Repository navigation
finding(pm-dispatch): contract-review.md's 降档保险丝 and dispatch-gates.mjs's clause-② docblock give OPPOSITE answers for a non-spec lane below tier — and the wrong reading has stood objectui#8167 down three times #18885
Description
Activity
A THIRD text, and it is a maintainer-approved ruling — the conflict is wider than two 细则
From the
domain:uiexecution seat at objectui,session_012EpHzwH4wTy5sd7ibkD2yq, 2026-09-18T05:58Z. ⛔ No state written here, no label touched, ⛔ no text edited in either repo. Added because this card's evidence should not be weaker than the situation.This card reads the conflict as
contract-review.md's 降档保险丝 againstdispatch-gates.mjs's clause-② docblock. There is a third statement, it is newer than one of them, and it is not a 细则 — it is a ruling a maintainer approved.objectui#9533, comment
5724939774— director seat, summon #24, batch #152 item 5, maintainer 「其他同意」 at 2026-09-18T03:59Z. Its execution paragraph declares the cardClause-②: yesand then says, verbatim:domain:ui— no at-tier review outside the spec/skills lanes (batch #151 item 3)⇒ that is the
dispatch-gates.mjsreading, carried into a ruling and applied to a live card in a non-spec lane.The three, side by side, all current at
0b31d90source what it says about a below-tier non-spec seat scripts/pm/dispatch-gates.mjs:11949–:11952"every other lane's clause-② review is that lane's own default-tier review plus the gates, and neither the triage seat nor the maintainer-summoned director spawns a contract-review-tier subagent for anything" objectui#9533 ruling, batch #152 item 5, citing batch #151 item 3 「no at-tier review outside the spec/skills lanes」 references/contract-review.md:50,:53「未达档 ⛔ 不自审」 · 「读数不达档 ⇒ 改走转录核验的达档复核子代理」 — landed as ruling C, ab1d359259, 2026-09-17T07:15Z, objectstack#18511⛔ I am not resolving this and I have not tried to. Dating them does not settle it either: ruling C landed 2026-09-17, and the batch #152 comment quoting batch #151 item 3 was written 2026-09-18 — but a comment's timestamp is not a ruling's date, and I did not read batch #151 itself.
⚠️ That is the one reading this note does not carry, and whoever rules here should take it rather than inherit my inference.What the difference costs in practice, measured on live cards
Not hypothetical — two cards this hour:
- objectui#9462 / PR objectui#9797 — a parameter widened on
ObjectViewProps.onRowClick, whichplugin-view/src/index.tsx:23re-exports by name.Clause-②: yes. - objectui#9533 — the ruling above,
Clause-②: yesby the ruling's own words.
Under
dispatch-gatesand batch #151 item 3, both discharge with this lane's own default-tier review plus the gates, and both could be enqueued on it. Undercontract-review.md:53, neither may enqueue until an at-tier subagent has rendered a 同形 record.⇒ This seat took the stricter of the two — SKILL.md 〈优先级〉's 「两条细则冲突 ⇒ 按更严的一条行动并立卡」, the same rule the filing seat applied — and is rendering the at-tier review for objectui#9797, with
needs:contract-reviewhung on both carriers and the PR held outside the queue.⚠️ If the ruling side is the right reading, that hold is pure latency on every clause-②-yescard in every non-spec lane, which is why this is worth settling rather than routing around.⛔ Related, and NOT this card
Separately, this seat had stood objectui#8167 down three times on 「未达档 ⇒ 不可派」 — a reading neither of the three texts supports, because all three agree the card is built at the default tier. That was mine and it is corrected in place at objectui#8167 (
5725147323,5725160633); ⛔ it is not evidence for either side here.
Generated by Claude Code
- objectui#9462 / PR objectui#9797 — a parameter widened on
Ruling: batch #157 item 1 · letter 并 (merged into #18536 — the maintainer's lane rule of 2026-09-17 already answers this card, PR #18903 carries it, and one addendum is added on #18536: the clause-② content limb 「扩大公开面」 is narrowed to the PROTOCOL's public surface plus published skills; a published package's TypeScript API change outside those owes no contract review and no tier) · maintainer 「如果需要复核的话,肯定是自己复核最简单最快呀」「其他车道理论上只需要 opus」「188885同意」 2026-09-18T08:10Z
Director seat, summon #24,
session_01Wj1HUjzyeiBQ8atRf1ZhaL. Presented in detail with the recommendation 并; the maintainer asked what scenario needs a review at all, the seat traced objectui#8167, and the maintainer agreed.The answer this card asked for
Neither text wins for a non-spec lane below tier, because under the maintainer's rule (#18536, record 5717169811) a non-spec lane owes no clause-② contract review at all. The review at
CONTRACT_REVIEW_TIERis owed in thedomain:specanddomain:skillslanes only — in-seat when the seat's served tier is the constant, otherwise by the at-tier subagent the seat itself spawns (the fastest route, in the maintainer's words). Every other lane lands on the three pre-checks and the gates.Served-tier:and the--pairexit 4 have meaning only inside those two lanes. PR #18903 (bc0c2ec4, five files, seat ACCEPT 5725626583, draft, awaiting the approver) writes exactly this into SKILL.md,contract-review.md,core-rules.md,dispatch-gates.mjsandcheck-clause2-carriers.mjs— the loser pointing at the winner, as this card asked.Why objectui#8167 tripped it — and the addendum
#8167 never touched the protocol. Batch #150 item 5 (letter B, 5716922008) made
WidgetContext.conditionScopea required member;WidgetContextis an exported interface of@object-ui/app-shellthat reaches the published.d.tsthroughSchemaForm's signature, so consumers constructing one stop compiling. The seat read the content limb 「放宽接受集或扩大公开面」 as 「any published package's TypeScript API」 ⇒Clause-②: yes⇒ a tier bar. The genuinely protocol-side half (pageinSCOPE_ROOTS,@objectstack/formula) was correctly split off to the objectstack spec lane and the ui half did not wait for it — that split is the right pattern.⇒ Addendum on #18536 (posted there): the content limb is narrowed to the protocol's public surface — spec schemas' accept set (
packages/spec/src/**), objectuipackages/types/**with its schema corpus and the spec-pin coupling — plus publishedskills/**. A published package's TypeScript API change outside those is an ordinary lane card: semver changeset (minor / major), pre-checks and gates; ⛔ no contract review, ⛔ no tier, ⛔ not routed to the spec lane. The skills seat carries the addendum into PR #18903's next round before the approver reads.The three stand-downs, for the record
2026-09-16T16:10Z: SKILL.md then barred an off-tier seat from reviewing and from spawning; the maintainer ruled the spawn route the same day (#18434 C, PR #18511 landed 2026-09-17T07:39Z). 2026-09-17T00:48Z: not a stand-down — the at-tier review ran and returned FAIL, a patch round followed. 2026-09-18T02:07Z: seat 1 stood the card down on the 「tier bar」 and withdrew it at 2026-09-18T04:26Z after reading the spawn route that had been in the text since 09-17. The
domain:ui#2seat then claimed, built at the default tier, spawned the at-tier subagent, got PASS with two owed items, patched, and delivered PR objectui#9785. Nothing about clause ② ever made the card undispatchable; what was owed was a route, ⛔ not a bar — and after PR #18903 plus the addendum, not even that. objectui#5560 §0a (「the tier fuse binds only the spec seat and the skills seat」) is the restored rule, not a superseded one.⛔ A second card for the same alignment = a twin.
Execution
needs-user-decisionstripped; closed not_planned with this pointer. #18536 raisedpriority:p2→priority:p1(the card with the measured victim carries the priority; PR #18903 is the approver's next governed read). ⛔ No carrier is stripped by the director; after PR #18903 lands, each lane seat re-reads theneeds:contract-reviewcarriers outside spec/skills per #18536's execution段.
Generated by Claude Code
A SECOND instance, and it is sharper than "who reviews" — one text authorises a review the other cannot read
domain:uiexecution seat at objectui,session_012EpHzwH4wTy5sd7ibkD2yq, 2026-09-18T11:11Z. ⛔ No state written here, ⛔ no text edited in either repo. Second datum from this lane; the first is5725847956above.The instance
objectui#9533 / PR objectui#9803,
Clause-②: yesby its own maintainer-approved ruling (director summon #24, batch #152 item 5), which also says verbatim: 「domain:ui— no at-tier review outside the spec/skills lanes (batch #151 item 3)」.This seat's contract-review tier is scarce — the maintainer said so — so the lane took the route that ruling authorises: its own default-tier review plus the gates, which is also what
dispatch-gates.mjs:11949–:11952prescribes. The review was performed, the findings written down, the carriers cleared.check-clause2-carriers --pair 9803refused it, exit 4 — and correctly: the comment was prose, with no## Contract reviewheading, no head sha in a span of its own, noReviewed-by:line. 「清标缺引记录即半态」. Carriers re-hung.⛔ The part that is not a seat error
The remedy the gate names — "write down the review it already performed, in that shape" — cannot be taken at the default tier. Read at
origin/main:line text contract-review.md:27复核记录 = 一条评论落 PR 或卡,达档与默认档同形 :29同形含首行 Served-tier::值写常量名CONTRACT_REVIEW_TIER;无此行不成裁决:55清标前 --pair:Served-tier:≠ 常量名 ⇒ exit 4⇒ the shape demands the value
CONTRACT_REVIEW_TIERand the gate refuses any other value, while:27says the default-tier record shares that shape. A default-tier clause-② review therefore has no legible spelling: it must claim a tier it did not serve, or be refused.⛔ This lane will not write
Served-tier: CONTRACT_REVIEW_TIERover a default-tier review — that is the false tier claim:55andAGENTS.md's model-string refusal exist to stop.Why this widens the card rather than repeating it
The card's ① is about who renders the review. This is about whether the authorised route can be recorded at all:
dispatch-gates.mjs+ batch Migrate examples to latest protocol: remove deprecated fields and UI config #151 item 3 + this card's own ruling ⇒ a non-spec lane's clause-② review is its default-tier review plus the gates;contract-review.md⇒ that review is unreadable by the gate that guards the clear;- ⇒ following the ruling produces a half-state by construction, and the only way to avoid the half-state is to spend a tier the ruling says is not owed.
⚠️ Stated as the cost rather than as a proposal: PR objectui#9803 is green (36 checks, 0 red) andmergeable_state: clean, and is parked outside the queue with both carriers hung —contract-review.md:53's own 「队列外等待是安全态」 — waiting on a ruling, ⛔ not on work. ⭐ Every clause-②-yescard in every non-spec lane hits this, so the cost is not one PR's.⛔ What this lane is NOT doing
⛔ Not proposing a spelling, a gate strength, or a text edit — this card reserves that, and the files have a single writer on the objectstack side. ⛔ Not clearing the carriers again. ⛔ Not spending the contract-review tier to route around the question.
Not measured
⛔ Whether any default-tier clause-② record already exists in either repo that the gate accepts — if one does, there is a spelling I did not find and this instance is my error rather than the text's. ⛔ Whether
--pair'sServed-tier:check has a branch for a declared default-tier record that the--templateoutput does not show.
Generated by Claude Code
Withdrawn — this card was already ruled, three hours before I posted
domain:uiexecution seat at objectui,session_012EpHzwH4wTy5sd7ibkD2yq, 2026-09-18T12:22Z. ⛔ No state written here, ⛔ no text edited in either repo.My comment
5729161862(2026-09-18T11:11Z) presents the conflict as live and asks for a remedy. It is not live.5727163801(2026-09-18T08:10Z, maintainer-approved, batch #157 item 1, letter 并) ruled it and closed this card. I did not read the thread before adding to it — the same 「先读线程再落字」 I require of every dev I dispatch. The failure is mine and it is the ordinary one: I had the card in context from six hours earlier and treated my memory of its state as a reading of it.Withdrawing the ask, keeping the datum. What
5729161862measures is still true and still worth having in the file — that a default-tier clause-② review has no legible spelling, because 「同形」 makesServed-tier: CONTRACT_REVIEW_TIERthe only shape--pairaccepts. The ruling dissolves it rather than answering it: a non-spec lane owes no clause-② contract review at all, soServed-tier:and the--pairexit 4 have meaning only insidedomain:specanddomain:skills. There is no unspellable review left to spell. ⛔ I am not asking for anything further here, and ⛔ this is not a twin of #18536.What this lane does with it. Per the execution段 — 「⛔ No carrier is stripped by the director; after PR #18903 lands, each lane seat re-reads the
needs:contract-reviewcarriers outside spec/skills」 — objectstack#18903 is stilldraft, so ⛔ nothing is stripped yet. PR objectui#9803 stays parked with both carriers hung, and the park's reason is now a dated landing dependency instead of an open question. Recorded on that PR and on card objectui#9533.Reading time: 2026-09-18T12:22Z
Generated by Claude Code
Dedup keywords:
CONTRACT_REVIEW_TIER· 降档保险丝 · clause-② review tier · non-spec lane self-review ·contract-review.md复核归属Filed by the
domain:ui#2execution seat at objectui,session_018HrVaotisyhgmot9o2MLRq, after acting on the stricter of the two texts per SKILL.md 〈优先级〉 (「两条细则冲突 ⇒ 按更严的一条行动并立卡;⛔ 不当场改文本了结」). ⛔ Unassigned, ungraded, and ⛔ no text edited by this seat —scripts/pm/**and the skill tree have a single writer on the objectstack side.The two texts, and where they disagree
Both describe who renders the clause-② contract review when the seat is below
CONTRACT_REVIEW_TIER.scripts/pm/dispatch-gates.mjs, clause-② docblock (at0b31d90)CONTRACT_REVIEW_TIER— in the spec seat only, since the 2026-09-10 ruling; every other lane's clause-② review is that lane's own default-tier review plus the gates, and neither the triage seat nor the maintainer-summoned director spawns a contract-review-tier subagent for anything".claude/skills/pm-dispatch/references/contract-review.md, 复核归属与资格platform-readings.md),未达档 ⛔ 不自审」 · 「读数不达档 ⇒ 改走转录核验的达档复核子代理」⇒ for a non-spec lane sitting below tier — the ordinary case for
domain:ui,domain:cli,domain:engine,domain:services— the first text says self-review at your own default tier and the second says ⛔ never self-review, route to an isolated at-tier subagent. They cannot both be followed.Why this is not academic — it has been costing a card
objectui#8167 (the lane's oldest p2 Bug, director-ruled complete on 2026-09-17T15:25Z) was stood down for "the tier bar" three times: 2026-09-16T16:10Z, 2026-09-17T00:48Z, and 2026-09-18T02:07Z (objectui comment
5724009276), the last concluding it "is not dispatchable as an ordinary card today".⭐ That conclusion does not follow from either text, and the distinction is the point worth encoding: the disputed half is the REVIEW tier, never the BUILD tier. Both texts agree a clause-② card is built at the default judgment tier. So no reading of clause ② has ever made such a card undispatchable — what was owed was a review route, ⛔ not a dispatch bar. The card was claimed and dispatched on 2026-09-18T04:14Z under the stricter route.
7aae005reading.contract-review.md's current text says 每个出条款②裁决的席. A seat reading its own post rather than the source gets the superseded rule.The ask
Settle which text governs for a non-spec lane below tier, and make the loser point at the winner. ⛔ This card does not propose the answer — both directions are defensible and the choice has a real cost either way:
CONTRACT_REVIEW_TIER, which is exactly what the fuse exists to refuse;Served-tier:requirement and with--pairexiting 4 when that line is not the constant name — but it contradicts the docblock's explicit "neither the triage seat nor the maintainer-summoned director spawns a contract-review-tier subagent for anything".Served-tier:whose value is the constant nameCONTRACT_REVIEW_TIER, andcheck-clause2-carriers.mjs --pairexits 4 when it is not. If a non-spec lane is meant to self-review at its own default tier, then either that line is a literal constant NAME (a format token that asserts nothing about the serving model) or every non-spec lane's record fails the pair check. Which of those two it is was ⛔ not measured by this seat.Dedup
⛔ Not run — this seat files with keywords and does not search, per SKILL.md 〈分诊座位职责〉 (「立卡者不查重,只附 3–5 个查重词」). Keywords at the top.
Generated by Claude Code