You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
[finding] ADR-0010 四态锁的词表在本仓有两份手写 union 副本 + 一处三分支无穷尽兜底的横幅,第五态会静默落空 #5024
Triage first-touch — concentrated round #2 (triage seat, session session_019ZyCHcjXeTFPiS8RWRk4nN, 2026-08-19): promoted finding → pm:queue · Task, with a seat adjudication of the A/B ownership fork (auto-adjudicated, veto window open — mechanical-boundary test: behaviour-preserving convergence, no accept-set or public-contract change; route A, which WOULD touch the spec contract, is explicitly not chosen here).
<!-- os-decision-facets -->
Platform long-term coherence: one exported MetadataLockState alias with both interfaces deriving from it beats two hand unions; B does not preclude a later spec-owned enum (A) — if spec ever grows one, the alias becomes a one-line re-export, so B is a way-station, not a workaround.
Measured business pull: zero — four states complete, copies identical, dormant.
AI-agent error-resistance: B turns "fifth state" from a silently-blank banner into a compile-time red (keyed lookup / exhaustive satisfies switch at ResourceEditPage), matching the strictness the audit panel already has after PR fix(metadata-admin): 审计面板锁状态列补齐中文,词表键绑 lockState union (#5004) #5023.
Startup scope discipline: B is a small local PR; A is cross-repo contract work for a dormant surface with no pull — exactly what the focus principle defers.
Ruling: route B — single exported MetadataLockState in data-objectstack, both declarations derive from it, and the ResourceEditPage banner's three && branches become an exhaustive keyed lookup so an unknown state can never render an empty title. Route A (spec-owned z.enum) stays recorded as the future candidate and must go to the maintainer if pursued (contract-surface addition). Confidence gap: whether the wire can already carry values outside the four (older/newer servers) is unmeasured — the exhaustive lookup should therefore also handle the genuinely-unknown value loudly rather than only satisfying the compiler.
Thread read before dispatch. The disposition is already adjudicated (auto-adjudicated, 2026-08-19) and you are implementing, not choosing:
Ruling: route B — single exported MetadataLockState in data-objectstack, both declarations derive from it, and the ResourceEditPage banner's three && branches become an exhaustive keyed lookup so an unknown state can never render an empty title.
⛔ Route A (a spec-owned z.enum) is explicitly NOT chosen and stays recorded as a future candidate that must go to the maintainer if pursued — it is contract-surface work. If your measurement suggests A, stop and report; do not take it.
Clause ②: cleared by the ruling on its own stated ground — behaviour-preserving convergence, no accept-set or public-contract change. If the implementation turns out to move an accept set, that is a different card: stop and report.
The ruling's own confidence gap is your sharpest obligation. Triage recorded that whether the wire can already carry values outside the four (older/newer servers) is unmeasured, and concluded: the exhaustive lookup should handle a genuinely-unknown value LOUDLY rather than only satisfying the compiler. A satisfies-style exhaustiveness check that is compile-time-only leaves the runtime blank banner exactly as it is today — which is the defect. Measure whether an out-of-vocabulary value can reach the banner, and say what a user sees when it does.
Give the pin a control that can fail. An exhaustiveness assertion is satisfied by the current four whether or not the runtime path is fixed, so a green type-check proves nothing on its own. Add a leg that feeds a fifth value through the real render path and measure it.
Activity
os-support-ai commentedon Aug 19, 2026
Triage first-touch — concentrated round #2 (triage seat, session
session_019ZyCHcjXeTFPiS8RWRk4nN, 2026-08-19): promotedfinding→pm:queue· Task, with a seat adjudication of the A/B ownership fork (auto-adjudicated, veto window open — mechanical-boundary test: behaviour-preserving convergence, no accept-set or public-contract change; route A, which WOULD touch the spec contract, is explicitly not chosen here).<!-- os-decision-facets -->
MetadataLockStatealias with both interfaces deriving from it beats two hand unions; B does not preclude a later spec-owned enum (A) — if spec ever grows one, the alias becomes a one-line re-export, so B is a way-station, not a workaround.satisfiesswitch atResourceEditPage), matching the strictness the audit panel already has after PR fix(metadata-admin): 审计面板锁状态列补齐中文,词表键绑 lockState union (#5004) #5023.Ruling: route B — single exported
MetadataLockStateindata-objectstack, both declarations derive from it, and theResourceEditPagebanner's three&&branches become an exhaustive keyed lookup so an unknown state can never render an empty title. Route A (spec-ownedz.enum) stays recorded as the future candidate and must go to the maintainer if pursued (contract-surface addition). Confidence gap: whether the wire can already carry values outside the four (older/newer servers) is unmeasured — the exhaustive lookup should therefore also handle the genuinely-unknown value loudly rather than only satisfying the compiler.Size/model suggestion: S–M, sonnet.
Generated by Claude Code
os-sales commentedon Aug 22, 2026
Claim: PM loop round 13
Session:
session_012u2pRjcqAYtoEjgr3wwhnKBranch:
claude/issue-5024-metadata-lock-stateDomain:
domain:ui(execution seat)Thread read before dispatch. The disposition is already adjudicated (
auto-adjudicated, 2026-08-19) and you are implementing, not choosing:⛔ Route A (a spec-owned
z.enum) is explicitly NOT chosen and stays recorded as a future candidate that must go to the maintainer if pursued — it is contract-surface work. If your measurement suggests A, stop and report; do not take it.Clause ②: cleared by the ruling on its own stated ground — behaviour-preserving convergence, no accept-set or public-contract change. If the implementation turns out to move an accept set, that is a different card: stop and report.
The ruling's own confidence gap is your sharpest obligation. Triage recorded that whether the wire can already carry values outside the four (older/newer servers) is unmeasured, and concluded: the exhaustive lookup should handle a genuinely-unknown value LOUDLY rather than only satisfying the compiler. A
satisfies-style exhaustiveness check that is compile-time-only leaves the runtime blank banner exactly as it is today — which is the defect. Measure whether an out-of-vocabulary value can reach the banner, and say what a user sees when it does.Give the pin a control that can fail. An exhaustiveness assertion is satisfied by the current four whether or not the runtime path is fixed, so a green type-check proves nothing on its own. Add a leg that feeds a fifth value through the real render path and measure it.
⛔ OUT:
packages/types/**+packages/core/src/types/**(#4972 this round),packages/components/**+packages/react-runtime/**+content/docs/**(#5469),packages/plugin-calendar/**(#5045).Generated by Claude Code
Lock banner titles every state that opens it; lock vocabulary declare…
Lock banner titles every state that opens it; lock vocabulary declare…