Commit ab1d359
skills(pm-dispatch): off-tier seat discharges clause-② review by spawning an at-tier subagent (ruling C) (#18511)
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:subagent` 里
`get_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
- Finding (b) from the first report — `references/core-rules.md` :112
「契约卡达档复核归 spec 席」 naming the pre-#18363 owner — is no longer to file: it
rides this PR (patch round, D9 above) by the coordinator's ruling.
- noted, not filed: SKILL.md :673 「报告席记条款②默认档 FAIL 率入复审清单」 reads
consistently under C when 「默认档」 is the construction tier (:512), so no
change; handler: none.
## 维护者速读(草稿)
**改了什么**:把条款②契约复核的路线改成你 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](https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu)_
---
_Generated by [Claude Code](https://claude.ai/code)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent fb41be1 commit ab1d359
3 files changed
Lines changed: 8 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
519 | 519 | | |
520 | 520 | | |
521 | 521 | | |
522 | | - | |
| 522 | + | |
523 | 523 | | |
524 | 524 | | |
525 | 525 | | |
| |||
637 | 637 | | |
638 | 638 | | |
639 | 639 | | |
640 | | - | |
| 640 | + | |
641 | 641 | | |
642 | 642 | | |
643 | 643 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
| 26 | + | |
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
| |||
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
39 | | - | |
40 | 39 | | |
41 | 40 | | |
42 | 41 | | |
| |||
48 | 47 | | |
49 | 48 | | |
50 | 49 | | |
51 | | - | |
| 50 | + | |
52 | 51 | | |
53 | 52 | | |
54 | | - | |
55 | | - | |
| 53 | + | |
| 54 | + | |
56 | 55 | | |
57 | 56 | | |
58 | 57 | | |
59 | 58 | | |
| 59 | + | |
60 | 60 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
109 | 109 | | |
110 | 110 | | |
111 | 111 | | |
112 | | - | |
| 112 | + | |
113 | 113 | | |
114 | 114 | | |
115 | 115 | | |
| |||
0 commit comments