Repository navigation
test(types): derive NamedListView's four disposition buckets against the protocol (objectui#7924) - #9720
Conversation
…t the protocol The census pinned "declared, and read off a named view?". The disposition the card is waiting on turns on a second question it never pinned: does the PROTOCOL declare the member? That separates "the renderer sources it from the wrong place" from "objectui invented a spelling", and it is the axis the 2026-09-16 director-seat ruling is written on — as prose, with no assertion that could fail. Derived at test time off the installed `@objectstack/spec`, the declaration's own AST and the runtime fold; the literals are the pinned reading: - the protocol declares 50 keys for a named list view, 5 of them retirement tombstones refused by name — so objectui not declaring those 5 is agreement, not narrowness; - objectui declares all 45 LIVE protocol keys: the narrower-than-protocol direction is EMPTY today, with the opposite difference (19 objectui-only) as the control that the zero is a reading; - the 43 unread members partition 23 + 8 + 10 + 2, disjoint and exhaustive; - `.omit().extend().superRefine()` still refuses unknown keys under zod 4 — executed with an accept control, not read off `strictObject`. No declaration face moves: `objectql.ts`, every `*.zod.ts` and every renderer read set are untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
…s entry's retired figures The census changeset still carried `47 declared / 6 read / 41 unread`. Those figures were re-taken at objectui#8980 (PR #9534), which declared the seventeen members the protocol declares on this surface: the partition is 21 read and 43 unread of 64 today, and the other three sites that carry the pair together were updated with it. This was the fourth site and the only one left — an unreleased changeset, so the retired figures would have shipped into the release notes. Frontmatter untouched (empty before, empty after): no package's release is affected by the edit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
|
ACCEPT — card objectui#7924, reviewed by the ⛔ Nothing below is taken from the PR body. ① The headline figure, re-derived on a DIFFERENT parserThe PR reads
⇒ the property signatures are the population, so the count is a reading and not an approximation. The interface is at ⭐ Recorded because this seat got that address wrong earlier today: an earlier claim of mine put ② Clause-②: no — verified on the file list, ⛔ not on the declarationThree files, and
⇒ no declaration face moves, no accept set moves, no renderer read set moves. The ③ The figures are ASSERTIONS, not prose — spot-checked by matcherThe whole point of the card was that the protocol-side partition had never been anything but prose. Read off the added lines:
⭐ That is the shape that makes a zero a reading rather than a dead instrument, and it is the thing this card was waiting for. ④ Neither changeset publishesThe class this board repaired four times today (objectui#9704, #9706, #9711, #9713) is a pending entry publishing verbatim into a CHANGELOG. Measured here, ⛔ not assumed:
⇒ no package is released by either, so neither reaches a CHANGELOG. ⭐ That is what puts the 「today」 phrasing in both bodies inside tolerance rather than in the class above: it is not published prose, and every figure it carries goes red in CI before it can drift. The in-place repair on the census entry is the right shape for the distinction card objectui#9713 draws: the retired ⑤ Gates — job conclusions, ⛔ not the aggregateAll 36 check runs on head ⑥ The disagreement it surfaced, and where it belongsThe card body and title still carry 47 / six / 41; the tree reads 64 / 21 / 43 since objectui#8980 (PR #9534) declared the seventeen missing protocol members. The dev correctly ⛔ did not edit the card body — 「a card body is the PM/filing seat's to edit」. That is this seat's to fix, and it is not fixed in this comment: the card is a What stays out, correctlyBuckets ② and ③ retire 18 members from a published TS face — Implemented-by: VERDICT: ACCEPT. Turning ready and enqueueing; card objectui#7924 ⛔ does not close on merge. Generated by Claude Code |
Part of #7924 — the card is NOT settled by this PR; see "What this does not do".
Clause-②: no — no declaration face moves.
packages/types/src/objectql.ts, every*.zod.tsand every renderer read set are untouched.Why
The liveness census (PR #8933) answers one question per member: is it declared, and is it read off a named view? The disposition this card is waiting on turns on a second question the census never pinned: does
@objectstack/specdeclare the member? That is what separates "the renderer sources it from the wrong place" from "objectui invented a spelling", and the 2026-09-16 director-seat ruling is written entirely on that axis — as prose, with no assertion that can fail.That is the exact failure mode this card has already produced twice:
about 52 / seven / ~45→47 / six / 41→ stale again at64 / 21 / 43since objectui#8980. The protocol-side partition is today in the same state the member count was in then: measured once, on a branch revision (d4733f27e4) in a shallow checkout with a staleorigin/main, and carried forward in prose. The sweep said "Re-sample before dispatching bucket ②"; the ruling repeated it. This PR re-samples it and makes it an assertion.Figures, each with its instrument — all re-derived on
78a9c6744, none inheritedNamedListViewdeclared membersts.createSourceFile, the interface's ownPropertySignaturemembers). No heritage clause, no index signature, no computed member — so the property signatures ARE the population. One required member:label.schema.listViewsto a named view classifiedObjectListViewSchema.shapeoff@objectstack/spec@17.4.0as installed — read off the schema object, not a hand list[REMOVED]marker, then each refused BY NAME through a realsafeParseDisagreement with the figures the card body carries
The card's corrected block says 47 declared / six read / 41 unread. On today's head those read 64 / 21 / 43. This is not a new correction by me: objectui#8980 (PR #9534) declared the seventeen protocol members objectui was missing, and the census pin,
objectql.zod.ts,zod-mirror-parity.test.tsand.changeset/object-view-unmirrored-keys-7779.mdwere all updated with it. The card body and its title were not. Not repaired here — a card body is the PM/filing seat's to edit.What lands
A new
describeblock in the existing census pin (extended, not duplicated — same corpus, same helpers), with every figure derived at test time and the literals as the pinned reading:[REMOVED]prescription, with the accept leg ({ label, columns }parses) as the control. So objectui not declaring those five is agreement, not narrowness; a raw key-count diff reads it the other way and is wrong to.options) — the whole cost of a by-reference mirror in one name, with the strict protocol value's refusal of it measured..omit().extend().superRefine()still refuses unknown keys under zod 4 — executed withsafeParseplus an accept control. This was carried as NOT MEASURED by the 2026-09-10 sweep and by the triage that answered it; if it ever flips, bucket ③'s "the protocol refuses these" weakens to "does not declare these".show*spellings, ③ 10 objectui-only, plus the 2 that objectui#8980 declared inert by ruling. A member changing bucket now fails by name instead of staling a prose list.SHOW_FLAG_TO_USER_ACTIONis parsed out ofpackages/core/src/utils/normalize-list-view.tsand each of the seven is asserted against its canonical protocol twin insideuserActions; the eighth (showDescriptiontoappearance.showDescription) by its own branch. Control: a flag the fold does not know is absent from the map on the same query.Ablation — both legs, mutation proven on disk BEFORE any result was read
The subject reaches the assertions by
readFileSyncof the source (plus the installed schema object), so there is nodisthop to prove; the proof is the on-disk text count plus the blob hash.Leg A — the fold derivation (
packages/core/src/utils/normalize-list-view.ts, HEAD blob59dc77b6): removed-text count 1 to 0, injected 0 to 1, blob59dc77b6to1567eae0. Result:Tests 1 failed | 213 passed (214), and the only red row is "the runtime fold maps seven of the eight legacy spellings…". Restored withgit checkout HEAD -- ABSOLUTE_PATHfrom atrap … EXIT INT TERM; restoration proven by blob equality back to59dc77b6and an emptygit diff HEADfor the path.Leg B — the declaration and the protocol difference (
packages/types/src/objectql.ts, HEAD blob033c24f9): one bucket ① member renamed (navigationtonavigationZZZ), counts 1 to 0 and 0 to 1, blob033c24f9to147d6bbd. Result:Tests 5 failed | 209 passed (214), red rows exactly: the declared-set pin, the 21+43=64 partition,UNREAD — navigation,objectui declares every LIVE protocol key … is EMPTY today, andBUCKET ① — navigation. So the zero in this PR's headline row is a live query, not a dead one. Restored and proven the same way; blob back to033c24f9,git diff HEADempty.Neither ablation file is edited by this PR.
Gates — exit code captured to a file before any pipe
pnpm exec vitest run packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.tsTest Files 1 passed (1)·Tests 214 passed (214)(164 before)pnpm --filter @object-ui/types testTest Files 202 passed (202)·Tests 4748 passed (4748)pnpm --filter @object-ui/types run type-checktscinvocations echoed,tsconfig.test.jsonamong them, so the test file IS typecheckedeslint --no-inline-configon the changed test file--format json: 1 file linted, 0 errors, 0 warningscheck:control-bytescheck-changeset-presencecheck-changeset-no-majorNo changeset declares a major bump.check-changeset-fixedAll workspace packages are in the changeset fixed group.check-changeset-overwritecheck:changeset-claims·check:pending-changeset-literalscheck:new-line-citationscheck:test-path-roots·check:installed-pin-claimscheck-governed-queue-guard --teston the changed test pathNOT GOVERNED — 1 path(s) checked against 5 governed surface(s); none matched.Every heavy run went through the shared verify lock (
OS_VERIFY_LOCK_SLOT=dev-7924), each printing its ownVERDICT command-exitline.Declared narrowing of the lint run. Repo-wide
pnpm lintisturbo run lintand belongs to CI; locally only the changed file was linted. The narrowing is measurable: the file count is read off eslint's own--format jsonoutput (1), andeslint.config.jsconfigures no type-aware linting (noproject/projectService), so this diff cannot move the verdict for any untouched file. Figures taken at4794f4786, the final commit.The in-place repair, named with its evidence
.changeset/7924-named-list-view-liveness-census.md— the census's own, still unreleased — carried the retired47 declared / 6 read / 41 unread. The other three sites that carry the pair were re-taken at objectui#8980; this was the fourth and last, and it would have shipped those figures into the release notes. Repaired in the same defect class as this card. Frontmatter untouched (empty before, empty after), so no package's release changes;check-changeset-overwritereports the edit (declared at base: nothing/declares now: nothing) and it is that gate's own documented case 2, "CORRECTING a declaration on purpose — prose that no longer matches the change".What this does not do
Clause-②: yes) and is outside this dispatch's remit. This PR only makes the bucket each of those 18 sits in a derived, failing assertion, which is the input that PR needs and the thing that was still prose.packages/plugin-view/src/ObjectView.tsx.维护者速读(草稿)
@objectstack/spec、声明文件自己的 AST、以及运行时的折叠表。show*拼法 + 十个本地键),那是另一张Clause-②: yes的 PR。Generated by Claude Code