Skip to content

Commit 01fd980

Browse files
chore(ci): empty spec-shape-retirements.json — all five entries name closed objectui cards (#25108) (#25394)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} --> _Requested by **Elon** · [project thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9D3HAzRn9UnnjnvWeBJbjUjJ)_ Fixes #25108 Clause-②: no Metadata-protocol: none ## What `scripts/ci/spec-shape-retirements.json`: all five entries in `retirements` are deleted, leaving `"retirements": []`. `$comment` is byte-identical, and no other key exists. - Why: the registry's own `$comment` says each entry is "deleted when that card closes". All five downstream cards are closed `completed`. - Why it matters: a stale entry still matches. While one stays, a new break in the same objectui file with the same code and message reads `known` instead of red. - The entries removed name objectstack PRs #23836, #23846, #24442, #24970 and #24778. One file, +1 / −82. No gate script, workflow or package change. Nothing publishes, so there is no changeset (`skip-changeset`). Precedent: #23822. ## Measurements (against `origin/main` at `fc7b53ffbf`) - **Downstream cards** (read through the REST API before the edit): | entry (objectstack PR) | downstream card | state | closed | |:--|:--|:--|:--| | #23836 | objectstack-ai/objectui#12654 | closed `completed` | 2026-10-16T15:04Z | | #23846 | objectstack-ai/objectui#12711 | closed `completed` | 2026-10-16T17:06Z | | #24442 | objectstack-ai/objectui#13022 | closed `completed` | 2026-10-19T13:05Z | | #24970 | objectstack-ai/objectui#13308 | closed `completed` | 2026-10-21T10:21Z | | #24778 | objectstack-ai/objectui#13309 | closed `completed` | 2026-10-21T10:09Z | - **`parseRegistry` accepts an empty array:** `scripts/ci/spec-shape-gate.mjs:857`. The shape check at `:865` refuses only a non-object, or a `retirements` that is not an array (`!Array.isArray(doc.retirements)`). Per-entry rules run inside `doc.retirements.forEach`, so zero entries raise zero problems. The self-test pins this case (`:1470`, "an empty registry loads as zero retirements"). - **The edited file, loaded by the real reader:** `parseRegistry(<the edited file>)` returns `retirements.length === 0` and does not throw. - **Self-test:** `node scripts/ci/spec-shape-gate.mjs --self-test` gives `60/60 passed across 7 batteries`, both before and after the edit. - **Other readers of the file:** only `scripts/ci/spec-shape-gate.mjs` and `.github/workflows/spec-shape-gate.yml`. The workflow's `paths:` filter (`:116`) names this file, so this PR runs its own `Spec Shape Gate`. ## Gates Derived by `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at `fc7b53ffbf`, with the one changed path. Exit codes were captured before any pipe and reconciled with `--ran`: "22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero — all 22 recorded an exit code and none of them is 3)". | Command | Exit | |---|---| | `node scripts/check-ci-filter-parity.mjs` | 0 | | `node scripts/check-closing-keyword-parity.mjs` | 0 | | `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | | `node scripts/check-comment-mask-corpus.mjs` | 0 | | `node scripts/check-position-name-fold-loaders.mjs` | 0 | | `node scripts/check-position-name-fold-loaders.mjs --self-test` | 0 | | `node scripts/check-scripts-symbol-anchors.mjs` | 0 | | `node scripts/check-scripts-symbol-anchors.mjs --self-test` | 0 | | `pnpm check:agent-test-spelling` | 0 | | `pnpm check:bash32-floor` | 0 | | `pnpm check:cli-command-ids` | 0 | | `pnpm check:cross-package-test-inputs` | 0 | | `pnpm check:driver-memory-census` | 0 | | `pnpm check:entry-guard` | 0 | | `pnpm check:gitlink-declared` | 0 | | `pnpm check:nul-bytes` | 0 | | `pnpm check:parse-guard` | 0 | | `pnpm check:pnpm-filter-targets` | 0 | | `pnpm check:pnpm-flag-spellings` | 0 | | `pnpm check:refd-timer-probe` | 0 | | `pnpm check:spec-shape-gate` | 0 | | `pnpm check:watch-hint-literal` | 0 | The first sweep ran in a checkout with no `node_modules`. Six commands exited 3 (`PREREQUISITE NOT MET`): `check-ci-filter-parity`, both `check-closing-keyword-parity` commands, `check-comment-mask-corpus`, `check:cli-command-ids` and `check:driver-memory-census`. After `pnpm install --frozen-lockfile` (exit 0, no tracked file changed), all 22 were re-run. The table shows that second sweep. CI runs the rest of the families on this PR. ## Acceptance notes - Done when (from the card): this PR's own path-filtered `Spec Shape Gate` run concludes `success` with no "matched nothing" list. That run is CI's to report. It cannot be measured locally. - Not touched: the gate script's header and grammar. Unlike #23822, no comment in `spec-shape-gate.mjs` or `spec-shape-gate.yml` names any of the five entries, so the change is the JSON file alone. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01LKHDniRQSWjRJyDtacwpEd Co-authored-by: Claude <noreply@anthropic.com>
1 parent 97be89b commit 01fd980

1 file changed

Lines changed: 1 addition & 82 deletions

File tree

Lines changed: 1 addition & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,4 @@
11
{
22
"$comment": "Intentional spec retirements the Spec Shape Gate reads as `known` instead of red. One entry per retirement, written by the accepting seat when the downstream (objectui) card is filed, deleted when that card closes. Every entry carries exactly: retired, objectstack_pr, objectstack_commit (40-hex merge commit), downstream_card (owner/repo#N), registered_at (YYYY-MM-DD), matches (non-empty; each pattern names a repo-relative objectui `file` -- `*` within a segment, `**` across -- plus at least one of `code` (TS<digits>) or `message` (substring)). A file alone is refused. The reader, its grammar and its refusals: scripts/ci/spec-shape-gate.mjs (THE REGISTRY).",
3-
"retirements": [
4-
{
5-
"retired": "the page component's `visibility` and the view form's `visibleOn` (field and section), retired as keys -- retiredKey() tombstones naming `visibleWhen` (F4 of #23543) -- objectui still passes the page component's `visibility` to an expression argument, and its expressions test (compiled only by the package's chained test project) still authors that key",
6-
"objectstack_pr": 23836,
7-
"objectstack_commit": "105902f10ae8124a5e965cb24f7b30681fd9fae2",
8-
"downstream_card": "objectstack-ai/objectui#12654",
9-
"registered_at": "2026-10-16",
10-
"matches": [
11-
{
12-
"file": "packages/react/src/SchemaRenderer.tsx",
13-
"code": "TS2345",
14-
"message": "Argument of type '{ '[REMOVED] Key retired: run `os validate` for its migration.': never; }' is not assignable to parameter of type 'string | boolean | { dialect?: string | undefined; source?: string | undefined; } | undefined'."
15-
},
16-
{
17-
"file": "packages/react/src/__tests__/SchemaRenderer.expressions.test.tsx",
18-
"code": "TS2322",
19-
"message": "Type 'string' is not assignable to type '{ '[REMOVED] Key retired: run `os validate` for its migration.': never; }'."
20-
}
21-
]
22-
},
23-
{
24-
"retired": "nothing retired -- the spec ADDED an optional key: the select option's lifecycle `kind` (`open` | `won` | `lost`, required only under a `stageField`, #23809). objectui's select-option convergence pins assert by design that the converged form and metadata faces gained no key beyond `description` / `default`, so a new spec key reds them (TS2344 `Equal` pins, compiled only by the package's chained test project); the entry is deleted when objectui re-pins the faces",
25-
"objectstack_pr": 23846,
26-
"objectstack_commit": "adad73f71483abf84b470e90367fe8080c44a4e0",
27-
"downstream_card": "objectstack-ai/objectui#12711",
28-
"registered_at": "2026-10-16",
29-
"matches": [
30-
{
31-
"file": "packages/types/src/__tests__/select-option-tier1-convergence-7014.test.ts",
32-
"code": "TS2344",
33-
"message": "Type 'false' does not satisfy the constraint 'true'."
34-
}
35-
]
36-
},
37-
{
38-
"retired": "a page action row's own `patch` (action:button, action:icon and the action:group / action:menu member), retired as a key -- a retiredKey() tombstone sending the author to the `patch` of the action the row's `name` names (#24394) -- objectui's action-button undo test still authors `patch` on an `action:button` node",
39-
"objectstack_pr": 24442,
40-
"objectstack_commit": "69f342b92470e0b66aa9b17ccd2fc7db04e4e568",
41-
"downstream_card": "objectstack-ai/objectui#13022",
42-
"registered_at": "2026-10-19",
43-
"matches": [
44-
{
45-
"file": "packages/components/src/renderers/action/__tests__/action-button-undoable-11168.test.tsx",
46-
"code": "TS2353",
47-
"message": "Object literal may only specify known properties, and 'status' does not exist in type '{ \"[REMOVED] Key retired: run `os validate` for its migration.\": never; }'."
48-
}
49-
]
50-
},
51-
{
52-
"retired": "the list view's and the page `list-view` node's `addRecord.mode` and `addRecord.formView`, retired as keys -- retiredKey() tombstones on the one AddRecordConfig every list-view door shares, with ADR-0087 drop conversions (`add-record-mode-form-view-removed`) -- objectui still authors both keys in two spec-alignment tests in `packages/types` that type a value carrying them (an `AddRecordConfig` in p2-spec-exports, a `ListViewSchema` in p1-spec-alignment); the entry is deleted when the downstream card closes",
53-
"objectstack_pr": 24970,
54-
"objectstack_commit": "fde7456352318872704c24feadaa6660b9bc649b",
55-
"downstream_card": "objectstack-ai/objectui#13308",
56-
"registered_at": "2026-10-21",
57-
"matches": [
58-
{
59-
"file": "packages/types/src/__tests__/p2-spec-exports.test.ts",
60-
"code": "TS2322",
61-
"message": "Type 'string' is not assignable to type '{ '[REMOVED] Key retired: run `os validate` for its migration.': never; }'."
62-
},
63-
{
64-
"file": "packages/types/src/__tests__/p1-spec-alignment.test.ts",
65-
"code": "TS2322",
66-
"message": "Type 'string' is not assignable to type '{ '[REMOVED] Key retired: run `os validate` for its migration.': never; }'."
67-
}
68-
]
69-
},
70-
{
71-
"retired": "nothing retired -- the spec WIDENED a union: `DroppedFieldsEvent['reason']` gained a fifth arm, `stored_expression` (a stored field whose declared expression the engine computes on every write). objectui's batch-6 spec-symbol pin `_ReasonIsTheEnum` asserts the exact four-member union (`readonly`, `readonly_when`, `primary_key`, `computed`) with a TS2344 `Equal` pin, so the widened union reds it; the entry is deleted when the downstream card closes",
72-
"objectstack_pr": 24778,
73-
"objectstack_commit": "7532ea3c0893a08a518739aebfe7c0751211f53d",
74-
"downstream_card": "objectstack-ai/objectui#13309",
75-
"registered_at": "2026-10-21",
76-
"matches": [
77-
{
78-
"file": "packages/data-objectstack/src/spec-symbol-batch6.test.ts",
79-
"code": "TS2344",
80-
"message": "Type 'false' does not satisfy the constraint 'true'."
81-
}
82-
]
83-
}
84-
]
3+
"retirements": []
854
}

0 commit comments

Comments
 (0)