Skip to content

Commit 11fea6b

Browse files
ci(spec-shape-gate): register the retirement of the page component's visibility and the view form's visibleOn (#23920)
Part of #23543 Clause-②: no F4 aftercare: one entry in the Spec Shape Gate's retirement registry, so the hourly run reads the F4 retirement (PR #23836, merge commit `105902f10ae8124a5e965cb24f7b30681fd9fae2`) as `known (registered: objectstack-ai/objectui#12654)` instead of red. #23543 stays open; this PR is the registry half of F4's aftercare only. objectstack-ai/objectui#12654 is the consumer card and is not addressed here. ## What changed `scripts/ci/spec-shape-retirements.json` gets one entry, in the grammar `parseRegistry` reads (`scripts/ci/spec-shape-gate.mjs`, THE REGISTRY): - `retired`: the page component's `visibility` and the view form's `visibleOn` (field and section), retired as keys (retiredKey() tombstones naming `visibleWhen`). - `objectstack_pr` 23836, `objectstack_commit` `105902f10ae8124a5e965cb24f7b30681fd9fae2`, `downstream_card` `objectstack-ai/objectui#12654`, `registered_at` 2026-10-16. - `matches`: two patterns. Each one names the objectui file, the TS code and the diagnostic's full first-line message, so neither covers anything but the diagnostic it was measured from. | # | objectui file | code | message (full first line) | where it was measured | |---|---|---|---|---| | 1 | `packages/react/src/SchemaRenderer.tsx` | TS2345 | see block 1 below | scheduled run `38896788900` (check-run `116959061730` annotation, line 1945:45), and reproduced byte-identical locally | | 2 | `packages/react/src/__tests__/SchemaRenderer.expressions.test.tsx` | TS2322 | see block 2 below | local only (line 171:86). The CI run cannot reach it: react's `type-check` is `tsc --noEmit && tsc -p tsconfig.test.json`, and the first half is red on pattern 1 | ```text 1: 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'. 2: Type 'string' is not assignable to type '{ '[REMOVED] Key retired: run `os validate` for its migration.': never; }'. ``` Pattern 2 is registered now for one reason: if objectui corrects the source read before the test, the test project starts compiling and would red on an F4 diagnostic nobody had registered. No change to the reader, its grammar, the workflow, or any objectui file. ## Which sites were measured, and which could not be The local compile: objectui `main` `f78efdd1e3` (a detached worktree with its own install), with `@objectstack/spec` built and `npm pack`ed from this branch's base `570f01d270` and injected by the gate's own `inject`. Then `TURBO_FORCE=true pnpm turbo run type-check --filter=@object-ui/react --filter=@object-ui/types --continue --concurrency=2` ran. That reproduced the scheduled run's two diagnostics exactly, and nothing else. After it, the three chained `tsc` projects that compile run never reaches were run by hand: | project | status | diagnostics | |---|---|---| | `packages/react` `tsc -p tsconfig.test.json` | 2 | pattern 1 again (the test program pulls in the source), and pattern 2 | | `packages/types` `tsc -p tsconfig.examples.json` | 2 | `layout.zod.ts:25` TS2305 only (seat 2's, below) | | `packages/types` `tsc -p tsconfig.test.json` | 2 | `layout.zod.ts:25` and `imported-defaults-8317.test.ts:145` TS2305 (seat 2's); `select-option-tier1-convergence-7014.test.ts:130,138,150,157` TS2344 (not F4's, see Acceptance notes) | The read sites objectui#12654 lists, by outcome: - **Red under F4, registered:** `SchemaRenderer.tsx:1944-1945` (diagnostic at 1945:45) and `SchemaRenderer.expressions.test.tsx:171`. - **Measured, no diagnostic:** `SchemaRenderer.tsx:191`, the type `PageComponent['visibility']`. It compiles, and it is where the tombstone type reaching 1945 comes from. Also `SchemaRenderer.tsx:365`, `1939-1940` and `2190-2191`: the working copy's `visibleOn` is typed by objectui's own `BaseSchema`, not the spec's. Also the `Pick` at `SchemaRenderer.expressions.test.tsx:38` and `types/src/__tests__/flat-props-refusal-10872.test.ts`, which has no row in the types test project. - **Read from the scheduled run, not recompiled here:** every other objectui package. That includes the `visibleOn` readers in `components`, `plugin-form`, `apps/console` and `app-shell`, and `plugin-form/src/sectionFields.spec-parity.test.ts`. In that run, turbo's failure annotations name only `packages/types` and `packages/react` (`build` and `type-check` each). So every other package's chained `type-check` ran to green, at the objectui `main` of 11:53Z, not at `f78efdd1e3`. The `sectionFields.spec-parity.test.ts:145` coupling reads `(… as any).in.shape`, which is a vitest runtime break and not a type diagnostic, so this compile-only gate cannot see it. - **Not measured:** the job log itself. Its download redirects to a results host this container cannot reach, so the scheduled run's reading here comes from its check-run annotations. ## Not this PR's `packages/types/src/zod/layout.zod.ts:25:3` TS2305 (`checkPageComponentViewData`) belongs to seat 2's PR #23784 and is not registered here. This PR's own Spec Shape Gate run is path-triggered by the registry. It is expected to read F4's diagnostic as `known` and still red on that one, until #23784 lands. The gate is not one of the five required contexts. ## Verification (all at `1adf5046ee`) - `node scripts/ci/spec-shape-gate.mjs --self-test`: exit 0, `60/60 passed across 7 batteries`. - `parseRegistry` on the committed file, plus `classifyRows` over eight rows: exit 0, `PARSE-CHECK PASS`. The two measured rows read known. Six rows stay unknown: seat 2's TS2305, the select-option TS2344, and four near misses that each change one field of a measured row (same file with another code, same file with another parameter type, the test file with another source type, another file with the same message). - The gate's own `report` over the real local turbo log (`--registry` this file): exit 1. `SchemaRenderer.tsx:1945` reads `known (registered: objectstack-ai/objectui#12654 …)`, and `layout.zod.ts:25` stays NEW. The same `report` over that log plus the three hand-run projects' output, each line given turbo's `@object-ui/PKG:type-check: ` prefix: exit 1. Two rows read known (patterns 1 and 2), and the six non-F4 rows stay NEW. - `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 19 commands from this diff. All 19 exit 0, and `--ran` reports `19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN`. - No changeset: `scripts/ci/` sits under the private root package (`@objectstack/spec-monorepo`, `private: true`), and no `package.json` under `scripts/` ships it. `skip-changeset` applies. ## Acceptance notes - **A second shape break is hidden behind seat 2's red, and it is not F4's.** `packages/types/src/__tests__/select-option-tier1-convergence-7014.test.ts:130,138,150,157` TS2344 `Type 'false' does not satisfy the constraint 'true'.` It comes from the `Equal` pins on the converged select-option faces, after `SelectOptionSchema` gained `kind` (`adad73f714`, PR #23846). The types test project compiles only once `layout.zod.ts:25` is green, so the hourly gate will red on these four rows when #23784 lands, unless someone registers them or objectui re-pins them first. Handed to the seat to route; not registered here. - Seat 2's TS2305 also has a second site the run never reached: `packages/types/src/__tests__/imported-defaults-8317.test.ts:145:3`. That is for PR #23784's registration or repair. - Prune this entry when objectstack-ai/objectui#12654 lands. The gate lists an entry that matched nothing in a run. --- _Generated by [Claude Code](https://claude.ai/code/session_01HjR8RUwTPQ3TgbfKihmxp9)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent cdf3777 commit 11fea6b

1 file changed

Lines changed: 21 additions & 1 deletion

File tree

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,24 @@
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": []
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+
]
424
}

0 commit comments

Comments
 (0)