Skip to content

Commit 5823d59

Browse files
os-helpclaude
andauthored
chore(spec): backfill nine ADR-0087 ledger entries missing from the v17 stock (#6350) (#7624)
The #6148 completeness gate is diff-only by design (#6129), so every breaking changeset already in the v17 train was never compared against the ADR-0087 ledger. This is the one-time manual reconciliation the maintainer ruled for. The gate is untouched and still judges diffs only. Measured today: 274 declared-breaking changesets in stock, 106 in the residue, 61 flagged as never having touched a ledger file. Judging all 61 by hand found nine genuinely missing entries, registered here as D3 semantic migrations, and each of the nine stock changesets now carries its adr-0087 disposition marker. Two had shipped half a retirement: tool.requiresConfirmation carries a live retiredKey() tombstone and SortNodeSchema carries aliases:{direction:'order'}, but neither had the ledger half. A retirement needs both. spec-changes.json and docs/protocol-upgrade-guide.md are regenerated. Claude-Session: https://claude.ai/code/session_0198a2mSFFM18npoJfNtNv8z Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
1 parent 814db6d commit 5823d59

22 files changed

Lines changed: 1044 additions & 0 deletions
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
---
2+
"@objectstack/spec": minor
3+
---
4+
5+
chore(spec): backfill nine ADR-0087 ledger entries the v17 stock was missing (#6350)
6+
7+
The #6148 completeness gate is deliberately **diff-only** — it judges what a PR
8+
adds, never the inventory, because auditing stock in CI would turn the repo red on
9+
adoption day and bill main's history to current authors (#6129). The cost of that
10+
choice is that every breaking changeset already in the v17 train was never compared
11+
against the ledger. This is the one-time manual reconciliation the maintainer ruled
12+
for, not a change to the gate: `check-adr-0087-registration.mjs` still judges diffs
13+
only, and nothing in CI starts auditing inventory.
14+
15+
Measured today over the stock: **274 declared-breaking changesets**, 106 in the
16+
residue (published break + a real FROM → TO prescription, so only `registered` or
17+
`already-registered` remain), **61 of them flagged** as never having touched a
18+
ledger file. Judging those 61 by hand found nine genuinely missing entries, now
19+
registered as D3 semantic migrations:
20+
21+
| entry | face | issue |
22+
| --- | --- | --- |
23+
| `runtime-httpserver-wrapper-retired` | the exported `HttpServer` delegating wrapper | #5122 |
24+
| `record-details-sections-object-form` | `RecordDetailsProps.sections` shape + `hideFields` | #5611 |
25+
| `data-driver-query-omit-object` | `IDataDriver`'s query parameter contract | #5181 |
26+
| `sort-node-direction-rejected` | `orderBy[].direction``order` | #4721 |
27+
| `tool-requires-confirmation-retired` | `tool.requiresConfirmation` | #3715 |
28+
| `export-axis-opt-in` | `allowExport` unset flips to deny | #3544 |
29+
| `apimethod-enum-shrink` | `enable.apiMethods` legacy values | #3543 |
30+
| `sharing-rule-recipient-reconcile` | sharing-rule `group` / `guest` / owner-type rules | #1878 |
31+
| `client-delete-result-success` | `DeleteDataResult.deleted``success` | #5638 |
32+
33+
Two of them had already shipped **half** a retirement: `tool.requiresConfirmation`
34+
carries a live `retiredKey()` tombstone in `ai/tool.zod.ts` and `SortNodeSchema`
35+
carries `aliases: { direction: 'order' }`, but neither had the ledger half. A
36+
tombstone is the proof the removal was declared; the ledger entry is what
37+
`spec-changes.json`, the upgrade guide and `os migrate meta` project to consumers,
38+
and a retirement needs both.
39+
40+
Each of the nine stock changesets now carries its `<!-- adr-0087: registered … -->`
41+
disposition marker, so the judgement is recorded where the next auditor reads
42+
rather than only in a PR body. `spec-changes.json` and
43+
`docs/protocol-upgrade-guide.md` are regenerated from the registry.

.changeset/apimethod-enum-shrink.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,5 @@ passing through Zod; the parse-time strip warning carries no object name).
7979
primitives = default-open). Read-only and deny-all whitelists are unchanged;
8080
the seven `[]` declarations are deliberately KEPT as defense-in-depth alongside
8181
`apiEnabled: false`.
82+
83+
<!-- adr-0087: registered apimethod-enum-shrink -->

.changeset/client-delete-result-success.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,5 @@ server suite never had: a real DELETE over HTTP whose body is read as
9696
`deleted.success` and whose key set is asserted literally — `z.object` strips
9797
unknown keys, so a passing parse alone cannot prove no stray `deleted` rode
9898
along.
99+
100+
<!-- adr-0087: registered client-delete-result-success -->

.changeset/data-driver-query-omit-object.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,5 @@ await driver.find('account', { where: { status: 'open' } });
2727
`QueryAST` 的 zod 形状(`data/query.zod.ts``BaseQuerySchema`**没有动**`object` 在引擎与 hook 那一层是被读的,改的只是驱动契约的参数类型。`expand` 条目里的 `object` 同样保留 —— 那里它命名的是**关联对象**,没有任何实参携带这个事实,不是冗余。
2828

2929
标 major 是因为这是**源码级破坏性**变更(调用点字面量),运行时行为零变化。注意 `check:api-surface` 只看得见新增的 `DriverQuery` 导出、看不见参数类型的收窄(它记录导出存在与否,不记录签名),所以这条迁移说明是该变更唯一的下游载体。
30+
31+
<!-- adr-0087: registered data-driver-query-omit-object -->

.changeset/export-axis-opt-in.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,5 @@ is the segregation-of-duties case the axis exists for.
7373
revoked. `html_table` stays a read — it is a rendered view, not a bulk copy.
7474
Deployments without `plugin-security` are unaffected (no permission sets
7575
exist, so the axis does not apply).
76+
77+
<!-- adr-0087: registered export-axis-opt-in -->

.changeset/record-details-sections-object-form.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,5 @@ of silently stripping a live page's hidden-field list.
5454
`fields` (required), `label`, `columns` (1-4), and `name` — the i18n anchor that
5555
resolves `objects.<object>._sections.<name>.label`, which `packages/lint`'s
5656
`translation-section-name-missing` rule tells authors to add.
57+
58+
<!-- adr-0087: registered record-details-sections-object-form -->

.changeset/runtime-httpserver-wrapper-retired.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,5 @@ and re-audited every time `IHttpServer` gains an optional member — it gained o
5858
as recently as #5080. The 2026-08-06 maintainer ruling took the #4939
5959
(`ApiRegistry`) precedent instead — retiring a part that was never assembled
6060
beats repairing it — under ADR-0049's remove side.
61+
62+
<!-- adr-0087: registered runtime-httpserver-wrapper-retired -->

.changeset/sharing-rule-recipient-reconcile.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,5 @@ validates and then silently does nothing (ADR-0078).
3838
rows by field values (see the migrated examples:
3939
`share_open_tasks_with_manager` in app-showcase,
4040
`share_active_leads_with_manager` in app-crm), or use a scope-depth grant.
41+
42+
<!-- adr-0087: registered sharing-rule-recipient-reconcile -->

.changeset/sort-node-direction-rejected.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,5 @@ nonsenseKey: 1 }).success === true`). That is tracked in the #4001 campaign map
6363
for its own batch, not smuggled in here.
6464

6565
Related: #4674, #4720, #4363, #4371, #4001, ADR-0049.
66+
67+
<!-- adr-0087: registered sort-node-direction-rejected -->

.changeset/tool-requires-confirmation-removed.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,5 @@ liveness-ledger entry, and the generated reference-doc row.
4848
objectui's `ToolPreview.tsx` reads the field via `!!d.requiresConfirmation`, so it
4949
degrades to "not shown" with no error; removing that badge is a follow-up in that
5050
repo.
51+
52+
<!-- adr-0087: registered tool-requires-confirmation-retired -->

0 commit comments

Comments
 (0)