Repository navigation
feat(source-control): trust a size-split sub-issue's task lines in the merge gate - #9945
Conversation
…ts them pr-merge's spec-trust check now mirrors Issue Triage's split-child rule (admit.mjs splitChildBody): a linked issue the lanes App wrote counts when its task lines come verbatim from its listed-human parent's text or from the newest unedited intake refinement its header names. The sub-issue, its parent and the parent's comments are read in one GraphQL call under the Actions token, only for an App-authored issue. The shared vectors file is copied byte for byte so the gate's test runs every case. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-issue The gate's split-child rule now matches Issue Triage's tightened splitChildBody: an unedited sub-issue the lanes App filed counts only when every line after its header is one of the parent's trusted task-list lines, those starting with admission's `task-list` prefix. The prefix is read from admission-rules.json at the base branch, once per reader and only for an App-authored issue; a missing or empty prefix counts nothing. The refinement-source path is gone, as in the JS. A failed read of the sub-issue, its parent or the rules now refuses verify:unreadable, as resolve-pr.mjs fails on it; a cut comment read stays untrusted. The shared vectors file is copied byte for byte from the Issue Triage branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LY6PpXaikB8J2tRLeypMmn
A split-child answer the reader reuses for a later queued pull request now notes again when each read behind it was taken (the task-list rule, the child and parent, the trusted list), so `_kept_recently` dates that judgment by its oldest input as for a fresh read. The task-list read notes its time on every answer, as the trusted-list reads do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LY6PpXaikB8J2tRLeypMmn
An edited sub-issue now counts only when every line after the header is one of the parent's trusted task-list lines, or that line with its one `[ ]` ticked to `[x]` or `[X]` (indent and text unchanged), matching admit.mjs splitChildBody and tickedForms. A task-list prefix without exactly one `[ ]` takes exact lines only. All 21 shared vectors pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LY6PpXaikB8J2tRLeypMmn
… fix a code span Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LY6PpXaikB8J2tRLeypMmn
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
claude-security-review reviewed No security findings. critical-findings: 0 I read the change under the diff, What the change does. Checked against
Docs and changelog fragments: prose only. They describe the same rule and add no standing instruction that removes a control. Cost: no billed resource or plan change. The gate now makes one extra GraphQL read plus one contents read per lanes-App-filed linked issue, which draws only on the job's Actions token. The residual risk is the shared design (the JS and Python copies must be kept in step), which the shared |
|
claude-review reviewed Code review: PR #9945 (split-child trust in the pr-merge verifier-evidence reader)No findings. I read the whole diff (6 files) and the PR context. The PR closes no issue (it only says What I checked
Author-claimed and not checked by meThe 2895-test pass, the 21 of 21 shared vectors, the mutation checks and the 59-case differential run against the JS are from the PR description. I did not run them. The new test file covers the vectors, the edited-path ticking rule, failed reads, a cut comment page, a missing Minor, not counted
No cost or critical-security hold. This is not a billing change, and it narrows trust rather than widening it: it trusts a lanes-App-filed sub-issue only when every line is a listed human's task-list line. |
Refs: #9906
Summary
pr-merge's Python verifier-evidence reader now applies the split-child trust rule that pr-verify's JS applies (#9906, hardened in #9940). An issue the lanes App filed counts as trusted spec only when it is a size split's sub-issue of a native parent written by a listed human, and its lines are that human's task-list lines. The owner confirmed the tightened rule on 2026-10-25, relayed by Issue Triage.
Fix
split_child_body(babysit_verify_evidence.py):task-listread fromadmission-rules.jsonat the base branch. A missing or emptytask-listcounts nothing.[x]or[X]). A marker without exactly one box allows exact lines only._split_childreads the child, its parent and the rules once per reader. Any failed read isverify:unreadable, matching resolve-pr's throw. A cut comment page counts nothing. A reused answer re-notes when each read behind it was taken.Verification
.github/scripts/intake-triage/split-child.vectors.jsonmatches main byte for byte (blob 06da3284): 21 of 21 vectors pass.python3 -m unittest discover -s tests -t .(babysit-prs scripts): 2895 tests OK.Related
🤖 Generated with Claude Code
https://claude.ai/code/session_01LY6PpXaikB8J2tRLeypMmn