Repository navigation
deps(v18): resolve @objectstack/* 18.0.0-next.2 and follow its contract (objectui#12626) - #12648
Conversation
Regenerated with `pnpm -r up --no-save '@objectstack/*'` then `pnpm dedupe`, so @objectstack/spec keeps one peer context and zod 4 stays a single copy. Workspace ranges are unchanged. Claude-Session: https://claude.ai/code/session_01HcrgxQPr9VQSBrMMCtVswb Co-authored-by: Claude <noreply@anthropic.com>
…fault check on the page-kind node @objectstack/spec 18.0.0-next.2 adds `checkPageRegionPlacement` and `checkPageDefaultPlacement` to `PageSchema`. The region check reads `kind`, `template` and each region's `name`, which the page node carries with the meaning the renderer places a region by, so both page nodes attach it. The isDefault check judges the page's `type`; it is attached on the page-kind node, whose `type` is the page kind, and recorded as not attachable on the `page` node, whose `type` is the component discriminator. Claude-Session: https://claude.ai/code/session_01HcrgxQPr9VQSBrMMCtVswb Co-authored-by: Claude <noreply@anthropic.com>
…surface directly (objectui#12592 items 1-2) @objectstack/spec 18.0.0-next.2 derives a bounded modal (`size: 'auto'`) for a field-heavy create / edit / child task flow on desktop and keeps `full` for a phone. The objectui#12521 interim that gave the derivation that shape early is deleted, and `AppContent` calls `deriveRecordFlowSurface` directly. Its exit pin is rewritten into a pin of the installed derivation's bounded answer, and `recordSurface.test.ts` follows the spec. The spec keeps no full-screen split for a form with an embedded child or line-items table. `@object-ui/app-shell`'s `@objectstack/spec` floor moves to `^18.0.0-next.2`: on next.1 the derivation answers `full` and the dialog would open at 95vw. Claude-Session: https://claude.ai/code/session_01HcrgxQPr9VQSBrMMCtVswb Co-authored-by: Claude <noreply@anthropic.com>
….0-next.2 The page node now imports `checkPageRegionPlacement` and `checkPageDefaultPlacement`, which next.1 does not export. Claude-Session: https://claude.ai/code/session_01HcrgxQPr9VQSBrMMCtVswb Co-authored-by: Claude <noreply@anthropic.com>
…es follow next.2 `e2e/live/ci/backend.env` names `18.0.0-next.2` (the `@objectstack/cli` release tag peels to objectstack `e5136ff10f`), and the lockfile-integrity samples re-key onto the next.2 snapshot keys. Claude-Session: https://claude.ai/code/session_01HcrgxQPr9VQSBrMMCtVswb Co-authored-by: Claude <noreply@anthropic.com>
…re-measured `check:installed-pin-claims` named 31 sites in 22 files stamped `18.0.0-next.1`. Each sentence's fact was re-measured on next.2 with next.1 as the control (a parse probe over the spec and lint builds both versions install, the green type-check for the type-level readings, and the green test files for the facts they assert); every reading is the same on both, so only the stamp moves. Claude-Session: https://claude.ai/code/session_01HcrgxQPr9VQSBrMMCtVswb Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HcrgxQPr9VQSBrMMCtVswb Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HcrgxQPr9VQSBrMMCtVswb Co-authored-by: Claude <noreply@anthropic.com>
席位核对 — ACCEPT · objectui#12626 · head
|
Contract reviewServed-tier: Face: the ① Derived judgments
② Semver levelNine packages, all ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
❌ 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. Which half objected:
📦 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. Which half objected:
📦 Bundle Size Report
Size Limits
|
…s measured +19,296 gzipped bytes (objectui#12626) Three console builds, one instrument: main 8a8bcf3 (next.1) 1,536,365, the branch with zod held at 4.6.5 1,555,533, the branch 1,555,661. +19,168 bytes are @objectstack/* 18.0.0-next.2 and +128 the zod 4.6.5 -> 4.6.7 patch, in place. The ceiling and its baseline move by the same delta, keeping main's 44-byte headroom; the aggregate ceiling, BASELINE and the regression constant do not move. Claude-Session: https://claude.ai/code/session_01HcrgxQPr9VQSBrMMCtVswb Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Face: the ① Derived judgments
② Semver levelUnchanged: nine packages, ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Landing · head
|
✅ 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 #12626
Clause-②: yes
Part of #12592 (items 1 and 2)
Moves objectui's lockfile from
@objectstack/*18.0.0-next.1to18.0.0-next.2(npmnext, built from objectstacke5136ff10f; the@objectstack/cli@18.0.0-next.2tag peels to it) and follows the contract changes that reach objectui. objectui#12592 items 1 and 2 ride here, as the card directs; its item 3 (section density on the page hosts) stays on objectui#12592.What changed
@objectstack/*packages objectui resolves (client,core,formula,lint,sdui-parser,spec,types) were published at18.0.0-next.2and now resolve there; none is left atnext.1. Regenerated by pnpm only:pnpm -r up --no-save '@objectstack/*', thenpnpm dedupe. A plainupresolved@objectstack/core's zod at 4.6.7 next to the tree's 4.6.5 and gave@objectstack/spectwo peer contexts;pnpm dedupecollapses that to one spec and one zod 4 (4.6.7). The dedupe also moves eight unrelated transitive patch versions (brace-expansion,bson,dompurify,fast-uri,is-core-module,resolve,serovalwithseroval-plugins,use-sync-external-store).check:lockfile-integrityandcheck:lockfile-dedupeare green.^18.0.0-next.2; all other ranges stay at^18.0.0-next.1.@object-ui/types: forced. The page node now importscheckPageRegionPlacementandcheckPageDefaultPlacement, which next.1 does not export. With the floor put back at next.1,check:spec-floorsreportsfloor-too-lowfor both symbols.@object-ui/app-shell: objectui#12592. With the interim deleted, the dialog's bound comes from next.2's derivation. On next.1 that derivation answersfull.@object-ui/types: next.2's two newPageSchemachecks (objectstacka69a40a5, objectstack#23708).checkPageRegionPlacementis attached onPageNodeSchemaandPageKindNodeSchema. It readskind,templateand each region'sname. objectui's region carriesnamewith the same meaning:page.tsxplaces a region by its lowercasedname, as the check does.checkPageDefaultPlacementjudgesisDefaultby the page'stype. On thepagenodetypeis the component discriminator, so attached there it would refuse everyisDefault. It is attached on the page-kind node, whosetypeis the page kind, and the census records it as not attachable on thepagenode.941c78ae, objectstack#23747).interimBoundedTaskFlowSurfaceis deleted, andAppContentcallsderiveRecordFlowSurfacedirectly at its one call site.AppContent.recordDialogInterimBound-12521.test.tsxis rewritten, not deleted. It pins the installed derivation's bounded answer for all four task flows, with the phone'sfullas the control, and keeps its real-dialog cells.recordSurface.test.tsfollows the spec: heavy task flows getsize: 'auto'on desktop, and a new row pinsfullon mobile.e2e/live/ci/backend.envnow names18.0.0-next.2.check-lockfile-integritysamples are re-keyed onto the next.2 snapshot keys.imported-defaults-8317) names the two new checks.check:installed-pin-claimsnamed 31 stamped sites in 22 files. Each fact was re-measured on next.2, with next.1 as the control, before its stamp moved: a parse probe over both installed spec and lint builds, whose output diff was empty; the green type-check for the type-level readings; and the green test files for the facts they assert. Every reading is the same on both versions.Reds after the bump → upstream → what this PR did
Measured with the full suite in 16 shards on
56da05c(lockfile only, next.2): 6 red files, pluscheck:installed-pin-claims.spec-object-refinements-7715census (page site 5 → 7 checks; 2 unnamed exports)a69a40a5(objectstack#23708)imported-defaults-8317(surfaced after the attach)AppContent.recordDialogInterimBound-12521exit pin941c78ae(objectstack#23747)recordSurface.test.ts(2 rows)941c78aeci-cd-pipeline-doclive-e2e pinbackend.envmovedcheck-lockfile-integritysamplescheck-installed-spec-pin-claims(31 sites)Held cards
AdminScopeSchemarefusesmanageBindingsandauthorEnvironmentSets(invalid_typeat each key; next.1 accepts both; objectstackbe48c5ec). The anchor pinPermissionAdvancedFacets.adminScopeAnchor.test.tsxstays green and the type-check stays greenCOMPILED_PAGE_KINDSis['html'](objectstackc5dd7fce); the app-shell server double inResourceEditPage.pageRequiresStamp-11357.test.tsxstill acceptsjsxand stays greenClause-② accept-set moves (
@object-ui/types, both faces)These documents were accepted on next.1 and are refused on next.2, with the spec's own message at the same path:
kind: 'full'page, a region whosenamethetemplatedoes not place (default template:header,sidebar,main,aside,footer), or a second region for a slot another region already fills. Refused atregions.N.name, on thepagenode and the page-kind node.isDefault: trueon a page-kind node that is not arecordpage bound to anobject. Refused atisDefault.dashboardtemplate; a non-fullkind; a boundrecordpage withisDefault;isDefaulton atype: 'page'node.HotCRM's own metadata trips both checks on next.2 (
home.page.ts:isDefaulton ahomepage, regionsleft_sidebar/right_sidebar), and three pages also trip the retiredtemplate: 'full-width'. This is a real producer writing what the spec now refuses, read throughobjectstack dev's compile.Browser reading (HotCRM Leads → New)
The backend was HotCRM on
@objectstack/*18.0.0-next.2: a scratch copy with its pins moved to next.2;/api/v1/healthanswered18.0.0-next.2. To get it to boot, the spec's own remedies were applied to that scratch copy only:full-width→default,isDefaultremoved from the home page, and its regions renamedsidebar/aside. The console ran from this branch.sm:max-w-5xl), the same as PR fix(plugin-form): a record dialog with no authored layout opens bounded with a two-column grid (objectui#12521) #12546's landing reading, and now produced by the spec. https://github.com/objectstack-ai/objectui/blob/303360ece0d0d5edb7d1ed87b9cd95ba2c69df4e/docs/design/findings/12626/leads-new-1440.png?raw=trueThe screenshots are on
claude/issue-12626-evidenceonly. This branch adds no PNG.Test evidence (head
371c3a2)56da05c. The changed packages were rebuilt (29/29) after the code commits.56da05c. On the final code,types,app-shell,plugin-viewandcomponentswith their dependencies: 33/33.56da05c, 16 shards): 5,223 files. Every red is in the table above.9ab905b), targeted runs, all exit 0:packages/types/383/383packages/components/388 + 1 skippedpackages/cli/+packages/plugin-view/107/107apps/console/+examples/253/253packages/app-shell/1,432 + 1 skippedscripts/185 + 2 skipped; the one red file there is in Acceptance notes371c3a2, after mergingmain: the 42 test filesmainbrought, 42/42; this PR's pins and ratchets, 10 files, 728/728.recordSurface2, the 12521 pin 8, and7715and8317red. On next.2 they are green.git diff HEADempty):AppContent=== 'full'→!== 'full': 4 red.PageNodeSchema: 3 red.isDefaultcheck removed from the kind node: 1 red.isDefaultcheck added toPageNodeSchema: 1 red (the control).check:installed-pin-claims,check:lockfile-integrity,check:lockfile-dedupe,check:spec-floors,check:spec-symbols,check:phantom-deps,check:self-import,check:control-bytes,check:new-line-citations,check:doc-json,check:doc-examples,check:doc-snippets,check:skill-examples,check:i18n-keys,check:i18n-drift,check:changeset-claims,check:pending-changeset-literals,node scripts/check-changeset-presence.mjs,check-changeset-no-major,check-changeset-fixed.--no-inline-configover the 29 touched code files reports 0 errors.Changeset
.changeset/12626-spec-next-2.mdfollows the repo's pre mode (tag: next). It bumps every changed released package asminor(nevermajor), says that the console and runner bundle next.2, and lists the dialog change and the two accept-set narrowings.Acceptance notes
scripts/__tests__/date-only-zone-pins-10183.test.tswent red 2 times out of 7 on this branch, both under heavy load: one case inFormulaFunctions.dateOnlyZone-10866read11:00for an expected03:00, which is another zone's clock. It was green the other 5 times, green 3 of 3 on BASE, and green when the pin file runs alone in a forked child.FormulaFunctionsimports nothing from@objectstack, so this is not a next.2 contract change and is left here as a load-order observation.Generated by Claude Code