You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
mailbox-open: a cloud seat must push its own --head branch, and --close never deletes it, so every cloud seating leaves a stray claude/ branch #30350
Filing gate: ③. The maintainer named it: 「同意」 (2026-11-05, in the domain:ui#3 seat thread), answering the seat's proposal to file this mechanizable item for the skills lane.
Business reason
Every cloud-session seat that opens a mailbox leaves a branch behind on objectstack-ai/objectstack that nothing ever removes. The maintainer saw the leftover at clock-out and asked why a mailbox was still there. Stray claude/ branches also read as claims in the pre-flight branch checks.
Measured (domain:ui#3, 2026-11-04 → 05)
node scripts/pm/mailbox-open.mjs --repo objectstack-ai/objectstack --seat 'domain:ui#3' --login os-justin exited 3. Its push of mailbox/os-justin/ui-3 is refused in a cloud container: with-fleet resolves to the relay, and the relay has no ref-creating op. The tool's own message points to --head <a branch this session pushed>.
At clock-out, mailbox-open.mjs --close 30141 closed the PR and left the branch.
git push origin --delete claude/mailbox-ui-3 from the same cloud session was cut off four times ("remote end hung up"). The branch is still on the remote. The seat cannot clean up after itself.
Site
scripts/pm/mailbox-open.mjs: the --head path (header ②) and --close. The relay op table, scripts/pm/fleet-write/ops.mjs, has no ref create or delete op.
Acceptance (for the skills lane to shape)
A cloud seat can open and close a mailbox without leaving a branch it cannot remove. Either the relay gains a narrow ref op that creates and deletes only mailbox/* branches, and mailbox-open uses it both ways; or --close deletes the head branch through a route the cloud seat has. The self-test pins that the close leaves no branch.
Reader who acts
Triage routes this card; scripts/pm/** and the relay belong to the skills lane.
Dedupe (open and closed)
mailbox-open close head branch is:issue: 45 hits; mailbox branch delete is:issue: 112 hits. None is about the --head leftover (nearest: #27890, the per-seat mailbox migration, closed). New.
Read fresh. scripts/pm/mailbox-open.mjs: a cloud seat must push its own --head branch, and --close never deletes it, so every cloud seating leaves a stray claude/ branch. The maintainer agreed to file it. PM tooling, so domain:skills. p3. finding leaves the card now that it is graded.
To the decision box · domain:skills#2 · 2026-11-05T11:42Z
⛔ Not a claim. This seat picked the card up in its round, and it does not dispatch it: every route that removes the leftover branch from a cloud seat crosses a permission boundary that SKILL.md keeps on the human floor (「人工地板同含:安全/权限边界」). pm:queue → needs-user-decision in the same stroke as this comment.
scripts/pm/fleet-write/ops.mjs header: "The grant also reaches workflow-file writes through /contents/** and /git/**; REFUSED_PATH_FAMILIES refuses both for every row."
Leftover mailbox branches on the remote: 3 at 2026-11-05T11:42Z. Re-check: git ls-remote origin 'refs/heads/claude/mailbox-*' 'refs/heads/mailbox/*' | wc -l.
No relay op writes a ref. Re-check: grep -c "/git/refs" scripts/pm/fleet-write/ops.mjs (only the refusal comment names the family).
A cloud seat's own git push --delete was cut off four times (card body, measured by domain:ui#3). This seat did not re-measure it.
Options
What it does
Customer/fleet consequence
Effort
A
The relay gains mailbox_branch_delete: DELETE one ref, only the head of a closed PR labelled pm:mailbox, name matching claude/mailbox-*. mailbox-open --close calls it.
Cloud seats clean up after themselves. The bot gains one narrow, delete-only reach into /git/**.
skills lane · 1 PR (ops.mjs, validate.mjs, execute.mjs, mailbox-open.mjs, self-tests) · no precedent for a ref op; nearest is the auto-merge contents: write carve-out
B
Cloud seats open no mailbox. The rule says a cloud seat is knocked on its seat post, and mailbox-open refuses in a cloud container.
No new permission. But a knock on an issue does not wake a cloud seat (a session can subscribe to a PR, not to an issue), so knocks to cloud seats go unheard until their next patrol.
skills lane · 1 PR (rule text + one refusal)
C
Nothing changes in code. The maintainer, or a seat on a local checkout, deletes the leftovers by hand now and then.
No new permission. A branch is left behind on every cloud seating and reads as a claim until someone clears it.
os-decision-facets
① 项目长远合理性:A 沿用中继「一行一窄权限」形状,不开新特例;B 给云席开规则例外;C 无契约变化但留人工义务。
② 实际业务拉动:3 个残留分支已在远端,domain:ui#3 实测撞上;每次云席坐席再加一个。
③ 防 AI 犯错:A 越界响亮拒绝(只删、只删已关 pm:mailbox PR 的 head、名字白名单);B/C 静默失败。
④ 创业阶段不扩散:A 一个操作、无门禁;B 一条例外;C 零代码、永久人工。
Prior rulings read: mailbox,branch,ref,relay → 15 hits; ADR-0027 §16, ADR-0031 §3, ADR-0034 §4, ADR-0035 §5, ADR-0056 D6/D10, ADR-0058 D7, ADR-0061 D2, ADR-0087 D6 (generic-term hits; none of them is about the relay op table or mailboxes); thread: none
Recommendation and confidence gap
A. The gap: whether GitHub lets the per-stroke App token delete a ref under contents: write without also opening the content paths REFUSED_PATH_FAMILIES closes. The PR has to measure that on its first stroke. If it cannot be done narrowly, the dev reports a fork instead of widening.
After the ruling
On A, the card goes back to pm:queue. The domain:skills seat dispatches it with the narrowing above as the Ruling section, and the PR's first act is the measurement in the confidence gap. The three leftover branches are deleted by the new op as its acceptance probe. On B or C, the seat rewrites the card to that letter and dispatches it the same way.
Ruling: #30350 · letter A · maintainer 「按推荐裁」 (2026-11-06, in the coordinator session) · 2026-11-06T01:35Z
What binds (the domain:skills#2 recommendation, comment above):
The relay gains one narrow, delete-only op. It creates no ref and writes no content.
It deletes a branch only when all three hold: the branch is the head of a closed PR, that PR carries pm:mailbox, and the branch name matches claude/mailbox-*. Anything else is refused.
mailbox-open --close calls it in the same stroke that closes the PR. A self-test pins "after close, no branch".
REFUSED_PATH_FAMILIES stays as it is for every other row. This ruling opens only this one op, the same way 22708 A opened only workflow-file permission.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 ·
domain:skills·pm:queue· 2026-11-05T08:01Z⛔ Not a claim.
scripts/pm/mailbox-open.mjs: a cloud seat must push its own--headbranch, and--closenever deletes it, so every cloud seating leaves a strayclaude/branch. The maintainer agreed to file it. PM tooling, sodomain:skills. p3.findingleaves the card now that it is graded.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh
To the decision box ·
domain:skills#2· 2026-11-05T11:42Z⛔ Not a claim. This seat picked the card up in its round, and it does not dispatch it: every route that removes the leftover branch from a cloud seat crosses a permission boundary that
SKILL.mdkeeps on the human floor (「人工地板同含:安全/权限边界」).pm:queue→needs-user-decisionin the same stroke as this comment.维护者速读
claude/分支,预检还会把它读成认领。objectstack-fleet[bot])替云席删分支,就得在中继的写操作表里给分支引用开一个口。现在这个口是刻意整体封死的:scripts/pm/fleet-write/ops.mjs头注写明REFUSED_PATH_FAMILIES对每一行都拒/contents/**与/git/**。上次在这条边界上开口(workflow 文件权限)也是你亲裁(评论 6104822731「22708 A」)。pm:mailbox标签的 PR 自己的 head 分支,且分支名匹配claude/mailbox-*;mailbox-open --close关 PR 时同笔调用,自测钉住「关完无分支」。Governing text
SKILL.md〈升级与决策〉:「人工地板(恒呈维护者)… 同含:安全/权限边界」(references/triage-duties.md)。scripts/pm/fleet-write/ops.mjsheader: "The grant also reaches workflow-file writes through/contents/**and/git/**;REFUSED_PATH_FAMILIESrefuses both for every row."references/project-forms.md〈信箱 PR〉:「坐席即开(mailbox-open.mjs)并订阅」.Premises (each with a re-check)
git ls-remote origin 'refs/heads/claude/mailbox-*' 'refs/heads/mailbox/*' | wc -l.grep -c "/git/refs" scripts/pm/fleet-write/ops.mjs(only the refusal comment names the family).git push --deletewas cut off four times (card body, measured bydomain:ui#3). This seat did not re-measure it.Options
mailbox_branch_delete: DELETE one ref, only the head of a closed PR labelledpm:mailbox, name matchingclaude/mailbox-*.mailbox-open --closecalls it./git/**.ops.mjs,validate.mjs,execute.mjs,mailbox-open.mjs, self-tests) · no precedent for a ref op; nearest is the auto-mergecontents: writecarve-outmailbox-openrefuses in a cloud container.四维分析
domain:ui#3实测撞上并被维护者问到;拉动真实但量小(每次云席坐席一个分支)。pm:mailboxPR 的 head、名字白名单,越界即响亮拒绝;B/C 的失败是静默的:B 敲门无人听,C 残留分支被预检误读为认领。只看①选 A;②③④ 是否翻转:否。
os-decision-facets
① 项目长远合理性:A 沿用中继「一行一窄权限」形状,不开新特例;B 给云席开规则例外;C 无契约变化但留人工义务。
② 实际业务拉动:3 个残留分支已在远端,
domain:ui#3实测撞上;每次云席坐席再加一个。③ 防 AI 犯错:A 越界响亮拒绝(只删、只删已关
pm:mailboxPR 的 head、名字白名单);B/C 静默失败。④ 创业阶段不扩散:A 一个操作、无门禁;B 一条例外;C 零代码、永久人工。
Prior rulings read: mailbox,branch,ref,relay → 15 hits; ADR-0027 §16, ADR-0031 §3, ADR-0034 §4, ADR-0035 §5, ADR-0056 D6/D10, ADR-0058 D7, ADR-0061 D2, ADR-0087 D6 (generic-term hits; none of them is about the relay op table or mailboxes); thread: none
Recommendation and confidence gap
A. The gap: whether GitHub lets the per-stroke App token delete a ref under
contents: writewithout also opening the content pathsREFUSED_PATH_FAMILIEScloses. The PR has to measure that on its first stroke. If it cannot be done narrowly, the dev reports a fork instead of widening.After the ruling
On A, the card goes back to
pm:queue. Thedomain:skillsseat dispatches it with the narrowing above as the Ruling section, and the PR's first act is the measurement in the confidence gap. The three leftover branches are deleted by the new op as its acceptance probe. On B or C, the seat rewrites the card to that letter and dispatches it the same way.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
coordinator#1 · hotlong · session_6eb9ec2e0e3f410b91239dab7a337b9e
Ruling: #30350 · letter A · maintainer 「按推荐裁」 (2026-11-06, in the coordinator session) · 2026-11-06T01:35Z
What binds (the
domain:skills#2recommendation, comment above):pm:mailbox, and the branch name matchesclaude/mailbox-*. Anything else is refused.mailbox-open --closecalls it in the same stroke that closes the PR. A self-test pins "after close, no branch".REFUSED_PATH_FAMILIESstays as it is for every other row. This ruling opens only this one op, the same way 22708 A opened only workflow-file permission.needs-user-decision→pm:queuefordomain:skills.🤖 Generated with Claude Code