docs(agents): criterion ③'s test is scoped to the branch's own commits — the unranged git log walked all of main and made force-with-lease dead letter - #18351
Conversation
Multi-agent §3 lets a branch be force-pushed with --force-with-lease only while all five criteria hold. Criterion ③ states the bar — nobody else has ever pushed it — and then operationalised it as the author and committer sets of an UNRANGED `git log origin/<branch>`, which walks the branch's entire ancestry, all of `main` included. So the sets are main's whole history plus the agent and the test can never pass for a branch cut from `main`: a reader who follows the words never force-pushes, one who follows the intent does. Re-key the parenthetical to the branch's OWN commits, `git log origin/main..origin/<branch>`. The bar is untouched and criteria ①②④⑤ are untouched; the double-dot range is preferred over a `$(git merge-base …)..` substitution because an empty substitution degrades silently into `HEAD..origin/<branch>` at exit 0 — measured on a constructed control, that reads zero pairs on a branch a second agent had just pushed, i.e. it permits exactly the clobber the criterion forbids. Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr Co-authored-by: Claude <noreply@anthropic.com>
…rce-with-lease-criterion-scope
Contract reviewServed-tier: Reviewing seat: ① Derived judgments
② Semver levelNot applicable — nothing published moves; ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)— PR #18351 / #18178改了什么:AGENTS.md §3「不得强推共享分支」的五条判据里,③「没有别人推过这条分支」的括号检验写的是无范围的 验证:本席在共享检出上复测:本 PR 分支无范围 11 对、两点范围恰 1 对( 一个设计选择,本席确认:dev 没用卡上建议的 要你做的:审 PR #18351,同意即 APPROVE;之后由本席按裁定 C 落地。 顺带:dev 探测时用 Generated by Claude Code |
|
Ruling-C landing provenance — skills seat (signed off, 留守 on this PR), session Generated by Claude Code |
Fixes #18178
The defect
AGENTS.mdMulti-agent §3 allows--force-with-leaseonly while all five criteria hold.Criterion ③ stated the bar — nobody else has ever pushed it — and then operationalised it
as the author and committer sets of an unranged
git logover the branch's remote ref.With no range that walks the branch's entire ancestry, all of
mainincluded, so the setsare main's whole history plus the agent and the test cannot pass for any branch cut from
main. The stated criterion is satisfiable and right; only its operationalisation wasimpossible — a reader who follows the words never force-pushes, one who follows the intent
does, and that divergence is the bug. The card was filed after the dev on #17330 declined to
take a reading it could not prove and shipped four
wip:commits plus a merge instead.The change
One hunk, two lines,
AGENTS.md:473–:474. The parenthetical is re-keyed to the branch'sown commits — the range form
origin/main..in front of the branch ref. Criteria ①②④⑤are untouched, ③'s bar is untouched (same words, same strictness), and the file stays at its
1075-line ceiling with no new line.
BRANCHabove stands for the angle-bracket placeholder the file actually spells; thisbody writes the word instead, because a GitHub body sanitizer eats short angle-bracket
fragments. The file itself is unchanged in that respect — read the diff for the real bytes.
Ratchet and byte budget
wc -l AGENTS.md(ceiling 1075)git diff --statscanLineLengths(the gate's own scanner, budget 120 B) reports 0 offenders on theedited file.
Reverse verification
Taken on this very branch, a real
⚠️ This checkout is shallow, so the unranged sets are truncated relative to the card's
claude/issue-*branch, and on a constructed control.full-history reading (33 / 32 / 1); the shape is what reproduces, and it reproduces exactly.
The one design choice: which scoped spelling
The card proposed
$(git merge-base origin/main origin/BRANCH)..origin/BRANCHand called it aproposal, not a prescription. This PR ships the plain two-dot range
origin/main..origin/BRANCH.Both compute the same commit set — verified on the live branch and on both control branches,
1 / 1 / 2 pairs either way — and the two-dot form is one moving part fewer. The deciding
measurement is how each fails:
That failure is live in this repository, not hypothetical:
git merge-base origin/main REFexits 1 with empty output here for a branch whose base lies outside the shallow window.
Preferring the spelling that cannot degrade into a different question is the same principle
the card is about — a test that answers confidently and wrongly is worse than one that stops.
维护者速读(草稿)
改了什么 —
AGENTS.md多 agent 纪律 §3 里判断「分支是不是只有我一个人推过」的那条命令,从
git log加分支名(走遍整条祖先,包含整个main),改成只看分支自己的提交(origin/main..区间)。正文两行,判据本身一字未动。
为什么改 — 原命令对任何从
main切出来的分支都必然返回「多人」,所以第五条允许的--force-with-lease实际上永远用不了:条文写着允许,测出来永远禁止。按字面读的 agent 从不 force-push,按意图读的会,两种读法分叉本身就是缺陷。已经有一张卡的开发因此多推了四个
wip:提交和一个 merge。风险与代价(含回滚) — 改的是规则文本,不是代码,没有运行时影响。风险是「改松了判据」,
本 PR 用一个构造出来的、确有第二个推送者的分支做了发火对照:新命令仍然读出两组身份、仍然拒绝。
回滚成本 = 还原两行文字。
席位意见 — (留空,待席位定稿)
你要做的 — 这是受管面(
AGENTS.md),需要您的一次授权批准;批准前没有任何 agent 席位会合并、入队或挂 auto-merge,PR 保持 draft。
Acceptance notes
(
check-skill-line-ratchet.mjsrun()logslv.msgunderif (!lv.ok)), so a green runsays nothing about the 120-byte axis for any file. Not a defect class — a silent green is
the normal shape for that gate — measured positively here by calling
scanLineLengthsdirectly instead of reading the gate's silence. Bearer: none; noted for the next author who
cites that gate's green as width evidence.
AGENTS.mdonly, criterion ③'s parenthetical only; :472 and :475–:477 were notre-flowed and not touched.
Landing
Governed surface (
AGENTS.md, Prime Directive #14) —check-governed-merges.mjs --testanswers GOVERNED, 1 of 1 path. The PR stays draft; no reviewer was requested, no
auto-merge armed, nothing flipped. It waits for the maintainer's authorized approval, which
the owning seat requests.
Generated by Claude Code