Skip to content

docs(pm-dispatch): a fork PR closes in the same stroke that closes its card - #19895

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-19883-fork-pr-close-at-landing
Sep 23, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-19883-fork-pr-close-at-landing

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #19883
Clause-②: no

维护者速读(草稿)

改了什么:三份 PM 协议细则文件,共 +5 / −3 行。① 采纳了 fork PR 的卡,正文恒带一行行首 Adopts: #M(M = 那个 fork PR 的号),立卡那一笔就写;② 落地收口清单(确认 MERGED、给卡收口的那一笔)加一行:卡带这一行,就在同一动作里给 fork PR 贴致谢 + 落地链接并关闭它;需求被拒(卡关 not_planned)时,关卡那一笔同样贴致谢与谢绝理由并关闭;③ 分诊席每次读的职责文件加一行:每次 fire 扫开着的 fork PR,没卡就立卡,卡已关而 fork PR 还开着就补关。两份有行数上限的文件各加一行、各退一行同文件里已原样写着的重复内容,上限不动。

为什么改:维护者原话「这种pr应该写个评论直接关闭。」「"这种 PR"都应该这样处理,开一个 skills 卡片」。外部贡献者的 PR 在需求已由内部 PR 落地后被晾了两天没人关:这条规则只写在一份落地时没有席位会读的文件里,落地收口清单里没有这一步,卡上指向 fork PR 的只是一段散文。另外核实发现,「分诊每次 fire 扫 fork PR」这一步本身也不在分诊席每次读的职责文件里,只在那份没人读的文件里。

风险与代价(含回滚):纯文本改动:不加门禁、不加脚本、不加巡查行、不动行数上限。代价是分诊每次 fire 多一次「列出开着的 PR」的读取(当前 23 个开放 PR,0 个 fork),以及卡正文多一种行首拼写 Adopts:。退掉的两行,其每一句在同一文件里都还在(逐条对照见下文表格)。回滚 = revert 这一个 squash commit。

席位意见:

你要做的:无需点击。本 PR 只碰 .claude/**,属 Tier S,由 skills 席在席内契约复核 PASS 后走队列落地。若不希望分诊每次 fire 都扫 fork PR(只保留落地那一笔),在本 PR 评论一句即可,删掉 triage 那一行。

What this PR does

Three files under .claude/skills/pm-dispatch/references/, +5 / −3.

  1. external-contributions.md (the fork-PR playbook)
    • Step ①: the card behind a fork PR always carries a line-start Adopts: #M (M = the fork PR's number). It is written in the stroke that files the card, or that attaches the fork PR to a card that already exists. The landing closeout and the triage catch-up read only this line.
    • Step ③: the line "after the internal PR lands, close the fork PR with thanks and the landing link" becomes: the stroke that closes the card also closes the fork PR its Adopts: line names. On completed the closing comment carries thanks and the landing link. On not_planned it carries thanks and the reason the need was declined. The declined case had no text before.
    • The sentence that limits a seat's comments on a fork PR is rewritten, not worked around. It used to say "only these two kinds" after naming review comments and the close. It now names them: apart from step ①'s fixed comment, a seat writes review comments and the closing comment, and nothing else. The declined form is the closing comment's second form, not a third kind.
  2. landing-operations.md §B, the MERGED closeout, the home of "the landing stroke": one line directly after the Part of / Fixes closeout line. A card closing completed with an Adopts: line means the same action posts thanks and the landing link on that fork PR and closes it.
  3. triage-duties.md: one line at the end of the backlog-sweep block. Every fire also scans open fork PRs. No card: file one per step ①. Card already closed: close the fork PR per step ③.

Why this shape — the four axes

The card offers two candidates, A (at the landing step) and B (in the triage sweep), and leaves the shape to the seat. SKILL.md's order for a failure fix is: remove the construct that allows the error, make the right form the only spelling, and only then add a check.

  • Remove the construct. The miss was allowed because the close was a separate, later act. It was written only in external-contributions.md, and no seat reads that file at MERGED. The landing seat reads landing-operations.md, whose closeout list had no fork-PR item. The card named its fork PR only in free prose: an "Adoption of PR" section and a promise to close it "in the landing stroke". Shape A removes the construct: the close is now an item of the closeout list itself, in the same action that closes the card.
  • One spelling. Adopts: #M, line-start and undecorated, the same form as Blocked-by:. It has three named readers: the landing closeout, the triage catch-up, and step ①'s "does this fork PR already have a card". Measured on the one case: the fork PR's timeline carries 10 cross-references from other issues and PRs, one of them its card. The line is what picks the card out of the ten.
  • Check. None is added: no gate, no half-state row, no ratchet. Neither ruling sentence names one, and a new gate defaults to no. B is one prose duty line on a scan the triage seat already owes by step ①. It is not a patrol row.
  • Why B at all, with A in place. The declined case has no other reader. A not_planned close happens in several seats' flows: a triage first-touch close, a decision-box answer, a falsified premise. The one file every seat reads is SKILL.md, which sits at 319 / 319 and is held by PR docs(pm-dispatch): name objectstack-fleet[bot] as the write identity #19890. The triage fire is the one reader that sees every closed card's fork PR, and it is also the backstop if a landing stroke misses one.
  • Real business need (measured). Fork PRs are rare: 1 among the 500 most recent closed PRs (created 2026-09-17T18:37Z .. 2026-09-23T14:41Z). That one is the fork PR that was missed. 0 of 23 open PRs are forks at 2026-09-23T15:29:57Z. The maintainer's word covers every such PR, and the one miss cost an outside contributor two days of silence.
  • Startup focus. +2 lines net across the corpus. Both ceilinged files stay at their ceilings: landing-operations.md 101 / 101, triage-duties.md 120 / 120. external-contributions.md goes 16 → 18; that file is not in the ceiling map.
  • Rejected alternative. Teach scripts/pm/close-cards.mjs to read Adopts: and refuse a card close that does not also close the fork PR. That is structurally the strongest shape, but it is a new mechanical check that no maintainer word names, and it is outside this card's claimed file surface.

Premise check, on origin/main at dabf8d7

Retired lines: every clause is still stated in the same file

retired where each clause still stands
landing-operations.md old :19, "follow to MERGED; after enqueue the watch belongs to the lane PM's landing window: every round read the queue branch and origin/main" §B heading 「跟到 MERGED 为止;入队后的看护归车道 PM 落地窗口」 and §B 「确认 MERGED 要两个读数:每轮同时读队列分支与 origin/main。」
triage-duties.md old :8, "the tool-loading discipline binds only the triage fresh session's opening; execution seats and devs are not bound" line 3: the file is the triage seat's alone. Line 6 「fire 开局只按名加载…判定本轮有活才加载其余」 and line 7 「⛔ 分诊 fresh session 开局不做泛关键词 ToolSearch」 are both scoped to the opening already.

Neither retired line is quoted anywhere else in the tree (git grep over both texts: the only hits are the lines themselves).

Gates, on 4a3242c

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derives 18 families from the 3 changed paths, merge base dabf8d795. All 18 were run, each exit captured before any pipe. --ran verdict: ✓ dispatch-gates --ran: 18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code and none of them is 3).

  • pnpm check:pm-skill-ratchet: exit 0. landing-operations.md is 101 lines (ceiling 101; headroom 0); triage-duties.md is 120 lines (ceiling 120; headroom 0). Every changed line is 120 bytes or less.
  • pnpm check:pm-skill-id-lint: exit 0, 34 file(s) clean (pattern /#[0-9]{3,}/g). No rule line cites a tracker number.
  • pnpm check:pm-governed-prose (named by the dispatch, outside the derivation): exit 0.
  • pnpm check:nul-bytes: exit 0, no raw ASCII control bytes.
  • pnpm check:skill-frame-sync: exit 0.
  • pnpm check:pm-half-states: exit 0, 4912 cases pass.
  • pnpm check:pm-governed-merges: exit 0.
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions: the first run exited 3 (PREREQUISITE NOT MET, @objectstack/formula and @objectstack/lint not built). After turbo run build for those two packages under the verify lock (VERDICT command-exit 0), the re-run exited 0.
  • The other 10 derived families (closing-keyword parity ×2, comment-mask corpus, harness-current, agent-test spelling, cross-package test inputs, doc authoring, driver-memory census, gitlink, refd-timer probe, watch-hint literal): exit 0.

No package is touched, so there is no build closure and no package test to run. Nothing here is published (.claude/**), so this PR carries skip-changeset.

Acceptance notes

  • SKILL.md's phase-file index names no reader for references/external-contributions.md. After this PR both executing seats' files point at it (landing-operations.md line 7, triage-duties.md), so no index row is owed. Carrier: none.
  • references/external-contributions.md is not in the line ratchet's ceiling map, while the other pm-dispatch reference files are. Stated as a fact, not a gap. Carrier: none.
  • A fork-PR card that closes as duplicate is not covered: its Adopts: line would need to move to the surviving card. There are 0 instances. Carrier: none.
  • check-half-states.mjs's H65 message quotes triage-duties.md as 「选层按 fire 时刻,⛔ 不用计数器;简报写明本轮跑的层」, but the file says 「选层按 fire 时刻 ⛔ 不用计数器,简报写明层」. This is report-only message text. Carrier: none.

Generated by Claude Code

…its card

A fork PR whose need landed internally was left open because its close
was prose in a file no landing reader reads at MERGED. The card now
names its fork PR on one line-start `Adopts:` line; the landing
closeout closes that fork PR with thanks and the landing link in the
same stroke; a not_planned close carries the decline; and the triage
fire gains the fork-PR scan (with a closed-card arm) that its duty file
never listed. Each added line in a ceilinged file is paid by retiring a
line whose content the same file already states.

Claude-Session: https://claude.ai/code/session_01A22sUB3mUWs6M36VgfijBq
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Sep 23, 2026
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 23, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 4a3242c3f5

Rendered in-seat by the domain:skills seat 1 at 2026-09-23T15:51Z on the diff of head 4a3242c3f5 against origin/main (three-dot), read from the branch, ⛔ not from the report; the card (#19883) and its maintainer word were the only other inputs.

① Derived judgments

  • The diff touches one of the five review faces — governed rule text under .claude/skills/pm-dispatch/references/ (three files, +5 / −3) — and no published schema, doc tree, changelog or changeset. No accept set and no public surface moves; Clause-②: no is correct.
  • external-contributions.md: (a) a new line-start directive Adopts: #M on the card behind a fork PR, written in the filing or attaching stroke, the only spelling the closeout and the backfill read — a closed spelling in the Blocked-by: form, judged right over prose; (b) step ③ now binds the fork-PR close to the stroke that closes the card, completed with thanks and the landing link, not_planned with thanks and the decline reason (the declined case had no text before) — the maintainer's word 「这种pr应该写个评论直接关闭」 executed as a closing act, not an afterthought; (c) the comment-set sentence is rewritten, not bypassed: the fixed intake comment of ①, review comments, and the closing comment.
  • landing-operations.md §B: the MERGED closeout gains the fork-PR close as an item of the same action; the retired line's two clauses (「跟到 MERGED 为止,入队后的看护归车道 PM 的落地窗口」 and 「每轮同时读队列分支与 origin/main」) are still stated by the §B heading and by the 「确认 MERGED 要两个读数」 line of the same file — verified on the branch, no rule lost; 101 / 101.
  • triage-duties.md: a per-fire scan of open fork PRs (file the card per ① when none, backfill the close per ③ when the card is closed). The file carried no fork scan before — the seat's own grep of origin/main found fork only in SKILL.md :222 (unrelated) and landing-operations.md :7, so the dispatch's assumption that the sweep existed was false and this line is its first reader; the retired line's scope clause (the tool-loading discipline binds only the triage fresh session) is implied by the file's header; 120 / 120.
  • No gate, script, half-state row or ratchet is added: 新增门禁默认否 holds, and the maintainer's words name none. SKILL.md untouched (PR docs(pm-dispatch): name objectstack-fleet[bot] as the write identity #19890 in flight there). check:pm-skill-ratchet, check:pm-skill-id-lint, check:pm-governed-prose, check:skill-frame-sync and check:nul-bytes green on the head per the report; the seat re-runs none (CI is the judge of the derived families).

② Semver level

None: .claude/** publishes nothing from any released package; skip-changeset is the correct declaration and is on the PR.

③ Boundary flags

  • open_questions: none raised by the dev.
  • The dev falsified one dispatch assumption (no fork scan existed in triage-duties.md) and answered it with the one-line B backstop — accepted, named in the PR body and the report.
  • Four out-of-scope notes, each 承接者:无 and left in the PR's Acceptance notes: no phase-index row is owed for external-contributions.md; that file is absent from the ratchet ceiling map; a fork-adopting card closed as duplicate is not covered (0 instances); the check-half-states.mjs H65 message quotes old triage-duties.md wording (report-only text). None blocks the landing; the duplicate case stays uncovered on purpose (创业阶段不扩散).

Implemented-by: claude/issue-19883-fork-pr-close-at-landing
Reviewed-by: session_01A22sUB3mUWs6M36VgfijBq

VERDICT: PASS


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 23, 2026 16:08
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 23, 2026
Merged via the queue into main with commit 3230308 Sep 23, 2026
32 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-19883-fork-pr-close-at-landing branch September 23, 2026 16:33
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Sep 28, 2026
…ough the allow-listed ccr pair; a landing denial stops and surfaces (objectstack-ai#19997)

Fixes objectstack-ai#19990
Clause-②: no

Rule text only, in three `pm-dispatch` references. This PR adds no allow
row, no tool and no gate. `.claude/settings.json`, `scripts/pm/**`,
`SKILL.md` and `AGENTS.md` are untouched. Line counts are unchanged (183
/ 101 / 37), and every edited line is at or under 120 bytes.

The maintainer's words, in the `domain:engine#1` seat's session, quoted
on the card verbatim and in order:

> 「你的pr为什么没有挂在当前session上」
> 「写一个 skills 卡片,更新技能」
> 「包括你刚才为什么不能merge,我当前session设置的是auto」

The same words reached the `domain:skills` seat directly (claim comment
5817962037): 「你的pr应该挂在当前 session上,对应的卡片优先派发」.

## What changed

| file · line (after) | bytes | rule |
|---|---|---|
| `execution-duties.md` :149 (new) | 118 | Case 1. When a report names a
PR, a session seat subscribes it at once (`subscribe_pr_activity`) and
lists it on the seat post. Reason, stated once: a PR the relay opens is
never attached to the session automatically. |
| `execution-duties.md` :147 | 87 → 116 | The collection line now covers
both modes itself ("(两种模式)", "评论与返回消息皆无"), replacing the deleted
report-channel line (see *Line budget*). |
| `landing-operations.md` :49 | 82 → 117 | (b). The landing executes the
verdict of record (ACCEPT, or the contract-review PASS). It is not a
self-approval. |
| `landing-operations.md` :51 | 65 → 115 | (a). Ready and auto-merge go
only through the two ccr commands that `settings.json` allow-lists
(`rest-channel.md` :51 / :55). |
| `landing-operations.md` :54 (new) | 120 | (c). A classifier denial
during landing means: stop, report to the maintainer, and record the
command and the denial reason on the card. ⛔ Never respell the command
or switch to the relay to get around it. |
| `landing-operations.md` :77 | 106 + 89 → 111 | Case 1, landing side.
Every PR in a session seat's window must be subscribed; subscribe any
that is missing. The optional 「关键 PR」 wording is gone. The old :77 "not
before the report" clause is folded in as 「⛔ 不早于报告」. Routine seats keep
polling. |
| `reading-discipline.md` :23 | 82 → 120 | (d). A timer text carries no
verdict or landing write verb. |

Wording choices that differ from the dispatch text:
- **`判决`, not `裁决`, at :49.** In this corpus `裁决` is a maintainer
ruling, and `判决` is the review verdict (`execution-duties.md` :180–:183,
「判决 ACCEPT / REWORK / ESCALATE」).
- **`判决与落地类写动词`, not only `落地类写动词`, at :23.** The timer that was denied
`[Self-Approval]` told the seat to post the ACCEPT as well as run the
two landing ops.

## Why no new allow row is owed: case 2 (a)

The allow-listed landing route already exists. The skill already names
it, and this PR only makes §B's landing step name it too.

- `.claude/settings.json` :61–:66 allow-lists `curl -sS -X POST
…/pulls/*/ccr/ready_for_review` and `curl -sS -X PUT
…/pulls/*/ccr/auto_merge` for all three repos. The hotcrm pair was added
on 2026-09-24 by `e6a5ecb9`. That commit also deliberately gave
`fleet-write/dispatch.mjs` no row. `git grep -n 'with-fleet'
.claude/settings.json` gives 0 hits; the control `git grep -n
'label-write' .claude/settings.json` gives 2.
- `SKILL.md` :201 says 「ready/draft 走 ccr 路」, and `platform-readings.md`
:48 says 「undraft 单通道:席位凭据走 `POST .../pulls/{n}/ccr/ready_for_review`」.
- Measured on the timeline (`GET /issues/N/timeline`,
2026-09-24T16:3xZ):
- PRs objectstack-ai#19873, objectstack-ai#19895, objectstack-ai#19902, objectstack-ai#19941, objectstack-ai#19948, objectstack-ai#19956, objectstack-ai#19970 and objectstack-ai#19993
were landed by the `domain:skills` seat under auto mode. Each has
`ready_for_review` and `added_to_merge_queue` with actor `os-zhuang`
(the ccr route, which writes as the seat's linked user).
- PRs objectstack-ai#19971, objectstack-ai#19972 and objectstack-ai#19979 have the same two events with actor
`objectstack-fleet[bot]` (the relay route).
- Both routes work. The ccr pair is the one with an allow row. The relay
route has none, so under auto mode the classifier judges it call by
call.

## Where the standing authorization is recorded: case 2 (b)

It is already recorded in the tree, so this PR adds only the one clause
at :49:
- `AGENTS.md` Prime Directive objectstack-ai#14: Tier S lands "by the owning seat on a
contract-tier review of record".
- `AGENTS.md` Multi-agent discipline §7 and Post-Task Checklist step 2:
arm auto-merge on a PR that is green and accepted.
- `landing-operations.md` :59 (Tier S).

Whether that is enough for a seat landing a PR written by its own
`mode:subagent` dev is put to the maintainer below. This PR does not
rule on it.

## Line budget: what left, and where each fact still lives

All three files stand at headroom 0. Each new line is paid for by
deleting content, not by re-wrapping or raising a ceiling.
- **`execution-duties.md` old :147 deleted.** It read 「报告通道统一:GitHub
是两种模式共用的真相源;dev 终报先落 issue 评论、再作返回消息。」
- The dev-side ordering lives in `.claude/agents/os-dev.md` :17–:18
(「报告交付两次,GitHub 优先:同一段 JSON 先作 issue 评论 … 再作为终报消息」).
- "GitHub is authoritative in both modes" lives in `os-dev.md` :324
(「两种派发模式(`mode:subagent` 与 `mode:cloud`)下 GitHub 都是报告的权威源」). It also
stays on the collection line as 「(两种模式)」.
- **`landing-operations.md` old :77, second clause, deleted.** It read
「订阅是感知补充,⛔ 不替代 flip 定点」. The fact lives on:
  - :50: the flip timer is set at ACCEPT.
  - :52: 「CI success webhook 不可靠:⛔ 不坐等」.
- `platform-readings.md` :40: 「订阅来的 `check_suite.completed` 是唤醒不是放行读数」.
  - Its first clause is kept on :77 as 「⛔ 不早于报告」.
- **`landing-operations.md` old :76 rewritten in place.** It dates from
`42af12fe7` (the 2026-08-07 ruling on subscribing *key* PRs). The newer
maintainer words quoted above replace its optional scope.

## Measured risk that stays open

- An allow row does not stop a denial based on content.
`mcp__Claude_Code_Remote__send_later` is allow-listed (`settings.json`
:23, present since before 2026-09-20), yet the engine seat's timer was
denied `[Self-Approval]`. `platform-readings.md` :435 records another
content-based `[Self-Approval]` denial.
- Two explanations are possible: that session did not load this settings
file, or the classifier judges content over an allow row. Which one
holds was not measured. The eight ccr landings are the positive reading.
The new :54 line covers the negative case.
- **Write identity, a tension this PR did not create.** The ccr pair
writes as the seat's linked user, `os-zhuang`, which is in
`GOVERNED_APPROVERS` (`scripts/pm/check-governed-queue-guard.mjs` :576).
Three texts point the other way:
- `AGENTS.md`: "Every GitHub write leaves through `scripts/pm/`, as
`objectstack-fleet[bot]` … ⛔ Never a bare `curl` … write".
  - `SKILL.md` :92: 「批准账号永不跑席位或作其关联用户」.
  - `SKILL.md` :94: 「写侧恒为 `objectstack-fleet[bot]`」.

`SKILL.md` :201 already routes ready/draft through ccr, so this tension
predates this PR. The new :51 states the same route more plainly. The
choice is the maintainer's; see the question below.

## Verification

At `04357257d`, every command from `node scripts/pm/dispatch-gates.mjs
--commands --repo objectstack-ai/objectstack` was run, with the exit
code captured before any pipe. All exited 0: 17 derived commands, plus
`pnpm check:pm-governed-prose`, `node
scripts/check-skills-token-ratchet.mjs` and `pnpm
check:pm-settings-deny-roster`. The reconciliation `dispatch-gates
--ran` reports: "17 derived famil(ies) accounted for — 17 run, 0
NOT-MEASURED (a DERIVED zero …)".

Verdict lines:
- `check:pm-skill-ratchet`: `execution-duties.md is 183 lines (ceiling
183; headroom 0)` · `landing-operations.md is 101 lines (ceiling 101;
headroom 0)` · `reading-discipline.md is 37 lines (ceiling 37; headroom
0)`.
- `check:pm-skill-id-lint`: `34 file(s) clean`.
- `check:skill-frame-sync`: `the one declared copy of the decision frame
is internally coherent`.
- `check:nul-bytes`: `OK … no raw ASCII control bytes`.
- `check:doc-formula-expressions` first exited 3 (PREREQUISITE NOT MET,
unbuilt `@objectstack/formula` / `@objectstack/lint`). It exited 0 after
`turbo run build` for those two packages under the verify lock. That
first run measured nothing; it was not a failure.

No build, test, reverse check or ablation applies to this change: it is
rule text only, with no code path.

## Acceptance notes

- `dispatch-runbook.md` :128 has cloud cards subscribe as soon as the
draft PR exists. The folded 「⛔ 不早于报告」 agrees with it only because a
cloud dev reports at draft-PR time (runbook :135). No change is made.
- `origin/main` was not merged before opening. It moved by one commit (a
`docs(qa)` change touching none of these files), and the queue rebuilds
on current `main`.

## 维护者速读(草稿)

**改了什么**
- dev 报告里点名了 PR,席位当场订阅这个 PR 的动态,并记进座位贴。规则里写明原因:经中继开出的 PR
永远不会自动挂到会话上。落地说明里原来"给关键 PR 挂订阅"是可选说法,现在改成"落地窗口里每个 PR 都要挂上,缺了就补"。
- 落地(转 ready、挂 auto-merge)只走 `.claude/settings.json` 已放行的两条 ccr
命令。席位落地是在执行已记录的复核判决,不是自己批准自己。
- 落地过程中如果被权限分类器拒绝:停手,报给您,在卡上记下命令和拒绝原因;不换写法,也不改走中继绕过去。
- 定时提醒的文本里不再写"判决/落地"这类写操作,只写"到时重读什么、满足什么条件"。

**为什么改**
- 您问了两个问题。
- PR 为什么没挂在当前 session 上:中继开的 PR 不会自动挂上,而技能里只有可选的"关键 PR 挂订阅"。
- auto 模式下为什么不能 merge:engine 席被拒了两次,一次是一条回读命令,一次是一条写着"发 ACCEPT
并落地"的定时器。它随后改走中继落地,而中继没有放行规则。放行的路本来就有:本席今天在 auto 模式下用它落地了 8 个 PR,一次都没被拒。

**风险与代价(含回滚)**
- 只改三个技能参考文件的规则文本。行数不变,每行不超过 120 字节。回滚就是 revert 本 PR。
- ccr 两条命令记在 os-zhuang 名下。而 AGENTS.md 写的是"所有 GitHub 写都经 scripts/pm,以
objectstack-fleet[bot] 身份,永不裸 curl 写",SKILL.md
也写"批准账号永不作席位的关联用户"。这个矛盾早就存在(SKILL.md 本来就写"ready/draft 走 ccr 路"),本 PR
没有新造,只是把它写得更明确。
- 放行规则不保证分类器一定放行。`send_later` 在放行清单里,engine
席那条定时器还是按内容被拒了。所以新加了"被拒就停手上报"这一条。

**席位意见**

**你要做的**
- 回一句话,确认下面两件事,或者指出要改哪一件:
- ① AGENTS.md 第 14 条(Tier S 由所属席位在达档复核记录在案后落地)和 Multi-agent discipline 第
7 条(PR 全绿且已验收就挂 auto-merge),就是席位落地自己子代理所写 PR 的常设授权,不用另外记。
- ② 用 ccr 两条命令落地,算 AGENTS.md「写只经 scripts/pm」这条规则的例外。是把这个例外写进
AGENTS.md,还是改走中继并加一条新的放行规则,都由您决定。

---
_Generated by [Claude
Code](https://claude.ai/code/session_01A22sUB3mUWs6M36VgfijBq)_

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants