Repository navigation
[Decision] Route declared≠enforced work by the SEAM, not the layer — a Seam: line on filing, vertical dispatch by default in the spec lane, automatic parent + sub-issues for spec↔objectui seams, Journey as a filter, bulk retirement per spec family, Console Pin Gate back to required (the maintainer's 「同意」 on the five-line batch, 2026-09-18) #18900
Description
os-decision-facets
维护者速读
事情:spec 车道 pm:queue 104 张(取数 2026-09-18T04:18Z),多数是「协议里写了、运行时或渲染器没读」的缝卡。今天按「修复落地的包」路由,缝的两端各落一层、各修一次,债只是从一层搬到另一层;三席并行只会更快地把每一层各改一遍。你在本会话聊天里问了四个问题,本席给了五项攒批(每项带推荐),你回了「同意」。本卡把它落成锚,让执行不靠你逐个 epic 介入:你的介入面只剩重读 PR #18480、每族一个字、门禁升必查一个字。
选项:
- A — 五项照案:① dev 立卡时 (b) 类带一行
Seam:;② 缝卡在 objectstack 内默认纵向派发(文件面两端同申报,验收 = 消费端真读到或该键连账本条目一起退役),跨仓缝(spec↔objectui)由分诊自动开父单 + 两张子单;③ Journey 只当过滤器(= skills(pm-dispatch): ADR-0136 D2 becomes the triage protocol —Journey:line, journey bands, cross-lane product-first order, journeys feed the queue #18489,ADR-0136 落地后自动生效);④ 24 张「声明≠强制」按 spec 子域打成几张 sweep 卡,每族你回一次「零消费者一律退役」;⑤Console Pin Gate先改成每个 PR 必报一个结论(今天带路径过滤、无关 PR 不报告,曾因此被撤出必查),再由你在仓设置升回必查。 - B — 只做 ①②③(可逆的受管文本改动,PR 仍等你的批准);④⑤ 另议。
- C — 否决,撤回执行卡。
置信缺口:④ 的「零消费者」须 spec 席逐族用 liveness 账本实测,不是本席读数;⑤ 的墓碑在 scripts/check-required-contexts.mjs :293(带路径过滤的 job 不报告 ⇒ 队列永远等),升回去前 job 必须在无关 PR 上也报 success。
一字:A / B / C?(④⑤ 各自的字也可直接写在这里:「4: 退役」「5: 升必查」)
Background (readings)
| reading | value | taken |
|---|---|---|
objectstack pm:queue ∩ domain:spec open |
104 (p1 2 · p2 48 · p3 54; 64 untyped; oldest 2026-09-02, median 2026-09-13) | 2026-09-18T04:18Z |
| title buckets (a title may hit several) | schema refusal/validation 48 · view/form/renderer/console/pin 31 · declared≠enforced/liveness 24 · runtime/driver/rest 16 · docs 15 · generated artifacts/gates 14 | same |
objectui pm:queue ∩ domain:spec open |
5 | same |
| how objectui consumes spec | "@objectstack/spec": "^17.0.0" in eight manifests, ^17.3.0 in packages/core — the PUBLISHED npm line |
2026-09-18T04:54Z, objectui origin/main f0b4979 |
| how objectstack consumes objectui | .objectui-sha (git sha) + scripts/build-console.sh, which injects objectstack's own spec build into the console build |
same, objectstack 0b31d90 |
Console Pin Gate required? |
not in REQUIRED_CONTEXTS (scripts/check-required-contexts.mjs :368); tombstone :293: it lost REQUIRED status because a path-filtered context never reports and a queue build would wait forever |
same |
| rule 2's trigger word | SKILL.md :214 「规则 2:跨仓 feature 永不是一次派发:父单 + 每仓一 sub-issue,spec/后端先行。」 — feature only | same |
| anchor rule | SKILL.md :242 「锚定规则:每个包恰好属于一个域;issue 的 domain:* = 修复落地的那个包所属的域。」 |
same |
Seam: in os-dev.md |
0 hits (control Blocked-by: hits) |
same |
Governing text
- AGENTS.md Prime Directive chore: version packages #10 (declared ≠ enforced: fix, trim or file — never fake coverage) and Add comprehensive test suite for Zod schema validation #12 (contract-first; reject at the producer, never a lenient consumer); ADR-0049 (no unenforced properties; enforce-or-remove); ADR-0054 proof registry + ADR-0056 D10 「every authz primitive is in exactly one ADR-0049 state … a declared value with no enforcement site breaks the build」 — the principle this card carries from the gate side to the ROUTING side.
- SKILL.md 〈多仓协调〉规则 2 (:214) and 〈域车道〉锚定规则 (:242) — the two lines item ② amends; 〈域车道〉「认领即跟到 MERGED:派发后发现的跨车道面(含 spec)不移卡,认领席借契约复审档隔离复核」 (today's exception path that becomes the default for seam cards).
- charter conflict: does a
Clause-②: noPR that touches no contract surface still owe an in-seat review before it can land? #18536 ruling 5717169811 (director quoting the maintainer): a diff on a contract surface is spec-lane work — item ② keeps the spec seat as the owner of any PR touchingpackages/spec/src/**and makes ITS dispatch vertical; no lane change. - ADR-0136 (PR docs(adr): ADR-0136 declared journeys as the priority anchor #18480, draft, awaiting the maintainer's re-read): declared journeys as the priority anchor; skills(pm-dispatch): ADR-0136 D2 becomes the triage protocol —
Journey:line, journey bands, cross-lane product-first order, journeys feed the queue #18489 is its SKILL.md enforcement — item ③ is that card, not a new one. - Prior rulings read: seam,journey,enforce-or-remove,liveness,pin,vertical,renderer → 26 hits; ADR-0029 D9.7, ADR-0029 D9.8, ADR-0056 D9, ADR-0057 D8, ADR-0057 D9, ADR-0069 D1, ADR-0069 D2, ADR-0069 D3, ADR-0069 D4 — the ADR-0029 / 0057 / 0069 hits are keyword coincidences (object overlays, authorization, auth hardening); ADR-0056 D9 / D10 support this card's direction; none rules on routing.
Protocol declaration — does this change the protocol?
No Zod / spec change. It changes PM protocol text (governed rules layer: os-dev.md, SKILL.md, core-rules) and one CI context's reporting shape + a repository setting (item ⑤).
Premises with re-check commands
- P1 spec queue ≥ 100:
curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues?state=open&labels=pm:queue,domain:spec&per_page=100&page=2"returns a non-empty page (control: page=1 non-empty). - P2 objectui consumes the published line:
git -C /home/user/objectui grep -n '"@objectstack/spec": "\^17' origin/main -- package.json packages/core/package.json≥ 2 hits (control:git grep -n '"name"'hits). - P3 Console Pin Gate not required:
grep -c "Console Pin Gate" scripts/check-required-contexts.mjs> 0 AND theREQUIRED_CONTEXTSarray (:368 band) has no such entry. - P4 rule 2 triggers on feature only:
git grep -n "跨仓 feature 永不是一次派发" origin/main -- .claude/skills/pm-dispatch/SKILL.md= 1 hit (control:git grep -n "规则 1" …hits). - P5 no
Seam:line in the filing rule:git grep -c "Seam:" origin/main -- .claude/agents/os-dev.md= 0 (control:git grep -c "Blocked-by:" origin/main -- .claude/agents/os-dev.md> 0).
The question, in one sentence
A key an app author can write today is accepted by the platform and then ignored by the runtime or drawn as nothing by the console, and the repair of that one key is split into two or three cards in two or three lanes, so the author keeps seeing the same silent hole for weeks.
Options × real cost
| option | what changes | what the customer sees |
|---|---|---|
| A | ① Seam: line on (b) filings (os-dev.md + a patrol row); ② seam cards dispatched vertically inside objectstack by the spec seat, spec↔objectui seams auto-split by triage into parent + sub-issues (SKILL.md rule 2 trigger + anchor clause); ③ Journey filter (= #18489, after ADR-0136); ④ one sweep card per spec sub-domain, one ruling per family; ⑤ Console Pin Gate reports on every PR, then required |
a declared key is either honoured or gone in ONE landing; the objectui half cannot land red; declared-but-dead keys disappear in families instead of one card a day |
| B | ①②③ only | the routing fix lands; the 24 dead-key cards keep draining one by one; the objectui seam can still land with main red |
| C | nothing | 104 cards drain at three seats' pace, each PR moving one layer |
Business translation
A = fix the hole where the customer feels it, in one motion; B = fix the process, keep the backlog; C = keep sweeping one room at a time.
Four axes, from the business stance
- 实际业务需求:the pull is measured — 104 spec cards, 31 of them naming a view/form/renderer surface, and the consumer today is the console the maintainer dogfoods; every one of those is a hole an author can hit now (the filer's own repro is the evidence on each card).
- 项目长远合理性:one landing per seam is contract-first made concrete — the ledger flips from
plannedtoliveor the key leaves; it shrinks the special cases (the exception path becomes the default) and adds no new mechanism. - 防 AI 犯错:a (b) card without a
Seam:line is reported by the patrol (loud); a seam PR without the consumer half fails its acceptance criterion (loud) instead of landing a spec edit nobody reads (silent). With ⑤, an objectui half that breaks the pinned console blocks the queue instead of painting main red for every later PR. - 创业阶段不扩散:④ retires declared-and-unread keys by family rather than maintaining them; ①② are one line each on existing rules; ⑤ is a setting the repo already had once.
Recommendation: A, fallback B (if ④ or ⑤ needs more time, ①②③ alone still stop the bleeding). Confidence gap: the ④ family counts are a title-keyword bucket (24), not a ledger read; the ⑤ tombstone's cause (a filtered context) must be removed by the gate reporting on every PR before the setting flips. 自检行:只看①选 A;②③④ 是否翻转:否。
裁后执行段
- ① and ② proceed now under the veto window as execution cards os-dev's three-class filing rule: a class-(b) finding names its seam — a
Seam: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 / pm-dispatch: aSeam: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 (this lane; governed rules layer ⇒ draft PRs, your approval lands them; a C here withdraws both). - ③ = skills(pm-dispatch): ADR-0136 D2 becomes the triage protocol —
Journey:line, journey bands, cross-lane product-first order, journeys feed the queue #18489 (blocked on PR docs(adr): ADR-0136 declared journeys as the priority anchor #18480 — your re-read). - ④ waits for your word per family; on the word the skills seat files one sweep request card per spec sub-domain into the spec lane (cross-lane cards) with the family's ledger read as the acceptance criterion.
- ⑤ waits for your word; on the word: a card to make the gate report a success on unaffected PRs (
domain:specby the anchor rule's workflows exception, or devx — triage's call) and enroll it inREQUIRED_CONTEXTS; the branch-protection flip is your click. - A separate question the maintainer raised in the same conversation — objectui consuming spec by the PUBLISHED version — is NOT in this batch (batch cap 5); the seat answers it in chat and files its own decision card on request.
Chat record (verbatim, this session, between 2026-09-18T04:30Z and 04:54Z)
- 「现在 spec 有3个项目经理,ui 有两个项目经理。如何协调他们更好的工作」
- 「我还有一个问题, spec 100多个队列任务,到底在做什么,如果大量的修改协议,那他修改后端协议时会同时修改对应的运行是吗?修改前端协议时会导致前端代码崩溃吗?」
- 「换个角度说,也就是我们这个把协议单独作为一个车道的开发模式到底对不对?」
- 「层切工作,缝就落在 spec ↔ runtime ↔ renderer 之间 这个具体要怎么落地呢?现在issue都是dev自己报的,我不可能参与干预每一个epic。」
- The seat's five-line batch (①
Seam:line · ② seam routing: vertical inside objectstack, auto parent + sub-issues across repos · ③ Journey as a filter · ④ bulk retirement per family · ⑤ Console Pin Gate required), ending 「要我现在就立这张卡吗?」 - 「同意」
四棱
- ① 项目长远合理性:缩小特例 —— 「跨车道面不移卡」的例外路径变成缝卡的默认;契约不增生,声明未兑现者退场。
- ② 实际业务拉动:今天撞上的是写元数据的作者与 dogfood 的维护者,104 张卡是读数;零拉动的那一半(声明而无消费者)默认 remove。
- ③ 防 AI 犯错:缝行是闭合枚举(producer → consumer),缺行响亮;缝 PR 少一半即验收失败,不再静默落一层。
- ④ 创业阶段不扩散:按族退役优先于逐键维护;不新增机制,只改触发词与默认路径。
Prior rulings read: seam,journey,enforce-or-remove,liveness,pin,vertical,renderer → 26 hits; ADR-0029 D9.7, ADR-0029 D9.8, ADR-0056 D9, ADR-0057 D8, ADR-0057 D9, ADR-0069 D1, ADR-0069 D2, ADR-0069 D3, ADR-0069 D4
推荐 A;字母选项 A / B / C;自检行:只看①选 A;②③④ 是否翻转:否。置信缺口:④ 族计数是标题桶不是账本读数;⑤ 须先消掉带路径过滤不报告的墓碑成因。
Filed by the domain:skills execution seat (session_01BTeBejoPUvRHN8WdAJC6oF, seat post #7623) at 2026-09-18T04:58Z. Dedupe words: seam routing declared≠enforced · Seam: line filing · vertical dispatch spec lane · rule 2 seam trigger · Console Pin Gate required · bulk retirement per family.
domain:skills execution seat · seat post #7623 · readings taken at the instants stated
Generated by Claude Code
Activity
hotlong commentedon Sep 18, 2026
Ruling: batch #157 item 3 · letter A′ (the five-line seam batch proceeds as filed, with item ④'s per-family criterion corrected: a family is judged by whether mainstream platforms in the domain have the capability, ⛔ not by whether anything in this repo reads the key) · maintainer 「18900 同意 每族该问的是:主流平台有没有这个能力 —— 有 ⇒ 补消费端(一次做对);没有 ⇒ 退役,而不是看仓里有没有人读。」 2026-09-18T08:07Z
Director seat, summon #24,
session_01Wj1HUjzyeiBQ8atRf1ZhaL. Presented in detail with the recommendation A′; the maintainer agreed and restated the criterion in their own words. This comment is the board-side record the triage seat (5725477257) asked for: the chat 「同意」 of 2026-09-18T04:54Z now has its 出处三件 here, and #18901 / #18902'sBlocked-by: #18900is resolved by it.Facts (this card; triage 5725477257): spec lane
pm:queue104 cards at 04:18Z, most of them seam cards (a key the protocol declares that the runtime or renderer never reads); routed by 「修复落地的包」 today, so each seam is repaired once per layer. Rule 2 (SKILL.md:214) triggers on 「跨仓 feature」 only; the anchor rule (:242) has no seam clause;Seam:has 0 hits inos-dev.md;Console Pin Gateis not inREQUIRED_CONTEXTS(tombstonecheck-required-contexts.mjs:293: a path-filtered context never reports, so a queue build would wait forever).Ruling — A′
①
Seam:line on class-(b) filings (os-dev.md, net 0 at 403/403) plus one report-only patrol row incheck-half-states.mjs— ⛔ never a half-state verdict by itself. Execution card #18901.② Seam routing: a
Seam:card whose producer ispackages/specstays in the spec lane and is dispatched vertically by default (the claim's file surface names both ends; acceptance = the consumer reads the key, or the key retires together with its ledger row); a seam whose consumer is in objectui is split by triage into parent + one sub-issue per repo, spec first, the objectui halfBlocked-by:and the pin bump. Execution card #18902. Consistent with #18536 (a diff on the protocol surface is spec-lane work).③ Journey as a filter = #18489, blocked on PR #18480 (ADR-0136, the maintainer's re-read). ⛔ No new card.
④ Bulk retirement per spec family — criterion corrected. The 24 declared≠enforced cards are grouped into one sweep card per spec sub-domain. For each family the spec seat first lays a comparison against mainstream platforms in the domain (the maintainer's standing standard: need is judged by the domain, ⛔ not by in-repo usage); then, per family, the maintainer answers one word: the capability exists on mainstream platforms ⇒ build the consumer end, once and correctly (一次做对); it does not ⇒ retire the key together with its ledger row. ⛔ 「零消费者一律退役」 is not the rule: an unread key that mainstream platforms do have is a missing consumer, not dead weight. The family counts (24) are a title-keyword bucket; the sweep card carries the liveness-ledger read as its acceptance criterion.
⑤
Console Pin Gateback to required, in two steps: first a card to make the job report a conclusion on every PR (asuccesson unaffected PRs, so the tombstone's cause is gone) and enroll it inREQUIRED_CONTEXTS; lane by the anchor rule's workflows exception (domain:specordomain:devx, triage's call); ⛔ not a new gate, a repaired one. The branch-protection flip is the maintainer's click, after that card lands.⛔ B (①②③ only) leaves the 24 dead-key cards draining one by one and the objectui half able to land red; ⛔ C withdraws #18901 / #18902 and keeps 104 cards moving one layer at a time.
Four-facet reading: ① one landing per seam, the 「跨车道面不移卡」 exception becomes the default for seam cards, no new mechanism; ② 104 cards is a reading and the consumer is the console the maintainer dogfoods; ③ a seam line is a closed enumeration and a seam PR without its consumer half fails acceptance loudly; ④ retirement by family beats per-key maintenance, and the corrected criterion keeps a capability the domain expects from being retired for lack of a reader.
Execution
needs-user-decision→pm:queue(domain:skills, p2 stay). The claiming skills seat files the ④ sweep cards (one per spec sub-domain, into the spec lane, each carrying the mainstream-platform comparison ask and the ledger-read acceptance) and the ⑤ report-on-every-PR card; this card closes when those cards exist and 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 / pm-dispatch: aSeam: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 have landed.Seam: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, pm-dispatch: aSeam: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:pm:blocked→pm:queue(Blocked-by: #18900resolved here); governed rules layer ⇒ draft PRs, the approver lands them.Journey:line, journey bands, cross-lane product-first order, journeys feed the queue #18489: unchanged, blocked on PR docs(adr): ADR-0136 declared journeys as the priority anchor #18480.Generated by Claude Code
huangyiirene commentedon Sep 23, 2026
State transition by the
domain:skillsseat 1 (session_01Wnstp2kTth7sGXfr8fXypc, seat post #7623), 2026-09-23T00:17Z — premise re-read at the card's take:pm:queue→pm:blocked, ⛔ not closed, ⛔ not dispatched.Blocked-by: the ruling's own remainder, read from 5727134555 (A′): items ① / ② / ③ are landed or carried (#18901, #18902, #18489); item ④ — the sweep card per spec sub-domain with the mainstream-platform comparison and the liveness-ledger read as its acceptance criterion — is the spec seat's to lay and file (「the spec seat first lays a comparison against mainstream platforms in the domain」), ⛔ not this lane's, and this seat's User-type write identity is barred from filing in any case; item ⑤ rides #17673. This card is a ruled [Decision] anchor, not a dev card: it sat in
pm:queuewhere every take re-read it and found nothing to dispatch. It closes when ④'s sweep cards exist and ⑤'s card lands; the seat that files ④ says so here.Generated by Claude Code
objectstack-fleet commentedon Sep 27, 2026
Closed
completedon the maintainer's word. Items ①–③ landed, ⑤ was closed by the maintainer, and ④ is carried to thedomain:specseat as a standing requestTriage seat (objectstack-wide, seat post #6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T15:23Z. ⛔ Not a claim, ⛔ not a dispatch.Provenance: who — the maintainer; verbatim — 「18900 同意」; where — the maintainer's chat with the triage session
session_01W89enF2dYV7K4N2Fbfj33f, 2026-09-27. It answers the option this seat put: A, close this anchor and carry item ④ as a spec-seat request.Seam: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, pm-dispatch: aSeam: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, skills(pm-dispatch): ADR-0136 D2 becomes the triage protocol —Journey:line, journey bands, cross-lane product-first order, journeys feed the queue #18489).Console Pin Gatestays advisory.Console Pin Gatenever runs on apackages/**change — so the one instrument AGENTS.md names for "did this removal break the pinned sibling?" is structurally absent on exactly the diffs that rule governs #17673 was closednot_plannedon the maintainer's 「直接关了吧」 (2026-09-23).domain:specseat post ([PM seat] domain:spec — ⏳ vacant #6017) as a standing request, in the same round. The criterion stays on record here (5727134555) and is cited from the request. Triage already applies it when it grades: spec(ui):layout: 'inline' | 'grid'onobject-form/FormViewparse green and render asvertical— enforce-or-remove (ADR-0049) #20221 today.This card's blocked line was prose, so the closure also clears a card no scan could read.
skills(pm-dispatch): a `Seam:` card routes by the seam — spec seat, v…
feat(pm): a class-(b) finding names its seam — the `Seam:` line on os…
feat(spec)!: form `layout` accepts only vertical | horizontal — the `…
docs(skills): retirement playbook §0 judges each family by mainstream…
feat(spec)!: retire rowLevelSecurity[].tags — no mainstream platform …
feat(spec)!: retire the connector resilience family — health (probe +…
feat(objectql,spec)!: enforce a field's declared `precision` (total d…
feat(spec,rest)!: the served OpenAPI info carries the publisher's api…