Skip to content

skills(pm-dispatch): off-tier seat discharges clause-② review by spawning an at-tier subagent (ruling C) - #18511

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-18434-clause2-offtier-subagent-route
Sep 17, 2026
Merged

os-zhuang merged 3 commits into
mainfrom
claude/issue-18434-clause2-offtier-subagent-route

Conversation

@os-justin

@os-justin os-justin commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator

Fixes #18434

Governed rules-layer re-key carrying the maintainer's ruling 「18434 C」 (director record 5699124096 on the card; the maintainer's confirmation on the ui seat's channel, record 5701005814: 「改规则:允许未达档席起达档子代理」). Three prose files (the third, references/core-rules.md, added in the patch round — D9 below), no code, no script edits, every touched file line-neutral against its ratchet ceiling. Landing is not the author's: this PR stays draft; the skills seat hangs the four-piece and the maintainer's approval lands it.

What changed

.claude/skills/pm-dispatch/SKILL.md — 812 / 812 (two lines re-keyed in place)

line before after
:522 (114 B → 118 B) 「- 条款②复核只在实测达档的席内做,记录写读数;未达档席 ⛔ 不审、不起该档子代理。」 「- 条款②复核按实测档:达档席内审;未达档席 ⛔ 不自审,起隔离达档子代理转录核档采信。」
:640 (117 B → 117 B) 「- 交付后复核由派发席席内完成:达档审,未达档默认档加门禁;记录 = 同形评论落 PR 或卡。」 「- 交付后复核归派发席:达档席内审,未达档循保险丝起子代理;记录 = 同形评论落 PR 或卡。」

:522 is the ruling's line — meaning fixed by the ruling, wording the dev's, 118 B under the 120 B cap. 「记录写读数」 was dropped from it because the record requirement lives in contract-review.md (「复核记录 = 一条评论落 PR 或卡」, 「同形含首行 Served-tier:」).

.claude/skills/pm-dispatch/references/contract-review.md — 60 / 60

line (new numbering) before after
:26 (119 B → 116 B) 「- 按档位:达档席内审契约增量;未达档默认档自审加门禁、挂标;豁免仅独立性件与保险丝。」 「- 按档位:达档席内审契约增量;未达档 ⛔ 不自审,走保险丝路;豁免仅独立性件与保险丝。」
old :39 deleted (97 B — the payment) 「- 随后按 landing-operations.md 走落地前检 → 转 ready → 挂 auto-merge 或入队。」 — (the same sequence is SKILL.md :617 「席位落地 = 过落地前检、清标、ready、auto-merge」 and :641; the three-step pre-landing check that follows at :40–:46 is untouched)
:50, was :51 (105 B → 120 B) 「- 保险丝管每个出条款②裁决的席,每场前必读服役档,读法见 platform-readings.md。」 「- 保险丝管每个出条款②裁决的席:每场前必读服役档(platform-readings.md),未达档 ⛔ 不自审。」
:53, was :54 (108 B → 114 B) 「- 读数不达档 ⇒ 改走转录核验的复核子代理;标签原样留置,队列外等待是安全态。」 「- 读数不达档 ⇒ 改走转录核验的达档复核子代理;标签原样留置,队列外等待是安全态。」
:54, was :55 (108 B → 118 B) 「- 保险丝只测座位自会话:mode:subagentget_session 量的是派发会话,⛔ 不作互证。」 「- 子代理档只取其转录 harness 逐请求 model 盖章;get_session 量的是派发会话,⛔ 不作互证。」
:59 (new, 110 B) 「- PASS、FAIL 与作废都落 PR 或卡;同 head 再起子代理须引前次作废因,⛔ 不重起求 PASS。」

.claude/skills/pm-dispatch/references/core-rules.md — 151 / 151 (one line re-keyed in place, patch round)

line before after
:112 (119 B → 119 B) 「- 一单一次派发,档位逐卡显式传参;语义面卡恒契约复审档施工,契约卡达档复核归 spec 席。」 「- 一单一次派发,档位逐卡显式传参;语义面卡恒契约复审档施工,契约卡达档复核归派发席。」

The twin probe git grep -n '达档\|子代理' origin/main -- .claude/skills/pm-dispatch/references/core-rules.md returns :51 :112 :113 :122, none of which states the spawn bar — but :112 still named the pre-tier-bound owner (spec seat) of the clause-② at-tier review, while SKILL.md :512 reads 「达档复核归派发席席内」 and contract-review.md :25 「归属该卡派发席」. 「席内」 is not spelled at :112 because the line would be 125 B against the 120 B cap; it is carried by SKILL.md :512.

The three guards, where each now lives

  1. Tier verified from the transcript, not the request — :52 「⛔ 自述档位与传参皆非读数」 (unchanged); :54 (the subagent's tier is taken only from the harness per-request model stamps in its own transcript; get_session measures the dispatching session and is no cross-proof); :57 「产出裁决的每轮都须读到契约复审档位,见回退证据 ⇒ 裁决整体作废」 (unchanged); :60, the quota-exemption bar (unchanged). Before this PR the file said 「转录核验」 but named no source for the subagent's tier — platform-readings.md :384 covers the seat's OWN session transcript, and the old :55 said get_session cannot see the subagent — so the source is added, not merely re-worded (PM assumption A2: substance present, source absent).
  2. Adversarial brief, no contamination — :32–:33 unchanged.
  3. Verbatim or void, every time on the record — :58 unchanged (verbatim adoption or whole voiding for 核验失败 / 越范围 / 格式不完整); the NEW :59 adds the half that was absent: every verdict, PASS, FAIL or voided, is posted on the PR or card, and a second spawn on the same head cites the first's void reason.

Independence pair (:35–:37), --pair (:41–:42, :55) and Served-tier: (:29) are unchanged. No script is edited (PM assumption A3 holds: check-clause2-carriers.mjs --pair already reads Served-tier:; guard 1 is a reading rule).

Deviation, declared: :640 and :26 are in the diff

PM assumption A1 (「line 522 is the only SKILL.md line stating the old bar」) holds for the spawn bar — 不起该档子代理 is only at :522 — and is falsified for the in-person bar. PR #18363 (05f1cdd6) wrote the rule in three places at once (its own file patch: SKILL.md :512 / :522 / :640 and contract-review.md :26 / :41 / :51 / :52), and :640 「未达档默认档加门禁」 and :26 「未达档默认档自审加门禁、挂标」 still described an off-tier seat reviewing IN PERSON at default tier — the half of the bar that ruling C keeps (the ui seat's record: 「the bar on reviewing in person stands; the bar on spawning does not」). Leaving them would re-create the two-texts-disagree shape this card reports, so both are re-keyed in place under the bounded in-place-fix exemption: same defect class; mechanical, with the meaning pinned by the ruling; no other claim holds either file (#18489 is instructed not to touch :523 and targets the triage block, #18469 targets :91–92, and the file lists of all 15 open PRs read at PR time touch neither file); same gate family. If the seat prefers the narrow diff, reverting those two lines is a two-line change and every gate below stays green. Answered by the coordinator in the patch round: A — keep.

D9 — patch round: core-rules.md :112 rides this PR

The out-of-scope finding (b) from the first report was verified by the coordinator on origin/main 8cf527f and ruled to ride this PR under the same bounded in-place-fix exemption (same class as D1 — text still naming the pre-tier-bound owner; mechanical; no other claim holds core-rules.md#18489 is pm:blocked, #18469 does not touch it; same gate family) instead of a fourth governed four-piece. Executed: origin/main merged first (acc1943, one docs commit touching content/docs/data-modeling/seed-data.mdx only, no regeneration owed); :112 re-keyed in place (af846cf). Probes with controls on core-rules.md: 归 spec 席 1 → 0, 归派发席 0 → 1, control 契约复审档 1 → 1; every other core-rules line byte-identical (git diff -U0 shows the single line).

Verification — round 2 on af846cf (round 1 on 3088a1c read identically)

  • Gate list derived with no paths, off the merge base with origin/main: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack → 17 families (identical to the PM's lead). All 17 run in the foreground, each exit code captured by redirect then $?, every one 0. Reconciliation --ran with COMMAND :: exit CODE lines: 「✓ dispatch-gates --ran: 17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED (a DERIVED zero — all 17 recorded an exit code and none of them is 3)」.
  • Ratchet: 「✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0)」 · 「…contract-review.md is 60 lines (ceiling 60; headroom 0)」 · 「…core-rules.md is 151 lines (ceiling 151; headroom 0)」; widest introduced line 120 B (:50 of contract-review.md); core-rules :112 is 119 B.
  • check:pm-skill-id-lint 「27 file(s) clean」 · check:skill-frame-sync 「the one declared copy of the decision frame is internally coherent」 · check:nul-bytes 「OK (scanned 8738 text file(s) … no raw ASCII control bytes)」.
  • check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built: built under scripts/pm/os-verify-lock.sh (「VERDICT command-exit 0 · held the lock 141s · waited 0s」), then 「✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 438 files / 1377 TS blocks judged clean」.
  • Probes, origin/main fed4a15 → this head: 不起该档子代理 1 → 0; 起隔离达档子代理 0 → 1; control 达档 6 lines → 6; 默认档加门禁|自审加门禁 1 + 1 → 0 + 0; core-rules.md 归 spec 席 1 → 0, 归派发席 0 → 1, control 契约复审档 1 → 1.
  • No reverse-verification or ablation leg: a prose rule with no runtime or dist; the probe flip above is the before/after measurement.

Acceptance notes

维护者速读(草稿)

改了什么:把条款②契约复核的路线改成你 16 日下午定的 C:达档的席自己审;未达档的席不自己审,起一个隔离的达档复核子代理,按子代理转录里逐请求的档位盖章采信其裁决。SKILL.md 两行、contract-review.md 六行(删一行付账、新增一行记「每份裁决都落 PR 或卡,同 head 再起须引上次作废因」)、core-rules.md 一行(:112 把契约卡达档复核的归属从 spec 席改为派发席,与 SKILL.md :512 一致),行数与上限一致(812 / 812、60 / 60、151 / 151)。

为什么改:今天早上落地的 :523 把「不自审」和「不起子代理」绑在一起,默认档车道的 Clause-②: yes 卡就没有任何合法路径拿到裁决——objectui 三张 PR 停在安全态,第四张(objectui#8167,你批过的 p2)干脆没派出去。你的裁决 C 只放开「谁可以起复核」,不放开「什么算复核」:Served-tier: 首行、子代理必须真的跑在契约复审档、实现者与复核者同会话仍算自审,三条都不变。

风险与代价(含回滚):零代码、零脚本、零发布物,17 个派生门禁全绿。剩下的风险在执行面:平台是否会把父会话逐字转贴的子代理裁决也拒为 [Self-Approval] 尚未实测(裁决记录已写明首次使用时测量并记入 platform-readings.md)。回滚 = revert 本 PR 的一个 commit,文本回到 :523 的旧句,车道回到安全态停靠。

席位意见:(留空,席位定稿)

你要做的:按四件套流程批准本 PR(规则层,等你的字);合并后 domain:ui 席直接按新规则处理停靠的三张 PR,不需要你再动。


Generated by Claude Code


Generated by Claude Code

…ning an at-tier subagent (ruling C)

Re-key the clause-② review route in place, line-neutral (SKILL.md 812/812,
contract-review.md 60/60): an at-tier seat reviews in-seat; an off-tier seat
never self-reviews and instead spawns an isolated review subagent at the
contract-review tier, adopting its verdict on a transcript tier reading.
contract-review.md keeps the fuse route as the rule, names the transcript
source for the subagent's tier, and records that every verdict (PASS, FAIL,
voided) lands on the PR or card and a re-spawn on the same head cites the
prior void reason. Paid inside the 60-line ceiling by deleting the
landing-sequence pointer line that SKILL.md already carries.

Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu
Co-authored-by: Claude <noreply@anthropic.com>
@os-justin os-justin added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 16, 2026 — with Claude
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Sep 16, 2026
…use-② at-tier review owner

Patch round on the same claim: `references/core-rules.md` still named the
pre-tier-bound owner (「契约卡达档复核归 spec 席」) while SKILL.md and
contract-review.md already read the dispatching seat. Re-keyed in place at
120 B, line-neutral (151/151); every other line byte-identical.

Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu
Co-authored-by: Claude <noreply@anthropic.com>

Copy link
Copy Markdown
Collaborator Author

维护者速读(终稿)

席位:domain:skills · session_01Gqi43smmqjJ5sUrhfoPeKu · 2026-09-16T17:36Z · 复核记录在 #18434(ACCEPT)。

改了什么。 把条款②契约复核的路线改成你今天下午定的 C:达档的席自己审;未达档的席不自己审,起一个隔离的达档复核子代理,按子代理转录里逐请求的档位盖章采信它的裁决。三个文件、八行、零代码:SKILL.md 两行(条款②那一句 + 「交付后复核」那一句)、contract-review.md 六行(保险丝三句改写、删一行付账、新增一行「每份裁决都落 PR 或卡,同 head 再起须引上次作废因」)、core-rules.md 一行(「契约卡达档复核归 spec 席」改成「归派发席」——dev 顺手发现的旧归属,本席核实后并入本 PR)。行数与上限一致:812 / 812、60 / 60、151 / 151。

为什么改。 今天早上落地的那一句把「不自审」和「不起子代理」绑在一起,默认档车道的 Clause-②: yes 卡就没有任何合法路径拿到裁决——objectui 三张 PR 停在安全态,第四张(objectui#8167,你批过的 p2)干脆没派出去。你的裁决 C 只放开「谁可以起复核」,不放开「什么算复核」:Served-tier: 首行、子代理必须真的跑在契约复审档、实现者与复核者同会话仍算自审,三条都不变;三道护栏(转录验档、对抗式简报、逐字采纳或整体作废且每份裁决上墙)现在都是承重条款。

风险与代价(含回滚)。 零代码、零脚本、零发布物;17 个派生门禁本地全绿,PR 上 20 绿 12 跳、Lint & Repo Gates 复核时还在跑(落地前本席再读)。执行面的一个未知:平台分类器会不会把父会话逐字转贴的子代理裁决也拒为 [Self-Approval],尚未实测——裁决已写明首次使用时测量并记入 platform-readings.md。回滚 = revert 本 PR(一次 revert 合并即可),文本回到旧句,车道回到安全态停靠。

席位意见。 同意落地。diff 逐行对照过裁决文本与 ui 席记录的边界(放开谁起复核,不放开什么算复核),八行都在这条边界内;dev 多改的三行(SKILL :640、contract-review :26、core-rules :112)是同一缺陷的残留文本——都还在描述「未达档自审」或「归 spec 席」的旧归属,不改它们今天的冲突会换一种拼写再出现。本席已按四件套挂起,并请了 os-zhuang 与 hotlong 复审。

你要做的。 在 PR #18511 上 APPROVE(规则层,等你的字)。批准后本席按裁决 C 落地(记录、--pair 0、检查全绿、清标、ready、auto-merge);合并后 domain:ui 席直接按新规则处理停靠的三张 PR,不需要你再动。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 17, 2026 07:15
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit ab1d359 Sep 17, 2026
42 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-18434-clause2-offtier-subagent-route branch September 17, 2026 07:39
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/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants