Repository navigation
docs(adr): ADR-0145 — ui ?: never tombstones retire on the spec's one-major window - #27251
Conversation
…ne-major window Records the maintainer's letter A on #25912 (ruling 6407810703): a `?: never` tombstone on the ui authoring face leaves in the first release after the spec major in which its ADR-0087 conversion expires, one major after the retirement it names and never longer. States how R is read (spec-named, pre-ADR-0087 and ui-only retirements), the container carve-out that keeps a deletion from turning a refusal into a silent accept, the minor + Breaking changeset, and how the first application batch finds due tombstones. Declares only; removes nothing. Regenerates the ADR index. Claude-Session: https://claude.ai/code/session_01JQwxbYznNtcYGX8apHQPtk Co-authored-by: Claude <noreply@anthropic.com>
The pull request opens at a head whose net diff touches no governed path, so the relay's pr_create requests no Tier H approver before the contract review (#26617). The next commit re-applies 11b3e68 unchanged. Claude-Session: https://claude.ai/code/session_01JQwxbYznNtcYGX8apHQPtk Co-authored-by: Claude <noreply@anthropic.com>
Restores 11b3e68's record and regenerated index unchanged (tree equal to 11b3e68), now that the draft pull request is open with no approver requested; the seat asks for approvers after the contract review PASS and its ACCEPT (#26617). Claude-Session: https://claude.ai/code/session_01JQwxbYznNtcYGX8apHQPtk Co-authored-by: Claude <noreply@anthropic.com>
Seat note · contract review owed · seat
|
|
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U Contract-review-claim: Triage seat, taking the Generated by Claude Code |
Contract reviewServed-tier: Inputs read: card #25912 body and all 8 comments (ruling ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
What holds, read in the live tree:
What breaks:
Implemented-by: VERDICT: FAIL Generated by Claude Code |
…; registry cited Contract review on PR 27251 (comment 6470170569): - D3: a registered mirror pair (or a z.input/z.infer-derived TS member) leaves together or not at all; zod-mirror-parity's MirroredUndeclaredKeys is the pin. Applying step 4 deletes member, JSDoc and twin together. - D1: "major" is the fixed group's major, lockstep with PROTOCOL_VERSION; the deletion gate reads CURRENT_MAJOR off the spec package version; a changeset's level is a separate axis. "Never outlives the kit" yields to D3's holds. - D2: one tag clock for every R (first refused/carried at a .0.0 cut counts in the major before it); a guidance's retiredIn names the first refusing release. - Registry: cite #26080 ruling A and the anchor checker's root-only resolution, and Prime Directive 13's own wording. Claude-Session: https://claude.ai/code/session_01JQwxbYznNtcYGX8apHQPtk Co-authored-by: Claude <noreply@anthropic.com>
Seat note · contract re-review owed · seat
|
|
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U Contract-review-claim: Triage seat, taking the Generated by Claude Code |
Contract reviewServed-tier: Inputs read: card #25912 body and all 8 comments (options Re-review on a moved head. Prior record: FAIL on ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Prior findings, each checked in the tree:
What else holds on this head, read in the live tree:
Findings on this head:
Observation, not a finding: with D3 now holding both faces wherever the zod container is
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(席位终稿)
席位意见:契约复核第一轮 FAIL(6470170569,一条必改),开发在 席位核对ACCEPT · seat
Generated by Claude Code |
…'s spec tags; D1 names the #18003 level-half amendment Two clauses of the record, one note each, under ADR-0087's amendment spelling; the status entry records the acceptance by PR #27251's merge. The decision (one major after the retirement, never longer) is unchanged; nothing is implemented. Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude <noreply@anthropic.com>
Requested by Warren · project thread
Fixes #25912
Clause-②: no
Metadata-protocol: none
维护者速读
docs/adr/)并重生成 ADR 索引:ui 授权面上的?: never墓碑按 spec 自己的窗口退场,退役后再保留一个 major,到 R+2 major 切出时到期,绝不更长;只立规则,不删任何墓碑、不改代码。pnpm check:adr-index && pnpm check:adr-anchors && node scripts/check-adr-links.mjs,应全部 exit 0。What changes
docs/adr/0145-ui-deprecation-tombstones-retire-on-the-spec-window.md(Proposed; becomes Accepted by the maintainer's merge). It records letter A and states:?: nevertombstone leaves the ui authoring face in the first release after the spec major in which its ADR-0087 conversion expires: carried through protocol major R + 1, due from the cut of R + 2, the same cut at which ADR-0087's 2026-10-26 addendum removes the spec's kit. One clock (the protocol major, never the npm major). The window binds both ways: a ui tombstone neither leaves before nor outlives the spec kit for the same key.RETIRED_KEYS_BY_MAJOR, else the release-tag clock the spec's deletion gate uses). A retirement that predates ADR-0087 is counted as if its conversion had run the one-major window from the major it retired in, so no such tombstone gets a fresh window. A ui-only retirement runs the same window from the first@object-ui/typesrelease that carried it. Undated means not due, never guessed..passthrough()or strips, which is ADR-0087's own strip-container rule and the postureagedOutSpecKeyRefusalalready takes. Derived faces move together.minor(nevermajor), a Breaking note naming eachType.keyand its remedy, plus the declaration lines and ADR-0087 disposition marker the gates require, not restated.git log -Son a full clone; pre-merge ui history is inobjectstack-ai/objectui, not here), judges and re-pins.docs/adr/README.md(pnpm adr:index).Why
Ruling 6407810703 (maintainer letter A, 2026-10-25T01:46Z) over seat options 6407810621. Not taken: B (remove when the spec retires the key) and C (no rule).
Tests
None. This PR declares a rule and changes no code, so there is no behaviour to pin or ablate.
Acceptance notes
docs/adr/: [Decision] ui/ merge leftovers that no aftercare card names: six nested top-level docs, a second copy of four .claude hooks, an independently numbered ui/docs/adr, and a dead ui/.github/dependabot.yml #26080 ruling A keepsui/docs/adr/as the frozen ObjectUI import (indexed underui-, files untouched), andscripts/check-adr-anchors.mjsresolves only the root registry, so a new ui decision lands here; Prime Directive [WIP] Add Chinese version of the documentation #13 places an ADR in the repository whose code it governs. No written rule continues new ui decisions inui/docs/adr/. Number 0145: open PR docs(adr): ADR-0144 multi-currency — record currency, dated rates, write-time home projection; dated note on ADR-0104 #27239 holds 0144, and no other open PR adds a root record at or above it (the file lists of all 20 open PRs, read through REST before numbering).origin/main9dec0545,ui/packages/types/src, tests excluded): 520@deprecatedtags and 675?: neverlines (the card read 574 and 640 on 2026-10-24 objectui). The card's "16z.nevertombstones" does not hold: the zod tombstones are now spelled through the helpers inzod/tombstone.zod.ts(retirementTombstone,agedOutSpecKeyRefusal,aliasKeyRefusal,handlerKeyRefusal,retiredNodeType), several hundred call sites, so the ADR names the zod twin by what it mirrors rather than by a count. Per ui/AGENTS.md [WIP] Create a new release version #9 the ADR records no count; the instrument is in "Applying the rule"..d.tsfaces retire together. D3 keeps that wherever a deletion leaves a refusal. Where the zod container is.passthrough()(everything derived fromBaseSchemaCore), deleting the twin would make the tolerant face keep the key silently. That is the Prime Directive Add comprehensive test suite for Zod schema validation #12 defect ADR-0087's 2026-10-26 addendum refused for the spec's 58 strip-container tombstones, so the twin stays there until its container closes.docs/adr/**is the register rowadr(glob: 'docs/adr/**', tier: GOVERNED_TIER_Hinscripts/pm/check-governed-merges.mjs).dispatch-gates --tierderives the mandatory ceiling model tier fordocs/adr/**, with the effort floor at xhigh. This card ran at TIER_DEFAULT under the measured quota exemption the claim records ("ceiling tier unavailable, contract review handed to triage at review time"). Changed lines 160 (+157 / −3) against the 3,000 threshold: under.pr_createrequests the governed approvers on a diff touching a governed path).11b3e687adds the record,98dcc57ereverts it so the PR opened with an empty net diff and no approver requested, and01db9123re-applies it, so the head's tree equals11b3e687's. The seat requests approvers after the contract review PASS and its ACCEPT.Verification
At
d3e67407(the head after the contract-review rework;01db9123was tree-identical to11b3e687), branch pointorigin/main8d79bbd7.Gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat11b3e687: 21 commands, each exit captured before any pipe:node scripts/check-adr-links.mjs:: exit 0node scripts/check-adr-links.mjs --self-test:: exit 0node scripts/check-closing-keyword-parity.mjs:: exit 0node scripts/check-closing-keyword-parity.mjs --self-test:: exit 0node scripts/check-comment-mask-corpus.mjs:: exit 0node scripts/ci/plan-test-core-shards.mjs --self-test:: exit 0pnpm --filter @objectstack/lint run check:doc-formula-expressions:: exit 0pnpm check:adr-anchors:: exit 0pnpm check:adr-index:: exit 0pnpm check:adr-symbol-anchors:: exit 0pnpm check:ci-filter-parity:: exit 0pnpm check:closed-ceremony-text:: exit 0pnpm check:cross-package-test-inputs:: exit 0pnpm check:doc-authoring:: exit 0pnpm check:driver-memory-census:: exit 0pnpm check:gitlink-declared:: exit 0pnpm check:nul-bytes:: exit 0pnpm check:pm-governed-merges:: exit 0pnpm check:pm-prior-rulings:: exit 0pnpm check:refd-timer-probe:: exit 0pnpm check:watch-hint-literal:: exit 0check:doc-formula-expressionsfirst exited 3 (prerequisite not met: nothing measured) and exited 0 afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint(under the verification lock, exit 0).--ran: "21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED (a DERIVED zero — all 21 recorded an exit code and none of them is 3)".pnpm --dir ui run check:new-line-citations: "0 new citation(s)", exit 0.--commandslists as NOT MEASURED (no TypeScript changes here).Generated by Claude Code