Repository navigation
Commit 11fea6b
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
4 | 24 | | |
0 commit comments