Skip to content

Bind a Local Review Record to the Reviewer's Report File - #3807

Merged
ptr727 merged 6 commits into
developfrom
burndown/3699-review-record
Nov 2, 2026
Merged

ptr727 merged 6 commits into
developfrom
burndown/3699-review-record

Conversation

@ptr727

@ptr727 ptr727 commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • scripts/local_review.py record takes --report, the file the agent-skill reviewer wrote, and no longer accepts a typed --findings count. The report's first line is contentDigest: <digest>, and each later non-blank line is one finding. record refuses a report that is absent or names another digest. Otherwise it stores the report's sha256 on the pass as reportSha256 and 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.
  • status gains a reportPath field, the digest-keyed path in the worktree's git directory where the reviewer writes. A record removes reports written for any other digest. The fields pr_review.py reads (covered, receiptProblems, findings) are unchanged.
  • The receipt format moves to version 2, so a receipt an earlier engine wrote, its pass carrying a typed count, no longer covers.
  • check's printed remedy carries --report with the real path, so it still runs as printed once the reviewer has written its report.
  • The local-strict-review skill'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 reads reportPath from status itself.
  • scripts/README.md describes the new record contract and names the uv no-cache exception at both places it promises uvx alone 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 introduced findings 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's OSError and UnicodeDecodeError branches only reworded a failure that main() already reports with exit 2, so they are gone.

Filed rather than fixed here: #3804, the typed --findings count canonical_review.py record still 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, reportPath sitting in the git directory without moving the digest, pruning, and the removed --findings flag.
  • tests/test_pr_review.py, tests/test_canonical_review.py, and tests/test_cli_usage.py pass against the changed engine.
  • prose_lint.py --diff origin/develop, ruff format --check, ruff check, repo_gate.py, spec/validate.py, and build_dist.py --check are clean.

🤖 Generated with Claude Code

ptr727 and others added 3 commits November 2, 2026 08:32
`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>
Copilot AI lite review requested due to automatic review settings November 2, 2026 16:43
@coderabbitai

coderabbitai Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@ptr727

ptr727 commented Nov 2, 2026

Copy link
Copy Markdown
Owner Author

A recorded local strict-review pass covers head 79f05812c89427b363b72cf6cab6c24f8df3ab93, the content this pull request carries at that commit against develop, and it recorded 2 findings.

"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>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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 uvx no-cache exception.
  • Regenerates the distributed local-strict-review skill 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

Comment thread scripts/local_review.py Resolved
Comment thread scripts/local_review.py Resolved
Comment thread scripts/local_review.py Resolved
@ptr727

ptr727 commented Nov 2, 2026

Copy link
Copy Markdown
Owner Author

A recorded local strict-review pass covers head d2512ee96c85f665bdd1f80543db390d34a65c83, the content this pull request carries at that commit against develop, and it recorded 0 findings.

ptr727 and others added 2 commits November 2, 2026 08:49
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

codecov Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.77%. Comparing base (23c7d78) to head (28ceefb).
⚠️ Report is 1 commits behind head on develop.

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              
Flag Coverage Δ
python-3.13 82.77% <100.00%> (+0.04%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ptr727

ptr727 commented Nov 2, 2026

Copy link
Copy Markdown
Owner Author

A recorded local strict-review pass covers head 28ceefbb0d2e285fa474ba794fb855251b99ec2b, the content this pull request carries at that commit against develop, and it recorded 0 findings.

@ptr727
ptr727 merged commit d7255dd into develop Nov 2, 2026
13 checks passed
@ptr727
ptr727 deleted the burndown/3699-review-record branch November 2, 2026 17:14
ptr727 added a commit that referenced this pull request Nov 3, 2026
…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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants