Filed unassigned by the domain:ui @ objectui execution seat (session_01YBWFb5YgMU5dw8p2VKj16S, os-justin), 2026-09-06T14:5xZ, under 两条细则冲突 ⇒ 按更严的一条行动并立卡;⛔ 不当场改文本了结. Routing and grading belong to this repo's triage seat.
维护者速读
派发协议里有一条闸门叫「条款②」:凡改变契约接受/拒绝行为、或扩大公开面的卡,一律要用最高档模型做,并且不过契约复审就不许进合并队列。
问题是这句话里的「改变接受/拒绝行为」到底分不分方向——
- 一张卡如果让系统多接受了以前拒绝的东西(放宽),大家都同意要走契约复审。
- 但一张卡如果让系统少接受了、把行为收紧回它本来声称的样子(例如给一个本该有权限检查的地方补上检查),这算不算?
同一份技能文本里,一处写的是「改变接受/拒绝行为」(不分方向),另一处说判据就是「机械边界测试」,而那个测试是分方向的(放宽才触发)。两位 PM 因此对同一张卡给出了相反的判定,⛔ 而这决定了那张卡能不能进合并队列。
这不是理论问题:今天下午我按较宽松的读法把 objectui#7429 派了下去,事后才发现昨天另一位 PM 已经按较严的读法判过它。
你要做的(一个动作):选 A(收紧不触发条款②,只有放宽才触发)还是 B(任何接受/拒绝行为变化都触发,不分方向)?
The conflict, stated precisely
The rule. 强制条款②:凡改变契约接受/拒绝行为或扩大公开面的卡一律契约复审档 — and it binds the enqueue gate: 双肢命中任一且派发档位低于契约复审档位 ⇒ ⛔ 禁止入队.
Reading A — directional. The skill immediately adds 条款②判据即代裁的机械边界测试, and that test is directional: 改动扩大接受集或公开面 ⇒ 人工;拉回已声明契约 ⇒ 代裁车道. On this reading a narrowing is no.
Reading B — directionless. The criterion sentence says changes accept/reject behaviour and carries no direction qualifier. A tightening still changes what a client gets back; a consumer that receives data today and does not tomorrow has experienced a behaviour change as surely as the reverse.
Both readings are load-bearing today, and both have been acted on within 24 hours, in the same lane:
| when |
seat |
card |
verdict |
ground |
| 2026-09-05T20:11Z |
domain:ui PM session_01KbJQ1y… |
objectui#7429 |
yes |
「判据句里没有方向限定」+ seven-package blast radius ⇒ 拿不准就升一档 |
| 2026-09-06 (shift) |
domain:ui PM os-steve |
objectui#7711, #7839, #7751 |
no ×3, all landed |
「Clause-② is about WIDENING… pulling back to the declared contract does not」 |
⇒ Three narrowings have already merged under Reading A while a fourth was held under Reading B. Whichever reading is right, some of that was wrong.
Why it cannot be settled at the seat
- It sets gate strength, which sits on the manual floor (门禁削弱:降阈值、删必查项…). Reading A is strictly weaker than Reading B in reach.
- It is not a one-off judgement call: it partitions routine defect work. Most bug fixes in a
declared ≠ enforced codebase are narrowings — under Reading B a large fraction of ordinary bug cards become contract-review-tier work with a hard enqueue gate, which is a throughput change, not just a semantics change.
- ⛔ 一条规则在本文与核心条款一处改动,另一处同 PR 同改 — so whichever way it lands, it is a
domain:skills PR touching the protocol surface, not a comment.
四棱分析
① 实际业务需求. Measured, not assumed: in the objectui domain:ui lane today, the overwhelming majority of pm:queue cards are declared ≠ enforced repairs — i.e. narrowings. Under Reading B they all become contract-review-tier with a binding enqueue gate. The real business need being served is not "review more"; it is "never let a widening slip through un-reviewed." Reading A serves that need exactly; Reading B serves it plus a large, unrequested tail. ⇒ leans A.
② 项目长远合理性. Contract-first says the declared contract is the North Star and code is brought to it. A rule that taxes moving code toward the contract at the same rate as moving the contract inverts that gradient — it makes the cheapest correct action expensive. ⇒ leans A, but with a real cost: "narrowing" is a judgement, and a mis-labelled widening escapes review entirely.
③ 防 AI 写代码犯错. This is the axis that argues hardest for B, and it should not be waved away. The direction of a change is asserted by the very agent whose work is being gated, in a free-text Clause-②: yes | no line. A directional rule is therefore only as strong as an unverified self-declaration — 声明即强制 is violated at the gate itself. Reading B removes the self-assessment: any accept/reject change is caught regardless of what the author believes about direction. ⚠️ Note the skill already concedes the declaration is fallible: 错误的 no 是可审计的假申报. ⇒ leans B.
④ 创业阶段不扩散需求. Reading B expands a gate's reach across a whole class of ordinary work with no measured incident driving it — the failure that motivated the governed-surface machinery (objectui#6183) was a governed-path bypass, not a mis-graded narrowing. No named user or incident pulls for B. ⇒ leans A.
⚖️ Recommendation: A (directional), and ⛔ not on a 3–1 count. 长远合理性权重恒 ≥50% and it reads for A: a contract-first project must not price "bring the code back to the contract" at the same rate as "change the contract." Axis ③ is a genuine objection, so the recommendation is A paired with a mechanical control that repairs exactly what ③ names — make the direction claim checkable instead of trusted:
- a gate that fails when a diff adds a key/arm/branch to a schema or registration while its claim declares
Clause-②: no (the widening tell), rather than relying on the author's word;
- ⇒ Reading A's reach, Reading B's non-reliance on self-assessment.
That control does not exist today. If it is not built, the honest fallback is B, because A without it is a gate defended only by the assertion of the agent being gated.
Not asking for
⛔ Not asking to relax the enqueue gate itself, and ⛔ not asking to re-open the three narrowings that already merged under Reading A. This card asks only which reading governs from here, so the next seat does not re-derive it a third time.
⚠️ Current state — REFRESHED 2026-09-06T15:5xZ (the original text below it is superseded)
The four objectui PRs this card said were "held" are no longer held. What resolved them was not this decision but the compensating control the skill already defines — in-seat review before enqueue:
| PR |
card |
outcome |
| #8075 |
objectui#7755 |
✅ MERGED (d5c1f527e) |
| #8077 |
objectui#7708 |
✅ MERGED (d3499b315) |
| #8080 |
objectui#7681 |
review FAIL → patched → ready, auto-merge armed |
| #8089 |
objectui#7429 |
review FAIL → patched → one CI shard from converged |
All four were reviewed and all four were measured to narrow only, with no widened surface under either reading — including #8089, where the decisive line sits outside the diff (packages/permissions/src/usePermissions.ts:115-118 returns a frozen NO_PROVIDER_PERMISSIONS with isLoaded: false, so a consumer without a provider issues a byte-identical request to today's).
⚠️ A second measurement that bears on the choice, and it was not available when this card was filed: CONTRACT_REVIEW_TIER (claude-fable-5-1, per scripts/pm/dispatch-gates.mjs:10023) is rate-limited and unavailable — a dispatch at that tier returned HTTP 429, "You've reached your Fable limit" (request req_011CenQv6qThwhtEfXed1Ne8). ⇒ Under Reading B, the class of work that would be routed to that tier is the ordinary narrowing-shaped bug queue, and that tier currently cannot run. Reading B is therefore not merely more expensive today; for a large share of the queue it is not executable, and the exemption's fallback (opus) would carry it anyway — which makes B's extra reach partly nominal.
⛔ This does not decide the question and is not offered as an argument for A. It is a cost reading the card could not previously supply, and it should be weighed against axis ③'s objection, which remains the strongest case for B.
The question is unchanged: A or B.
Filed unassigned by the
domain:ui @ objectuiexecution seat (session_01YBWFb5YgMU5dw8p2VKj16S,os-justin), 2026-09-06T14:5xZ, under 两条细则冲突 ⇒ 按更严的一条行动并立卡;⛔ 不当场改文本了结. Routing and grading belong to this repo's triage seat.维护者速读
派发协议里有一条闸门叫「条款②」:凡改变契约接受/拒绝行为、或扩大公开面的卡,一律要用最高档模型做,并且不过契约复审就不许进合并队列。
问题是这句话里的「改变接受/拒绝行为」到底分不分方向——
同一份技能文本里,一处写的是「改变接受/拒绝行为」(不分方向),另一处说判据就是「机械边界测试」,而那个测试是分方向的(放宽才触发)。两位 PM 因此对同一张卡给出了相反的判定,⛔ 而这决定了那张卡能不能进合并队列。
这不是理论问题:今天下午我按较宽松的读法把 objectui#7429 派了下去,事后才发现昨天另一位 PM 已经按较严的读法判过它。
你要做的(一个动作):选 A(收紧不触发条款②,只有放宽才触发)还是 B(任何接受/拒绝行为变化都触发,不分方向)?
The conflict, stated precisely
The rule. 强制条款②:凡改变契约接受/拒绝行为或扩大公开面的卡一律契约复审档 — and it binds the enqueue gate: 双肢命中任一且派发档位低于契约复审档位 ⇒ ⛔ 禁止入队.
Reading A — directional. The skill immediately adds 条款②判据即代裁的机械边界测试, and that test is directional: 改动扩大接受集或公开面 ⇒ 人工;拉回已声明契约 ⇒ 代裁车道. On this reading a narrowing is
no.Reading B — directionless. The criterion sentence says changes accept/reject behaviour and carries no direction qualifier. A tightening still changes what a client gets back; a consumer that receives data today and does not tomorrow has experienced a behaviour change as surely as the reverse.
Both readings are load-bearing today, and both have been acted on within 24 hours, in the same lane:
domain:uiPMsession_01KbJQ1y…yesdomain:uiPMos-steveno×3, all landed⇒ Three narrowings have already merged under Reading A while a fourth was held under Reading B. Whichever reading is right, some of that was wrong.
Why it cannot be settled at the seat
declared ≠ enforcedcodebase are narrowings — under Reading B a large fraction of ordinary bug cards become contract-review-tier work with a hard enqueue gate, which is a throughput change, not just a semantics change.domain:skillsPR touching the protocol surface, not a comment.四棱分析
① 实际业务需求. Measured, not assumed: in the objectui
domain:uilane today, the overwhelming majority ofpm:queuecards aredeclared ≠ enforcedrepairs — i.e. narrowings. Under Reading B they all become contract-review-tier with a binding enqueue gate. The real business need being served is not "review more"; it is "never let a widening slip through un-reviewed." Reading A serves that need exactly; Reading B serves it plus a large, unrequested tail. ⇒ leans A.② 项目长远合理性. Contract-first says the declared contract is the North Star and code is brought to it. A rule that taxes moving code toward the contract at the same rate as moving the contract inverts that gradient — it makes the cheapest correct action expensive. ⇒ leans A, but with a real cost: "narrowing" is a judgement, and a mis-labelled widening escapes review entirely.
③ 防 AI 写代码犯错. This is the axis that argues hardest for B, and it should not be waved away. The direction of a change is asserted by the very agent whose work is being gated, in a free-text⚠️ Note the skill already concedes the declaration is fallible: 错误的
Clause-②: yes | noline. A directional rule is therefore only as strong as an unverified self-declaration — 声明即强制 is violated at the gate itself. Reading B removes the self-assessment: any accept/reject change is caught regardless of what the author believes about direction.no是可审计的假申报. ⇒ leans B.④ 创业阶段不扩散需求. Reading B expands a gate's reach across a whole class of ordinary work with no measured incident driving it — the failure that motivated the governed-surface machinery (objectui#6183) was a governed-path bypass, not a mis-graded narrowing. No named user or incident pulls for B. ⇒ leans A.
⚖️ Recommendation: A (directional), and ⛔ not on a 3–1 count. 长远合理性权重恒 ≥50% and it reads for A: a contract-first project must not price "bring the code back to the contract" at the same rate as "change the contract." Axis ③ is a genuine objection, so the recommendation is A paired with a mechanical control that repairs exactly what ③ names — make the direction claim checkable instead of trusted:
Clause-②: no(the widening tell), rather than relying on the author's word;That control does not exist today. If it is not built, the honest fallback is B, because A without it is a gate defended only by the assertion of the agent being gated.
Not asking for
⛔ Not asking to relax the enqueue gate itself, and ⛔ not asking to re-open the three narrowings that already merged under Reading A. This card asks only which reading governs from here, so the next seat does not re-derive it a third time.
The four objectui PRs this card said were "held" are no longer held. What resolved them was not this decision but the compensating control the skill already defines — in-seat review before enqueue:
d5c1f527e)d3499b315)All four were reviewed and all four were measured to narrow only, with no widened surface under either reading — including #8089, where the decisive line sits outside the diff (
packages/permissions/src/usePermissions.ts:115-118returns a frozenNO_PROVIDER_PERMISSIONSwithisLoaded: false, so a consumer without a provider issues a byte-identical request to today's).CONTRACT_REVIEW_TIER(claude-fable-5-1, perscripts/pm/dispatch-gates.mjs:10023) is rate-limited and unavailable — a dispatch at that tier returnedHTTP 429, "You've reached your Fable limit"(requestreq_011CenQv6qThwhtEfXed1Ne8). ⇒ Under Reading B, the class of work that would be routed to that tier is the ordinary narrowing-shaped bug queue, and that tier currently cannot run. Reading B is therefore not merely more expensive today; for a large share of the queue it is not executable, and the exemption's fallback (opus) would carry it anyway — which makes B's extra reach partly nominal.⛔ This does not decide the question and is not offered as an argument for A. It is a cost reading the card could not previously supply, and it should be weighed against axis ③'s objection, which remains the strongest case for B.
The question is unchanged: A or B.