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
Conversation
…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
Collaborator
Author
Contract reviewServed-tier: ① Derived judgments
② Semver levelNone — ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
os-steve
marked this pull request as ready for review
September 20, 2026 12:43
This was referenced Sep 20, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 inos-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 ofSKILL.md, their twocore-rules.mdtwins, nothing else. Headb175866on basee3b3cdd(origin/mainat dispatch); diff +5 / −5 over 2 files. Every touched line verbatim with its byte count (the 120-byte cap isMAX_LINE_BYTESinscripts/pm/check-skill-line-ratchet.mjs, enforced bycheck:pm-skill-ratchet;check:pm-governed-prosepins only the governed-surface enumeration, not line length).1. 〈域车道〉 anchor rule gains the seam clause (
SKILL.md):242 before, 108 B:
:241 after, 120 B (in place; 「恰好属于」 → 「恰属」 and 「修复落地的那个包所属的域」 → 「修复落地包的域」 bought the bytes, same meaning):
:243 NEW, 119 B (both ends in the claim's file surface + the fixed acceptance criterion):
packages/lint…」 line so the 锚定规则 / 唯一例外 pair, whichcore-rules.md:64 andlanes/engine.md:15 point at, keeps its adjacency.plannedare the spellingsreferences/dispatch-runbook.md:191–:193 already uses fornode_modules/@objectstack/spec/liveness/*.json(status: 'planned'= carrier present, zero consumers), so "the consumer reads the key" has its machine-readable reading beside it.packages/spec") is carried by theSeam:line's grammar (os-dev's three-class filing rule: a class-(b) finding names its seam — aSeam:line (producer → consumer,consumer: noneallowed) on the card, and the half-state patrol reports a class-(b) card that lacks one (item ① of #18900) #18901: its left side is alwaysspec:), so the clause names the card by its key only and restates no grammar. The isolated review (:231 「认领即跟到 MERGED …」) is untouched — it is the exception path that now becomes the default forSeam:cards.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):Surviving homes, both halves:
SKILL.md:290 「epic 委托不入座位贴体系;新packages/spec工作恒归 spec 座位。」,core-rules.md:62 「…新 spec 工作由 spec 席收口。」,lanes/spec.md:12 「packages/spec恒归本席,不论谁需要它。」;SKILL.md:231 「认领即跟到 MERGED:派发后发现的跨车道面(含 spec)不移卡,认领席借契约复审档隔离复核。」,core-rules.md:62 「派发后的跨车道面不移卡、借隔离复核」.3. 〈多仓协调〉 rule 2's trigger widens (
SKILL.md):214 before, 97 B:
:214 after, 120 B (in place):
Blocked-by:and the pin bump are the lines that already follow (:215 downstream carriesBlocked-by:; :219 a pin bump is never a rider), so they are not restated. 「永不是一次派发」 is implied by 「恒由分诊立父单 + 每仓一子单」 together with :216 「被链接或同父的两单永不同批」.4.
core-rules.mdtwins — net 0 on 151 / 151Subset rule,
SKILL.md:44: 「一条规则在本文与核心条款一处改动,另一处同 PR 同改」. Both twins moved because bothSKILL.mdlines changed meaning.:58 before, 107 B:
:58 after, 119 B:
「跨仓
Seam:卡」 is the subset spelling of "aSeam:card whose consumer is in objectui": under theSeam:grammar the producer isspec:(objectstack), so a seam crosses repos exactly when itsrenderer:consumer lives in objectui.:64 before, 120 B:
:64 after, 116 B (the pointer widens to cover the seam clause; the core rule itself is unchanged):
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 readsSKILL.mdin 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)
Seam:card namesruntime:— 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.Seam:card namesrenderer: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 itsBlocked-by:and the pin bump. No maintainer action per epic.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 pipenode 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 includingpnpm --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)」.pnpm check:pm-skill-ratchetSKILL.md813 / 813 ·core-rules.md151 / 151 ·lanes/spec.md43 / 43 (headroom 0 each); every line within 120 bytes or structurally exemptpnpm check:pm-skill-id-lintpnpm check:pm-governed-prosepnpm check:skill-frame-syncpnpm check:skill-frame-freshness(named by the card, not derived)pnpm check:pm-governed-mergespnpm check:pm-expected-skipspnpm check:pm-half-statespnpm check:doc-authoringpnpm check:nul-bytespnpm check:agent-test-spellingpnpm check:cross-package-test-inputspnpm check:driver-memory-censuspnpm check:refd-timer-probepnpm check:watch-hint-literalnode scripts/check-closing-keyword-parity.mjsand--self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/pm/check-governed-queue-guard.mjs --self-testnode scripts/pm/check-harness-current.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressions— afterpnpm --workspace-concurrency=2 --filter '@objectstack/formula...' --filter '@objectstack/lint...' buildunderscripts/pm/os-verify-lock.sh(closure sdui-parser · spec · formula · lint; lock held 225 s, waited 0 s)node scripts/pm/check-governed-merges.mjs --test SKILL.md core-rules.md --additions 5 --deletions 5.claude/**×2); size 10 changed lines ≤ 5000Not merged past
origin/main(4fef271, three commits ahead of the base): none of the 16 files those commits changed is under.claude/**orscripts/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 canPUT /pulls/N/update-branchat zero file writes if CI on a current merge ref is wanted before the review of record.Acceptance notes
SKILL.md:210 / :212,core-rules.md:57: the cross-repo coordination card that stays in objectstack withrepo:*) and 「Seam:卡」 (a card carrying theSeam:line, this PR). The backticked spelling keeps them apart; reconciling the naming is an observation, not one of the three filing classes. 承接者: the skills seat when os-dev's three-class filing rule: a class-(b) finding names its seam — aSeam:line (producer → consumer,consumer: noneallowed) on the card, and the half-state patrol reports a class-(b) card that lacks one (item ① of #18900) #18901 lands.SKILL.md:231 and the spec-collection line at :234 (the dispatch said :286 / :281; text anchors held).lanes/spec.mdHAS a ceiling row (check-skill-line-ratchet.mjs:1238 → 43, file at 43 / 43), so the claim's "no ceiling row / ≤ +1" was not available without a script edit; item 3 resolved by adding no line.维护者速读(草稿)
改了什么: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