skills(pm-dispatch): charter revision — rulings A/③/C, governed-surface tiering, ui/triage lane lines (#17942 chain) - #18018
Conversation
…iage is the sole producer of grading, routing and dedupe Charter revision, chain head card 17942 (rules layer). Three rulings land here, quoted verbatim: - Q1 and Q2 (director seat, decision batch 131 item 1, 2026-09-13): 「同意」 to `1A(+三类表)·2(1)·3A·4B` — the claiming seat owns a card to MERGED; a cross-lane surface found after dispatch imports an isolated contract-review-tier review whose record carries `Implemented-by:` / `Reviewed-by:`; `pm:retriage` re-routing is pre-dispatch only; the spec seat keeps the intake of NEW `packages/spec` work; derived work in three classes (in-scope ⇒ sub-issue owned by the claiming seat at inherited priority; unclaimed blocker ⇒ the blocked seat claims and does it, any size; in-flight blocker ⇒ wait, `pm:blocking` ranks it first; incidental ⇒ a separate card). - The seat's plan, accepted verbatim: 「以上接受你的建议。」 - Ruling ③ (skills seat record, 2026-09-13T09:51Z): 「同意」 to the five points — 「一律经过分诊。定级、路由、查重、跨仓 shadow 检查、`duplicate_of` 关单,全部收回分诊席一个人做」; 「唯一例外:在飞卡的衍生子卡」; 「立卡者不查重,只在卡面附 3–5 个查重词」; 「查重缓存住在分诊席自己的容器里」. Q3 (self-routing / self-grading) is WITHDRAWN; no self-routing text had reached SKILL.md (git grep -E '自路由|自定级|self-rout' over origin/main exits 1, control 「分诊座位唯一」 hits), so nothing comes out. SKILL.md (812 → 811 in this commit; the family PR nets 0): - 多仓协调: 「跨座位转移 … 唯一豁免:简单阻塞项直接接手」 becomes 认领即跟到 MERGED plus the imported-review record line (+1); 「凡触 packages/spec 一律转」 narrows to NEW spec work; 「跨仓查重/shadow 检查恒归中央」 is deleted — the rule survives in the rewritten 分诊座位唯一生产 line (查重 / shadow / duplicate_of named) and in core-rules 多仓协调; the 单车道仓 repo:* 席 restatement is deleted — it survives at the 单车道仓 … 自理机械三务 line of the same section and the skills-lane finding self-triage line of 分诊座位职责. - 域车道: domain:* production gains the one ruled exception; the third boundary-crossing channel is named. - Epic 子树车道: 衍生问题三分 is deleted — generalised to every dispatched card in 执行座位职责, where the four 简单阻塞项 lines are rewritten as the three-class rule and the blocker rules (the S-level cap is lifted by the ruling; the incidental class survives at 顺带发现 ⇒ 独立立单). - 分诊座位职责: the triage-side dedupe cache line (+1) — lanes/triage.md is at 7/7 with its one spendable line taken by ruling B, so the cache rule lands in the rules layer the triage seat reads. - 平台读数纪律 and 报告契约: 立单前查重 → 立卡者附查重词; 立卡查重先行 → 立卡附查重词. core-rules.md (151/151): mirrors of every moved rule — dedupe keywords, triage as the sole producer including 查重, follow-through plus new-spec intake, the blocker rule, the domain-label exception. Not in this commit (references layer, follow-up PR): contract-review.md 复核归属与资格 / 独立性件 and dispatch-runbook.md 跨车道简单阻塞项直接接手. The 「分诊不重指派」 wording that option B named does not exist in the instruction tree (git grep exits 1), so there is nothing to narrow. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
…s hand-merged, pm-dispatch references land after in-seat contract-tier review Ruling on card 17950 (live chat with the skills seat, 2026-09-13T07:2xZ–07:4xZ), maintainer verbatim: 「收窄受管面,但是 skills 是不是还是应该我来确认?」, then to the seat's boundary — 「**规则层(你确认)**:所有 SKILL.md 级的规则文本——发布的 `skills/**`(两个仓)、`.claude/skills/*/SKILL.md`(含 pm-dispatch 本体和内部 playbook)、`core-rules.md`、`.claude/agents/**`、hooks、settings、`AGENTS.md`、`CLAUDE.md`、ADR。**事实层(席内契约复审档复核后入队)**:只有 `.claude/skills/pm-dispatch/references/**`」 — 「我点头」. SKILL.md 〈复核〉 (net 0): the three skills-lane self-landing lines (diff 含 .md ⇒ 四件套 / 纯代码面 including `.claude/` hooks, workflows and settings ⇒ skills 席自审 / 直接落地 ⛔ 不推维护者) are replaced by three lines — the non-governed pure-code path (`scripts/pm/`) keeps its in-seat contract-tier self-review and landing; the two-layer definition; the per-layer landing. The old carve-out that let `.claude/` hooks, workflows and settings PRs land on the skills seat's own review is superseded: the ruling names hooks and settings in the rules layer. The ACCEPT fork line now reads 命中规则层. core-rules.md 执行座位职责: the mirror. lanes/skills.md (33/33): 受管面 PR 恒 draft 等人合 → 规则层受管 PR 恒 draft 等维护者的字; the 范围 pointer names the two layers. The objectui half (published skills/** governed there too) is already stated by lanes/ui.md 常设承诺 and the 跨仓同判 line of 〈复核〉 — measured, no line owed. AGENTS.md Prime Directive 14 (1075 → 1072 in this commit; the PR nets 0): the tiering sentence, paid inside the directive by folding the four ⛔-never spellings into one clause, dropping the node -e helper (the register sentence already names the file), and compressing the armed-or-queued paragraph and the detection sentence without removing a rule. The prose gate's anchor sentence and all five register spans are unchanged; the references prefix is spelled with a trailing slash, never as a ** glob, because check-governed-prose reds any **-shaped span outside the register. Not in this commit: the register and queue-guard script items of the card (a separate script PR) and contract-review.md 落地前检③ (references PR). Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
…eat lands a governed PR — later pushes included Ruling C on card 17971 (maintainer, live chat with the skills seat, 2026-09-13T08:50Z), verbatim: 「C. approve 后不管后续改动都由席位落地:」 — chosen over A (byte-pinned approval) and B (status quo) with the seat's own reservation in front of the maintainer. AGENTS.md Prime Directive 14: the first sentence gains its converse (confirmed by an authorized approval and then landed by the owning seat; before that approval the four acts stay forbidden); the approval sentence now says WHO lands it — the owning seat, later pushes included, re-queuing after an ejection or a rebase on its own pre-landing check — and that the maintainer's word is spent once per PR. Multi-agent discipline §7 (a): 「never enter this path, however green」 → 「on green alone」. Post-Task Checklist step 2: landing waits for the maintainer's word instead of 「by hand」 alone. Line counts unchanged at each spot. SKILL.md: red line 27 gains 「批准在案后席位落地」, paid on the same line by folding the three 永不 into one; 复核 ②: 授权批准 ⇒ 席位落地; the 批准后再推亦不过期 line now defines 席位落地 = 过落地前检、清标、ready、auto-merge, 踢出/变基同法 (its former 无批准 ⛔ 不翻 ready… half survives at red line 27). core-rules.md 红线: the mirror. Unchanged by design: the queue guards (their predicate already accepts the approval on any commit), objectui's AGENTS.md §9 (sibling repo, its own PR), and each seat's Routine text (updated at its next re-arm, per the card). Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
…e ui lane instead of pointing at it Card 17933 (p2 Task, routed into this lane by the maintainer's direct word). The maintainer read the pointer as 「不是说你的 ui 车道不需要契约复审了吗?为什么还有 `needs:contract-review`」 — a misreading that had already happened on the rule's own user. lanes/ui.md 席内判断, one line replaced (38/38): the pointer 「档位与复核豁免边界读源码与 references/contract-review.md,⛔ 不凭记忆或继承的注记」 becomes the statement synthesised from contract-review.md's three paragraphs — clause ② review applies to this lane as default-tier self-review plus gates with the label hung as usual; only the independence piece and the downgrade fuse are exempt. The per-lane applicability table and the ruling on the 「复核正为补偿低档派发而存在」 derivation live in contract-review.md and ride the references PR. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
…graded card in pm:queue with a domain:* Card 17742, graded by the lane's self-triage (2026-09-12T02:20Z), verbatim: 「admitted as class (a) with one measured instance … Grade: pm:queue · Task · priority:p2 … (1) COUNT the population on both boards first … (2) then the cheapest of the card's three shapes that the count supports — a fourth disjunct if the population is small, the H-row home if it is large; (3) the round report's 裸卡 metric must say what it becomes」. Count, posted on the card before this edit (2026-09-13T11:46Z, repo-scoped REST lists, both boards, every page read): pm:queue ∧ domain:* ∧ ¬priority:* = 7 on objectstack and 31 on objectui — small, so the fourth disjunct is the shape; the pm:on-hold pool (69 / 46) is a decision already made and not a dispatch slot, so it stays outside the disjunct and is recorded as a measurement only. SKILL.md 分诊座位职责 (net 0): 析取 ④ takes the line of 「②③ 只取 updated_at …」 and carries that clause for ②③④; the 半状态治愈积压 line reads ②③④; the 轮次报告 裸卡数 metric line states 未定级数另计析取④. core-rules.md 分诊座位职责: the sweep mirror names 队列卡缺定级. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
…waiting the maintainer's word as one decision batch Card 17951 (p2 Task; the reading-cost half of the maintainer's question, verbatim: 「③ 受管面手合本身也是一条队列。能否简化我的审核步骤,比如我召唤项目总监时可以批量决定?」). SKILL.md 升级与决策 (+1; the family PR nets 0): after the director's four duties, one line — every summon presents the governed drafts carrying an in-seat ACCEPT as one batch of at most five rows; the approval and the merge stay the maintainer's own clicks. AGENTS.md Prime Directive 14: the same duty as one clause of the tiering sentence (the directive is 34 lines before and after the family; 1072 → 1075 across its commits). Not in this commit: lanes/director.md and decision-analysis.md (references PR). Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
… concurrently belongs to the seat that wrote it Ruling B on card 17624 (director seat, decision batch 125 item 5, 2026-09-13): 「同意」 — the concurrency principle replaces line 7 of lanes/triage.md, a near-verbatim duplicate of the SKILL.md 分诊座位职责 line; the ratchet cap stays at 7. Precondition (ruling item 2) measured word by word: line 7 differs from the SKILL.md line only by 「分诊」 inserted (the subject the SKILL.md section already supplies) and 「裁定」 dropped (SKILL.md is the stricter spelling); neither difference carries a rule absent from SKILL.md, so B stands. lanes/triage.md line 7 (7/7): the restatement is replaced by 「补半状态前先确认无人在动;读取之后才出现的六态属他席,停手重读,⛔ 不替换」. The other three disciplines stay closed by measurement (no shared six-state writer under scripts/pm/), per the ruling's item 3. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
…ough ruling — planned spec sub-issues still route to the spec seat, derived work stays with the claiming seat Follow-up on card 17942 (same ruling as the first commit: 「同意」 to `1A(+三类表)·2(1)·3A·4B`, and 「以上接受你的建议。」 — the spec seat keeps the intake of NEW packages/spec work; a cross-lane surface found after dispatch, packages/spec included, does not move the card). Two 座位贴协议 / Epic 子树车道 lines still said 「packages/spec 恒归 spec 座位」 and 「(sub-issue 或衍生)⇒ 照旧转 spec 座位队列」, which would have re-created the transfer the ruling removed for derived work. Both are rewritten in place (net 0): planned spec sub-issues still route to the spec seat with the epic side writing Blocked-by:; derived work follows the three-class rule of 执行座位职责. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewHead: ① derived judgments — every changed rule read against its ruling, whole diff read line by line:
Density payments, each checked to survive elsewhere: 跨仓查重/shadow line (→ :220 + Seat measurements on the head tree ( ② semver: nothing publishes; ③ boundary flags: Implemented-by: Verdict: PASS — the rules layer of all eight rulings, each verbatim, each paid inside its file; one declared-not-enforced gap named and carded (the queue guard's tier). Governed rules layer: draft stays; Generated by Claude Code |
维护者速读(终稿)改了什么 —— 一个 PR 把今天裁过的八张卡的「规则层」文字落进章程: 为什么 —— 这些裁决今天上午已生效,章程文本落后一上午;每个席位读的是文本。 风险与代价 —— 纯文本,回滚 = revert。两点要你知道:(a) 分层现在只是「写了」,合并队列守卫( 未含 —— 批准即由本席按裁决 C 落地(四个 check 还在跑,绿了才落)。要不要批? Generated by Claude Code |
|
Ruling C landing step — skills seat (session Generated by Claude Code |
…es tier The maintainer tiered the governed surface on 2026-09-13 and the charter text landed with PR #18018, but the queue guard still demanded an authorized approval for every governed path — so the tier was declared and not enforced. The merge-group leg now classifies each governed pull request's governed paths and, when they ALL lie under `.claude/skills/pm-dispatch/references/`, accepts the skills seat's review of record on the CURRENT head in place of the approval: a `## Contract review` comment on the PR thread carrying a `Reviewed-by:` line and a `Served-tier:` reading that stands. Every other governed path is the rules layer and keeps today's predicate byte-for-byte — 16 predicate bodies are md5-identical to their pre-change selves. Recognition is IMPORTED, never re-implemented: the heading marker, the head-sha span test, the newest-of resolution, the `Reviewed-by:` key line and the `Served-tier:` reader all come from the two files that own them. Reaching them needed the module-eval cycle solved rather than worked around, so the import is lazy and this file's dispatch no longer carries a top-level await; the battery pins that precondition against this file's own source. The leg is MONOTONE by construction — consulted only for an entry no authorized approval satisfied — so it can lift a refusal and can never create one. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
Fixes #17971
Fixes #17742
Fixes #17624
Part of #17942
Part of #17950
Part of #17933
Part of #17934
Part of #17951
Dev session
session_01DAcomhvR9kKizeYgg89Vo8on branchclaude/issue-17942-charter-revision(worktreeobjectstack-issue-17942). Rules-layer charter revision for the eight-card family whose chain head is #17942. Deferred to the follow-up references PR (files occupied by PR #17990 / #17992, seat-landable once this PR lands the tiering):contract-review.md(the #17934 落地前检③ exception, #17933's per-lane table, #17950's 落地前检③ line, #17942's 复核归属 / 独立性件),dispatch-runbook.md(#17942's 跨车道直接接手),lanes/director.md+decision-analysis.md(#17951's director half); the #17950 register / queue-guard script items are their own script PR. #17934 has no edit here — its ruling lives in a deferred file.Rulings landed (verbatim, one commit per card)
1A(+三类表)·2(1)·3A·4B; 5652079343 「以上接受你的建议。」; 5652544529 ruling ③ 「同意」 (「一律经过分诊 … 唯一例外:在飞卡的衍生子卡 … 立卡者不查重,只在卡面附 3–5 个查重词 … 查重缓存住在分诊席自己的容器里」). Q3 withdrawn — no self-routing text had reached SKILL.md (git grep -E '自路由|自定级|self-rout' origin/main -- .claude/skills/pm-dispatchexits 1; control 「分诊座位唯一」 hits), so nothing came out. The 「分诊不重指派」 wording does not exist in the tree (git grep exits 1) — nothing to narrow..claude/skills/pm-dispatch/references/**lands through the queue after in-seat contract-tier review (maintainer ruling 2026-09-13) #17950 — 「我点头」 to the boundary 「规则层(你确认)… 事实层(席内契约复审档复核后入队):只有.claude/skills/pm-dispatch/references/**」.lanes/ui.md指向条款②的适用面却不陈述它 —— 维护者据此读成「本车道无需契约复核」 #17933 — the maintainer's misreading 「不是说你的 ui 车道不需要契约复审了吗?为什么还有needs:contract-review」;lanes/ui.md:38 now states the applicability.pm:queuewith adomain:*matches none of the three disjunctions — invisible to triage, visible to the lane's candidate query #17742 — self-triage 5642823259 (fourth disjunct if the population is small); count posted on the card first (5653074219):pm:queue∧domain:*∧ ¬priority:*= 7 objectstack / 31 objectui at 2026-09-13T11:46Z.lanes/triage.md:7 differed from the SKILL.md line only by 「分诊」 inserted and 「裁定」 dropped — no rule lost.Acceptance greps (
git grep -c -FatBASE→ this head; every file's control still hits)Landing is tiered/ 「两层分档」GOVERNED_SURFACES/ 「QA 波次由维护者手动触发」landed by the owning seatdirector seat requests as ONEA version release is performed by the maintainerLine budgets (net 0 per file, paid by density inside the file — payments named in each commit)
SKILL.md 812 → 812 (widest table row 342 B, untouched); core-rules.md 151 → 151; AGENTS.md 1075 → 1075 (widest row 768 B, untouched; the
node -ehelper line under PD #14 is the one deletion that is not a rule); lanes/ui.md 38 → 38; lanes/triage.md 7 → 7; lanes/skills.md 33 → 33. Every added line ≤ 120 B (git diff BASE..HEAD | grep '^+' | awk 'length>120'prints nothing); the whole-fileawk 'length($0)>120'baseline is 23 / 23 on SKILL.md and 15 → 14 on AGENTS.md — all table rows or the dropped helper line, the shape the ratchet exempts (the PM's "empty over edited files" expectation is false onorigin/mainalready). Decision frame block byte-identical: md53327d02c56f8a0eca88569dad2270f32(now at :733–:754).Deviations from the dispatch, stated
references/**spelling in prose:check:pm-governed-prosereds any**-shaped code span outside the register, so the tier is spelled.claude/skills/pm-dispatch/references/(AGENTS.md) and 本技能references/(SKILL.md)..claude/hooks/workflows/settings PRs self-land on the skills seat's review; the pm-dispatch: tier the governed surface — the rules layer stays hand-merged,.claude/skills/pm-dispatch/references/**lands through the queue after in-seat contract-tier review (maintainer ruling 2026-09-13) #17950 ruling names hooks and settings in the rules layer, so those three lines became the tiering lines (provenance beyond the shallow window not read).Gates (derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon the merged head269933d9; all 18 run in the foreground, exit codes captured before any pipe,--ranreconciled: 18 derived, 18 run, 0 unrun)check:pm-skill-ratchet✓ (SKILL.md 812/812 · core-rules 151/151 · AGENTS.md 1075/1075 · ui 38/38 · triage 7/7 · skills 33/33; both widest-row pins at headroom 0) ·check:pm-skill-id-lint✓ 27 files clean ·check:skill-frame-sync✓ ·check:pm-governed-prose✓ (5 register surfaces named, no over-claim) ·check:pm-governed-merges✓ ·check:nul-bytes✓ 8593 files ·check:refd-timer-probe✓ ·check:doc-authoring✓ ·check:required-contexts✓ ·check:watch-hint-literal✓ ·check:agent-test-spelling✓ ·check:docs-audit-scope✓ ·check:driver-memory-census✓ ·check-closing-keyword-parity(+ self-test) ✓ ·check-comment-mask-corpus✓ ·check-governed-queue-guard --self-test✓ 183 cases ·@objectstack/lint check:doc-formula-expressions✓ (first run exit 3 PREREQUISITE NOT MET — formula/lint unbuilt; built under the verify lock, 2m52s, then ✓). No package is touched ⇒ no build/test closure owed; changeset:.claude/**andAGENTS.mdpublish nothing ⇒skip-changeset.Acceptance notes (noted, not filed; 承接者 named)
.claude/agents/os-dev.md:50 「先搜再立」 still asks the dev to dedupe before filing; ruling ③ moves dedupe to triage (filer attaches keywords). 承接者: the skills seat — a class-1 sub-issue of [Decision] A claimed card follows through to MERGED; cross-lane surfaces import the review instead of exporting the card; in-scope derived work and unclaimed blockers stay with the claiming seat (maintainer question after #17718, 2026-09-13) #17942 (os-dev.md has its own ceiling; not in this PR's file surface).lanes/ui.md:25 and objectuiAGENTS.md§9 still read 「停在 draft 等人合」 — ruling C applies to objectui governed PRs too (the card names objectui#9374 / [finding] delegation-of-duty.dogfood.test.ts is a real end-to-end proof of the ADR-0091 validity window, and no authz matrix row cites it #9377). 承接者: the skills seat, sibling-repo PR.SKILL.md:113pm:retriagerow and :106 assignee row (table rows) still name 改路由 / 跨车道移交 without the pre-dispatch qualifier; the bullet 「pm:retriage改路由只对未派发卡」 governs. 承接者: whoever next edits those rows under the 342 B pin.维护者速读(草稿)
改了什么:把这周你在聊天里定下的八条裁决写进 PM 章程的规则层——认领的卡跟到合并(碰到 spec 面借复核不换席)、衍生子卡与阻塞项的三分表、定级/路由/查重收回分诊席(立卡者只附查重词)、受管面分两层(只有 pm-dispatch 的 references 目录经席内复核后入队,其余仍由你确认)、你批准之后由席位自己落地(后续推送也是)、ui 车道条款②适用面写明、分诊 sweep 补第四态、总监席把待你确认的受管草稿一批呈报、分诊席「并发出现的六态属他席」。SKILL.md、核心条款、AGENTS.md 第 14 条、三个车道文件,行数全部不变,每处新增都在同文件删重付账。
为什么改:每条都是已裁未落地的章程滞后;裁决原文逐字引在各 commit 与上文。
风险与代价(含回滚):不发布任何包、无 changeset;规则层文本改动,回滚 = revert 本 PR。风险在两处判断:AGENTS.md 第 14 条为付行数删掉了
node -e打印受管面的辅助命令(注册表所在文件仍点名);〈复核〉里「.claude/hooks/settings 纯代码面由 skills 席自审直接落地」的旧例外被你 09-13 的分层裁决覆盖,已删。未含:references 层的对应条文(contract-review.md 的落地前检③例外与逐车道适用表、dispatch-runbook.md 的接手细则、director.md 与 decision-analysis.md 的总监批呈)另起一个 references PR,待 PR #17990 / #17992 落地后由席位自落;#17950 的注册表与队列守卫脚本项另起脚本 PR。
一句问:同意「hooks/settings 的旧自审直落例外」随分层裁决一并删除吗(是/否)?
Generated by Claude Code