Repository navigation
Bind a Local Review Record to the Reviewer's Report File - #3807
Conversation
`local_review.py record` now takes `--report`, the file the agent-skill reviewer wrote at the `reportPath` that `status` names, instead of a typed `--findings` count. It refuses a report that is absent or names another digest, stores the report's sha256, and derives the count from its lines. The local-strict-review skill's brief has the reviewer write that file, and "Running It" says to record only once the harness delivers the reviewer's completion notification. scripts/README.md also names the uv no-cache exception to the uvx promise for reading action files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The brief now writes only finding lines to the report, so a clean prose_lint scope line is not counted as a finding. A reviewer that finishes without writing its report owes a fresh pass rather than a report the driver writes for it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Windows PowerShell 5.1 writes one ahead of UTF-8 text, which hid the report's digest line from the header check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
|
A recorded local strict-review pass covers head |
"What It Does" now says the reviewer writes one report file, so it needs an agent type that can write. read_report drops the OSError and UnicodeDecodeError branches, which only reworded a failure main() already reports with exit 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
Outstanding correctness issues remain around reviewer write capability, legacy pass invalidation, and concurrent report pruning, so the change cannot yet reliably enforce its report-bound contract.
4 open issues
What changed in this PR
This pull request binds local review receipts to reviewer-generated, digest-specific report files instead of caller-supplied finding counts. It updates the recording engine, tests, documentation, and distributed review skills.
Changes:
- Adds report validation, digest binding, hashing, derived finding counts, and stale-report cleanup.
- Updates status output, check remediation, and the recording workflow to use
--report. - Documents reviewer report creation, completion notification handling, and the
uvxno-cache exception. - Regenerates the distributed
local-strict-reviewskill files and source digest. - This pull request requires changes.
| File | Description |
|---|---|
tests/test_local_review.py |
Adds coverage for report validation, derived counts, hashes, paths, pruning, and CLI changes. |
scripts/README.md |
Documents the report-based recording contract and uvx cache exception. |
scripts/local_review.py |
Implements report parsing, validation, hashing, status paths, cleanup, and report-based recording. |
.github/skills/local-strict-review/SKILL.md |
Updates the generated Copilot review skill distribution. |
.claude-plugin/fleet-skills/skills/local-strict-review/SKILL.md |
Updates the generated Claude review skill distribution. |
.claude-plugin/fleet-skills/.source-digests/local-strict-review |
Updates the generated skill source digest. |
.agents/skills/local-strict-review/SKILL.md |
Updates the source review brief and recording workflow for reviewer-generated reports. |
Review effort: Lite
|
A recorded local strict-review pass covers head |
The receipt format moves to version 2, so a receipt an earlier engine wrote, its agent-skill pass carrying a typed count, no longer covers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A seat that cannot dispatch the reviewer hands back the same worktree, target, and digest that backlog-burndown names. The dispatcher reads reportPath from status in that worktree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #3807 +/- ##
===========================================
+ Coverage 82.72% 82.77% +0.04%
===========================================
Files 29 29
Lines 9629 9654 +25
===========================================
+ Hits 7966 7991 +25
Misses 1663 1663
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
A recorded local strict-review pass covers head |
…rge on a Running Hosted Review, and Gate Skill Description Length (#3843) Promotes the changes merged into `develop` since promotion #3797 to `main`, the end of an away-mode backlog burndown. - [#3803](#3803) exempts the Roslyn embedded-language marker (`// lang=json`, `language=`) from the prose gate's comment rules as a tool directive. - [#3807](#3807) has `local_review.py record` take `--report`, the file the reviewer wrote, bind the pass to its sha256, and derive the finding count from it. `status` gains `reportPath`. - [#3809](#3809) holds `pr_review.py merge` while a hosted review is still running on the head, and routes a declined Qodo finding to a dismiss request. - [#3811](#3811) dates an anchored `intentRef` by the section its anchor names, and lets a `driftNote` acknowledge a verified intent advisory. - [#3816](#3816) moves the null GraphQL node check into the shared `gh_graphql` transport as `NullNodeError`. - [#3818](#3818) explains the workspace-edit default in `GOVERNANCE.md` and names the aggregator's expression form. - [#3822](#3822) moves the abandon discard to the `backlog-burndown` orchestrator, aligns the abandoned-branch delete, and holds a grown agent-safety set. - [#3823](#3823) scopes the Husky prose gate to staged paths and adds `--skip-generated` so a named file inside a generated tree is skipped. - [#3828](#3828) reads Copilot's `Open findings:` label, drops the duplicate `null_node`, and matches `scripts/README.md` to the Merge Gate. - [#3829](#3829) bumps the two stale hub caller snippet pins and documents the fallback's mixed-pair refusal. - [#3831](#3831) keeps an inherited `GIT_DIR` from rerooting the prose gate's subdirectory git reads. - [#3832](#3832) gives `backlog-burndown` a disposition for a worker's standalone clone and keeps the agent-safety hold past a park. - [#3835](#3835) makes `carry.py check-sections` refuse what `apply-sections` would, and name an open fence. - [#3836](#3836) pins the reusable-workflow stubs by placeholder and ticks the PlexCleaner gates item. - [#3838](#3838) has the `runtime-secrets` audit dimension detect a bare `secrets/` directory from the tracked files that name it. - [#3839](#3839) gates skill descriptions at the 1024-character limit and trims every one over it. - [#3846](#3846) fixes an adjacent doc, an in-file pre-existing defect, and an edge case on new code in the open pull request instead of filing an issue for each, and keeps filing for code that runs elsewhere. - [#3847](#3847) refuses skill frontmatter that parses to a list or a scalar, so the description length gate cannot be bypassed. Fixes #3770 Fixes #3699 Fixes #3705 Fixes #3789 Fixes #1819 Fixes #727 Fixes #3710 Fixes #3706 Fixes #3623 Fixes #3687 Fixes #3617 Fixes #3757 Fixes #3790 Fixes #3786 Fixes #3785 Fixes #3772 Fixes #1657 Fixes #3443 Fixes #3824 Fixes #3817 Fixes #3805 Fixes #1666 Fixes #3700 Fixes #3821 Fixes #3771 Fixes #3794 Fixes #3825 Fixes #3690 Fixes #1472 Fixes #3813 Fixes #3719 Fixes #1592 Fixes #3845 🤖 Generated with [Claude Code](https://claude.com/claude-code)



Summary
scripts/local_review.py recordtakes--report, the file the agent-skill reviewer wrote, and no longer accepts a typed--findingscount. The report's first line iscontentDigest: <digest>, and each later non-blank line is one finding.recordrefuses a report that is absent or names another digest. Otherwise it stores the report's sha256 on the pass asreportSha256and derives the count from the report's lines. There is no dispatch-time stamp, per the recorded decision on Bind a Local Review Record to the Reviewer's Actual Report #3699.statusgains areportPathfield, the digest-keyed path in the worktree's git directory where the reviewer writes. A record removes reports written for any other digest. The fieldspr_review.pyreads (covered,receiptProblems,findings) are unchanged.check's printed remedy carries--reportwith the real path, so it still runs as printed once the reviewer has written its report.local-strict-reviewskill's brief has the reviewer write that report. "Running It" says to record only once the harness delivers the reviewer's completion notification, and that text in the driver's own turn is never that notification. The handback route and "Recording the Pass" carry--report, and on the handback route the dispatcher readsreportPathfromstatusitself.scripts/README.mddescribes the newrecordcontract and names the uv no-cache exception at both places it promisesuvxalone can read the action files (Add the uv No-Cache Exception to the scripts/README.md uvx Promise #3705).Closes on promotion: #3699, #3705
Local Review Findings
The first push's local-strict-review edit budget ran out with two
introducedfindings open. Commit d2512ee fixes both, and the pass over that commit found nothing:introduced, fixed: "What It Does" said the pass dispatches a read-only subagent, while the brief now has the reviewer write its report. It now says the reviewer needs an agent type that can write a file.introduced, fixed:read_report'sOSErrorandUnicodeDecodeErrorbranches only reworded a failure thatmain()already reports with exit 2, so they are gone.Filed rather than fixed here: #3804, the typed
--findingscountcanonical_review.py recordstill takes.Verification
python3 tests/test_local_review.py: new cases cover an absent report, a report for another digest, a report with no digest line, the derived count and stored sha256, a header-only report,reportPathsitting in the git directory without moving the digest, pruning, and the removed--findingsflag.tests/test_pr_review.py,tests/test_canonical_review.py, andtests/test_cli_usage.pypass against the changed engine.prose_lint.py --diff origin/develop,ruff format --check,ruff check,repo_gate.py,spec/validate.py, andbuild_dist.py --checkare clean.🤖 Generated with Claude Code