Repository navigation
fix(plugin-calendar, plugin-map, plugin-gantt): registration inputs agree with the record-source rule - #10508
Conversation
The shared `object-calendar` / `calendar` input list declared `objectName`
with `required: true`, while `ObjectCalendarSchema` carries
`requireRecordSource('object-calendar')`: the record source is one of `data`,
`staticData` and `objectName`. `validateTree` therefore raised a
`missing-required-prop` error on a `staticData`-only calendar the schema
accepts. Drop the flag and state the rule in the description, the same form
the map and gantt registrations took.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
… sources
`ObjectMapSchema` and `ObjectGanttSchema` declare `data` and `staticData`,
two of the three record sources `requireRecordSource` accepts, but the
`object-map`, `map` and `object-gantt` registrations listed neither, so
`validateTree` reported a block authored on either as `unknown-prop`.
Declare both on the schema's own arms: `data` is a `{ provider, ... }`
data-source configuration (`type: 'object'`, so a bare array there draws
`type-mismatch`, matching the schema and the ladder's `view-data` arm), and
`staticData` is an array of records. Each description names only what the
renderer was measured to do, including that the map does not implement the
`api` provider. The two map keys now share one input list. The gantt README
sentence listing the inputs and an `ObjectMap` comment that said the
registration declares no `data` input are corrected.
The changeset covers both commits of this PR.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
The control row reused the staticData-only node, so on the unfixed tree it also carried the missing-required-prop error and flipped with the fix. Bound by `objectName`, it holds on both trees and only proves that the manifest resolves the tag and still reports a bogus key. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
…jectName The control rows reused the staticData-only node, so on the unfixed tree they also carried the staticData unknown-prop warning and flipped with the fix. Bound by `objectName`, they hold on both trees and only prove that the manifest resolves the tag and still reports a bogus key. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
The shared `OBJECT_MAP_INPUTS` constant was spread into both registrations, and `check:component-surface-parity` cannot name the entries of a spread, so both map registrations dropped out of that reader's population (its "cannot name" count went from 22 to 24). Spell the list inline in each registration, as before this PR, and keep the pin that asserts the two lists are identical. The changeset no longer mentions a shared list. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
…he html-tier pins The new record-source pins run `validateTree` from `@object-ui/sdui-parser`, which neither package declared, so `check:phantom-deps` reported both test imports as undeclared tooling. Declare it as a devDependency, the same way plugin-calendar and plugin-kanban already do for the same kind of pin. The lockfile change is the two importer entries only. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
`tsc -p tsconfig.test.json` refused the untyped `call` parameter in the two new record-source pins (TS7006). Annotate it as `unknown[]`; nothing the tests assert changes. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
|
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
|
Contract reviewServed-tier: Method: ① Derived judgments#10392 (calendar). The one edit is in the shared #10394, declarations. #10394, descriptions vs the real ladder. Surface beyond the claims. Fold mechanics. Per-commit file lists: Report-only Nit (not blocking). ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #10392
Fixes #10394
Clause-②: no — registration metadata stops contradicting a schema rule that has already landed, and the registrations declare two inputs the schema already accepts. No schema, export or accept set moves.
Folded family. Each commit belongs to one card, and the commit subject names its package: objectui#10392 (chain head, calendar) and objectui#10394 (map and gantt). Dispatched by the
domain:uiseat 2 PM; this run's session ishttps://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN.What changed
objectui#10392, calendar.
OBJECT_CALENDAR_INPUTS(spread into bothobject-calendarandcalendar) declared{ name: 'objectName', type: 'string', required: true }, whileObjectCalendarSchemacarriesrequireRecordSource('object-calendar'). The flag is gone and the description states the rule, in the exact form PR objectui#10390 used for map and gantt: "ObjectQL object name. The record source is one ofdata,staticDataandobjectName; theobject-calendarschema refuses a block that declares none of them." One edit covers both tags because the list is shared.objectui#10394, map and gantt.
object-map,mapandobject-ganttnow declaredataandstaticData, on the schema's own arms:dataistype: 'object'.ObjectMapSchema.data/ObjectGanttSchema.dataareViewDataSchema, a{ provider, … }object, and both renderers call the ladder on theview-dataarm. So a bare array underdatanow drawstype-mismatchin the html tier, which matches what the schema and the renderer already do with it.staticDataistype: 'array'.Each description says only what the renderer was measured to do (see the behaviour rows below). One map-specific limitation is published: the
apiprovider is not implemented inObjectMapand plots nothing.mapis declared exactly likeobject-map, and both keys spell the list inline. objectui#10393 is serial after this PR and may retire the baremapkey. That is not decided here.Measured before writing the prose (hypotheses)
OBJECT_CALENDAR_INPUTS, so both calendar tags had it. There is no second copy.data/staticDatawere already declared there.data, thenstaticData, thenobjectNamethroughresolveRecordSourceConfig(schema, 'view-data'). This was probed through the realSchemaRendereron all three keys, and the probe results are now committed as behaviour rows. Differences from the calendar:datais a provider configuration, not a record array.{ provider: 'api' }plots nothing and logsAPI provider not yet implemented for ObjectMap. WithstaticDatabeside it,staticDatais still not reached.apireads through its request.maphas not been retired or re-armed.Tests
New pins:
packages/plugin-calendar/src/__tests__/recordSourceInput-10392.test.tspackages/plugin-map/src/index.recordSourceInputs-10394.test.tsxpackages/plugin-gantt/src/__tests__/recordSourceInputs-10394.test.tsxWhat the pins check:
staticData-only node and adata-only node with zero diagnostics. That means nomissing-required-propon the calendar and nounknown-propon map/gantt.objectName, so the row holds on both trees.ObjectCalendarSchemarefuses a block with no record source (RECORD_SOURCE_REQUIRED) and accepts thestaticData-only block.SchemaRenderer):datawins overstaticDataandobjectName.staticDatawins overobjectNameand issues no query.objectprovider queries its own object.datais not a record source.apiprovider plots nothing. Gantt: theapiprovider fetches its URL.All runs below are on the final head
9a2afd981, the last commit of this PR:Red on the base. The three
index.tsxfiles were checked out at the pinned base557abc2f4, with the tests left at HEAD. Markers were counted on disk after the mutation:required: true= 1;name: 'staticData'= 0;name: 'staticData'= 0.Result:
Tests 23 failed | 26 passed (49). This matches the direction predicted before running:Failure reasons:
expected [ 'missing-required-prop' ] to not include 'missing-required-prop'on the calendar, andhas no prop "staticData"on the map and gantt.Restore. The files were restored with
git checkout HEAD -- pathunder a trap. Proof: each blob hash matchesHEAD, andgit diff HEADis empty.Green on the head.
Tests 49 passed (49).Affected suites and registry readers.
Test Files 156 passed (156),Tests 1977 passed (1977). The run covered:packages/plugin-calendar/,packages/plugin-map/andpackages/plugin-gantt/;apps/consoletests that enumerate the whole registry;calendar-flat-color-allday-8466,calendar-doc-key-set-8830andcomponent-input-retired-keys-7493inpackages/types;examples/schema-catalogrecord-source render tests.Type-check.
pnpm --filter @object-ui/PKG type-check(tsc --noEmit && tsc -p tsconfig.test.json) exits 0 forplugin-calendar,plugin-mapandplugin-gantt, after building their 15-package dependency closure.--listFilesconfirms that each new pin is in its package's test program. The first type-check run caught TS7006 on an untyped mock-call parameter in the two map/gantt pins, and that was corrected in the last commit.Gates (local, targeted)
Exit 0:
7 source file(s) of 3 released package(s) changed … declares 1 changeset(s))check-changeset-fixed/no-major/overwritecheck:changeset-claims— it named6470-gantt-dependency-field-deprecated.mdand6939-objectql-record-source-refinement.md. I read both paragraphs and both are still true.check:pending-changeset-literalscheck:new-line-citations(VERDICT new-cross-file-line-citations: 0 new citation(s))check:control-bytescheck:phantom-depscheck:unused-depscheck:lockfile-integrity(VERDICT clean)check:lockfile-dedupe(VERDICT deduped)check:pre-install-import-graphcheck:self-importcheck:element-data-source-declarationcheck:registry-bare-namescheck:test-path-rootscheck:vi-mock-specifiers/inherit/override-shapecheck:unreferenced-sourcescheck:designer-field-key-paritycheck:doc-typescheck:prompt-keyscheck-doc-linkscheck-doc-fence-languagescheck-governed-queue-guard --test(NOT GOVERNED)check:component-surface-parity(report-only; see Acceptance notes)ESLint (
--no-inline-config --format json) over the 7 touched.ts/.tsxfiles gave 7 results, 0 errors, and warnings only, of kinds the files already carry (no-explicit-any,only-export-components). The config has no type-aware linting (noparserOptions.project), so this diff cannot change a verdict on an untouched file.NOT MEASURED:
check:readme-exports. Reason: it needs every package'sdist/index.d.ts, and only the dependency closure was built, so it exits 1 withself-import(s) could not be judged. That is a prerequisite miss, not a verdict. The README edit changes no import or export line. Repo-widepnpm lintand the rest of the CI farm are left to CI.Surface beyond the claim, and why
packages/plugin-gantt/README.md: its sentence "It declares two inputs" became false with this change. It now names four inputs and says thatdatais a provider configuration.packages/plugin-map/src/ObjectMap.tsx: this is a comment-only change. ThegetDataConfigdocblock said the registration "declares nodatainput", which became false. It now says the registration declaresdataon the same object arm.packages/plugin-map/package.json,packages/plugin-gantt/package.json,pnpm-lock.yaml: the new pins importvalidateTreefrom@object-ui/sdui-parser, which neither package declared, socheck:phantom-depswas red. It is now a devDependency, as inplugin-calendarandplugin-kanban. The lockfile change is the two importer entries only.Acceptance notes
check:component-surface-parity(report-only) gains three rows:plugin-map:object-map.staticData,view:map.staticDataandplugin-gantt:object-gantt.staticData, each "outside (spec ∪ renderer reads)". The cause is that the static reader does not follow the shared ladder in@object-ui/core(resolveRecordSourceConfig), which is wherestaticDatais read. The behaviour rows above show the read. The earlierobject-map.map/view:map.maprows are unchanged.validateTreeno longer reports a calendar that has no record source at all. Before, it did so only through theobjectNamerequiredness. The zod refinement is the only enforcement now. This is the same accepted trade the objectui#7470 ruling made for map and gantt: no one-of vocabulary ininputs.objectNamedescription says "theobject-calendarschema refuses". That is true ofObjectCalendarSchemain@object-ui/types, which the pin measures. The spec faceComponentPropsMap['object-calendar'](on@objectstack/spec17.4.0) parses an empty object, so the refusal lives in this repo's mirror and not in the spec row.Findings for the seat (not filed here)
ObjectMapSchema.dataisViewDataSchema, which accepts theapiarm ({ provider: 'api', read, write }).ObjectMapdoes not implement it: the map logsAPI provider not yet implemented for ObjectMap, plots nothing, and still shadowsstaticData. This is pinned as a gap inindex.recordSourceInputs-10394.test.tsx.Seam: spec:ObjectMapSchema.data (ViewData api arm) → renderer:ObjectMap fetch effect.schemaarm ({ provider: 'schema', … }) on either renderer is NOT MEASURED.packages/plugin-map/README.mdsays that "staticData, a bare array underdata, anddata: { provider: 'value', items }all reach the same in-memory adapter". A bare array underdatareaches nothing. ThroughSchemaRendererit is neither a record source nor spread as a prop. On the host-prop path it is drawn without the adapter's filter. The failing probes are the "a bare array under data is not a record source" row here and the retirement rows inObjectMap.schemaDataShorthand.test.tsx.plugin-mapand edits its registration section.Generated by Claude Code