Repository navigation
.claude: allow the relay's landing strokes in settings.json; landing-operations names the direct invocation - #23442
Conversation
…the direct invocation settings.json permissions.allow gains the fleet-write relay entry point (plain and --use-env-proxy), beside the other scripts/pm write tools, so a seat can run the pr_ready + automerge_enable landing strokes without a prompt. landing-operations.md names the direct invocation (no wrapper in front: the allow rule matches the command as typed) and the write-pace retry; two restatements (the Adopts close, already in external-contributions.md, and the D-section auto-merge line, already in the line above it) pay for the two lines, so the file stays at its ceiling. Claude-Session: https://claude.ai/code/session_01LqNgdPZB2Jnr5HpGbaqLeB Co-authored-by: Claude <noreply@anthropic.com>
维护者速读(终稿)· PR #23442 · 席位已对照 diff 逐行校正,2026-10-14T08:57Z改了什么: 为什么改:你的话:「给 Bash 加一条许可规则,允许 scripts/pm/fleet-write/dispatch.mjs 的落地写入(pr_ready / automerge_enable),以后 Tier S 的 PR 我就能按登记册自己落地」「这个你应该派卡开发」。本会话的 auto 分类器先后以「Self-Approval」「Merge Without Review」拒了 #23417、#23389 的中继落地笔画,又以「Self-Modification」拒了 agent 自改许可清单;你关掉 auto 并授权(「我去掉了 auto,你现在可以改吗」「我授权你执行相关所有的高风险修改」)后,开发按备好的 diff 逐字重跑,权限层放行。 风险与代价(含回滚):这条许可匹配整个中继脚本,覆盖它封闭 op 表里的全部写入(评论、标签、建卡、开 PR、入队、转移、限定的 workflow_dispatch),和现有 post-stamped / label-write / close-cards / issue-create 规则同一形状;闸门仍是中继自己的 op 校验、 席位意见:建议落地。两轮都在认领面内;18 个派生门禁族全跑全绿,五个具名检查绿,受管预检读 Tier S。一处面外小漂移( 你要做的:无。 |
Contract reviewServed-tier: PR #23442, card #23432 (ruling 6164613078, letter A on both questions, the maintainer's authorisation quoted there). Governed by path: ① Derived judgments
② Semver levelNo package's ③ Boundary flagsThe dev raised two open questions in round 1 (authorship; the glob's scope), both ruled A (6164613078); round 2 raised none. Deviations accepted in the ACCEPT ( Implemented-by: VERDICT: PASS |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 38539409668 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Fixes #23432
Clause-②: no
Adds the fleet-write relay's entry point to the repository's Claude Code permission allow-list, so a seat runs the Tier S landing strokes (
pr_ready+automerge_enable) without a permission prompt. The landing reference now names the direct invocation. The card closes on landing (ruling 6164613078 returned it topm:dispatched; the seat records the post-landing live proof on the closed card).The two allow entries
.claude/settings.json,permissions.allow. Both lines go directly after"Bash(node scripts/pm/label-write.mjs *)", plain first and then--use-env-proxy, the pair order theclose-cards/issue-create/issue-transferpairs already use. Nothing else in the file moves (+2/-0, JSON parses).The reference line, before and after
.claude/skills/pm-dispatch/references/landing-operations.mdhas ratchet ceiling 101 and is 101 lines both before and after (+2/-2).Before (line 51):
After (line 51 unchanged; lines 52-53 new, 119 and 95 bytes):
The two command spans alone are 118 bytes, so the sentence cannot fit one 120-byte line. Two restatements are deleted to pay for the two new lines, so the ceiling is not raised:
external-contributions.md:14, which states the same close in the same act, with the same thanks and landing link. Line 7 of this file already routes every fork PR to that reference, and that reference's back-pointer names line 7, not line 69.os-dev.md(the dev never merges). Its dev-facing half addresses a reader who never opens this seat-only file.git grepoverscripts/and.github/finds no hit.Why the invocation must be direct
A
Bash(...)allow rule matches the command as typed: the literal prefix before the rule's glob.rest-channel.md:38states the same for the curl rules, andrest-channel.md:13records that assignment andcd ... &&prefixes fall to the classifier. Any wrapper in front makes the typed command start with something other thannode scripts/pm/fleet-write/dispatch.mjs: abash -cshell,with-fleet.sh --, or a scratchpad pacing script. The rule then never matches, and the stroke goes back to the classifier that refused these strokes as "Self-Approval" and "Merge Without Review".The write-pace refusal is exit 10:
EXIT_WRITE_PACE_REFUSEDinwrite-pace.mjs, whichdispatch.mjsreports as "throttle refused". It is the one refusal the seat retries itself, oncewrite-pace.mjs --statusshows a free slot, instead of wrapping the call in its own pacing loop.Scope: the glob admits every op in the relay's closed table (
fleet-write/ops.mjs), not only the two landing ops. The director seat's reading on the card (comment 6164270805) chose the carded glob.validate.mjs, the write pace and the queue's governed-surface guard stay the gates, the same shape that already coverspost-stamped,label-write,close-cards,issue-createandissue-transfer.维护者速读(草稿)
改了什么:
.claude/settings.json的许可清单加两条规则(普通写法与--use-env-proxy写法各一),允许席位会话不经弹窗直接运行舰队写中继scripts/pm/fleet-write/dispatch.mjs。landing-operations.md写明两件事:落地笔直接敲这条命令、前面不套壳;写节流拒(exit 10)后等--status显示有空槽再重试。为守住该文件 101 行上限,同时删掉两条在别处已有的重复规则。为什么改: Tier S 落地(
pr_ready+automerge_enable)要经这条中继命令,而会话权限分类器曾把它拒为 "Self-Approval" 与 "Merge Without Review",席位无法按登记册自己落地。这是你在卡上要求的改动。本 PR 由 dev 在你明确授权后编写:第一轮 dev 遇分类器以 Self-Modification 拒绝,随即停手并回退未提交的改动;之后你在席位会话中授权,原话(经席位转述):「我去掉了 auto,你现在可以改吗」。dev 据此重做了同一份已备好的 diff。风险与代价(含回滚): 规则用
*通配,放行的是中继闭合 op 表里的全部操作(开 PR、改卡、转卡、白名单内的workflow_dispatch等),不只落地两步。把关的仍是三道:中继自己的validate.mjs、写节流write-pace、合并队列的受管面守卫。没有达档复核记录或你的批准,受管面 PR 仍进不了队列。回滚:revert 本 PR 即删掉两条规则,落地回到每次弹窗。席位意见(留空):
你要做的: 本 PR 自己的落地需要你 Approve 一次,规则落地后 Tier S 由席位按登记册落地。
Acceptance notes
All readings below are at head
8e5999ccd, on baseorigin/main04a314873.node -e "JSON.parse(require('fs').readFileSync('.claude/settings.json','utf8'))": exit 0.git diff origin/main --stat: settings +2/-0; the reference 4 lines changed, +2/-2, 101 lines.pnpm -s check:pm-skill-ratchet: exit 0. Its reading:landing-operations.md is 101 lines (ceiling 101; headroom 0).pnpm -s check:pm-skill-id-lint: exit 0,87 file(s) clean.pnpm -s check:pm-governed-prose: exit 0.pnpm -s check:nul-bytes: exit 0,no raw ASCII control bytes.pnpm -s check:skill-frame-sync: exit 0.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 18 families. All were run, and the record carries exit codes.--ranreports:18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN(a DERIVED zero). One family,@objectstack/lintcheck:doc-formula-expressions, first exited 3 with PREREQUISITE NOT MET (formula and lint not built, nothing measured). Afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock (VERDICT command-exit 0), it exited 0.node scripts/pm/check-governed-merges.mjs --test .claude/settings.json .claude/skills/pm-dispatch/references/landing-operations.md: exit 3, which is the GOVERNED verdict on--test. Both paths fall under.claude/**, so the PR is Tier S, governed whole. It stays a draft, and the dev never readies, queues, arms or approves it..claude/**, soskip-changesetis owed. The dev applies no labels in this order, so Check Changeset is expected red until the seat applies the label.Part of, notFixes. The card carriesneeds-user-decision, and the dev protocol never writes a closing keyword against a card in the decision box. The card's live-proof acceptance item also stays open after merge. Once the ruling act clears the label, the seat may edit the first line toFixes.landing-operations.md:59says 落地前检三条, whilecontract-review.md:32says 落地前检两条.Generated by Claude Code