Repository navigation
refactor(core,react): home the non-grid row ceiling in core; the note takes the result (objectui#7508) - #10426
Conversation
…es the result (objectui#7508) Ruling A′: NON_GRID_ROW_CEILING, applyNonGridRowCeiling and NonGridCeilingResult move to @object-ui/core beside extractRecords, and @object-ui/react re-exports them. NON_GRID_ROW_CEILING_TOP is deleted; the probe row's +1 lives only in core's new nonGridRowCeilingQuery(). The four non-grid renderers spread that query into their find() and hand NonGridRowCeilingNote the result, which is now its only prop. Co-Authored-By: Claude Opus 5.5 <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: Inputs read: card 7508 body + 4 comments (ruling 5529427804, retriage 5737038551, Claim 5824018182, os-dev-report 5824558104 — the last two treated as the seat's own words), PR 10426 body + 25-file list, ① Derived judgmentsCore home — RIGHT. New React re-export — RIGHT, identity holds.
Behaviour on the four renderers — RIGHT. State becomes Extra files — all necessary, nothing unrelated. Diff file count 25 = PR file list 25. Beyond the dispatch's named surface: ② Semver level
Changeset prose is true. Moved names/value unchanged (byte-compare), same bindings (re-export + pin), Never published — confirmed independently. Relation to pending 7210 — stale, and the stated reason for leaving it is weaker than claimed. 7210's body (lines 20, 47) says the four fetches "ask for ③ Boundary flags
Implemented-by: VERDICT: PASS |
Fixes #7508
Clause-②: yes — two packages' public API moves (maintainer ruling A′, comment 5529427804)
Follow-up to objectui#7210 (already completed), executing ruling A′ as recorded on objectui#7508.
Public surface, per package
@object-ui/core— addedNON_GRID_ROW_CEILING@object-ui/react, value unchangedapplyNonGridRowCeiling@object-ui/react, behaviour unchangedNonGridCeilingResult@object-ui/react, shape unchangednonGridRowCeilingQuery{ $top }+ 1is written@object-ui/reactNON_GRID_ROW_CEILING,applyNonGridRowCeiling, typeNonGridCeilingResultexport … from '@object-ui/core'— the same bindings (pinned by identity)NON_GRID_ROW_CEILING_TOPNonGridRowCeilingNoteresult: NonGridCeilingResult.drawn,total,truncatedandclassNameare gone, no deprecated pathnonGridRowCeilingQuery+ 1in one exported helper, and core is its homeRelease status, measured: the npm registry's latest
@object-ui/reacttarball (17.6.0) contains none of the five names (positive control:extractWriteErrorMessagehits 5 files in the same tarball), and.changeset/7210-non-grid-row-ceiling.mdis still pending. So the deletion and the prop reshape reach no released consumer.What changed
packages/core/src/utils/non-grid-row-ceiling.ts(new, besideextract-records.ts) and one core barrel line. The ruling-a′ docblock (the 2,000 measurement table) moved with the constant.packages/react/src/utils/nonGridRowCeiling.tsxkeeps only the note. It printsresult.rows.lengthandresult.totaland decides onresult.truncated. It now carriesshrink-0itself: the only styling any caller passed was the gantt'sshrink-0class string, and that is a no-op outside a flex container.packages/react/src/index.ts: the three names re-exported from core; the stale "OPEN maintainer decision" comment replaced.ObjectCalendar,ObjectGantt,ObjectMap,ObjectTree: the helpers come from the@object-ui/coreimport block each file already had. Every$topsite spreadsnonGridRowCeilingQuery()(calendar 2, gantt 1, map 2, tree 2). TherowCeilingstate holds theNonGridCeilingResultitself, ornullon the host-data paths that used to reset it totruncated: false. The note is mounted withresult={rowCeiling}only while a result is held. What they fetch, draw and print is unchanged.contractEnvelope-6839moved topackages/core/src/utils/__tests__/, the react test now pins only the note and the re-export, and 11 plugin test files moved off the deleted constant ontononGridRowCeilingQuery().$top.packages/react/README.md"NON_GRID_ROW_CEILING" section rewritten to the new shape (heading kept)..changeset/7508-non-grid-ceiling-to-core.md:minoroncoreandreact, with every moved, new, removed and reshaped name.The ruling's two pins
+ 1. Every renderer test that reads the wire (rowCeiling-7210,inlineQueryKeys-*,elementDataSource,hostDataProp-7210) asserts$top === nonGridRowCeilingQuery().$top, and each row-ceiling pin asserts the note namesNON_GRID_ROW_CEILING. Core pins the query as exactly{ $top: NON_GRID_ROW_CEILING + 1 }, holding only$top, and a fresh object on every call.@ts-expect-errorlines, one each fordrawn,total,truncatedand a missingresult, are compiled by react'stsc -p tsconfig.test.json(--listFilesconfirms the file is in that program). A runtime case forces the loose props past the compiler and shows they are ignored. A third case uses a truncated result of 7 rows and shows the note prints 7, not the constant.Verification — all runs at
ae0a5b7@object-ui/react...,@object-ui/core..., the four plugins'^...closures, then thecheck-doc-snippet-types --build-filterclosure (turboTasks: 35 successful, 35 total), then console — all exit 0.--maxWorkers=2):packages/core/168 files / 3509 passed;packages/react/94 / 1291;plugin-calendar+plugin-map+plugin-tree85 / 556;plugin-gantt72 / 558. The 35 test files outside those six packages that name a changed file (types, i18n, components, plugin-list, plugin-grid, plugin-view, apps/console, examples/schema-catalog, scripts/tests) also pass: 35 / 1852.type-check(thetsc --noEmit && tsc -p tsconfig.test.jsonpair) for core, react, calendar, gantt, map and tree: all sixDone.lintfor the same six: 0 errors. The only warnings on the new core module are the 4no-explicit-any, moved verbatim from the react module.check-changeset-presence: "23 source file(s) of 6 released package(s) changed, and this change declares 1 changeset(s)".check-changeset-no-major: "No changeset declares amajorbump".check-changeset-fixed✅.check-changeset-overwrite: "No pre-existing changeset was modified or deleted".check:changeset-claims: report-only, exit 0. It lists 11 pending bodies that name a touched file; I re-read each and none describes the ceiling.check:readme-exports✅: "544 real, 0 wrong-path, 0 fabricated"; the react README's two self-imports are judgedreal.check-doc-snippet-types: "673 of 673 block(s) judged, 0 failed".check-doc-example-types✅.check:doc-types✅.check-doc-links: "Links are valid across 17 scan roots".check:self-import,check:phantom-deps,check:unused-deps,check:unreferenced-sources,check:esm-specifiers✅.check:node-esm-load: 34 of 39 entries imported and evaluated; the 5 exclusions are by design.check:new-line-citations: "0 new citation(s)".check:control-bytes✅.check:sdui-registration-pins: "All 16 registration(s) … present".check:eager-closure✅ (headroom 61.2 KB).check:side-effects-array✅.check:test-path-roots,check:vi-mock-specifiers,check:vi-mock-inherit,check:vi-mock-override-shape✅.check-type-check-coverage43/43.check-lint-coverage46/46.check:i18n-keys✅.check:i18n-dead-keysexit 0 (report-only).check:pending-changeset-literalsexit 0.check:entry-guard✅.check-governed-queue-guard --testover the 25 changed paths: NOT GOVERNED.Reverse verification / ablation
These ran on the committed tree through
ablation-replace.mjs. Each run confirmed the anchor count went down and the target text count went up before any test ran. Each restore is proven: blob == HEAD andgit diff HEADempty.nonGridRowCeilingQuerydrops the+ 1. Predicted: the core pins go red and the renderer pins stay green. Observed: 8 failed / 11 passed. The 4 core pins and the envelope pin went red. So did 2 gantt row-ceiling cases and the tree row-ceiling case: those fakes honour$top, so exactly 2,000 rows came back and nothing was truncated. That is more red than predicted, and it means the renderer pins also depend on the one+ 1.result.rows.length: 2 failed / 5 passed (the two result-count cases), as predicted.drawn: reacttsc -p tsconfig.test.jsonexit 2 withTS2578: Unused '@ts-expect-error' directiveon thedrawnline, as predicted.ObjectTree's object arm writes$top: 2000instead of the spread: tree row-ceiling pin 1 failed / 1 passed, as predicted.check-doc-snippet-typesreports "673 of 673 block(s) judged, 1 failed" with TS2322 onpackages/react/README.md(drawndoes not exist on the note's props).Acceptance notes
packages/core/src/utils/extract-records.tsnow points at the moved call site. The move made the old path false.contractEnvelope-6839moved into core's__tests__together with the module they test.ObjectCalendar.inlineQueryKeys-9061,ObjectGantt.elementDataSource,ObjectGantt.hostDataProp-7210,ObjectGantt.inlineQueryKeys-8769,ObjectMap.elementDataSource,ObjectMap.inlineQueryKeys-9061,ObjectTree.inlineQueryKeys-9136..changeset/7210-non-grid-row-ceiling.mdstill namesNON_GRID_ROW_CEILING_TOP. It lists it as a new react export and says the fetches ask for it. I did not edit it: it is outside the claim, andcheck-changeset-overwritewatches that file. This PR's changeset says outright that it supersedes that export list. Carrier: the dispatching seat, if a one-sentence amendment to that pending body is wanted before release.classNamewas removed fromNonGridRowCeilingNote. I read the ruling's "nothing else" literally. Flagged for the contract review.content/docs/guide/data-source.mdstill describesNON_GRID_ROW_CEILINGas a@object-ui/reactexport. That is still true through the re-export, so I left it.packages/plugin-markdown/src/toc.tsuses### NON_GRID_ROW_CEILINGonly as a slugging example, and its parity test works on a literal string. The react README heading it mirrors is kept, so nothing moves.packages/core/src/data-scope/.ae0a5b7carries a model-namedCo-Authored-Bytrailer. I did not rewrite it, because this repo bans force-push.Generated by Claude Code