Repository navigation
Description
Problem
Part of #588. This is the whole-object scanning and shared push-selection slice of #329; #818 owns publication commit additions and reuses this boundary.
At origin/main (a0347a715fab580ece45edfcb3d13509620459a8), shell selects and reads whole outgoing Git objects (.devtools/scripts/check-leaks.sh:341, .devtools/scripts/check-leaks.sh:427, .devtools/scripts/check-leaks.sh:443). Push selection depends on Git's ref lines and the actual destination, not cached tracking refs. Move that boundary to tested Go while retaining its complete-history and nondisclosure guarantees.
Acceptance criteria
- AC1:
--rangechecks exactly the objects added by its revision selection, including whole binary and text contents, tree names and merge results, with the frozen shell's results rather than diff-based coverage. - AC2: Every relevant object path retains its current pattern-allowance behavior, including reused blobs with both allowed and ordinary paths, gitlink names and tagged non-commit payloads.
- AC3: Whole commit and annotated-tag contents retain their current findings, including author, committer and tag metadata, nested tags and values removed from the branch tip.
- AC4: Push scans check every supplied ref-update line and both ref names, accepting the existing supported object-ID widths and rejecting malformed input with status 2.
- AC5: Objects excluded from a push scan are exactly those the current destination-selection contract excludes; stale tracking refs and unrelated environment values cannot shrink coverage.
- AC6: A deletion sends no objects; empty input to
--pre-push-hookhas nothing to scan, while empty input to manual--pre-pushretains its HEAD scan. - AC7: Invalid arguments or revisions, shallow history, unavailable destination information when required, failed Git operations, missing or unreadable objects and incomplete object reads fail with status 2, never a clean result.
- AC8: Complete scans retain statuses 0/1, finding order, labels, opaque sensitive locations and stream behavior, without disclosing private values, refs, URLs or sensitive error arguments.
- AC9: Non-functional: existing entry points end as thin shell wrappers that probe Go subcommand support without writes or consuming ref input; missing binary or capability uses frozen shell behavior, while supported execution runs once with unchanged streams and status and never falls back after failure.
- AC10: Non-functional: the scan leaves refs, index and working files unchanged and performs no destination write or history fetch.
- AC11: Non-functional: native behavior works on Linux, macOS and Windows without raising the N-2 binary floor.
- AC12: Non-functional: no temporary matched content remains after success or failure.
Scope and non-goals
In scope: the whole-object contract currently covered by emit_objects, emit_range and emit_pre_push, its task boundary, and consumer documentation of range/manual/hook behavior, fallback and rollback. This issue owns tag payloads (AC2, AC3), ref-line parsing and OID widths (AC4), destination discovery and exclusions (AC5), and zero-line hook versus manual selection (AC6), including when #818 uses that boundary. Hook wiring means only --pre-push and --pre-push-hook mode handling; it excludes hook installation. Read-only destination discovery remains permitted when the existing contract requires it (.devtools/scripts/check-leaks.sh:434); it never supplies write authority. Temporary-content cleanup is current behavior at .devtools/scripts/check-leaks.sh:87.
Coverage: range cases at .devtools/scripts/check-leaks.bats:303, .devtools/scripts/check-leaks.bats:382, .devtools/scripts/check-leaks.bats:478, .devtools/scripts/check-leaks.bats:585, .devtools/scripts/check-leaks.bats:654; ref-line and object cases at .devtools/scripts/check-leaks.bats:752 through .devtools/scripts/check-leaks.bats:880; existing installed-hook mode regression cases at .devtools/scripts/check-leaks.bats:960 through .devtools/scripts/check-leaks.bats:1084; shared-object and failure cases at .devtools/scripts/check-leaks.bats:1346, .devtools/scripts/check-leaks.bats:1382, .devtools/scripts/check-leaks.bats:1390 and .devtools/scripts/check-leaks.bats:1442; shared whole-object tag cases at .devtools/scripts/check-leaks.bats:1890 and .devtools/scripts/check-leaks.bats:1913, owned here for both unscoped and publication-scoped pushes. These existing hook fixtures verify mode behavior without requiring installer changes.
Overlap: preserve origin/main's exported *_PRIVATE_STRINGS matching and nondisclosure behavior. All #501 source-loading changes remain out of scope: worktree/machine source resolution, precedence, configured-source refusal, source notices and provisioning. All #551/#573 changes remain out of scope: gitleaks local/ci modes, full-index snapshots, base resolution, caller changes and local history reduction. This port closes none of those issues.
Non-goals: publication commit additions (#818), staged comparison, .devtools/scripts/install-pre-push.sh and hook installation (#819), the shared-hooks work in #277, gitleaks selection, recursive submodule contents, transformed/split-value detection and preventing hook bypass. #277 is not a blocker for this mode-handling scope. Existing whole-object quirks remain characterized, including tab-name allowances and tag/commit shared-subtree selection. Removing the frozen fallback waits for separate N-2 follow-up work under D9.
Approach
Port the scoped requirements to Go while retaining the frozen shell compatibility behavior. Implementation choices remain open within these requirements.
Dependencies
Blocked by #753 before activation; cite its merged enforcement-protection evidence. #329 tracks the containing migration. #818 depends on this issue for the shared boundary; its publication commit-addition work is not a prerequisite here. #819 owns the installer, and #277 is not a dependency of this issue. #501 and #551/#573 retain the excluded source-loading and gitleaks changes. #661 governs compatibility; #333 owns distribution without requiring consumers to raise their pins for this port.
Size
M. One pull request for the whole-object and shared push-selection boundary, including mode handling; no installer work.
Verify plan
Write failing Go cases for a secret removed at the tip, a shared blob with a non-exempt use and an incomplete object read first. Port every scoped Bats behavior before reducing shell coverage.
- AC1, AC2: real disposable Git fixtures for additions, removal-only and empty ranges, a bare HEAD revision, clean and leaking merges, suppressed diffs, binary/text type changes, mode changes, empty files, renames, reused blobs under mixed and all-exempt paths, gitlinks and tagged blobs/trees. Compare exact outcomes and streams with the pinned shell. Include tab/newline/backslash names and the tag-then-commit shared-subtree regressions without correcting their recorded quirks.
- AC3: commit messages and author/committer identities, annotated and nested tags, and a finding later removed from the tip; each must remain detectable at its recorded object location.
- AC4: both supported ID widths, multiple refs in either order, local and remote names containing synthetic literals, blank lines, missing fields, invalid IDs and surplus fields; assert findings or status 2 as appropriate.
- AC5: known and unknown remote OIDs, a new ref, empty destination, repointed destination, multiple push URLs and stale tracking refs. Assert destination discovery occurs only for the current new/unknown-OID cases with a URL; no URL excludes nothing beyond known line OIDs. No interactive prompt is permitted.
- AC6: deletion-only input and zero-line manual versus installed-hook input; compare exact coverage and status with shell.
- AC7, AC8: missing range operand, invalid revisions, unknown options, shallow repositories, failed destination lookup, failed enumeration, missing objects, disappearing objects, truncated reads, unreadable path data and content resembling an object response. Assert status 2 for misuse or incomplete scanning, no clean acceptance, and no synthetic sensitive bytes on either stream; compare complete result order and diagnostics separately.
- AC9: missing/old/supported command fixtures through the actual consumer path. Record ref input bytes before and after probing; supported output-then-error must propagate once with no shell rerun. A failed capability probe refuses rather than guessing absence.
- AC10: record refs, index and working files before and after every failure class; recording Git/destination fixtures assert no fetch or destination write.
- AC11: native platform tests, unchanged N-2 fixtures and shell parity where available. Record 20 warm process timings against the same 100-commit fixture for both implementations, excluding builds, and investigate regressions.
- AC12: inspect the fixture temporary area after success, findings and each failure class; no matched content may remain. As D6 evidence, review documentation against the tested boundary and exercise its fallback and rollback instructions in disposable fixtures.
- Run the branch binary through
mise run test-leaks, preserving disposable local-destination integration coverage, thenmise run check, fresh coverage and both coverage floors. Check build(agents): protect replacement Go enforcement paths #753's protection of replacement enforcement and registration. Regenerate and validate output if maintained skill sources change. - Definition of done: D1 each AC is verified at the merged head, with the commands and results cited in the pull request's Verification. D2 an independent review approves the exact merged head, and every finding has a recorded disposition. D3 required checks pass with no gate loosened. D4 the leak scans the repository specifies are clean, and every post made for this work (comments, descriptions) passes the per-post leak review before it is posted. D5 every commit is signed. D6 the documentation matches, or the description says
No doc impactwith the reason. D7 every commit carries anAssisted-bytrailer and the pull request carries theprovenance:agent-assistedlabel. D8 the change stays within the pull request size limits. D9 follow-up work, including deferred review findings, is filed as issues, each with a Problem section and numbered acceptance criteria and linking this issue; the pull request's Related section lists them, and any code that defers work links its issue. D10 the merge closes this issue through a closing reference, the project board shows the state Done, and a finalStatus:comment names the merge commit.
Risks
An overbroad exclusion can hide an outgoing object; a changed path association can accidentally exempt a shared blob. Object accounting and exact-destination fixtures bound those risks. Undo: revert this PR to restore the original range and push entry points.
Operator authority
standing rule names the operator: replacement enforcement must be protected under #753 before activation, with its required exact-head owner review. This work authorizes no destination write. The thin-wrapper migration requirement follows #329 and #588.
Metadata
Metadata
Assignees
Labels
Type
Fields
Priority
Work type
Projects
- StatusShow more project fieldsBacklog
Activity
tbhb-agent commentedon Oct 26, 2026
Refinement: NOT READY — clarify whole-object boundary ownership with #818 and record #277 status
Model: gemini-4-argon-high
Checked
originin an independent clone identifiestbhb-dev/devtoolsandorigin/mainresolves toa0347a715fab580ece45edfcb3d13509620459a8.tbhb-dev/devtools#817(title,change:featlabel,Featuretype, body, and zero comments) and the live issues named in the body and prompt:tbhb-dev/devtools#329,tbhb-dev/devtools#588,tbhb-dev/devtools#501,tbhb-dev/devtools#551,tbhb-dev/devtools#573,tbhb-dev/devtools#753,tbhb-dev/devtools#661,tbhb-dev/devtools#333,tbhb-dev/devtools#818, andtbhb-dev/devtools#277.origin/mainsource references cited intbhb-dev/devtools#817:.devtools/scripts/check-leaks.sh:341(emit_objectscomment and implementation at.devtools/scripts/check-leaks.sh:341-411),.devtools/scripts/check-leaks.sh:427(emit_rangeat.devtools/scripts/check-leaks.sh:427-432), and.devtools/scripts/check-leaks.sh:443(emit_pre_pushat.devtools/scripts/check-leaks.sh:434-492)..devtools/scripts/check-leaks.sh:434(read-only destination discovery viagit ls-remoteat.devtools/scripts/check-leaks.sh:475) and.devtools/scripts/check-leaks.sh:87(rm -rf "$tmp"cleanup inon_exit())..devtools/scripts/check-leaks.bats:303,.devtools/scripts/check-leaks.bats:382,.devtools/scripts/check-leaks.bats:478,.devtools/scripts/check-leaks.bats:585,.devtools/scripts/check-leaks.bats:654,.devtools/scripts/check-leaks.bats:752through.devtools/scripts/check-leaks.bats:880,.devtools/scripts/check-leaks.bats:960through.devtools/scripts/check-leaks.bats:1084,.devtools/scripts/check-leaks.bats:1346,.devtools/scripts/check-leaks.bats:1382,.devtools/scripts/check-leaks.bats:1390,.devtools/scripts/check-leaks.bats:1442,.devtools/scripts/check-leaks.bats:1890, and.devtools/scripts/check-leaks.bats:1913all match the claimed range, ref-line, installed-hook, shared-object, failure, and whole-object tag test cases onorigin/main.docs/compatibility.md:1-20, and AC12 temporary matched-content cleanup).mise run test-leaks(mise.toml:584-586),mise run check, coverage floors,#753protection checks, and D1–D10.#501and#551/#573non-goals:Scope and non-goalsandDependencieskeep#501's new private-string source discovery, precedence, notices, and provisioning out of scope, and keep#551/#573's gitleaks--mode local/--mode ciselection, full-index snapshot, base resolver, caller changes, and local history reduction out of scope as non-goals while preserving this scanner's existing literal non-disclosure and history boundary.Operator authority: accurate against.agents/agent-skills.conf:4-9,packages/agents/source/skills/merge-pr/shared/scripts/merge-policy.py:474-595, andtbhb-dev/devtools#753. Replacement Go enforcement packages and subcommand registration must be protected under#753before activation, requiring exact-head owner review (or the golden-only waiver where applicable), and any edit to.devtools/tasks/leaks.tomlfalls undergate_config_pathsat.agents/agent-skills.conf:8.tbhb-dev/devtools#817againsttbhb-dev/devtools#818for whole-object boundary ownership: both issues currently define whole-object push/tag scanning and claim overlapping Bats tests without referencing each other (Gap 1).tbhb-dev/devtools#277(named in parenttbhb-dev/devtools#329):#277is open withlabels: [](notrefinement:readyand not done; its latest comment isRefinement: NOT READY — Go implementation, compatibility coverage, and verification need revision), and#817does not cite#277when excluding installer changes (Gap 2).Gaps
Blocker —
tbhb-dev/devtools#817andtbhb-dev/devtools#818both define the whole-object push and tag boundary instead of one owning it and the other referencing it.At
origin/main, publication-scoped pre-push (emit_publish_pre_pushat.devtools/scripts/check-leaks.sh:672-726) delegates non-commit objects and outgoing tags to the whole-object producer and scanner (emit_objectsat.devtools/scripts/check-leaks.sh:341-411, called at.devtools/scripts/check-leaks.sh:725, andscanat.devtools/scripts/check-leaks.sh:865-869). Currently, neither#817nor#818names the other inScope and non-goalsorDependencies:#817defines whole-object non-commit tag payloads (AC2), whole annotated and nested tags (AC3), push ref-line parsing and OID widths (AC4), destination discovery and exclusions (AC5), and zero-line--pre-push-hookversus--pre-push(AC6), and claims.devtools/scripts/check-leaks.bats:1890and.devtools/scripts/check-leaks.bats:1913.#818also defines push ref-name and zero-line hook/manual behavior (AC6), whole outgoing annotations, followed/nested tags, and non-commit tag payloads (AC7), and destination discovery and OID-width/malformed-line refusals (Verify planfor AC6, AC7), and claims.devtools/scripts/check-leaks.bats:1774through.devtools/scripts/check-leaks.bats:2095(which includes.devtools/scripts/check-leaks.bats:1890and.devtools/scripts/check-leaks.bats:1913).Update
#817(Scope and non-goalsandDependencies) and#818so that#817explicitly owns the whole-object scanning and push-selection boundary (emit_objects,emit_range,emit_pre_push, and the whole-object tag contract) and names#818as the publication-scoped slice that references and reuses#817's whole-object boundary rather than redefining it.Blocker —
tbhb-dev/devtools#277is neither Ready nor done, and#817does not record its disposition relative to#329.Parent issue
tbhb-dev/devtools#329states that the pre-push hook installer (install-pre-push.sh) needs the shared-hooks fix fromtbhb-dev/devtools#277. On live GitHub,tbhb-dev/devtools#277isopenwith norefinement:readylabel (labels: []) and its latest refinement comment isRefinement: NOT READY — Go implementation, compatibility coverage, and verification need revision. While#817listsinstaller changesunderNon-goals, it exercises the installed pre-push wrapper in.devtools/scripts/check-leaks.bats:960through.devtools/scripts/check-leaks.bats:1084(via.devtools/scripts/install-pre-push.shat.devtools/scripts/check-leaks.bats:901,935). Either bringtbhb-dev/devtools#277torefinement:ready(or done) and cite#277in#817'sScope and non-goals/Dependenciesto confirm why installer changes in#277are independent of this slice, or record the dependency if#277must land first.Split
No further split of
tbhb-dev/devtools#817is needed. Whole-object--rangeand unscoped--pre-push/--pre-push-hookshareemit_objects(.devtools/scripts/check-leaks.sh:341-411) andscan(.devtools/scripts/check-leaks.sh:134-247) and fit oneMpull request once the boundary reference withtbhb-dev/devtools#818is explicit.Definition of done
The definition of done for #817 (Feature). Tick each item and give its evidence.
Boxes ticked below indicate planning coverage in the issue's acceptance criteria and verification plan, not completed implementation work.
Evidence: Planned in
Verify plan(AC1, AC2throughAC12andDefinition of done: D1 each AC is verified at the merged head, with the commands and results cited in the pull request's Verification).Evidence: Planned in
Verify plan(D2 an independent review approves the exact merged head, and every finding has a recorded disposition).Evidence: Planned in
Verify plan(Run the branch binary through mise run test-leaks ... then mise run check, fresh coverage and both coverage floorsandD3 required checks pass with no gate loosened) andOperator authority.check-leaks.shwith the repository's private-strings list, and the leak review of each post.Evidence: Planned in
Verify plan(D4 the leak scans the repository specifies are clean, and every post made for this work (comments, descriptions) passes the per-post leak review before it is posted).Evidence: Planned in
Verify plan(D5 every commit is signed).docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.Evidence: Planned in
Scope and non-goals(consumer documentation of range/manual/hook boundaries, fallback and rollback) andVerify plan(As D6 evidence, review documentation against the tested boundary and exercise its fallback and rollback instructions in disposable fixturesandD6 the documentation matches, or the description says No doc impact with the reason).provenance:agent-assistedlabel.Evidence: Planned in
Verify plan(D7 every commit carries an Assisted-by trailer and the pull request carries the provenance:agent-assisted label).Evidence: Planned in
Size(M. One pull request for one whole-object scanning boundary and its two selection forms) andVerify plan(D8 the change stays within the pull request size limits).Evidence: Planned in
Scope and non-goals(Removing the frozen fallback waits for separate N-2 follow-up work under D9) andVerify plan(D9 follow-up work, including deferred review findings, is filed as issues, each with a Problem section and numbered acceptance criteria and linking this issue; the pull request's Related section lists them, and any code that defers work links its issue).Status:comment names the merge commit.Evidence: Planned in
Verify plan(D10 the merge closes this issue through a closing reference, the project board shows the state Done, and a final Status: comment names the merge commit).Round: 1 of 3
tbhb-agent commentedon Oct 26, 2026
Refinement: READY — whole-object range and push boundary,
#818split, and#277disposition are clear and verifiedModel: gemini-4-argon-high
Checked
originidentifiestbhb-dev/devtoolsandorigin/mainresolves toa0347a715fab580ece45edfcb3d13509620459a8.tbhb-dev/devtools#817(open,Feature, labelchange:feat, and its Round 1 comment) and the live issues named in its body:tbhb-dev/devtools#588,tbhb-dev/devtools#329,tbhb-dev/devtools#818,tbhb-dev/devtools#819,tbhb-dev/devtools#277,tbhb-dev/devtools#501,tbhb-dev/devtools#551,tbhb-dev/devtools#573,tbhb-dev/devtools#753,tbhb-dev/devtools#661, andtbhb-dev/devtools#333.tbhb-dev/devtools#817andtbhb-dev/devtools#818:#817explicitly owns the whole-object scanning and shared push-selection boundary (emit_objects,emit_range,emit_pre_push, tag payloads in AC2/AC3, ref-line parsing and OID widths in AC4, destination discovery and exclusions in AC5, and zero-line--pre-push-hookversus manual--pre-pushselection in AC6), including when#818reuses that boundary. Live#818narrows its contract to publication commit additions (--publishandDEVTOOLS_LEAK_MODE=publish), lists#817as a prerequisite inDependencies, and cites#817AC2, AC3, AC4, AC5, AC6, AC7, and AC8 in#818AC7 andVerify planrather than redefining the whole-object and push-selection boundary..devtools/scripts/check-leaks.batsownership between#817and#818:#817claims the shared whole-object tag tests at.devtools/scripts/check-leaks.bats:1890and.devtools/scripts/check-leaks.bats:1913for both unscoped and publication-scoped pushes, and#818delegates those cases to#817. (Note for#818:#818'sCoveragetext excludes.devtools/scripts/check-leaks.bats:1885as belonging to#817, whereas.devtools/scripts/check-leaks.bats:1885-1889is a--publishbinary marker test;#817's ownCoveragecitations are exact and do not claim.devtools/scripts/check-leaks.bats:1885.)#277disposition:#817clarifies inScope and non-goals,Dependencies, andSizethat hook wiring in#817means only--pre-pushand--pre-push-hookmode handling in.devtools/scripts/check-leaks.sh:743-752,847-853, while.devtools/scripts/install-pre-push.sh, hook installation, and#277's shared-worktree hook changes belong totbhb-dev/devtools#819, so#277is not a dependency or blocker for#817.origin/mainsource and test references intbhb-dev/devtools#817:.devtools/scripts/check-leaks.sh:341(emit_objectscomment and implementation at.devtools/scripts/check-leaks.sh:341-411),.devtools/scripts/check-leaks.sh:427(emit_rangeat.devtools/scripts/check-leaks.sh:427-432), and.devtools/scripts/check-leaks.sh:443(emit_pre_pushat.devtools/scripts/check-leaks.sh:443-492)..devtools/scripts/check-leaks.sh:434(comment documenting read-only destination discovery viagit ls-remoteat.devtools/scripts/check-leaks.sh:475) and.devtools/scripts/check-leaks.sh:87(rm -rf "$tmp"cleanup inon_exit())..devtools/scripts/check-leaks.bats:303,.devtools/scripts/check-leaks.bats:382,.devtools/scripts/check-leaks.bats:478,.devtools/scripts/check-leaks.bats:585,.devtools/scripts/check-leaks.bats:654,.devtools/scripts/check-leaks.bats:752through.devtools/scripts/check-leaks.bats:880,.devtools/scripts/check-leaks.bats:960through.devtools/scripts/check-leaks.bats:1084,.devtools/scripts/check-leaks.bats:1346,.devtools/scripts/check-leaks.bats:1382,.devtools/scripts/check-leaks.bats:1390,.devtools/scripts/check-leaks.bats:1442,.devtools/scripts/check-leaks.bats:1890, and.devtools/scripts/check-leaks.bats:1913.Scope and non-goals,Dependencies,Size,Verify plan,Risks, andOperator authorityagainst the Definition of Ready andorigin/main(.agents/agent-skills.conf:4-9,.devtools/tasks/leaks.toml:1-23): all criteria are observable, testable, single-outcome, and free of unapproved implementation detail;#753isopenandrefinement:ready;#501and#551/#573remain non-goals; and every AC ID is proved by concrete checks inVerify plan.Gaps
None
Split
No further split is needed.
tbhb-dev/devtools#817(Size: M) cleanly scopes the whole-object scanning and shared push-selection boundary (emit_objects,emit_range,emit_pre_push, and--pre-push/--pre-push-hookmode handling) into one pull request, leaving publication commit additions totbhb-dev/devtools#818and pre-push hook installation totbhb-dev/devtools#819.Definition of done
The definition of done for #817 (Feature). Tick each item and give its evidence.
Boxes ticked below indicate planning coverage in the issue's acceptance criteria and verification plan, not completed implementation work.
Evidence: Planned in
Verify plan(AC1, AC2throughAC12andDefinition of done: D1 each AC is verified at the merged head, with the commands and results cited in the pull request's Verification).Evidence: Planned in
Verify plan(D2 an independent review approves the exact merged head, and every finding has a recorded disposition).Evidence: Planned in
Verify plan(Run the branch binary through mise run test-leaks, preserving disposable local-destination integration coverage, then mise run check, fresh coverage and both coverage floors. Check #753's protection of replacement enforcement and registrationandD3 required checks pass with no gate loosened) andOperator authority.check-leaks.shwith the repository's private-strings list, and the leak review of each post.Evidence: Planned in
Verify plan(D4 the leak scans the repository specifies are clean, and every post made for this work (comments, descriptions) passes the per-post leak review before it is posted).Evidence: Planned in
Verify plan(D5 every commit is signed).docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.Evidence: Planned in
Scope and non-goals(consumer documentation of range/manual/hook behavior, fallback and rollback) andVerify plan(As D6 evidence, review documentation against the tested boundary and exercise its fallback and rollback instructions in disposable fixturesandD6 the documentation matches, or the description says No doc impact with the reason).provenance:agent-assistedlabel.Evidence: Planned in
Verify plan(D7 every commit carries an Assisted-by trailer and the pull request carries the provenance:agent-assisted label).Evidence: Planned in
Size(M. One pull request for the whole-object and shared push-selection boundary, including mode handling; no installer work) andVerify plan(D8 the change stays within the pull request size limits).Evidence: Planned in
Scope and non-goals(Removing the frozen fallback waits for separate N-2 follow-up work under D9) andVerify plan(D9 follow-up work, including deferred review findings, is filed as issues, each with a Problem section and numbered acceptance criteria and linking this issue; the pull request's Related section lists them, and any code that defers work links its issue).Status:comment names the merge commit.Evidence: Planned in
Verify plan(D10 the merge closes this issue through a closing reference, the project board shows the state Done, and a final Status: comment names the merge commit).Round: 2 of 3