Skip to content

skills(pm-dispatch): a Seam: card routes by the seam — spec seat, vertical dispatch by default; rule 2 splits a spec↔objectui seam into parent + per-repo sub-issues - #19321

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-18902-seam-routing-rules
Sep 20, 2026
Merged

os-steve merged 1 commit into
mainfrom
claude/issue-18902-seam-routing-rules

Conversation

@os-steve

Copy link
Copy Markdown
Collaborator

Fixes #18902

Clause-②: no
Ruling-ref: 5727135121 — director seat, ruling batch 157 item 3, letter A′ on decision card #18900 (the five-line seam batch proceeds; item ②, this card, as filed). #18900 stays open (its ④ / ⑤ execution is not this PR). #18901 (item ①, the Seam: line itself in os-dev.md) is not addressed here — this text presupposes that line and lands in either order.

What lands

Rules layer, .claude/skills/pm-dispatch/** (Tier S) — the PR stays DRAFT; the seat's in-seat contract-tier review lands it. Two regions of SKILL.md, their two core-rules.md twins, nothing else. Head b175866 on base e3b3cdd (origin/main at dispatch); diff +5 / −5 over 2 files. Every touched line verbatim with its byte count (the 120-byte cap is MAX_LINE_BYTES in scripts/pm/check-skill-line-ratchet.mjs, enforced by check:pm-skill-ratchet; check:pm-governed-prose pins only the governed-surface enumeration, not line length).

1. 〈域车道〉 anchor rule gains the seam clause (SKILL.md)

:242 before, 108 B:

- 锚定规则:每个包恰好属于一个域;issue 的 `domain:*` = 修复落地的那个包所属的域。

:241 after, 120 B (in place; 「恰好属于」 → 「恰属」 and 「修复落地的那个包所属的域」 → 「修复落地包的域」 bought the bytes, same meaning):

- 锚定规则:每个包恰属一个域;`domain:*` = 修复落地包的域;`Seam:` 卡归 spec 席,默认纵向派发。

:243 NEW, 119 B (both ends in the claim's file surface + the fixed acceptance criterion):

- `Seam:` 卡认领申报两端;验收 = 消费端读该键(活性账本行离开 `planned`)或键随账本行退役。

2. The line retired to pay for :243 — net 0 on 813 / 813

SKILL.md :234 before, 119 B, retired (it is the "adjacent spec-collection line" the dispatch named as the one fold candidate; no re-wrap bought anything):

- 新 `packages/spec` 工作恒由 `domain:spec` 席收口,不论谁需要它;已派发卡 ⛔ 不因触 spec 转席。

Surviving homes, both halves:

  • first half — SKILL.md :290 「epic 委托不入座位贴体系;新 packages/spec 工作恒归 spec 座位。」, core-rules.md :62 「…新 spec 工作由 spec 席收口。」, lanes/spec.md :12 「packages/spec 恒归本席,不论谁需要它。」;
  • second half — SKILL.md :231 「认领即跟到 MERGED:派发后发现的跨车道面(含 spec)不移卡,认领席借契约复审档隔离复核。」, core-rules.md :62 「派发后的跨车道面不移卡、借隔离复核」.

3. 〈多仓协调〉 rule 2's trigger widens (SKILL.md)

:214 before, 97 B:

- 规则 2:跨仓 feature 永不是一次派发:父单 + 每仓一 sub-issue,spec/后端先行。

:214 after, 120 B (in place):

- 规则 2:跨仓 feature 或 objectui 消费的 `Seam:` 卡恒由分诊立父单 + 每仓一子单,spec/后端先行。
  • "triage opens the parent + one sub-issue per repo itself, no maintainer action per epic" is the new subject 「恒由分诊立」. The objectui half's Blocked-by: and the pin bump are the lines that already follow (:215 downstream carries Blocked-by:; :219 a pin bump is never a rider), so they are not restated. 「永不是一次派发」 is implied by 「恒由分诊立父单 + 每仓一子单」 together with :216 「被链接或同父的两单永不同批」.

4. core-rules.md twins — net 0 on 151 / 151

Subset rule, SKILL.md :44: 「一条规则在本文与核心条款一处改动,另一处同 PR 同改」. Both twins moved because both SKILL.md lines changed meaning.

:58 before, 107 B:

- 跨仓 feature 拆成父单加每仓一张子单,下游带 `Blocked-by:`,上游未关闭 ⛔ 不派发。

:58 after, 119 B:

- 跨仓 feature 或跨仓 `Seam:` 卡拆成父单加每仓子单,下游带 `Blocked-by:`,上游未关 ⛔ 不派发。

「跨仓 Seam: 卡」 is the subset spelling of "a Seam: card whose consumer is in objectui": under the Seam: grammar the producer is spec: (objectstack), so a seam crosses repos exactly when its renderer: consumer lives in objectui.

:64 before, 120 B:

- 每个包恰好属于一个域(唯一例外见 SKILL.md 锚定规则),域标签等于修复落地的包所属的域。

:64 after, 116 B (the pointer widens to cover the seam clause; the core rule itself is unchanged):

- 每个包恰好属于一个域,域标签 = 修复落地包的域;例外与 `Seam:` 卡见 SKILL.md 锚定规则。

5. Item 3 — lanes/spec.md: no line (the dev's call)

The ratchet carries a row for that file (check-skill-line-ratchet.mjs :1238, ceiling 43; the file is at 43 / 43), so a pointer line there costs a retired line there, and nothing in that file is a duplicate of anything else; every seat reads SKILL.md in full and the two 域车道 lines are self-sufficient. ⛔ No restatement — so no line.

Reader tests (the card's Acceptance section, answered against the landed text)

  • (a) 「a Seam: card names runtime: — who dispatches it and what does the claim's file surface say?」 ⇒ SKILL.md :241 「Seam: 卡归 spec 席,默认纵向派发」: the spec seat, vertically; :243 「认领申报两端」: the claim's file surface names both ends (the spec key and the runtime call site / pin test); 「验收 = 消费端读该键(活性账本行离开 planned)或键随账本行退役」: acceptance as ruled.
  • (b) 「a Seam: card names renderer: in objectui — who opens what?」 ⇒ SKILL.md :214 「objectui 消费的 Seam: 卡恒由分诊立父单 + 每仓一子单,spec/后端先行」: triage opens the parent + one sub-issue per repo (two here), spec half first; :215 / :219 give the objectui half its Blocked-by: and the pin bump. No maintainer action per epic.
  • (c) 「a spec-only card with no Seam: line」 ⇒ unchanged: :241's first two clauses are the old anchor rule (「每个包恰属一个域;domain:* = 修复落地包的域」), :214's 「跨仓 feature」 trigger is untouched, :231 (the isolated review) is untouched, core-rules.md :64's rule half is untouched.

Gates — head b175866, every exit code captured before any pipe

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths; change set from the merge base: 2 files, +5 / −5) derived 20 commands — exactly the dispatch-time list including pnpm --filter @objectstack/lint run check:doc-formula-expressions. All 20 ran, all exit 0. --ran (a separate call, exit codes recorded per line): 「20 derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED (a DERIVED zero — all 20 recorded an exit code and none of them is 3)」.

command exit verdict line (excerpt)
pnpm check:pm-skill-ratchet 0 SKILL.md 813 / 813 · core-rules.md 151 / 151 · lanes/spec.md 43 / 43 (headroom 0 each); every line within 120 bytes or structurally exempt
pnpm check:pm-skill-id-lint 0 27 file(s) clean (pattern /#[0-9]{3,}/g)
pnpm check:pm-governed-prose 0 2 instruction surface(s) name all 6 registered governed surfaces and claim no others
pnpm check:skill-frame-sync 0 the one declared copy of the decision frame is internally coherent
pnpm check:skill-frame-freshness (named by the card, not derived) 0 the frame itself is unchanged
pnpm check:pm-governed-merges 0 435 assertions
pnpm check:pm-expected-skips 0 99 cases
pnpm check:pm-half-states 0 5081 cases
pnpm check:doc-authoring 0 44 published skill files clean; 15844 customer-facing strings clean
pnpm check:nul-bytes 0 9036 text file(s), no raw ASCII control bytes
pnpm check:agent-test-spelling 0 green
pnpm check:cross-package-test-inputs 0 255 self-test cases; 29 package(s) declared
pnpm check:driver-memory-census 0 every declaration ledgered
pnpm check:refd-timer-probe 0 6916 source file(s) swept
pnpm check:watch-hint-literal 0 71 declaration(s) across 4 rostered names
node scripts/check-closing-keyword-parity.mjs and --self-test 0 / 0 40 assertions, 5 mutations driven to red
node scripts/check-comment-mask-corpus.mjs 0 6921 files, 0 disagree
node scripts/pm/check-governed-queue-guard.mjs --self-test 0 296 cases
node scripts/pm/check-harness-current.mjs --self-test 0 26 cases
pnpm --filter @objectstack/lint run check:doc-formula-expressions — after pnpm --workspace-concurrency=2 --filter '@objectstack/formula...' --filter '@objectstack/lint...' build under scripts/pm/os-verify-lock.sh (closure sdui-parser · spec · formula · lint; lock held 225 s, waited 0 s) 0 22 record-scoped formula example(s) across 439 files / 1380 TS blocks clean
node scripts/pm/check-governed-merges.mjs --test SKILL.md core-rules.md --additions 5 --deletions 5 3 GOVERNED — Tier S (.claude/** ×2); size 10 changed lines ≤ 5000

Not merged past origin/main (4fef271, three commits ahead of the base): none of the 16 files those commits changed is under .claude/** or scripts/pm/**, and the only derivation inputs they moved (scripts/check-tenant-audit-census.mjs, scripts/tenant-audit-census.mjs) are outside the 20 derived families; #18891 (:441, this seat) has not landed. The seat can PUT /pulls/N/update-branch at zero file writes if CI on a current merge ref is wanted before the review of record.

Acceptance notes

维护者速读(草稿)

改了什么:PM 派发规则两处。① 域车道锚定规则加一句:带 Seam: 行的卡归 spec 席、默认纵向派发;认领同时申报 spec 键与消费端两头,验收 = 消费端真读到该键(活性账本行离开 planned)或该键连账本行一起退役。② 多仓协调规则 2 的触发从「跨仓 feature」扩到「跨仓 feature 或消费端在 objectui 的 Seam: 卡」,由分诊自己开父单加每仓一张子单,spec 先行。核心条款两行同改;三份受管文件行数不变(813 / 151 / 43),付账的是退掉一行两处已有的重复句。

为什么改:你 2026-09-18 对五项攒批的「同意」(#18900 裁决 A′,第 ② 项)。今天「协议里写了、运行时或渲染器没读」的缝卡按修复落地的包路由,缝的两头各落一层、各修一次;改成按缝路由后,一个键要么在一次落地里被真正读到,要么连账本一起退场,不再拆成两三张卡在两三条车道上排队。跨仓的缝由分诊自动拆父子单,不需要你逐个 epic 介入。

风险与代价(含回滚):纯规则文本,无代码、无门禁、无脚本改动;每行 ≤ 120 字节、行数净零。风险在措辞:spec 席从此默认连消费端(runtime)那半边一起接,若消费端文件正被别的认领持有,仍走既有的在飞检查串行,不另设机制。回滚 = revert 本 PR,一次提交。

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

你要做的:无。受管面 Tier S,由 skills 席的契约档复核落地;你若想改「默认纵向派发」的措辞或范围,在本 PR 留一句即可。


Generated by Claude Code

…ertical dispatch by default; rule 2 splits a spec↔objectui seam into parent + per-repo sub-issues

Anchor rule (域车道) gains the seam clause: a `Seam:` card belongs to the
spec seat and is dispatched vertically by default; its claim declares both
ends and acceptance = the consumer reads the key (liveness-ledger row leaves
`planned`) or the key retires with its ledger row. Rule 2 (多仓协调) now also
triggers on a `Seam:` card consumed by objectui: triage files the parent +
one sub-issue per repo, spec/backend first. Net 0 lines in SKILL.md: the new
域车道 line is paid by retiring the 多仓协调 line whose two halves already
live at 座位贴协议 (新 spec 工作恒归 spec 座位) and the 认领即跟到 MERGED line.
core-rules.md twins updated in place (net 0).

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi
@os-steve os-steve added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 20, 2026 — with Claude
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Sep 20, 2026

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b17586642cce555fc748eedbea1406b2103c94a5

① Derived judgments

  • Accept set / public surface: none moves — protocol prose only (SKILL.md two regions, core-rules.md two twins), no script, no gate. Judged correct.
  • Ruling A′ item ② (5727135121) realised on this head, read line by line by the seat: 〈多仓协调〉 rule 2 now triggers on a cross-repo feature OR an objectui-consumed Seam: card, triage opens parent + one sub-issue per repo, spec/backend first (:214, 120 B); 〈域车道〉 anchor rule routes a Seam: card to the spec seat with vertical dispatch by default (:241, 120 B); the new :243 (119 B) fixes the claim's file surface (both ends) and the acceptance criterion (the consumer reads the key — its liveness-ledger row leaves planned — or the key retires with its ledger row); core-rules :58 / :64 moved as twins (119 B / 116 B). Judged correct against the card's 「What lands」 1–2; item 3 (a lanes/spec.md pointer) correctly not added — the file has a ratchet row at 43 / 43 and no restatement is allowed.
  • The retired :234 「新 packages/spec 工作恒由 domain:spec 席收口,不论谁需要它;已派发卡 ⛔ 不因触 spec 转席」: both halves verified surviving on the head — :290 「新 packages/spec 工作恒归 spec 座位」 + core-rules :62 「新 spec 工作由 spec 席收口」 for the first, :231 「派发后发现的跨车道面(含 spec)不移卡」 + core-rules :62 for the second. No rule lost.
  • Ratchet / lint / prose / frame, seat-run on this head: check-skill-line-ratchet.mjs exit 0 (813 / 813, 151 / 151), check-skill-id-lint.mjs exit 0, check-governed-prose.mjs exit 0, check:skill-frame-sync exit 0. git merge-tree against origin/main 13d5294 (which now carries PR skills(pm-dispatch): hard serial across rounds applies to the same claimed region, not the same file — SKILL.md :441 and its core-rules twin #19317's :441 change): 0 conflicts.

② Semver level

None — .claude/** publishes nothing; skip-changeset on the PR is the correct declaration. Judged correct.

③ Boundary flags

open_questions empty. One noted, not filed read: two seam vocabularies coexist (「缝卡」 = the cross-repo coordination card; 「Seam: 卡」 = a card carrying the line) — the backticked spelling keeps them apart; recorded on the seat post as a rider for when #18901 lands. The three reader tests (a)(b)(c) are answered in the PR body against the landed text.

Implemented-by: claude/issue-18902-seam-routing-rules
Reviewed-by: session_017ETYWqMQD4qMtZzAGovWNi

VERDICT: PASS


Generated by Claude Code

@os-steve
os-steve marked this pull request as ready for review September 20, 2026 12:43
@os-steve
os-steve added this pull request to the merge queue Sep 20, 2026
Merged via the queue into main with commit 9120837 Sep 20, 2026
32 checks passed
@os-steve
os-steve deleted the claude/issue-18902-seam-routing-rules branch September 20, 2026 13:20
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

1 participant