Repository navigation
fix(types): the stray-groupBy kanban refusal no longer denies the validation that emits it (objectui#9653) - #10317
Conversation
…idation that emits it (objectui#9653) `KanbanStrayGroupByRefusal`'s message said a view carrying `kanban.groupBy` "never came through the validated path", then that the key rode this mirror's `.passthrough()` into `ListView` and changed the board. Only the second was true: before the refusal, `safeValidateSchema` accepted and kept the key in both nestings and `ListView` grouped by it. The false clause is gone; the tail now says what happened and why the key is refused now. What is refused (key, paths, codes, lead sentence, remedy) is unchanged. Also corrects `checkNamedViewCalendarAliases`' docblock, which said every alias refusal in the module "stops at `listViews`" while the function itself refuses `listViews.KEY.calendar.dateField`. Adds a content pin (no clause denying validation; the message names the validator and the mechanism that kept the key) and a patch changeset. Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
…objectui#9653) The lit control required the message to name `safeValidateSchema` as well, which pinned new wording rather than the true clause, and would have gone red together with the negative when the retired text is restored — so the ablation could not tell the two arms apart. It now asserts the passthrough clause alone, which the retired text also carried. Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
…ngeset (objectui#9653) A build of `@object-ui/types` shows the named-view calendar check's docblock is emitted into the built JavaScript as a comment, so the correction ships too; the changeset now says so. Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
|
changeset-claim-re-read
|
✅ 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
|
✅ 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
|
Fixes #9653
Clause-②: no
What changed
Two false sentences in
packages/types/src/zod/objectql.zod.ts, one fix window. What the schema refuses does not change.1.
KanbanStrayGroupByRefusal's message (runtime-visible, both channels). It said a view carryinggroupBy"never came through the validated path". A few clauses later the same message said the key "rode this object's.passthrough()" intoListViewand changed the board. The first clause is deleted. The tail now says what happened and why the key is refused now:The lead sentence (
Unrecognized key(s) on this kanban configuration: .../Did you mean groupBy → groupByField?), the key, both paths and both codes are byte-identical in behaviour. The old tail said the key "rode this object's.passthrough()". The new one also names the second channel, because onoptions.kanbanthe key was kept by thez.record(z.string(), z.any())bag, not by a passthrough.2.
checkNamedViewCalendarAliases' docblock (seat 3's fold-in, comment 5732909013). "Every alias refusal this module declares stops atlistViews" was false under either reading of "stops at", because the function it documents refuseslistViews.KEY.calendar.dateField. The sentence now says that no alias refusal reached insidelistViewsuntil this check, that this check is the only door in, and that it judges only the two calendar spellings, at both nestings. The paragraph's kanban-twin sentence now says that no pin re-derives that silence (AGENTS.md #9).Premise, measured before writing
91facaef, the parent of704e6959(PR objectui#9236, the commit that added the refusal), throughsafeValidateSchemaand a realListViewmount with a registry spy. It gave 7/7 as predicted.kanban.groupBypassed and was KEPT (data.kanban.groupBy), and so wasoptions.kanban.groupBy(data.options.kanban.groupBy). LIT CONTROL: the same door refused a wrong-typedkanban.groupByField, so it does judge the block. The renderedobject-kanbannode carriedgroupBy: LANE_FROM_STRAY_GROUPBYin both nestings, withgroupByField: LANE_FROM_CANONICALpresent. RENDER CONTROL: the canonical key alone resolved the canonical lane.@objectstack/spec17.4.0,ListViewSchemarefuseskanban.groupBy(unrecognized_keysatkanban) and refusesoptionsoutright. Its controls: a canonical view is ACCEPTED, and a bogus top-level key is refused. The new text keeps the protocol's refusal and drops the inference.aliasKeyRefusal()family at HEAD8b1f0661(throwaway probe throughsafeValidateSchema, each control first): the kanbangroupByarm refuses onlist-viewkanbanandoptions.kanban, and a named view carrying it is ACCEPTED in both nestings. The calendar block arms refuse onlist-viewcalendarandoptions.calendar, and onlistViews.v1.calendar.dateField,…endFieldandlistViews.v1.options.calendar.dateField(custom, via this check). A flatlistViews.v1.dateFieldis ACCEPTED. The node and container arms refuse onobject-calendaronly.git grep -n -i 'validated path\|never came through'over the tree finds no third instance inpackages/types/src/zod/**. Two siblings outside this surface are under Acceptance notes..changeset/8365-stray-kanban-groupby-refused.mdis present at base8b1f0661. The npm@object-ui/types@17.6.0tarball hasaliasKeyRefusal0 and the old clause 0, while its lit controls fire (safeValidateSchema3 files,ListViewSchema7,Kanban-specific configuration1).objectql.zod.ts: all 29 open PRs were read (a short page, so the list is complete).Tests, at
ee1f2a7a(final commit), from the repo root under the verify lockpnpm --filter @object-ui/types type-check(all three tsconfigs) passed, run with&&.tsc -p tsconfig.test.json --listFilesincludes the new pin: 1 hit, out of 215src/__tests__files.pnpm exec vitest run --maxWorkers=2 packages/types/ packages/plugin-list/src/__tests__/ListView.strayGroupByRefused-8365.test.tsx packages/plugin-view/src/__tests__/ObjectView.calendarAliasRefused-8355.test.tsx packages/plugin-view/src/__tests__/ObjectView.strayGroupByLane-9242.test.tsx→Test Files 218 passed (218),Tests 4959 passed (4959).pnpm check:control-bytesOK ·pnpm check:new-line-citations:0 new citation(s)·node scripts/check-changeset-presence.mjs✅ ·pnpm check:changeset-claimspasses self-contradiction. It flags 20 pending changesets that nameobjectql.zod.ts. Each was read, and none describes the edited message or docblock sentence. ·pnpm check:pending-changeset-literals✅ ·pnpm type-check:coverage✅.@object-ui/typesbuild (tsc && vite build && check-dist-completeness): the new message is indist/zod/objectql.zod.jsanddist/zod/index.zod.js. The old clause appears 0 times, and the lit control (the lead sentence) is present in both files. The docblock is also emitted as a comment into the built JS, so the changeset names it too.eslint.config.jscovers both changed TS files (not ignored; 116 and 118 rules resolved). ②eslint --no-inline-config --format jsonread 2 files: 0 errors, 1 warning, a pre-existingno-explicit-anyin the untouchedoptionscheck. ③ Invariance: the config sets noparserOptions.projectorprojectService, so linting is not type-aware and this diff cannot move a verdict on an untouched file. The repo-widepnpm lintis left to CI.Pin and ablation
New file
packages/types/src/__tests__/kanban-stray-group-by-refusal-text-9653.test.ts, 5 tests across both channels:.passthrough().It pins content, not sentences.
codeandpathare pinned already by the objectui#8365 tests.Ablation, predicted first, through
ablation-replace.mjs(WRAP mode, anchor hit ×1, blob moved) with a bashtrapbelt:e9fce805): 5/5 green.00d6d77fequals HEAD,git diff HEADis empty, andgit statusis clean.Acceptance notes
listViewssearch the sentence names re-derives it.CALENDAR_DATE_ALIAS_STEM, objectui#8355's text) says the keys "rode a.passthrough()straight throughsafeValidateSchema". On theoptions.calendarchannel they were kept by thez.any()record, not by a passthrough. This is about mechanism only; the stem's validation claim is true. Not filed. Carrier: none..changeset/9242-stray-kanban-groupby-lane-second-route.md(pending, so it publishes verbatim into the CHANGELOG), and the kanban-branch comment ingenerateViewSchemainpackages/plugin-view/src/ObjectView.tsx(the paragraph beginning "The contract half is NOT here"). The reach probe rowobject-view listViews.v1.kanban.groupBy → ACCEPTEDfalsifies both, withlistViews.v1.calendar.dateField → REFUSEDas the lit control on the same door. Neither file was touched: they are outside this claim's file surface. Open PR objectui#10283 touchesObjectView.tsx.Generated by Claude Code