Repository navigation
feat(repo): repo compare flags replay tasks a guidance revision may have seen - #392
antonwolfy wants to merge 15 commits into
Conversation
Part 2 of issue intel#290, after the recording in intel#359. A guidance:rev: arm runs a revision of the guidance against replay tasks built from PRs merged earlier; guidance written after a task's review can encode that review, and nothing in a batch showed it. repo tasks replay now writes patch_files into task.json: the sorted paths change.patch changes, from the same --no-renames diff, so a rename counts as both its paths. repo compare checks every compared arm whose cells record arm_rev (new module dokimi/repos/compare_leak.py), over its tasks with public_at or source_pr: - by date: a guidance file that applies to the task has its guidance_latest commit committed after public_at, compared as aware datetimes. A nested AGENTS.md, CLAUDE.md, CLAUDE.local.md or GEMINI.md applies to tasks patching below its directory; any other guidance path, and every file for a task without patch_files, applies to every task (the strict side, marked scoped: false). - by name: a guidance_commits subject names the task's PR (#N, owner/repo#N of its own repository, or its PR URL; not #N0 or other/repo#N). A cut history (guidance_commits_truncated) is said. - unknown, with the reason: no public_at (by date only), a patch: arm, a batch with no recorded history, a cell file of the wrong shape. The --json summary gains leak (one entry per checked arm, [] when none); the text prints the counts, the tasks named with their commit short shas, and the clean tasks as --task options. No delta, interval, p or exit code changes. Contract sections 3, 4.6 and 9 and the reviewing guide describe the flags. Closes intel#290 Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
|
✅ OpenCodeReview: Review complete: 0 finding(s) across 9 selected item(s). CI at `cb26557`: 4 still running, 14 passing, 2 skipped
This PR has reached its review limit, so only a re-request starts a review. Review details
|
There was a problem hiding this comment.
🟡 Changes recommended
Leak detection still falsely flags unrelated URLs and repository references while missing startup-loaded rules and imported guidance.
4 open issues
What changed in this PR
4 new findings.
This PR adds replay-leakage reporting to repo compare, using recorded guidance history to flag tasks a guidance revision may have seen.
Changes:
- Records replay patch paths for directory-scoped guidance checks.
- Adds date/name flags, unknown reasons, and clean-task filters to comparison output without changing comparison statistics.
- Adds regression tests and documents the checks and their limitations.
| File | Description |
|---|---|
dokimi/tests/test_repo_replay.py |
Tests patch-path recording and rename handling. |
dokimi/tests/test_repo_compare_leak.py |
Tests leakage flags, scope, malformed records, and output. |
dokimi/dokimi/repos/replay/build.py |
Writes patch_files into replay tasks. |
dokimi/dokimi/repos/compare.py |
Integrates leakage checks into JSON and text output. |
dokimi/dokimi/repos/compare_leak.py |
Implements leakage classification and formatting. |
dokimi/docs/reviewing.md |
Updates leakage-cut guidance to use comparison output. |
dokimi/docs/repo-evaluation-contract.md |
Documents metadata, scope rules, and output fields. |
dokimi/docs/architecture.md |
Adds the leakage-check module to the architecture map. |
dokimi/changelog.d/20261104_120000_antonwolfy_replay-leak-flags.md |
Announces leakage reporting and replay patch metadata. |
Review effort: Balanced
| if not applies(path, files): | ||
| continue |
There was a problem hiding this comment.
Valid, not fixed here: guidance_latest records the last commit per guidance path, not the import graph, so which nested files a root file imports is not known to the check. Treating every scoped file as unknown would drop the scoping the check exists for. 58d9f0c states the gap in the module docstring and in contract §9 (@ imports are not followed; a nested file a root file imports counts as scoped and can be missed). Recording the imports at build time is a separate change.
Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
…e its host The URL form had no leading boundary, so notgithub.com/<owner>/<repo>/pull/N or evil.github.com/... flagged a clean task by name. The scheme stays optional so a bare github.com/... URL still flags. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #392 +/- ##
==========================================
+ Coverage 94.78% 94.86% +0.07%
==========================================
Files 354 357 +3
Lines 46588 47367 +779
Branches 7974 8143 +169
==========================================
+ Hits 44159 44934 +775
- Misses 1541 1545 +4
Partials 888 888
🚀 New features to boost your workflow:
|
…epo name's - or . is not a PR reference A file under .claude/rules/ is a rule whatever its basename, so it applies to every task, not only those patching its parent directory. #N glued to - or . is another repository's PR (other/repo-#N). The docs say that @ imports are not followed. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
…rce_url, and an unparsable public_at The changed lines of compare_leak.py that codecov reported uncovered: the absent-file read, a task with no source_pr, a source_url that is no PR URL, and a public_at that is not a date. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
napetrov
left a comment
There was a problem hiding this comment.
Verdict: one blocking thread (the clean: suggestion) and two nits; COMMENT review. CI red: none on head (0 failing Actions jobs).
Coverage: checked the diff, the leak batches (plain and leak, head and base), the custom-arm and big-source_pr probes, and the test run on head (test_repo_compare_leak.py and test_repo_replay.py, 116 passed) with probe-only shims for regex and scipy. Not looked at: the full pytest suite (not run), the 46 leak tests on the real packages.
…readable meta.json and huge source_pr stay unknown Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
…er arm reports unknown Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
|
Review round 2 is addressed on 3d9c9d4 (CI green); the four threads are replied to and resolved.
Each fix has a test that fails without it, and the bad-shape test covers the 5000-digit |
vlad-perevezentsev
left a comment
There was a problem hiding this comment.
Review at 3d9c9d4. The check does what issue #290 asks and leaves every delta, interval and p as they were. What is left is in the clean: suggestion and in a few cases where a task reads as clean or as unknown when it should not; see the line comments.
What I ran, at 3d9c9d4:
make ci-local --offline: 0 failed, 19 passed, 13 skipped (network/docker steps); the test suite: 15,687 passed, 63 skipped.- A repro with the test file's batch helpers: a batch that mixes replay and hand-written tasks, a
guidance:nonecell with an unreadablemeta.json, andnames_pr(3103, ...)against the subjectsPR#3103,pr#3103,GH-3103,PR 3103anddpnp#3103.
Checked, no issues
- Earlier review threads: the cross-arm
clean:filter (flagged and unknown), the unreadablemeta.jsonof a custom-named arm, and the over-longsource_prare fixed atcompare_leak.py:242,:91and:201, each with a test. - Scope and dates:
.claude/rules/*applies everywhere whatever its name,.claude/CLAUDE.mdcounts for its parent, and dates are compared as aware datetimes, so+09:00againstZis right. patch_files: built from the samechangedlist as the patch minusleft_out_files, with both paths of a rename. The new test covers it.- Docs and changelog: contract §9 and §4.6,
reviewing.mdandarchitecture.mdmatch the code. The fragment is underAddedand says what a user sees; the stored keys and schemas are unchanged.
napetrov
left a comment
There was a problem hiding this comment.
Re-review at 3d9c9d4 (round 58d9f0c..3d9c9d4). Verdict: no new thread from me.
- My blocking (
clean:suggests a task another arm flags): fixed,flaggedset across arms. - My nit (unreadable
meta.jsondrops the arm from the check): fixed by the_kindfallback. - My nit (
source_prover 4300 digits crashes): fixed, bounded to 18 digits. - Round pass found one row: the
_kindfallback turns a plain arm with one corruptmeta.jsoninto a checked arm, whose healthy cells gounknownand then drop out of every arm'sclean:line. Same as @vlad-perevezentsev's open thread oncompare_leak.py(line 91); agree it needs a fix, not repeated here.
Coverage: round diff, plain + edge pass, no probes beyond the passes' own. CI green on head.
An unreadable meta.json made the leak check treat its arm as one with a
guidance history, so a guidance:none baseline with one corrupt cell was
checked: its healthy cells were reported unknown ("its meta.json has no
arm_rev object") and, being unknown in some arm, dropped out of the
guidance:rev arm's clean: line.
The arm's name now decides first: guidance:none, guidance:raw, the other
guidance parts, guidance:format=<fmt> and skill-only arms have no history
and are not checked, whatever their meta.json holds. The unreadable
meta.json still makes an arm of another name checked, its replay tasks
unknown. Settles the review thread on compare_leak.py:91.
Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
The clean: line listed only the replay tasks the check found clean, so on a batch mixing replay and hand-written tasks the suggested --task options also dropped every task the check does not read (no task.json, or one with neither public_at nor source_pr), against contract section 9's "to compare without the flagged tasks". Each leak entry now lists those tasks as not_checked, and the clean: line suggests them with the clean ones, leaving out only what some arm flags or reports unknown. Contract section 9, the reviewing guide and the changelog fragment say so. Settles the review thread on compare_leak.py:261. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
The by-name check took only #<n> not preceded by a word character, so a guidance commit titled "Add rule from PR#3103 review" (or pr#3103, PR 3103, GH-3103) left the task built from PR 3103 clean, a miss on the side the check is there to catch. The number form now also takes PR, PR#, PR # or GH- right before the number, in any case, under the same boundary: dpnp#3103, SPR#3103 and other/PR#3103 still do not name it, nor does PR#31030. The module docstring, contract section 9 and the changelog fragment list the forms. Settles the review thread on compare_leak.py:221. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
@vlad-perevezentsev (#392 (review)): The three line comments are fixed: the |
@napetrov (#392 (review)): The row you agreed with (a plain arm with one corrupt meta.json turned into a checked arm, its healthy cells going unknown and dropping out of every |
compare.py keeps both imports: main's compare_interval and this PR's own module. Signed-off-by: Alexander Rybkin <alexander.rybkin@intel.com>
vlad-perevezentsev
left a comment
There was a problem hiding this comment.
Review at 7381f9e. The three points of my last round are fixed, each with a test: the clean: line keeps the hand-written tasks (714b283), a plain arm with a broken meta.json stays unchecked (83a0168), and PR#N, PR N and GH-N name the PR (27f45a5). One gap is left in the first fix, about cells with no task.json; see the line comment.
What I ran, at 7381f9e:
make ci-local --offline: 0 failed, 19 passed, 13 skipped (network/docker steps); the test suite: 15,873 passed, 63 skipped.- A repro with the test file's batch helpers for each fix (a mixed batch, a
guidance:nonecell with{brokenasmeta.json, thePR/GHsubjects together withAPR 3103,dpnp#3103,PR#31030andother/PR#3103), and aguidance:rev:cell with notask.json.
Checked, no issues
- Merge of
main: thecompare.pychanges sit next to #409's interval code without overlap; the leak entry and its text are unchanged by it. - Arm names:
guidance:none+skill:x,skill:xandguidance:format=...are left out, whileguidance:rev:...+skill:xandpatch:...are still matched first. - Docs and changelog: contract §9,
reviewing.mdand the fragment describenot_checkedand the new name forms.
Brings in main up to 37c0c21, which conflicted in two files: - dokimi/dokimi/repos/compare.py: main's intel#395 added compare_judged (judge:recall_judged), which builds the same per-arm cell map that leak_check reads. Both imports are kept; compare() now builds the map once as arm_cells and passes it to judged_cells and leak_check, and the summary keeps both "judged_cells" and "leak". - dokimi/docs/architecture.md: the repo compare entry names both compare_judged.py and compare_leak.py. docs/reference/cli-interface.json merged without conflict; a fresh scripts/cli_surface.py dump matches it. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
Review point: with guidance_commits_truncated, a replay task whose PR
none of the kept commits names was listed clean, and offered as a
--task option, though a cut commit after its public_at may name it.
guidance_commits is newest first by committer date, so every cut commit
is no later than the oldest kept one. _by_name now reports such a task
unknown ("guidance_commits_truncated after its public_at") when its
public_at is earlier than the oldest kept commit's committed date, and
("guidance_commits_truncated, no public_at date to bound it") when it
has no public_at; a task public at or after that commit was fully
checked and stays clean. Contract section 9, the module docstring and
the changelog fragment say so.
Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
Review point: a replay task whose cells in a checked arm have no
task.json was put in not_checked, and so on the clean: line as a
--task option, though its leak was never read. The runner writes
task.json only once the trace parsed, so a host error before that
leaves a finished cell without it, whatever the task is.
_arm_entry now reports a task none of whose cells has a task.json as
unknown ("no cell has a task.json"); not_checked keeps only the tasks
whose task.json was read and is not replay-style, so a hand-written
task still stays on the clean: line. The test of that line gives its
hand-written tasks a task.json, as the runner writes one. Contract
section 9, the module docstring and the changelog fragment say so.
Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
@vlad-perevezentsev (#392 (review)): The gap from the line comment (cells with no |
…known
Review point: with pooled batches, a task whose b1 cell has a task.json
and whose b2 cell has none was judged by b1's guidance history alone.
_check_cell skips a cell with no task.json, and the "no cell has a
task.json" rule did not apply since b1 has one, so b2's later root
AGENTS.md was never compared with the task's public_at and the task
was offered as a clean --task option.
_arm_entry now keeps the arm_rev each checked cell of a task read, and
a cell with no task.json whose arm_rev matches none of them makes the
task unknown ("a cell with no task.json ran a guidance history no
other cell read"). A spec-less cell that ran the same history as a
checked cell stays covered by it, as before. A flag another cell sets
still wins. The module docstring, contract section 9 and the changelog
fragment say so.
Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
vlad-perevezentsev
left a comment
There was a problem hiding this comment.
LGTM
I checked cb26557. The two points of my last round are fixed, each with a test that fails on the previous head. A cut history now leaves a task public before the oldest kept commit unknown by name (bff9c32). A task with no task.json in any cell is unknown, not clean (3598d88), and so is a pooled task whose spec-less cell ran a history no other cell read (cb26557).
Merge: safe now: it merges cleanly into current main, 3 commits behind, and its tests pass on the merge. No open PR conflicts with it.
What I ran, at cb26557:
make ci-local --offline: 0 failed, 19 passed, 13 skipped (network/docker steps); the test suite: 16,267 passed, 70 skipped.- The round's three new tests on the previous head 7381f9e: all fail there.
- A repro with the test file's batch helpers: a replay task whose one
guidance:rev:cell has notask.jsonis nowunknown, no cell has a task.json, and a hand-written task with atask.jsonstays on theclean:line. test_repo_compare_leak.py,test_repo_replay.pyandtest_repo_compare.pyon this branch merged withmain: 256 passed.
Checked, no issues
- The truncation bound:
guidance_commitsis sorted by committer date inguidance_history.py, so every cut commit is no later than the last one kept, andpublic_atequal to it is rightly clean. - Merge of #395:
compare()builds the per-arm cell map once forjudged_cellsandleak_check, andjudged_cellsdoes not change it. - Docs and changelog: contract §9, the module docstring and the fragment describe the new unknown reasons and
not_checked.

Summary
Part 2 of #290 ("repo compare flags replay tasks a guidance revision may have seen"). Part 1, the recording, merged as #359; this part waited on #332 (per-task values in
dokimi/repos/compare_values.py) and #336 (repo compare --ledger). It follows the design in the maintainer's comment on #290: a commit counts against a task only when it touches a guidance file that applies to a file in the task's patch, by committer date, with no content similarity, readingpublic_at, the uncappedguidance_latestfor the date flag and the cappedguidance_commitsfor the name flag, and with no new option (the clean ids go to--task).A
guidance:rev:<sha>arm runs a revision of a repository's guidance againstreview_replaytasks built from PRs merged earlier. Guidance written or edited after a task's review can encode that review, and the arm then "catches" the thread because a rule was written from it. In a replay of a dpnp guidance revision, three of nine "after the cut" tasks had their PRs named by later guidance commits, and one late guidance commit came after every task's first review comment. Onmain,repo compareprints nothing about this: the cells recordarm_rev.guidance_latest/guidance_commitsandtask.jsonrecordspublic_at, but the check was done by hand.Here, on a batch of six replay tasks (
guidance:noneagainstguidance:rev:<sha>, rootAGENTS.mdcommitted 2026-03-01T11:30Z,dpnp/tests/AGENTS.mdcommitted 2026-03-10, and a commit "Update test guidance for the fixes in #3103"),repo compare --baseline guidance:nonenow ends its comparison with:public_atpatch_filesdpnp/linalg.pyAGENTS.mdcommitted 11:30Zdpnp/tests/test_b.pydpnp/tests/AGENTS.mdcommitted 03-10dpnp/fft.pydpnp/tests/AGENTS.mddoes not applydpnp/tests/test_a.py#3103dpnp/x.pydpnp/y.pypublic_at), checked by nameThe exit code is 0, as before; the deltas, intervals and p values are unchanged.
Changes
repo tasks replay(dokimi/repos/replay/build.py) writespatch_filesintotask.json: the sorted pathschange.patchchanges, taken from the same--no-renamesdiff the patch is built from, so a rename gives both its paths, and without theleft_out_files.dokimi/repos/compare_leak.py. It checks every compared arm, baseline or treatment, whose cells'meta.jsonhasarm_rev(or whose name starts withguidance:rev:), andpatch:arms. An arm whose name says it has no history (guidance:none,guidance:rawand the other guidance parts,guidance:format=<fmt>, a skill-only arm) is never checked, even with an unreadablemeta.json; that file makes only an arm of another name checked, with its replay tasks unknown. It reads the tasks whose celltask.jsonhaspublic_atorsource_pr, and--tasknarrows it.guidance_latestcommit wascommittedafterpublic_at, compared as aware datetimes, soZ,+00:00and other offsets all work. A nestedAGENTS.md,CLAUDE.md,CLAUDE.local.mdorGEMINI.mdapplies to tasks whosepatch_fileshas a path under its directory; one in a.claude/directory counts for that directory's parent. Every other guidance path applies to every task (the strict side). So does every file for a task withoutpatch_files, whose entry saysscoped: falseand is named in the text.guidance_commitssubject names the task's PR as#N, asPR#N,PR #N,PR NorGH-N(any case), asowner/repo#Nof its ownsource_url, or by its PR URL, none followed by a digit.#31030,PR#31030,dpnp#3103,other/repo#3103,…/#3103and a URL whose host is glued to a longer name (notgithub.com/…,evil.github.com/…) do not name#3103; a URL without its scheme does. Whenguidance_commits_truncatedis set, the JSON and the text both say so.public_at(by date only), apatch:arm, anarm_revwithoutguidance_latest, ameta.json/task.jsonof the wrong shape, or notask.jsonin any of the task's cells (the runner writes it only once the trace parsed, so a host error leaves a cell without it). Withguidance_commits_truncated, a task no kept subject names is unknown by name when itspublic_atis missing or earlier than the oldest kept commit'scommitted(the list is newest first, so every cut commit is no later than that one), and clean otherwise. These never crash.task.jsonwhosearm_revno checked cell of the task has makes the task unknown ("a cell with no task.json ran a guidance history no other cell read"), as that history was never compared with the task; one that ran the samearm_revas a checked cell is covered by it.clean:line: the--taskoptions are the arm's clean tasks and the tasks it does not check (not_checked: atask.jsonwith neitherpublic_atnorsource_pr), so the rerun leaves out only the flagged ones; a task any checked arm flags or reports unknown is left out.dokimi/repos/compare.pyonly calls the new module:compare()addssummary["leak"](one entry per checked arm,[]when none is checked), andformat_compareappends its lines.compare()builds the per-arm cells once, for bothleak_checkandmain'sjudged_cells. The file is 783 lines (cap 800).arm_rev: whatrepo comparereads), §4.6 (patch_files, and howpublic_atis read), §9 (each flag, the scope rule and its strict side, unknown, the name rule, truncation, the JSON keys, the clean ids and the unchecked ones as--task). Also the reviewing guide's leakage-cut bullet, which now names this output instead of a hand check, and thearchitecture.mdmodule map.Closes #290
Risk
repo compare --jsongains a top-levelleakkey, always present ([]when no compared arm is checked); each entry also lists the arm'snot_checkedtasks. Text output gains aleak checkblock only when aguidance:rev:orpatch:arm has a replay-style task or a task with notask.jsonin any cell; other batches print the same as before.patch_files. They are read strictly (every guidance file applies), so they may be flagged by date more often than a scoped read would flag them. Their entries sayscoped: false, and the text names them. Rebuilding the tasks withrepo tasks replay --forcewrites the field.repo compare --ledgercallscompare()and gets the extra key, which it does not read.Testing
On a Linux review host, at
cb26557(onmain37c0c21):make ci-local: 30 passed, 0 failed, 7 skipped (external-catalog-smoke: needs docker; test-latest, docs deploy, pip-audit report: job conditions false on a PR; cli-surface "Package the result": unknown expression; conda-forge-deps: no micromamba; semgrep: not on PATH). The test run: 16326 passed, 11 skipped. Changed-line coverage 100% (206 lines measured). Not run here: the test legs on Python 3.11, 3.12 and 3.14.tests/test_repo_compare_leak.py(82 cases) covers:arm_rev;sub/AGENTS.md,sub/CLAUDE.md,sub/.claude/CLAUDE.mdandsub/GEMINI.mdflag a task patchingsub/deep/x.pybut notother2/y.pyorsubway/z.py, while a rootAGENTS.md,.claude/rules/x.mdor a non-instruction guidance file flags all three;patch_filesread strictly;PR#3103,pr#3103,PR #3103,PR 3103andGH-3103named,PR#31030,dpnp#3103,SPR#3103andother/PR#3103not;public_atunknown, and one a kept commit names flagged;patch:arm unknown; aguidance:rev:baseline checked whileguidance:none/guidance:raware not;guidance:none,guidance:raw,guidance:format=yaml,guidance:none+skill:lintorskill:lintbaseline with one unreadablemeta.json: not checked, and theguidance:rev:arm keeps itsclean:line;clean:line keeps them, and drops one that another batch'sguidance:rev:arm flags;task.jsonin any cell: unknown and off theclean:line, while a task with one in only some cells is checked by those when the others ran the samearm_rev, and is unknown when one of them, in another pooled batch, ran a later history;public_at: unknown by date, still flagged by name;--tasknarrowing; pooled cells;tests/test_repo_replay.py:patch_fileson PR 7, and a new PR whose patch renamessrc/r.pytosrc/q.py, which lists both paths and leaves out the nestedAGENTS.mdit adds..claude/not read as its parent;patch:arm read as a revision; every arm or every task checked;public_ator noguidance_latestread as clean;--taskignored;patch_fileskeeping left-out files, taken from a rename-detecting diff (only the new path), or not written.One mutant first survived (dropping
/from the#Nlookbehind), so the test now has a…/#3103subject.guidance:format=arms, or the guidance part of a+skill:name; theclean:line without the unchecked tasks,not_checkedleft empty, or the unchecked tasks not filtered by the other arms' flags; thePRorGH-prefix dropped,PRneeding a#or taking no space, and the boundary applied only before#. The filter mutant first survived, so the mixed-batch test now has a task another batch's arm flags. The new cases also fail at 3d9c9d4 itself (12 of 79;PR #3103already matched there).mainmerged (37c0c21), then two fixes. The repro of each point, on a batch built with the test helpers, before and after: with 200 kept commits, the oldest from 2026-03-10, the task public on 03-01 went fromclean:tounknown, guidance_commits_truncated after its public_at; a replay task whoseguidance:rev:cell has notask.jsonwent fromclean: --task review_replay_pr1 --task review_replay_pr3tounknown, no cell has a task.json: review_replay_pr3andclean: --task review_replay_pr1. 3 mutants, all failing their test: the truncation check dropped, its boundary made strict (<for<=), and the no-task.jsonstate dropped. Both new tests also fail at the merge commit before the fixes.task.jsonand a rootAGENTS.mdcommitted before itspublic_at, and its b2 cell has notask.jsonand a rootAGENTS.mdcommitted after it, with pr2 flagged by date in b2: before,0 unknown, 1 cleanandclean: --task review_replay_pr1; now1 unknown, 0 cleanandunknown, a cell with no task.json ran a guidance history no other cell read: review_replay_pr1, with noclean:line. 3 mutants, all failing their test: the new unknown state dropped, every cell withouttask.jsonmade unknown whatever its history (fails the test of a task with one in only some cells), and every cell's history compared as equal. The new test also fails at 3598d88.repo compareon the hand-built batch above: exit 0, with the output shown.Revert
A plain revert. Tasks written meanwhile keep a
patch_fileskey that nothing else reads; no schema version changes.Checklist
pytestpassesruff,mypy, and schema checks passAGENTS.md.github/.licenserc.yaml)