Repository navigation
Run the fact-list updater in the pipeline (HINBOX_PROFILE_UPDATE_APPROACH=facts), with timelines and saved fact rows - #69
Conversation
…ates, add `HINBOX_PROFILE_UPDATE_APPROACH=facts` The compare step gets an `update` verdict for a later state of the same thing, written next to the old state; a `conflict` must also share most of its words with the row (`same_subject()`). Rows are saved as `profile["fact_rows_json"]` and reloaded by `load_rows()`, so source kinds and repeat counts survive. `update_profile(approach="facts")` runs it in the pipeline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017KuZSfznoSE6bnm9t8KWMf
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017KuZSfznoSE6bnm9t8KWMf
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017KuZSfznoSE6bnm9t8KWMf
…nflicts; loosen the `update` check Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017KuZSfznoSE6bnm9t8KWMf
On dev/test it brought back false "Another report differs" sentences (6 per test run) and still caught 0 of 4 planted disputes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017KuZSfznoSE6bnm9t8KWMf
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 24d42adc5f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…act_list` The update-to-conflict check never fired on the evals and could turn a rescheduled trial date into a false dispute, so it is removed. Facts the model placed now keep their sentence on their row, so their quote and source kind are saved in `fact_rows_json`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017KuZSfznoSE6bnm9t8KWMf
…-orjf3o # Conflicts: # src/engine/profiles.py
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 52868be9cb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…t_list` Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017KuZSfznoSE6bnm9t8KWMf
Requested by Alex · project thread
What changes
This follows #64, which added the fact-list updater as an eval-only prototype.
Pipeline:
update_profile(approach="facts")andHINBOX_PROFILE_UPDATE_APPROACH=factsmakejust processusesrc/engine/fact_list.py. The default staysedit.Saved rows: each profile saves its fact rows as a JSON string under
profile["fact_rows_json"]. A row records:load_rows()reloads the rows on the next update. It drops a saved row whose sentence is no longer in the text, and builds rows from the text for any cited sentence that no saved row covers.Timelines: the compare step gets an
updateverdict for a later state of the same thing, such as a move to another camp, a decision after "still deciding", or a rescheduled trial date. It is written next to the old state, not as "Another report differs".Fewer false conflicts: a
conflictmust also passsame_subject(), which means the two sentences share at least 40% of their word stems, ignoring numbers.Details no longer dropped: a claim judged
samethat has a year, month or number the row lacks ("a 78-minute secret session") is written as a new fact instead of being dropped.Removed checks:
sameandupdateverdicts into conflicts. On test it brought back 6 false disputes per run and still caught 0 of 4 planted disputes, so it is reverted.update-to-conflict check (different dates plus 60% shared stems) never fired on dev or test. Review showed it could turn a rescheduled trial date into a false dispute, so it is removed too.Results
All runs use local Qwen through llama-server. Every run had 0 errors.
Eval, on the cc1158f code. That version still had the
update-to-conflict check, but the check never fired, so the scores apply to this PR. Scores are cases passed:Real
just processrun on the same 60 articles, edit against facts, counted byscripts/audit_entities.py. This run used 989d194, before the last fixes.profile.updatesecondsI sampled 11 of the 121 rows with linked but uncited articles:
same_with_detailchange fixes that.Known gap
Planted disputes on test are 0 of 4 for both models. The models call a different year for a past event "the same" or "an update". Fixing that inside the updater brought back false disputes, so it needs a separate check after the update, with its own eval.
Testing
uv run pytest -q tests -m "not asyncio": 590 passed after merging main. ruff is clean.🤖 Generated with Claude Code
https://claude.ai/code/session_017KuZSfznoSE6bnm9t8KWMf