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 }}
Repository navigation
Commit bd6337b
Browse filesBrowse the repository at this point in the historyBrowse files
docs(governed): restate the projections, the registry and their laps as main builds them
ADR-0087's D4 progress note records #22483 (PR #22556) and #22485
(PR #22638) as landed and its other not-yet-landed sentences move to
the past tense; the ruling quotation is untouched. AGENTS.md re-counts
the checked-in generated artifacts (six) and the ADR-0087 row of the
regenerate table says there is nothing to commit. The retirement
playbook sends step edits to registry.ts.template and drops the
gen:spec-changes / gen:upgrade-guide laps.
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011u73oxZ5X95qrARPTeoU6v
### Touched `packages/spec`? Regenerate its artifacts BEFORE pushing
705
705
706
-
`packages/spec` has **eight** checked-in generated artifacts, each with its own CI
706
+
`packages/spec` has **six** checked-in generated artifacts, each with its own CI
707
707
gate. All of them live in one job — `TypeScript Type Check` in `lint.yml`, which is
708
708
required and has no paths filter, so no gate can go dormant on the PR that breaks it.
709
709
That job runs its gates **sequentially**, so the first stale artifact masks every one
@@ -714,7 +714,7 @@ behind it. Match the change to the gate and regenerate up front:
714
714
| A `.describe()` / TSDoc on any schema |`check:docs`|`gen:schema && gen:docs`|
715
715
| A public export (added / removed / renamed) |`check:api-surface`|`gen:api-surface`|
716
716
| An authorable key on a metadata schema |`check:authorable-surface`|`gen:schema`|
717
-
| An ADR-0087 conversion / migration registry |`check:spec-changes`, `check:upgrade-guide`|`gen:spec-changes`, `gen:upgrade-guide`|
717
+
| An ADR-0087 conversion / migration registry entry |`check:spec-changes`, `check:upgrade-guide`— in memory, red only when the registries do not project | nothing to commit — `gen:migration-registry` (install, build and test run it too) writes the gitignored `registry.ts`|
718
718
| A `SKILL.md` (frontmatter or body) |`check:skill-docs`, `check:skill-refs`|`gen:skill-docs`, `gen:skill-refs`|
719
719
| The react-blocks contract |`check:react-blocks`|`gen:react-blocks`|
Copy file name to clipboardExpand all lines: docs/adr/0087-metadata-protocol-upgrade-contract.md
+27-21Lines changed: 27 additions & 21 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# ADR-0087: Metadata protocol upgrades for AI consumers — conversion over notification, executable migrations, machine-verifiable upgrades
2
2
3
-
**Status**: Accepted (2026-07-04, #2582) · trued up to as-built 2026-07-15 (see Addendum) · **Amended** (2026-09-30, #20390 ruling A — the artifact-ingestion window decides per entry by each retired conversion's `retiredAfter`; see the amendment note under the 2026-09-13 addendum's window bullet) · **Amended** (2026-10-09, #22449 ruling B′ — the two D4 projections, the per-major section of `spec-changes.json` and the protocol upgrade guide, are generated at publish rather than committed; see the amendment note under D4, which says what has landed and which cards carry the rest, and the struck clauses in the P2 phase-status bullet)
3
+
**Status**: Accepted (2026-07-04, #2582) · trued up to as-built 2026-07-15 (see Addendum) · **Amended** (2026-09-30, #20390 ruling A — the artifact-ingestion window decides per entry by each retired conversion's `retiredAfter`; see the amendment note under the 2026-09-13 addendum's window bullet) · **Amended** (2026-10-09, #22449 ruling B′ — the two D4 projections, the per-major section of `spec-changes.json` and the protocol upgrade guide, are generated at publish rather than committed; see the amendment note under D4, which says what is generated where and where each part landed, and the struck clauses in the P2 phase-status bullet)
4
4
**Deciders**: ObjectStack Protocol Architects
5
5
**Builds on**: [ADR-0059](./0059-third-party-backward-compatibility-gates.md) (layered backward-compat gates — this ADR is its consumer-facing sequel), [ADR-0078](./0078-no-silently-inert-metadata.md) (no declarable-but-unenforced metadata — the un-checked `engines.protocol` is exactly this class), [ADR-0025](./0025-plugin-package-distribution.md) (§3.2 `engines.protocol` / `engines.platform` compatibility ranges, §3.10 #3 protocol-first check order), [ADR-0033](./0033-ai-assisted-metadata-authoring.md) (the authoring population this ADR designs for), [ADR-0049](./0049-no-unenforced-security-properties.md) (enforce-or-remove), [ADR-0054](./0054-runtime-proof-for-authorable-surface.md) (prove-it-runs), AGENTS.md Prime Directive #12 (contract-first, no consumer-side dialect fallbacks — §"Why the conversion layer does not violate PD #12" draws the line)
6
6
**Consumers**: `@objectstack/spec` (protocol version constant, conversion layer, deprecation/change registries), `@objectstack/cli` (`validate`, `doctor`, `migrate meta`), the runtime metadata loader (handshake + conversion), `@objectstack/mcp` (the AI-native change/migration surface), `@objectstack/create-objectstack`, the Release workflow, and every third-party consumer — whose maintainer is assumed to be an **AI agent**
@@ -205,7 +205,9 @@ chain** — the database-migration model applied to metadata source files.
205
205
> **Amended 2026-08-06 (#5837), paths only.**`api-surface.json` became the directory
206
206
> `api-surface/` (one shard per entry point) and ships in the npm artifact as such; the
207
207
> release diff reads whichever layout the previously published tarball carried. `spec-changes.json`
208
-
> is deliberately unsharded — it is keyed by version, which has never been a conflict surface.
208
+
> was left deliberately unsharded — it is keyed by version, which was never a conflict surface.
209
+
> That call was about merging its committed copy, which #22485 deleted (PR #22638): nothing
210
+
> merges it any more.
209
211
210
212
> **Amended 2026-10-09 (#22449, ruling B′) — where the two projections live.** Ruling
211
213
> `6078203801` on #22449, letter B′, which the maintainer answered 「同意」 at
@@ -255,20 +257,23 @@ chain** — the database-migration model applied to metadata source files.
255
257
> artifact when it is non-empty. That step is red only when a side cannot be
256
258
> generated, never because of the size of a diff.
257
259
>
258
-
> **The ruled end state, and the cards that still carry it.** Not landed when this
259
-
> note was written, and stated here as ruled rather than as done:
260
+
> **The ruled end state, landed** (trued up 2026-10-11). Not landed when this note was
261
+
> first written; both remaining cards have landed since, each deleting one committed copy
262
+
> and its `merge=os-regen` route in `.gitattributes`:
260
263
>
261
-
> - condition (2), the guide's public address and the pointer stub at
262
-
> `docs/protocol-upgrade-guide.md` — #22483;
263
-
> - the deletion of the committed copies (the per-major projection in
264
-
> `packages/spec/spec-changes.json`, the guide body at
265
-
> `docs/protocol-upgrade-guide.md`) and of their two `merge=os-regen` routes in
266
-
> `.gitattributes` — #22485, which lands last.
264
+
> - condition (2) — #22483, landed as `514bf3c101` (PR #22556). The guide's public
265
+
> address is the docs site, one page per protocol major, generated at docs build into
266
+
> the gitignored `content/docs/protocol-upgrade/`. `docs/protocol-upgrade-guide.md`
267
+
> stays at its path as a hand-written pointer stub naming that address; the guide body
268
+
> it used to hold left git with its route;
269
+
> - the committed `packages/spec/spec-changes.json` and its route — #22485, landed last
270
+
> as `46064dfa03` (PR #22638).
267
271
>
268
-
> Until #22485 lands the committed copies stay in the tree, and the generators'
269
-
> no-flag mode (`gen:spec-changes`, `gen:upgrade-guide`) still writes them, but
270
-
> `check:spec-changes` and `check:upgrade-guide` no longer compare them: they can go
271
-
> stale, and the copies that ship are the record. Condition (3) is cloud's half and
272
+
> No committed copy of either projection remains. `packages/spec/spec-changes.json` and
273
+
> `packages/spec/protocol-upgrade-guide.md` are gitignored paths the publish lane writes
274
+
> for `files[]` to ship, and the generators' no-flag mode writes only untracked output
275
+
> (`gen:spec-changes` that `spec-changes.json`, `gen:upgrade-guide` the docs pages), so a
276
+
> registry entry's pull request regenerates neither. Condition (3) is cloud's half and
272
277
> lives in that repository (objectstack-ai/cloud#2750); this record governs the
273
278
> framework half.
274
279
>
@@ -281,7 +286,7 @@ chain** — the database-migration model applied to metadata source files.
281
286
> generators the publish lane runs, and the registry entries those projections are
282
287
> computed from stay committed, reviewable source. What leaves git is the committed
283
288
> aggregate and the re-sync laps it cost. The 2026-08-06 note above ("deliberately
284
-
> unsharded") is about that committed copy, which #22485removes.
289
+
> unsharded") is about that committed copy, which #22485removed.
285
290
286
291
- The Release workflow diffs the current `api-surface.json` against the previously
287
292
published one (reusing the ADR-0059 §3 gate artifact instead of discarding it),
@@ -428,18 +433,19 @@ scaling framework-side execution when the consumers can execute themselves.
428
433
**amended 2026-10-09** — it is generated from the registries at publish, as
429
434
`protocol-upgrade-guide.md` inside the npm artifact and on the GitHub Release,
430
435
and in memory, with its diff rendered, at pull request;
431
-
`docs/protocol-upgrade-guide.md`is ruled to become a pointer stub naming the
432
-
guide's public address, which #22483 carries.
436
+
`docs/protocol-upgrade-guide.md`became a pointer stub naming the guide's
437
+
public address, the docs site's per-major pages (#22483, PR #22556).
433
438
434
439
> **Amended (2026-10-09) — the projections are generated at publish, not
435
440
> committed.** Provenance: ruling `6078203801` on #22449 (letter B′; maintainer
436
441
> 「同意」), which supersedes the 2026-08-10 #6957 ruling's rejection of option B
437
442
> and keeps its reason, the review diff, as its condition (1); the generation
438
443
> half landed as `5b12503c31` (PR #22533, card #22482). The struck clauses
439
-
> describe committed copies drift-checked in CI. Those copies stay in the tree
440
-
> until #22485 deletes them, and `check:spec-changes` / `check:upgrade-guide`
441
-
> no longer compare them. The amendment note under D4 is the full record:
442
-
> what is generated where, and what #22483 and #22485 still carry.
444
+
> describe committed copies drift-checked in CI. Those copies are gone — the
445
+
> guide's at #22483 (PR #22556), `spec-changes.json`'s at #22485 (PR #22638) —
446
+
> and `check:spec-changes` / `check:upgrade-guide` generate in memory and
447
+
> compare nothing. The amendment note under D4 is the full record: what is
0 commit comments