Repository navigation
docs(pm-dispatch): landings go through the fleet-write relay; the ccr pair is retired - #20070
Merged
objectstack-fleet[bot] merged 1 commit intoSep 25, 2026
Merged
Conversation
… pair is retired The seat's ready flip and auto-merge arm now name the relay ops (pr_ready + automerge_enable, reverse pr_draft / automerge_disable) and their spelling; a classifier denial still stops the landing and is recorded, and the retired ccr pair is not a fallback. Line-neutral in all four ratcheted files. Claude-Session: https://claude.ai/code/session_01LNRg6FUMXYWgkAbDsfZpC8 Co-authored-by: Claude <noreply@anthropic.com>
objectstack-fleet
Bot
deleted the
claude/issue-20048-relay-landing-route
branch
September 25, 2026 02:30
This was referenced Sep 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #20048
Clause-②: no
What this changes
The maintainer answered the card's open choice in the skills seat's session, verbatim: 「B:走中继落地(推荐)」. The seat's landing (ready flip + auto-merge arm, and their reverse) now goes through the fleet-write relay as
objectstack-fleet[bot]. The two allow-listed ccr commands are no longer a landing route. A classifier denial during landing still means: stop, report to the maintainer, record the command and the reason on the card. The text now says the fallback does not exist: never respell, never go back to ccr.Text only, in four ratcheted files, line-neutral in each (in-place rewrites, no re-wrap, no ceiling touched):
.claude/skills/pm-dispatch/SKILL.md.claude/skills/pm-dispatch/references/landing-operations.md.claude/skills/pm-dispatch/references/rest-channel.md.claude/skills/pm-dispatch/references/platform-readings.mdEvery ccr hit under
.claude(git grep -n ccr -- .claude), decided one by onelanding-operations.md:51ccr pair is the only landing routepr_ready+automerge_enable, spelling pointed torest-channel.mdlanding-operations.md:54"never switch to the relay"SKILL.md:201ready/draft goes the ccr wayrest-channel(where the spelling lives)rest-channel.md:17"dispatch.mjshas no allow row"dispatch.mjsdirectly is for landing onlyrest-channel.md:51ccr ready flipwith-fleet.sh --via dispatchcarries the same opsrest-channel.md:55ccr auto-mergepr_draft/automerge_disablemarked as never called for realrest-channel.md:56ccr 422 on draftpr_readygoes first in the file. The executor stops at the first failure and does not try later actions (fleet-write/execute.mjs)rest-channel.md:34ccrreview_threadsread ·:54ccr resolve/unresolveplatform-readings.md:48"undraft single channel = ccr"platform-readings.md:49"this route eats the session GraphQL pool"platform-readings.md:138·:146ccr as the draft-flip / arm route in the quota sectionplatform-readings.md:162"ccr route 429 at full budget"platform-readings.md:435content-based denial reading[Self-Approval]fact is kept, and the ccr flip denial is added beside it ("ccr 翻转亦拒").claude/settings.json:61-66ccr allow rowslanding-operations.md:53(undraft hits 429, wait forresets at) does not name ccr and is left as it is. How a 429 surfaces under the relay has not been measured.The relay spelling, measured (dry run only; nothing was sent, no real PR was landed)
node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file land.json --dry-runwithland.json=[{"op":"pr_ready","pull":20022},{"op":"automerge_enable","pull":20022}], exit 0:bash scripts/pm/with-fleet.sh --via dispatch --repo objectstack-ai/objectstack --actions land.json --dry-runalso exits 0. It printswith-fleet: transport dispatch — the actions file goes through the fleet-write relay as objectstack-fleet[bot]and hands the same payload todispatch.mjs. Both spellings work.with-fleet.shtakes--actions, anddispatch.mjstakes--actions-file.The ops exist in
scripts/pm/fleet-write/ops.mjs:pr_ready/pr_draft(pull-requests) andautomerge_enable/automerge_disable(contents), each withrequired: ['pull'], each one GraphQL mutation. The ✓ on the relay line rests on the card's reading: in the cli seat's session, under auto mode, the relay readied and armed three PRs with zero denials.Deviation: the two allow rows are NOT in this PR
The dispatch asked for two allow rows in
.claude/settings.json:These would sit beside the
post-stamped.mjspair. The edit was denied by this session's auto-mode classifier, reason[Self-Modification]. It was not retried in any other form. The card's own acceptance note already puts a settings row on the maintainer's hand, so the two rows above are left for the maintainer to add. Without them, each relay landing call is judged by the classifier one by one. The card's reading is three passes in three calls. Note what the rows cover:dispatch.mjs *admits every op in the closed table, not only the four landing ops.Question for the maintainer
.claude/settings.json:61-66) be deleted now that the text retires the ccr pair? This PR leaves them in place, because that is your surface.Gates (run on
d32057c6)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 22 commands. All 22 exit 0, pluspnpm check:pm-settings-deny-roster(exit 0). That makes 23 runs, and--ranreconciles them: "22 derived famil(ies) accounted for — 22 run, 0 NOT-MEASURED". Among them:check:pm-skill-ratchet,check:pm-skill-id-lint,check:skill-frame-sync,check:doc-authoring,check:pm-governed-merges,check:pm-governed-prose,check:pm-half-states,check:nul-bytes.check:doc-formula-expressionsfirst exited 3 (PREREQUISITE NOT MET, formula not built). It exited 0 afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lint.check-governed-merges.mjs --teston the four paths reports GOVERNED — Tier S.No changeset:
.claude/**does not ship.Acceptance notes
scripts/pm/check-settings-deny-roster.mjs's header still says the ccr auto-merge route "already serves every real enqueue". That header comment is now stale. Nobody else is working on this file.platform-readings.md:48no longer says "bare GraphQL refused". It referred to GraphQL mutations sent with the session's credentials. The relay sends the same mutations with the App token, so the line would now mislead.维护者速读(草稿)
改了什么:PM 技能里「转 ready + 挂 auto-merge」的落地路,从 settings 放行清单里的 ccr 两条 curl 命令,改成 fleet-write 中继(以 objectstack-fleet 机器人身份写)。四个技能文件逐行原地改写,行数一行没加。
为什么改:auto 模式下,放行清单里的 ccr 命令照样被权限分类器拒绝,而旧文本又禁止改走中继。结果是席位一旦被拒,就完全没有落地路,已验收的 PR 只能等人手动落地。中继路在同样条件下三次零拒。你已选定方案 B:走中继落地。
风险与代价(含回滚):只改文字,不改代码,不加门禁。中继的反向两个 op(转回 draft、卸载 auto-merge)还没真实调用过,文中已标「未实调」。原计划加的两条 settings 放行行被本会话分类器以 Self-Modification 拒掉,本 PR 不含。回滚就是 revert 本 PR。
席位意见:
你要做的:① 在
.claude/settings.json加上正文列出的两条dispatch.mjs放行行(可选;不加的话,每次中继落地都要逐次过分类器)。② 决定六条 ccr 放行行删不删。Generated by Claude Code