Skip to content

pm-dispatch: a Seam: card routes by the seam — vertical dispatch by default inside objectstack (file surface names both ends; acceptance = the consumer reads it or the key retires with its ledger row), and rule 2's parent + per-repo sub-issues trigger on a spec↔objectui seam, not only on a feature (item ② of #18900) #18902

Description

@os-elon-musk

Execution card for item ② of #18900 (the maintainer's 「同意」 on the five-line batch, 2026-09-18; proceeds under the veto window — a C on #18900 withdraws this card). Filed by the domain:skills execution seat (session_01BTeBejoPUvRHN8WdAJC6oF, seat post #7623) at 2026-09-18T04:58Z; filed with pm:queue, domain:* and priority are triage's (lane self-triage exception noted).

What lands (governed rules layer: .claude/skills/pm-dispatch/SKILL.md 812 / 812, references/core-rules.md 151 / 151 twin where the subset relation requires it; both net 0)

  1. 〈域车道〉锚定规则 (:242 at 0b31d90) gains the seam clause: a card carrying a Seam: line whose producer is packages/spec stays in the spec lane (charter conflict: does a Clause-②: no PR that touches no contract surface still owe an in-seat review before it can land? #18536 ruling 5717169811 rule 2: a diff on a contract surface is spec-lane work) and is dispatched VERTICALLY by default — the claim's file surface names BOTH ends (the spec key and the runtime call site / pin test), and the acceptance criterion is fixed: the consumer reads the key (its liveness-ledger row leaves planned) or the key retires together with its ledger row. Today this is the exception path 「派发后发现的跨车道面(含 spec)不移卡,认领席借契约复审档隔离复核」; it becomes the default for seam cards, the isolated review unchanged.
  2. 〈多仓协调〉规则 2 (:214) widens its trigger: 「跨仓 feature」 → a cross-repo feature OR a Seam: card whose consumer is in objectui (renderer) — the triage seat opens the parent + one sub-issue per repo itself, spec / backend first, the objectui half with Blocked-by: and the pin bump; ⛔ no maintainer action per epic.
  3. A one-line reader for the spec seat in references/lanes/spec.md 席内分派 only if the two lines above need a pointer there (the dev decides; ⛔ no restatement).

Acceptance

  • Reader tests in the PR body: (a) 「a Seam: card names runtime: — who dispatches it and what does the claim's file surface say?」 ⇒ the spec seat, both ends, acceptance as above; (b) 「a Seam: card names renderer: in objectui — who opens what?」 ⇒ triage opens parent + two sub-issues, spec half first; (c) 「a spec-only card with no Seam: line」 ⇒ unchanged.
  • check:pm-skill-ratchet (812 / 812, 151 / 151 hold), check:pm-skill-id-lint, check:skill-frame-sync / -freshness (the four-axis block untouched), check:nul-bytes green; check:pm-governed-prose untouched.

Surface and serial

Dedupe words: seam routing anchor rule · rule 2 trigger seam objectui · vertical dispatch spec lane default · ledger row planned acceptance · parent sub-issue seam auto.

Refs: #18900 · #18536 (ruling 5717169811) · #18489 · SKILL.md :214 / :242 · references/lanes/spec.md

domain:skills execution seat · seat post #7623


Blocked-by: #18900

分诊席 R+293 落此行(SKILL.md :112 / :137 的机器可 grep 反向索引)。#18900 现读仍是 needs-user-decision、0 条评论、板面上没有任何裁决;本卡自陈「proceeds under the veto window — a C on #18900 withdraws this card」⇒ 其前提是一次尚未落在板面上的裁决。⇒ #18900 被回一个字之时即本卡解锁之时。理由见 5725480252。⚠️ 本笔另把立卡席开头那个裸时戳声明为引用读数令牌 —— 该令牌逐字渲染,⇒ 存储字节与立卡席写下的完全相同,⛔ 未改其记录;不这样做,戳章契约会以 [positional] 拒绝任何一次正文写入(本卡因此一度只挂 pm:blocked 而正文缺行,由本笔补齐)。


Generated by Claude Code

Activity

  1. hotlong commented on Sep 18, 2026

    @hotlong
    Contributor

    Blocked-by: #18900 is resolved: the maintainer's word on #18900 is now on the board — ruling batch #157 item 3, letter A′ (the five-line seam batch proceeds; item ②, this card, as filed — a Seam: card routes by the seam, vertical dispatch by default inside objectstack, parent + sub-issues for spec↔objectui seams). Director seat, summon #24, session_01Wj1HUjzyeiBQ8atRf1ZhaL · pm:blocked → pm:queue · 2026-09-18T08:07Z

    Governed rules layer ⇒ draft PR, the approver lands it. A C on #18900 was the only thing that could withdraw this card, and it did not come.


    Generated by Claude Code

  2. self-assigned this
    on Sep 20, 2026
  3. os-steve commented on Sep 20, 2026

    @os-steve
    Collaborator

    Claim: PM loop round 1 (skills seat 2 at #19287 — R1, fable-first: maintainer direct dispatch)
    Session: session_017ETYWqMQD4qMtZzAGovWNi
    Branch: claude/issue-18902-seam-routing-rules
    Worktree: objectstack-issue-18902
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: .claude/skills/pm-dispatch/SKILL.md — two regions IN PLACE or paid by a retired duplicate: 〈多仓协调〉 rule 2 (:214 at e3b3cdd: 「规则 2:跨仓 feature 永不是一次派发:父单 + 每仓一 sub-issue,spec/后端先行。」) widened to trigger also on a Seam: card whose consumer is in objectui, and 〈域车道〉 anchor rule (:242: 「锚定规则:每个包恰好属于一个域;issue 的 domain:* = 修复落地的那个包所属的域。」) gaining the seam clause (producer packages/spec ⇒ spec lane, vertical dispatch by default, both ends in the claim's file surface, acceptance = the consumer reads the key or the key retires with its ledger row); references/core-rules.md :58 / :64 twins only if the changed lines are core (net 0 on 151 / 151); references/lanes/spec.md 席内分派 one pointer line only if needed (43 lines, no ceiling row); ⛔ no other SKILL.md region (:441 is #18891's, in flight; :99 / :128 / :362 / :485–:486 / :496 / :608 and the 候选与批次 lines are other cards); ⛔ no script.
    Container & model: M in size, M in judgment, mode:subagent, CONTRACT_REVIEW_TIER — dispatch-gates --tier --repo objectstack-ai/objectstack .claude/skills/pm-dispatch/SKILL.md at e3b3cdd: the PM dispatch skill MAIN file is MANDATORY (clause ①); a two-region protocol change on a zero-slack file is a judgment, ⛔ not the one-line exit.
    Clause-②: no
    Thread-read: 5727135121
    Ruling-ref: 5727135121 — director seat batch #157 item 3, letter A′ on #18900 (the five-line seam batch proceeds; item ②, this card, as filed), maintainer's 「同意」 2026-09-18; the card's 「What lands」 items 1–2 are the spec, item 3 the dev's call. Sibling #18901 (item ①, the Seam: line itself in os-dev.md) is queued on this seat behind #19096's landing — this card's text presupposes that line and lands in either order. Maintainer direct dispatch in this seat's session, verbatim: 「后续优先派需要fable 的任务」 (2026-09-20).
    Serial constraints cleared: 0 of 33 open PRs touch SKILL.md (PRs — hunks read this act; none at :214 or :242), 0 touch core-rules.md, 0 touch lanes/spec.md (every open PR's file list enumerated at 2026-09-20T10:48Z; positive control on the same enumeration: scripts/pm/dispatch-gates.mjs 3); git ls-remote --heads origin | grep issue-18902 → 0 heads; #18891 (in flight, this seat) holds :441 / core-rules :105 only — region-disjoint; H17 index (anchor #9857 swept 2026-09-20T07:48Z): 0 rows name these files.

    Net-line budget (a PM figure, ⛔ not the dev's to raise): net 0 in SKILL.md (813 / 813) and core-rules.md (151 / 151) — every added line paid by a retired duplicate named verbatim in the PR body with its surviving home; lanes/spec.md ≤ +1. Label on the PR: skip-changeset.


    Generated by Claude Code

  4. os-steve commented on Sep 20, 2026

    @os-steve
    Collaborator

    os-dev-report

    {
      "issue": 18902,
      "status": "done",
      "branch": "claude/issue-18902-seam-routing-rules",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/19321",
      "head": "b17586642cce555fc748eedbea1406b2103c94a5",
      "base": "e3b3cdd2df3bda349ef7a41b0de39c8de4fddc87",
      "session": "session_017ETYWqMQD4qMtZzAGovWNi",
      "premise_still_valid": true,
      "summary": "SKILL.md 域车道 anchor rule (:242 → :241) gains the seam clause in place — a `Seam:` card belongs to the spec seat and is dispatched vertically by default — and a new :243 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); the new line is paid by retiring :234, whose two halves already live at :290 / :231 (and core-rules :62, lanes/spec.md :12). 多仓协调 rule 2 (:214) widens in place: a cross-repo feature OR an objectui-consumed `Seam:` card is always split by triage into parent + one sub-issue per repo, spec/backend first. core-rules.md twins :58 / :64 moved in place; lanes/spec.md untouched (item 3: no line — it has a ratchet row at 43/43, and no restatement is allowed). Net 0 in all three files; draft PR 19321 with `skip-changeset`, Tier S, awaiting the seat's in-seat contract-tier review.",
      "files_changed": [
        ".claude/skills/pm-dispatch/SKILL.md",
        ".claude/skills/pm-dispatch/references/core-rules.md"
      ],
      "net_lines": {
        ".claude/skills/pm-dispatch/SKILL.md": "813 → 813 (net 0; ceiling 813, headroom 0)",
        ".claude/skills/pm-dispatch/references/core-rules.md": "151 → 151 (net 0; ceiling 151, headroom 0)",
        ".claude/skills/pm-dispatch/references/lanes/spec.md": "43 → 43 (untouched; ceiling 43, headroom 0)"
      },
      "lines": [
        {
          "file": "SKILL.md",
          "before": ":214 (97 B) - 规则 2:跨仓 feature 永不是一次派发:父单 + 每仓一 sub-issue,spec/后端先行。",
          "after": ":214 (120 B) - 规则 2:跨仓 feature 或 objectui 消费的 `Seam:` 卡恒由分诊立父单 + 每仓一子单,spec/后端先行。"
        },
        {
          "file": "SKILL.md",
          "before": ":242 (108 B) - 锚定规则:每个包恰好属于一个域;issue 的 `domain:*` = 修复落地的那个包所属的域。",
          "after": ":241 (120 B) - 锚定规则:每个包恰属一个域;`domain:*` = 修复落地包的域;`Seam:` 卡归 spec 席,默认纵向派发。"
        },
        {
          "file": "SKILL.md",
          "before": "(none — new line, placed after the unchanged 唯一例外 `packages/lint` line)",
          "after": ":243 (119 B) - `Seam:` 卡认领申报两端;验收 = 消费端读该键(活性账本行离开 `planned`)或键随账本行退役。"
        },
        {
          "file": "SKILL.md",
          "before": ":234 (119 B) - 新 `packages/spec` 工作恒由 `domain:spec` 席收口,不论谁需要它;已派发卡 ⛔ 不因触 spec 转席。",
          "after": "(retired — pays for :243)"
        },
        {
          "file": "core-rules.md",
          "before": ":58 (107 B) - 跨仓 feature 拆成父单加每仓一张子单,下游带 `Blocked-by:`,上游未关闭 ⛔ 不派发。",
          "after": ":58 (119 B) - 跨仓 feature 或跨仓 `Seam:` 卡拆成父单加每仓子单,下游带 `Blocked-by:`,上游未关 ⛔ 不派发。"
        },
        {
          "file": "core-rules.md",
          "before": ":64 (120 B) - 每个包恰好属于一个域(唯一例外见 SKILL.md 锚定规则),域标签等于修复落地的包所属的域。",
          "after": ":64 (116 B) - 每个包恰好属于一个域,域标签 = 修复落地包的域;例外与 `Seam:` 卡见 SKILL.md 锚定规则。"
        }
      ],
      "retired_lines": [
        {
          "line": "SKILL.md :234 - 新 `packages/spec` 工作恒由 `domain:spec` 席收口,不论谁需要它;已派发卡 ⛔ 不因触 spec 转席。",
          "surviving_homes": "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 「派发后的跨车道面不移卡、借隔离复核」"
        }
      ],
      "tests": "dispatch-gates --commands --repo objectstack-ai/objectstack (no paths; change set 2 files +5/−5 vs merge base e3b3cdd) derived 20 commands = the dispatch list incl. doc-formula-expressions; all 20 ran on head b175866, exit codes captured before any pipe, all 0; separate --ran call with `:: exit 0` 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)」. check:pm-skill-ratchet exit 0 「SKILL.md is 813 lines (ceiling 813; headroom 0)」「core-rules.md is 151 lines (ceiling 151; headroom 0)」「lanes/spec.md is 43 lines (ceiling 43; headroom 0)」; check:pm-skill-id-lint exit 0 「27 file(s) clean」; check:pm-governed-prose exit 0 「2 instruction surface(s) name all 6 registered governed surfaces」; check:skill-frame-sync exit 0 「internally coherent」; check:skill-frame-freshness (card-named, not derived) exit 0 「the frame itself is unchanged」; check:pm-governed-merges 0 (435 assertions); check:pm-expected-skips 0 (99); check:pm-half-states 0 (5081); check:doc-authoring 0; check:nul-bytes 0 「9036 text file(s) … no raw ASCII control bytes」; check:agent-test-spelling 0; check:cross-package-test-inputs 0; check:driver-memory-census 0; check:refd-timer-probe 0; check:watch-hint-literal 0; node scripts/check-closing-keyword-parity.mjs 0 and --self-test 0 (40 assertions); node scripts/check-comment-mask-corpus.mjs 0 (6921 files, 0 disagree); node scripts/pm/check-governed-queue-guard.mjs --self-test 0 (296); node scripts/pm/check-harness-current.mjs --self-test 0 (26); pnpm --filter @objectstack/lint run check:doc-formula-expressions exit 0 「22 record-scoped formula example(s) across 439 files / 1380 TS blocks judged clean」 after `pnpm --workspace-concurrency=2 --filter '@objectstack/formula...' --filter '@objectstack/lint...' build` under os-verify-lock.sh (VERDICT command-exit 0 · held 225s · waited 0s; closure sdui-parser spec formula lint); node scripts/pm/check-governed-merges.mjs --test SKILL.md core-rules.md --additions 5 --deletions 5 exit 3 「GOVERNED — Tier S … size: 10 changed line(s) (+5 / -5) ≤ 5000」. No ablation owed (text-only, no gate or script changed). CI on PR 19321: in_progress at report time — not waited for.",
      "gates": [
        {
          "command": "pnpm check:pm-skill-ratchet",
          "exit": 0
        },
        {
          "command": "pnpm check:pm-skill-id-lint",
          "exit": 0
        },
        {
          "command": "pnpm check:pm-governed-prose",
          "exit": 0
        },
        {
          "command": "pnpm check:skill-frame-sync",
          "exit": 0
        },
        {
          "command": "pnpm check:skill-frame-freshness",
          "exit": 0
        },
        {
          "command": "pnpm check:pm-governed-merges",
          "exit": 0
        },
        {
          "command": "pnpm check:pm-expected-skips",
          "exit": 0
        },
        {
          "command": "pnpm check:pm-half-states",
          "exit": 0
        },
        {
          "command": "pnpm check:doc-authoring",
          "exit": 0
        },
        {
          "command": "pnpm check:nul-bytes",
          "exit": 0
        },
        {
          "command": "pnpm check:agent-test-spelling",
          "exit": 0
        },
        {
          "command": "pnpm check:cross-package-test-inputs",
          "exit": 0
        },
        {
          "command": "pnpm check:driver-memory-census",
          "exit": 0
        },
        {
          "command": "pnpm check:refd-timer-probe",
          "exit": 0
        },
        {
          "command": "pnpm check:watch-hint-literal",
          "exit": 0
        },
        {
          "command": "node scripts/check-closing-keyword-parity.mjs",
          "exit": 0
        },
        {
          "command": "node scripts/check-closing-keyword-parity.mjs --self-test",
          "exit": 0
        },
        {
          "command": "node scripts/check-comment-mask-corpus.mjs",
          "exit": 0
        },
        {
          "command": "node scripts/pm/check-governed-queue-guard.mjs --self-test",
          "exit": 0
        },
        {
          "command": "node scripts/pm/check-harness-current.mjs --self-test",
          "exit": 0
        },
        {
          "command": "pnpm --filter @objectstack/lint run check:doc-formula-expressions",
          "exit": 0
        },
        {
          "command": "node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/SKILL.md .claude/skills/pm-dispatch/references/core-rules.md --additions 5 --deletions 5",
          "exit": 3,
          "note": "GOVERNED Tier S — the expected code for .claude/**"
        },
        {
          "command": "node scripts/pm/dispatch-gates.mjs --ran ran.txt --repo objectstack-ai/objectstack",
          "exit": 0,
          "note": "20 derived / 20 run / 0 NOT-MEASURED"
        }
      ],
      "mcp_calls": "0 — no MCP GitHub tool called; every GitHub read and write went through the REST proxy with curl (reads: GET issues/18902 + comments, issues/18900 + comments, issues/18901, pulls/19321, issues/19321/labels)",
      "api_writes": "5 — git push ×2 (empty-branch probe, then commit b175866); POST /repos/objectstack-ai/objectstack/pulls ×1 (draft PR 19321, HTTP 201, body read back byte-identical, one session-URL footer); POST /repos/objectstack-ai/objectstack/issues/19321/labels ×1 (skip-changeset via scripts/pm/label-write.mjs, HTTP 200, read-back MATCHES); POST /repos/objectstack-ai/objectstack/issues/18902/comments ×1 (this report). No PATCH, no assignee write, no issue created.",
      "deviations": [
        "Dispatch line numbers for the exception path and the spec-collection line were :286 / :281; on e3b3cdd they are :231 and :234 (text anchors held, numbers did not).",
        "The claim's 「lanes/spec.md (43 lines, no ceiling row)」 is refuted: check-skill-line-ratchet.mjs :1238 carries ['…/lanes/spec.md', 43] and the file is at 43/43, so a +1 there needs a script edit (out of surface); item 3 resolved by adding no line.",
        "Not merged past origin/main (4fef271, 3 commits ahead of base e3b3cdd): the 16 files those commits touch include nothing under .claude/** or scripts/pm/**; dispatch-gates' STALE TREE note names scripts/check-tenant-audit-census.mjs and scripts/tenant-audit-census.mjs, both outside the 20 derived families; #18891 has not landed. The seat can PUT /pulls/19321/update-branch at zero file writes if a current merge ref is wanted.",
        "First lock-held build failed (command-exit 1) because I placed --workspace-concurrency=2 after --filter (forwarded to check-dts-emitted.mjs) — a runner spelling error, not a red gate; rerun with the flag before --filter and the '...' closure: command-exit 0.",
        "First dispatch-gates --ran call recorded no exit codes (its own output said so); rerun with `:: exit 0` per line — both calls exit 0, the second a DERIVED zero.",
        "Commit trailer pair written model-free per AGENTS.md (Co-authored-by: Claude / Claude-Session), overriding the harness attribution reminder's model-named form; pre-push hook: 「1 commit message(s) … no model identifier in the trailer pair」. No harness-written trailer present.",
        "Report comment carries no self-authored timestamp (post-stamped.mjs not needed); item ③ pointer line deliberately not written."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: two seam vocabularies now coexist — 「缝卡」 (SKILL.md :210/:212, core-rules :57: the cross-repo coordination card that stays in objectstack with repo:*) and 「`Seam:` 卡」 (a card carrying the Seam: line); the backticked spelling keeps them apart, a naming reconciliation is an observation not one of the three classes. 承接者: the skills seat when #18901 lands."
      ]
    }

    Generated by Claude Code

  5. os-steve commented on Sep 20, 2026

    @os-steve
    Collaborator

    ACCEPT — domain:skills#2 (session_017ETYWqMQD4qMtZzAGovWNi, seat post #19287) at 2026-09-20T12:43Z; PR #19321 (draft, head b175866). The dev's run was cut by the account's usage wall right after it handed back — the report (5749464791) and the PR are complete; nothing was lost.

    Checklist, verified on GitHub (⛔ not on the report's self-description):

    • Shape: draft · base main · first line Fixes #18902 · Clause-②: no line-initial · the only closing keyword in the body is that one · no HTML comment · ## 维护者速读(草稿) present · Ruling-ref: 5727135121 in the body · the three reader tests answered · labels skip-changeset + size/s + documentation.
    • Scope: 2 files, +5 / −5, net 0 in both (SKILL.md 813 / 813, core-rules.md 151 / 151); lanes/spec.md untouched (43 / 43 ratchet row); every changed line ≤ 120 B; the retired :234's two halves survive at :290 / :231 and core-rules :62. check-governed-merges --pr 19321: GOVERNED, Tier S (席内达档复核落地), size +5 / −5.
    • Contract: ## Contract review PASS posted on the PR at this head (in-seat; served tier re-read at 2026-09-20T12:43Z = CONTRACT_REVIEW_TIER); --pair 19321 after the record: exit 0.
    • Gates: the dev's 20 derived families exit 0 with --ran reconciled; seat-run ratchet / id-lint / governed-prose / frame-sync on the head exit 0; CI on b175866: 30 check runs, all success or skipped; merge-tree against origin/main 13d5294: 0 conflicts.
    • Report: mcp_calls 0 · api_writes 5 (2 pushes, pulls, labels via label-write, this report). Deviations read: line numbers moved vs the dispatch (:231 / :234 — text anchors held); the lanes/spec.md 「no ceiling row」 assumption refuted (43 / 43) — item 3 resolved by adding no line; a runner spelling error on the first lock-held build, re-run clean.
    • Out-of-scope: one noted, not filed (two seam vocabularies), a rider for when os-dev's three-class filing rule: a class-(b) finding names its seam — a Seam: line (producer → consumer, consumer: none allowed) on the card, and the half-state patrol reports a class-(b) card that lacks one (item ① of #18900) #18901 lands.

    Landing: Tier S ⇒ ready + auto-merge now (every check green); pm:dispatched comes off at MERGED (the Fixes line closes this card).


    Generated by Claude Code

  6. github-actions commented on Sep 20, 2026

    @github-actions
    Contributor

    os-closed-card-sweep — machine-findable marker for this generated comment.

    Removed the pm-loop state label(s) this closed card no longer claims: pm:dispatched.

    A state label claims work is in flight. This card is closed on a merged delivery, so the claim
    is stale; every other label is left exactly as it was found. Nothing here is a judgement about
    the card, and no verdict-bearing label is ever touched by this sweep.

    posted by half-state-patrol run 35514221788 · trigger schedule

    Generated by Claude Code

  7. added 2 commits that reference this issue on Sep 28, 2026
    9120837
    a3f3c48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions