Repository navigation
Commit 753a14e
docs(adr): ADR-0145 amended — a ui-only tombstone's R is judged against the fixed group's @objectstack/spec@M.0.0 cut, and D1 names the ADR-0087 level-half amendment (#27333)
Fixes #27291
Clause-②: no
Metadata-protocol: none
## 维护者速读
- **改了什么**:ADR-0145 两处条款各加一条修订注(照 ADR-0087 的修订拼法,原文保留在注里),状态行记为
Accepted(#27251 的合并)并加 Amended 条目。决定本身不变:ui 墓碑随 spec 的窗口退场,退休后一个
major,绝不更长;不删任何墓碑,不改代码、schema 或 changeset。
- **为什么改**:D2 的 ui-only 时钟原来读 `@object-ui/types` 自己的首个 release tag,而该包的
17 从 `17.1.0` 开始、没有 `17.0.0`,于是在 16.1.0 与 17.1.0 之间诞生的 ui-only 墓碑会被读成 R
= 17(spec 时钟读 16),比 spec 多活一个 major —— 恰是 D1 禁止的。D1 引的「ADR-0087
2026-09-13 修订」有两段同日文本,现在点名 #18003 的 level-half 那一段。
- **风险与回滚**:只改 ADR 文本,不发布任何包;回滚 = revert 这一个
commit。误差方向:修订前偏长(不会提前删除),修订后与 spec 时钟一致。
-
**先看**:`docs/adr/0145-ui-deprecation-tombstones-retire-on-the-spec-window.md`
—— ① D2 的 ui-only 条目(新 L87–96,规则本身);② D1 的 level-axis 条目(新 L60–66,仅引文);③
状态行(新 L3–6)。
- **两分钟验证**:`npm view @object-ui/types versions --json` 看到 `16.1.0`
之后直接是 `17.1.0`;`git ls-remote --tags origin '@objectstack/spec@17.0.0'`
返回一行 —— 修订针对的就是这两个事实。
- **需要你做的**:Tier H(`docs/adr/**`),PR 保持 draft;由 `GOVERNED_APPROVERS`
中的账号批准,或维护者亲手合并 / 入队。
## What changes
One file,
`docs/adr/0145-ui-deprecation-tombstones-retire-on-the-spec-window.md`,
+17/−7 (167 → 177 lines). Two clauses are amended, each with an in-place
`Amended 2026-10-28 (#27291)` note that quotes the former wording; the
status entry records the acceptance and the amendment in ADR-0087's
spelling. D1's window, D3, D4, D5 and the Applying-the-rule steps are
untouched. Nothing is implemented: no tombstone is removed, no code, no
schema, no changeset (`skip-changeset`: `docs/adr/**` publishes
nothing).
**Status line** — before:
```text
**Status**: Proposed (2026-10-28). `docs/adr/**` is Tier H (Prime Directive #14): this record becomes **Accepted** by
the maintainer's merge. **This record declares; it implements nothing** — …
```
after (PR #27251 merged 2026-10-28T14:43Z; `adr-index` keys the record
by its earliest status keyword, so the row reads Accepted):
```text
**Status**: Accepted (2026-10-28, #27251) · **Amended** (2026-10-28, #27291 — one clause each; see the amendment notes
under D2's ui-only bullet and under D1's level-axis bullet). **This record declares; it implements nothing** — …
```
**D1, level-axis bullet (item 6 of triage's re-review, comment
6471216267 on PR #27251)** — before:
```text
(ADR-0087's 2026-09-13 amendment, `scripts/check-changeset-no-major.mjs`) and moves nothing here;
```
after:
```text
(ADR-0087's #18003 level-half amendment of 2026-09-13 — the note inside its "Ratified: the pre-launch launch-window
exemption" section — and `scripts/check-changeset-no-major.mjs`) and moves nothing here;
> **Amended 2026-10-28 (#27291) — the citation names its text.** Was "ADR-0087's 2026-09-13 amendment": ADR-0087
> carries two texts of that date, the #12772 artifact-ingestion addendum being the other, and D1 means the level half.
```
**D2, ui-only bullet (item 5 of the same re-review)** — before:
```text
from the ui's own retirement. R is the major of the first `@object-ui/types` release tag (or the first release of the
package that publishes the `.d.ts`) whose tree carries the tombstone, on the same convention: first carried by a
major's `.0.0` cut counts in the major before it.
```
after:
```text
from the ui's own retirement, on the fixed group's clock (D1): R is read off the first `@objectstack/spec` release tag
whose tree carries the tombstone's introducing commit (for a commit the ui merge did not import, the first cut after
its date — step 2), on the convention the bullets above use: first carried by a major's `.0.0` cut counts in the major
before it. ⛔ Never off `@object-ui/types`' own tags: a major's first tag there need not be a `.0.0` cut.
> **Amended 2026-10-28 (#27291) — the ui-only clock reads the group's tags.** Was: "R is the major of the first
> `@object-ui/types` release tag (or the first release of the package that publishes the `.d.ts`) whose tree carries
> the tombstone, on the same convention: first carried by a major's `.0.0` cut counts in the major before it."
> `@object-ui/types` opens 17 at `17.1.0` (no `17.0.0`), so that reading gave a tombstone born before the
> `@objectstack/spec@17.0.0` cut R = 17 where the spec's clock reads 16: one major longer, which D1 forbids.
```
The clause is one rule, not a two-branch fallback: because the group
releases in lockstep (D1), reading the group's `@objectstack/spec` tags
gives the same R as the ui package's own tags wherever those coincide,
and the spec's R wherever the ui package skipped a `.0.0`. It points at
D1 and at Applying-the-rule step 2 (`git tag --contains` on the
introducing commit, the pre-merge objectui era dated on a full clone)
rather than restating them.
**Worked examples (the test the order set; they live here, not in the
ADR):**
- (a) A ui-only tombstone introduced between `@object-ui/types@16.1.0`
and `17.1.0`, before the `@objectstack/spec@17.0.0` cut. Old reading:
first `@object-ui/types` tag carrying it is `17.1.0`, not a `.0.0` cut,
so R = 17 — carried through 18, due at 19. New reading: the first
`@objectstack/spec` tag carrying it is `17.0.0`, a `.0.0` cut, which
counts in the major before, so R = 16 — carried through 17, due at the
18 cut, exactly the spec's own answer for a key refused from `17.0.0`.
- (b) A tombstone first carried by a 17.x release after the `17.0.0`
cut. Both readings: first tag carrying it is `17.x` (x ≥ 1), so R = 17 —
carried through 18, due at 19. The amendment moves nothing here.
- (c) A tombstone introduced today, after the `18.0.0` cut: first
carrying tag `18.x`, R = 18, due at 20 — unchanged.
Registry facts the amendment rests on, re-read this run: `npm view
@object-ui/types versions --json` lists `… 15.0.0, 16.0.0, 16.1.0,
17.1.0, 17.2.0, 17.3.0, 17.5.0, 17.6.0, 17.7.0, 18.0.0, 18.1.0, 18.2.0`
(no `17.0.0`); `git ls-remote --tags origin '@objectstack/spec@17.0.0'`
answers `100d9059…`.
## Tests
Docs-only diff: no workspace package is touched, so there is no ①
dependency closure and no ② package test or typecheck to run;
`test:repo` is CI's. The verification is the derived gate set below, all
run on head `2d14a9c2`. Dogfood battery: n/a — no `!` in the title and
`Clause-②: no`.
## Acceptance notes
- **`docs/adr/README.md` (the generated index) is not regenerated
here.** `pnpm check:adr-index` is report-only by design and it already
warned `stale` on `origin/main` `1c5fe3cb` before this edit: a regen on
the clean tree moves ADR-0035's row (amended by #27069 without an index
run). On this head a regen would move that row plus the 0145 row and the
Accepted/Proposed counts (127/4). Scope here is the one ADR file; the
next `pnpm adr:index` run refreshes both rows. Noted, not filed.
- PR #27251's `merged_by` reads `os-zhuang` through REST (`merged_at`
2026-10-28T14:43:02Z, merge commit `e9c88f7c`); the status entry records
the PR number and date only.
- `check:role-word` was not derived for this diff — its roots are
`content/docs` and `skills/`, not `docs/adr/` — so the order's gate-list
hypothesis overstated the set by that one family; the other named
families were all derived.
- Two added lines run 121–122 characters; the file already carried a
125-character line (former L5) and no gate reads line length under
`docs/adr/`.
- The derived gate `pnpm --filter @objectstack/lint run
check:doc-formula-expressions` first answered exit 3 `PREREQUISITE NOT
MET` (unbuilt `@objectstack/formula` / `@objectstack/lint`) — nothing
measured; the two packages were built under `os-verify-lock.sh`
(`VERDICT command-exit 0`, held 86s, waited 0s) and the gate rerun exit
0.
- Commit trailer pair is the repo's model-free form (`Claude-Session:` +
`Co-authored-by: Claude`), per AGENTS.md; no card trailer on the commit.
## Verification
Head `2d14a9c2` · derivation `node scripts/pm/dispatch-gates.mjs
--commands --repo objectstack-ai/objectstack` (no paths; change set from
the merge base `1c5fe3cb7`, 1 path, 24 changed lines) → 21 commands, all
run in the foreground with exits captured before any pipe.
<details>
<summary>21 derived gates — every exit 0 (gate 07 after its prerequisite
build)</summary>
```text
01 exit=0 node scripts/check-adr-links.mjs ✅ check-adr-links: 929 relative link destination(s) under docs/adr/ resolve
02 exit=0 node scripts/check-adr-links.mjs --self-test
03 exit=0 node scripts/check-closing-keyword-parity.mjs
04 exit=0 node scripts/check-closing-keyword-parity.mjs --self-test 40 assertions, 5 mutations each driven to red
05 exit=0 node scripts/check-comment-mask-corpus.mjs 18830 files, 0 disagree, 0 unparseable
06 exit=0 node scripts/ci/plan-test-core-shards.mjs --self-test 23 case(s) across 5 batteries
07 exit=0 pnpm --filter @objectstack/lint run check:doc-formula-expressions 24 record-scoped formula example(s) across 541 files judged clean (first run: exit 3 PREREQUISITE NOT MET, nothing measured; rerun after build)
08 exit=0 pnpm check:adr-anchors
09 exit=0 pnpm check:adr-index ::warning adr-index: stale (report-only, exit 0 by design; already stale on origin/main)
10 exit=0 pnpm check:adr-symbol-anchors 2787 anchors across 146 records resolve
11 exit=0 pnpm check:ci-filter-parity
12 exit=0 pnpm check:closed-ceremony-text 4911 shipped file(s) read
13 exit=0 pnpm check:cross-package-test-inputs
14 exit=0 pnpm check:doc-authoring sibling-package prose ids hold the baseline
15 exit=0 pnpm check:driver-memory-census
16 exit=0 pnpm check:gitlink-declared
17 exit=0 pnpm check:nul-bytes scanned 22118 text file(s); no raw ASCII control bytes
18 exit=0 pnpm check:pm-governed-merges
19 exit=0 pnpm check:pm-prior-rulings 155 cases pass
20 exit=0 pnpm check:refd-timer-probe
21 exit=0 pnpm check:watch-hint-literal
```
</details>
<details>
<summary>--ran reconciliation and the prerequisite build</summary>
```text
$ node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran.txt
Run reconciliation — 21 derived, 21 run, 0 NOT-MEASURED, 0 UNRUN.
✓ dispatch-gates --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).
$ OS_VERIFY_LOCK_SLOT=issue-27291 bash scripts/pm/os-verify-lock.sh -c 'pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2'
Tasks: 4 successful, 4 total
os-verify-lock: VERDICT command-exit 0 · held the lock 86s (1m26s) · waited 0s
```
</details>
Control-character scan of the edited file: `grep -naP
'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'` — no match. Markdown render check
(markdown-it 14.3.3): both amendment notes parse as a `blockquote`
inside their list item.
CI families this PR owes beyond the local subset (`Lint & Repo Gates`,
`Check Documentation Links`, `Governed Surface Queue Guard`, `PR-body
guards`, `Check PR Size`) are read from the PR's check-runs, not re-run
locally.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg)_
---------
Co-authored-by: objectstack-fleet[bot] <noreply@anthropic.com>1 parent 13f5360 commit 753a14e
2 files changed
Lines changed: 28 additions & 14 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | | - | |
5 | | - | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
| |||
59 | 60 | | |
60 | 61 | | |
61 | 62 | | |
62 | | - | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
63 | 67 | | |
64 | 68 | | |
65 | 69 | | |
| |||
81 | 85 | | |
82 | 86 | | |
83 | 87 | | |
84 | | - | |
85 | | - | |
86 | | - | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
87 | 98 | | |
88 | 99 | | |
89 | 100 | | |
| |||
140 | 151 | | |
141 | 152 | | |
142 | 153 | | |
143 | | - | |
144 | | - | |
145 | | - | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
146 | 160 | | |
147 | 161 | | |
148 | 162 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | | - | |
21 | | - | |
| 20 | + | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
105 | 105 | | |
106 | 106 | | |
107 | 107 | | |
108 | | - | |
| 108 | + | |
109 | 109 | | |
110 | 110 | | |
111 | 111 | | |
| |||
211 | 211 | | |
212 | 212 | | |
213 | 213 | | |
214 | | - | |
| 214 | + | |
215 | 215 | | |
216 | 216 | | |
217 | 217 | | |
| |||
0 commit comments