Repository navigation
feat(repo): replay grades record each credited hit; repo report --hits lists them - #297
Conversation
A dokimi:review_replay grade kept only the ids of the threads it credited (details.threads_hit), not which finding hit each one. To check a hit, the evaluation of IntelPython/dpnp#3099 had to rerun the location matching by hand next to gold.json and answer.txt, and that is how it found credits by chance: a finding on the right lines about something else. Separately, an answer whose findings JSON does not parse is graded parse_error with every recall 0, but no summary showed it, so an arm that makes answers harder to parse read as a recall loss. - grade_replay adds details.matches: per credited pair, in threads_hit order, the thread (id, file, line, comment cut to 200 characters), the finding (its index, repository-relative file, line as matched, severity, message cut to 200) and their distance. The matching and the metrics are unchanged, so VERSION stays 1; the graders digest a batch is pinned to changes with the source as before. - repo report --hits lists those pairs by task, arm, model and rep, two lines each (--json: records with task, arm, model, rep and cell), counts the cells graded before matches existed, and says so when the batch has no review_replay cell. The default report is unchanged. - repo report counts, per row, the cells whose grade.json has parse_error, as a note under the row ("agent answer(s) whose findings JSON did not parse") and as parse_errors in --json. - Contract §4.5 and §9, the grader docstring and a changelog fragment. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
CLI interface change detectedThis PR changes dokimi's user-facing CLI surface (commands and/or options): ~ `dokimi repo report` parameters changed:
+ added option `--hits`Updated on every push; the |
|
✅ OpenCodeReview: Review complete: 0 finding(s) across 7 selected item(s). Review details
|
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #297 +/- ##
==========================================
+ Coverage 93.52% 93.57% +0.04%
==========================================
Files 274 275 +1
Lines 35625 35772 +147
Branches 6052 6066 +14
==========================================
+ Hits 33320 33475 +155
+ Misses 1489 1481 -8
Partials 816 816
🚀 New features to boost your workflow:
|
…tches A field added to details that leaves every metric and pass as they were does not bump VERSION; a reader tells such a grade by the field being present. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
Covers a grade.json that is not JSON or not an object, details that is not an object, non-object and textless entries in matches, metrics that is not an object and a non-boolean parse_error. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
Resolve the conflicts with intel#238: summarize keeps the parse_errors count inside the new reading_cells block, and cmd_repo_report runs --hits inside the same CellFileError handling as the table. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
After intel#238, repo report refuses a result.json of the wrong shape with a CellFileError naming it (exit 1). load_cells checks task, arm and model; --hits also sorts by rep, which the table never reads, so a cell without it stopped --hits with a KeyError traceback. load_hits now refuses it the same way: "<cell>/result.json has no usable `rep`". Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
Review comment 4416180649: test_replay_matches_record_each_credited_pair_ nearest_first now grades a thread with no `comment` against a finding with no `severity` or `message` and compares the match with a literal whose three fields are "". Before, every input supplied those strings, so `_cut` could turn None into "None" and the suite still passed. Review comment 4416180698: test_hits_list_each_credited_pair_by_task_ arm_and_rep adds a replay cell with rep 10 next to rep 2. By directory name r10 sorts before r2, so the expected listing, rep 1, 2, then 10, now fails if load_hits drops its (task, arm, model, rep) sort or sorts the rep as a string. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
|
Review round in 89f282a, tests only. Both newer OpenCodeReview points held: a mutant survived each at 0a7539a, and both are caught now.
The two earlier threads were answered in 29fed9c and 8e43a2b and are resolved. |
vlad-perevezentsev
left a comment
There was a problem hiding this comment.
Review at 89f282a. The grader change is right: matches is built from the same nearest-first matching, and the metrics do not change. One thing should be fixed before merge: plain repo report now reads every cell's grade.json without the guards read_grade uses. The details are in the line comments.
What I ran, at 89f282a:
make ci-local --offline: 0 failed, 17 passed, 13 skipped (network or Docker only).- A hand-written cell whose
grade.jsonis"[" * 200000:summarizeandload_hitsraiseRecursionError. Whengrade.jsonis a FIFO,summarizehangs (timeout 10exits 124). When it is a symlink, it is followed. - A replay cell that
result.jsonmarksgrader_failure, with a validgrade.json: the table scores it 0.0, andload_hitsstill lists its hit.
Checked, no issues
- Matching and scores: the sort key is still
(distance, finding, _id_key(thread)), sothreads_hitand every metric are as before.matchesfollowsthreads_hitorder. KeepingVERSIONat "1" holds, as answered in the thread: no metric orpasschanges for the same inputs. - Earlier threads: the
""for missing text and the rep-10 ordering test are in 89f282a, as the replies say. - Docs and changelog: contract §4.5 and §9 describe
matches,--hits,--hits --jsonandparse_errorsas the code does. The fragment is under Added and says what changed.
|
✅ OpenCodeReview: Review complete: 0 finding(s) across 10 selected item(s). Review details
|
…der failures `repo report` reads every cell's grade.json for parse_errors, and --hits for the matches. _grade_doc read it with a plain read_text, so a FIFO blocked the whole table, a link out of the batch was followed, and a deeply nested file raised RecursionError. It now goes through grading.read_grade_json, the reader read_grade uses (lstat, O_NOFOLLOW, and RecursionError as no grade). read_grade gets the RecursionError case too: it used to crash the grading of such a cell. --hits also credits no match of a cell whose result says grader_failure, which the table scores as 0. Signed-off-by: Nikolay Petrov <nikolay.a.petrov@intel.com>
There was a problem hiding this comment.
🟡 Changes recommended
The FIFO test uses an unguarded Windows-incompatible os.mkfifo call and can falsely pass despite a blocking regression because it does not assert that the initial join completed without timing out.
2 open issues
What changed in this PR
2 new findings.
This PR makes dokimi’s location-based replay credits auditable without changing scoring, and distinguishes answer parse failures from lower review recall.
Changes:
- Records each credited thread/finding pair in
details.matches. - Adds
repo report --hitstext and JSON output, plus per-row parse-error counts. - Shares guarded grade-file reading and adds regression tests and documentation.
| File | Description |
|---|---|
dokimi/tests/test_repo_report_hits.py |
Tests hit reports, parse-error counts, and malformed grade handling. |
dokimi/tests/test_repo_builtin_graders.py |
Verifies credited pairs, ordering, normalization, and text limits. |
dokimi/dokimi/repos/report.py |
Loads and formats hits; reports parse-error counts. |
dokimi/dokimi/repos/grading.py |
Extracts shared guarded JSON reading and handles excessive nesting. |
dokimi/dokimi/repos/graders/review.py |
Records credited pairs while preserving matching and metrics. |
dokimi/dokimi/commands/repo_run.py |
Adds and dispatches repo report --hits. |
dokimi/docs/repo-evaluation-contract.md |
Documents match records and report output. |
dokimi/changelog.d/20261029_120000_antonwolfy_replay-hit-pairs.md |
Announces replay-hit details and parse-error reporting. |
Review effort: Balanced
|
Two blocking threads from the review are handled in
Not in this push: the |
Review comment 4418950465 (the parse_errors half): a cell whose result.json says grader_failure was counted both in the row's grader_failures and, when its grade.json had metrics.parse_error, in parse_errors. summarize now leaves it out of parse_errors, as 9092ed4 leaves it out of --hits. Review comment 4418950480: the parse-error note said "(counted as failed)" on every row, but a score-only row (every dokimi:review_replay row) has no failure count; the cell is in the mean as a score of 0. The note now says "(scored 0)" on a score row and keeps "(counted as failed)" on a gate row. The module docstring, contract §9 and the changelog fragment say both. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
Review comment 4418950473: the --hits help said the pairs are listed "by task, arm and rep", but load_hits sorts and format_hits groups them by task, arm, model and rep, as contract §9 and the changelog fragment already say. The help now says so too. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
Review comment 4420760178: the test called os.mkfifo unguarded, an AttributeError on Windows. It is now skipped where os.mkfifo is missing, as tests/test_task_format_detect.py does. Review comment 4420760207: a report that opened the FIFO could still pass, because the cleanup opened the write end, the blocked read got EOF and the empty file read as no grade. The test now records whether the first join timed out, then opens the write end (non-blocking, a bounded number of times) until every blocked read has ended, and only then asserts that it did not time out. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
|
Review round in 414855f, 6421d62 and e53ab20, on top of 9092ed4, which fixed the two blocking points.
Every thread is answered and resolved; the Testing section has the mutants and |
Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
The merge with main brings the flag registry of intel#254: its ratchet test fails a spelling that is neither canonical in dokimi/cli_flags.py nor on tests/data/cli_flags_allowlist.txt, and CI fails a stale docs/reference/cli-interface.json. `--hits` switches repo report from the table to the list of credited replay hits; no registry concept names a view switch, so it gets an allowlist row with that reason, and the snapshot is regenerated with what `make cli-snapshot` runs (the only change is the --hits option). intel#298's scripts/check_comment_blocks.py --base origin/main --head HEAD finds no comment block over two lines among the lines this PR adds or edits, so no comment changes. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
Review comment 4422546939: load_hits built each hit as the cell's task, arm, model, rep and cell followed by **match, so a details.matches entry with a key of one of those names moved the hit to another task or repetition in both --hits and --hits --json. The match is now spread first and the result.json values last. format_hits only reads these records, so it needs no change. A new test grades a cell whose match carries all five colliding keys and checks that the JSON records and the text listing show the cell's own task, arm, model, rep and cell. The contract (§9) and the changelog fragment say the five come from result.json. Signed-off-by: Anton Volkov <antonwolfy@gmail.com>
vlad-perevezentsev
left a comment
There was a problem hiding this comment.
LGTM
I checked 5210ebe. All four points of my first round are fixed, and so is exai-bot's **m point: load_hits now puts the cell's result.json task, arm, model, rep and cell after the match's keys.
What I ran, at 5210ebe:
make ci-local --offline: 0 failed, 19 passed, 13 skipped (network or Docker only).test_a_match_key_named_like_the_cell_key_does_not_move_the_hitfails on 5210ebe's parent and passes at the head.- At e53ab20, the new
tests/test_repo_report_hits.pyon 89f282a: the nested/linked grade, FIFO, grader-failure, parse-error and(scored 0)tests fail there. - The first round's repro again: a
"[" * 200000and a FIFOgrade.jsonare no grade, andsummarizeandload_hitsreturn.
Checked, no issues
read_grade_json:read_gradeand the report now share one reader.read_gradealso treats a nested-too-deep grade as no grade now, where it raised before.- Grader failures:
--hitsandparse_errorsboth leave out a cell thatresult.jsonmarksgrader_failure, so they agree with the table. The docstring, contract §9 and the fragment say so. - FIFO test: it is skipped without
os.mkfifo, and it fails when the read blocks, as the replies to Copilot say.

Summary
Found while evaluating IntelPython/dpnp#3099 (AGENTS.md guidance) with dokimi: 26
dokimi:review_replaytasks, 156 cells, 210 credited thread hits. Two of the evaluation's readings could not be checked from the batch.A credited hit names its thread, not the finding that hit it.
grade_replaycredits a thread to the nearest finding on the same file withinwindowlines, one to one. That is by design: location only, no judge. Butgrade.jsonkeeps onlydetails.threads_hit, the thread ids. To check a hit, the dpnp audit had to rerun the matching by hand next togold.jsonandanswer.txt. Doing that turned up hits credited by chance, which the report had quoted as evidence that the guidance works:pr3098-t2pr3066-t1pr2841-t43The
grade.jsonof the cell that creditedpr3098-t2(guidance:rev:<sha>, rep 2), onmain:Nothing in it says which finding got the credit, or what it said.
Parse errors are not counted per arm. In pr3014, arm
guidance:none, rep 2, the answer's findings JSON was{"file": "dpnp/dpnp_iface_indexing.py", "line": 1:1, ...}, which does not parse. That cell is gradedparse_error: truewith every recall 0, as contract §4.5 says: the agent failed the task. But nothing outside the grader readsparse_error, sorepo reportshows only the lower score. Onmain,repo reportof a batch holding that cell (and the sixpr3098cells) gives its row as:A treatment that makes answers harder to parse would read as a recall loss.
Related: #291 proposes a judged recall over these pairs.
Changes
grade_replay(repos/graders/review.py) addsdetails.matches: one object per credited pair, inthreads_hitorder. Each holds the thread (thread,thread_file,thread_line,comment), the finding (finding= its index among the answer's objects,filerepository-relative,lineas matched,severity,message) anddistance. Strings are cut to 200 characters._replay_pairscarries the thread along; the sort key, the matching and every metric are unchanged. The module is still standard library only and parses as Python 3.8. On the same cell, this branch writes, among its twomatches:VERSIONstays"1": its rule is "bump when a result for the same inputs changes", and no metric orpasschanges.graders_digest()hashes the grader sources, so it changes with this PR anyway. A batch pinned with the old digest refuses to resume (_pin_batch), andrepo comparewarns when compared batches differ ingraders. So old and new grades are not mixed silently. A reader tells them apart by whethermatchesis present.repo report --hits(commands/repo_run.py;load_hits,format_hitsinrepos/report.py) prints each credited pair instead of the table, grouped by task, then arm/model/rep. Each pair takes two lines: the thread id, its anchor and the gold comment, then the finding's index, location, severity, distance and message. Text is flattened to one line and cut to 100 characters. A cell is a replay cell when itsgrade.jsonnamesdokimi:review_replay. A replay cell whoseresult.jsonsaysgrader_failurelists no hit, since the table scores it 0. A cell graded beforematchesexisted is counted on one line (N cell(s) graded without hit details), not treated as an error. A batch with no replay cell prints<batch>: no dokimi:review_replay cell.--hits --jsongives{batch, replay_cells, without_matches, hits}, one record per pair inhits(task,arm,model,rep,celland the match fields). Those five come from the cell'sresult.json: a match key of the same name does not replace them (5210ebe). Without--hitsthe output is unchanged. On those seven cells (excerpt):repo reportnotes, under a row, how many of its cells havemetrics.parse_errortrue. The note goes in the row's existing notes line, so it reads as the agent's failure, not the grader's; on thepr3014row above, a score-only row, it adds1 agent answer(s) whose findings JSON did not parse (scored 0): the cell is in the row's mean as a score of 0. A gate row says(counted as failed)instead. A cell whoseresult.jsonsaysgrader_failureis counted undergrader_fail, not as a parse error.--jsongivesparse_errorson every row. A batch with no such cell prints nothing new. The row notes moved fromformat_reportinto_row_notes.repo reportreads each cell'sgrade.json(forparse_errors, and for--hits) throughgrading.read_grade_json, the readerread_gradeuses, now factored out of it (9092ed4). A link, FIFO or other non-regular file is not read (lstat, thenO_NOFOLLOW), and a file nested too deep to parse is no grade, as are invalid JSON and a non-object. So one such file left in a cell no longer stops, hangs or misleads the report of the whole batch.read_gradegets theRecursionErrorcase too: such a cell is now a grader failure (grade.json is not JSON: ...) where its grading used to raise.repo reportrefuses aresult.jsonof the wrong shape with a ✗ message naming it (exit 1).--hitsalso sorts byrep, which the table never reads, so a cell without it stopped--hitswith aKeyErrortraceback.load_hitsnow refuses it the same way, with✗ <cell>/result.json has no usable \rep`, exit 1 (0a7539a).test_hits_refuse_a_cell_with_no_rep_as_the_table_refuses_a_malformed_cellfails without the check (theKeyError`) and passes with it.--hitsis a new spelling for the flag registry of test(cli): flag registry, ratchet contract test, CLI snapshot (#94 F1a) #254:tests/data/cli_flags_allowlist.txtlists it (no registry concept names a view switch), anddocs/reference/cli-interface.jsonis regenerated with it (29aff4f).detailscolumn and a bullet on thematchesfields), §9 (--hitsand the parse-error count), and the grader and report module docstrings.Risk
grade.jsonof adokimi:review_replaycell gainsdetails.matches, up to two 200-character strings per credited thread.detailsis stored and never aggregated (repo_grade.v1allows any object there). No metric changes.repo report --jsonrows gainparse_errors. The text table gains a note only on rows that have a parse error.grade.jsonnested too deep to parse now makes its cell a grader failure, where its grading raisedRecursionError.graders_digest()changes. A batch started before this PR with built-in graders refuses to resume (batch ... was run from graders ...; use another --batch), as with any grader change.repo compareacross such batches warns about thegradersstamp.Testing
On a Linux review host, at
3d19b8f(onmaine966422):make ci-local: 27 passed, 1 failed, 7 skipped. The failure ispip-audit, which reports 10 known CVEs againstfilelock 3.32.7inrequirements-ci.lock.txt. This PR does not touch that file, andmainhas the same pin; ci(deps): document and ignore ten more filelock 3.32.7 advisories #288 documents and ignores those advisories. Skipped:external-catalog-smoke(needs docker),test-latest,docs.yml:deployandpip-audit.yml:report(job conditions false on a PR),cli-surface / Package the result,conda-forge-deps(no micromamba), semgrep secrets (runs on the PR). 10191 tests passed, 4 skipped; changed-line coverage 100% (74 lines).tests/test_repo_builtin_graders.py::test_replay_matches_record_each_credited_pair_nearest_first: a two-thread, three-finding answer (plus one non-object entry). The finding at line 4 is near both threads and takest_doc(distance 0).t_opthen goes to the finding at distance 1, not to the earlier one at distance 4. The test checks the fullmatches, theirthreads_hitorder when credit order differs, the 200-character cut and the repository-relativefile. It also checks that the entry script writes them underdetailsand that the result passescheck_grade.tests/test_repo_report_hits.py(new): a batch graded by the real grader, with two replay tasks, three arm/rep cells, an old-format grade, the dpnp parse-error answer ("line": 1:1) and areview_seedscell. It checks--hitstext and JSON, thegraded without hit detailscount, the CLI flag, that the default table is unchanged, the no-replay-cell batch, and the per-row parse-error count and note (not a grader failure).main's code: the new grader test fails (nomatches). The report test file fails to import (format_hitsdoes not exist). The other 48 tests oftest_repo_builtin_graders.pypass there.matchesin credit order instead ofthreads_hitorder; no 200-character cut; the finding's rawfileinstead of the repository-relative one;--hits: count a parse-error cell as graded without hit details; take cells of every grader; drop the arm/model/rep header; don't cut a long message; drop the "no dokimi:review_replay cell" line;--hits; print the hits in place of the default table.An unmutated copy passes the same tests (53 passed).
grade.json,details: null, and non-object entries inmatchesare skipped without an error. A non-booleanparse_erroris not counted. Review round 1 (8e43a2b) turns these into a test, which dropping any of the six guards makes fail.pr3098cells and thepr3014parse-error cell of the dpnp batch, regraded with this branch's grader. Every metric equals the originalgrade.json's, andrepo report/repo report --hitsgive the output quoted above.8e43a2b:make ci-localpasses apart frompip-audit(the samefilelockadvisories) and the two gitleaks steps. The host's proxy answers GitHub release downloads with 504, so CI's gitleaks install fails there; the installed gitleaks 8.30.1 finds no leaks in the PR's commits.mainmerged in after fix(cli): run, compare, arms, tasks, explore and repo exit with a message on bad input or output #238 (f0fe902). The conflicts were insummarize, where theparse_errorscount moved into fix(cli): run, compare, arms, tasks, explore and repo exit with a message on bad input or output #238'sreading_cellsblock, and incmd_repo_report, where--hitsnow runs inside the sameCellFileErrorhandling as the table. Then0a7539a(below). On that commit, the report, grader, run and compare tests with the guard tests: 578 passed;ruffandmypyare clean.mainf0f95a2with the other PRs from this evaluation (fix(repo): scan says why it is incomplete #295 at4fa7783, feat(repo): compare records the start context, filters tasks, and flags inconclusive rows #296 atcad52dd, feat(repo): replay grades record each credited hit; repo report --hits lists them #297 at0a7539a, fix(novelty): a capped run says how far the cap reached #299 atfa453d8), on a workstation: the full suite has 10482 passed and 57 skipped, and the same 5 failures and 1 collection error asmainalone there (10456 passed). All six come from that machine's setup: nodocker, nohypothesis, and two tests that depend on its git and shell settings.89f282a(test(repo): pin "" for missing match text and rep order of --hits). On a Linux review host, at89f282a(onmainf0f95a2). Both mutants the comments named survived at0a7539a; the tightened tests now catch them, 3 of 3:test_replay_matches_record_each_credited_pair_nearest_firstalso grades a gold thread with nocommentagainst a finding with onlyfileandline, and expects a literal match withcomment,severityandmessageall"". It fails when_cutturns None into"None".test_hits_list_each_credited_pair_by_task_arm_and_repadds a rep-10 cell next to rep 2; by directory name r10 comes first. The test fails whenload_hitsdrops its sort, and when it sorts the rep as a string.make ci-local: 25 passed, 3 failed, 7 skipped. None of the failures comes from this change.Install gitleaks: the download returned HTTP 504.Scan commitsthen had no gitleaks binary.pip-auditreports 10 known CVEs againstfilelock 3.32.7inrequirements-ci.lock.txt, the same pin as onmain. Skipped:external-catalog-smoke(needs docker),test-latest,docs.yml:deployandpip-audit.yml:report(job conditions false on a PR),cli-surface / Package the result,conda-forge-deps(no micromamba), semgrep secrets (runs on the PR). 10525 tests passed, 4 skipped; changed-line coverage 100% (78 lines).9092ed4(fix(repo): report reads grade.json as the host does; --hits skips grader failures),414855f(fix(repo): parse_errors skips grader failures; score rows say scored 0),6421d62(docs(cli): repo report --hits help says by task, arm, model and rep),e53ab20(test(repo): FIFO grade test skips without mkfifo and fails on a block). On a Linux review host, ate53ab20(onmainf0f95a2):test_parse_errors_leave_out_a_cell_the_table_counts_as_a_grader_failure(a parse-error grade in a grader-failure cell and in a graded cell:grader_failures1,parse_errors1) andtest_the_parse_error_note_of_a_gate_row_says_counted_as_failed.test_report_counts_answers_that_did_not_parse_per_rownow expects(scored 0)on the replay row. The FIFO test is skipped withoutos.mkfifo, and it records whether the firstjointimed out, unblocks every waiting read (bounded), then asserts it did not.9092ed4: the newparse_errorstest and the changed note test fail (2 failed, 9 passed); ate53ab20, 11 passed.9092ed4checked by reverting it in pieces:_grade_docback onread_textfails the nested/linked grade test and the FIFO test;read_grade_jsonwithout theRecursionErrorcatch fails the nested grade test;load_hitswithout thegrader_failureskip failstest_hits_credit_no_match_of_a_cell_the_table_scores_as_a_grader_failure(3 of 3).e53ab20; each one makes its test fail (6 of 6):parse_errorscounts grader-failure cells again; the note'skindcheck flipped; the note always(counted as failed); the note always(scored 0); onlyload_hitsreadsgrade.jsonwithread_text(at9092ed4the FIFO test passed with this mutant; now it fails with "a grade.json that is a FIFO blocked the report"); the table and--hitsboth read it withread_text(the test file fails in about 11 s: the cleanup loop ends both blocked reads, where the old cleanup left the second one waiting and took 22 s). An unmutated copy passes (11 passed).make ci-local: 27 passed, 1 failed, 7 skipped. The failure ispip-audit: 10 known CVEs againstfilelock 3.32.7inrequirements-ci.lock.txt, which this PR does not touch;mainignores them since ci(deps): document and ignore ten more filelock 3.32.7 advisories #288, which this branch predates, and CI tests the merge withmain. Skipped:external-catalog-smoke(needs docker),test-latest,docs.yml:deployandpip-audit.yml:report(job conditions false on a PR),cli-surface / Package the result,conda-forge-deps(no micromamba), semgrep secrets (runs on the PR). 10530 tests passed, 4 skipped; changed-line coverage 100% (86 lines). Theskipifwas not run on Windows.main(test(cli): flag registry, ratchet contract test, CLI snapshot (#94 F1a) #254, ci: fail comment blocks over two lines that a PR adds or edits #298) and review comment 4422546939:29aff4f(test(cli): allowlist repo report --hits and refresh the CLI snapshot),5210ebe(fix(repo): repo report --hits keeps the cell's key over a match's). On a Linux review host, at5210ebe(onmain83f18fb):--hitshas an allowlist row with its reason (no registry concept names a view switch), anddocs/reference/cli-interface.jsonis regenerated; the snapshot diff is the--hitsoption only.tests/test_cli_flags.py: 2 failed at040508d(--hitsneither canonical nor allowlisted; the snapshot is stale), 16 passed at29aff4f.scripts/check_comment_blocks.py --base origin/main --head HEADfinds no comment block over two lines among the lines the PR adds or edits.test_a_match_key_named_like_the_cell_key_does_not_move_the_hitgrades a cell whose match carriestask,arm,model,repandcellkeys and checks that--hits --jsonand the--hitstext both show the cell's own values. Copied onto040508d, it fails (the hit is listed underother-task,guidance:raw,m-9, rep 99; 1 failed, 11 passed); at5210ebe, 12 passed. A mutant that puts onlyrepback in front of the match also fails it (1 of 1).make ci-local: 28 passed, 2 failed, 7 skipped. Neither failure comes from this change:Install gitleaksgot HTTP 504 on the download, soScan commitshad no gitleaks binary. A gitleaks already on the host scanned the branch's commits instead: no leaks found. Skipped:external-catalog-smoke(needs docker),test-latest,docs.yml:deployandpip-audit.yml:report(job conditions false on a PR),cli-surface / Package the result,conda-forge-deps(no micromamba), semgrep secrets (runs on the PR). 10652 tests passed, 4 skipped; changed-line coverage 100% (86 lines). An earlier run at the same commit also failedtest_reference_checks.py::test_the_regex_limit_is_shared_by_every_pattern_of_one_check, a wall-clock bound (1.55 s against 1.5 s) in a file this PR does not touch; it passes alone and in the second full run.Revert
A plain revert.
grade.jsonfiles written meanwhile keepdetails.matches, which nothing else reads. Batches started after this PR are pinned to its graders digest, so resuming them after a revert asks for another--batch.Checklist
pytestpassesruff,mypy, and schema checks passAGENTS.md.github/.licenserc.yaml)