Repository navigation
console: the metadata-admin-only spec validation leaves the first screen (lazy-loaded), the console-side payback of the objectui#11088 D1 ceiling raise #11101
Description
Activity
- addedenhancementNew feature or requestNew feature or requestdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repoobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repoarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iterate
on Sep 29, 2026 objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsBlocked-by: #11073
pm:queue→pm:blockedon the serial dependency this card names itself.domain:devx@ objectui seat 2 (objectui#10917),session_01TdiauJaVCHuj45EzZGUxHh, 2026-09-29T13:56Z. ⛔ Not a claim.- The loan isn't taken yet. This card's step 3 lowers 「the ceiling back … by the amount recovered」. The raise it pays back lands in PR objectui#11086 (objectui#11073), which this seat is executing now under the objectui#11088 ruling. On
mainthe ceiling is still the pre-bump one. - Same file. PR chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086's current round edits
scripts/check-eager-closure-budget.mjs, the ceiling and headroom this card lowers. Two in-flight edits to one gate's constants would collide. - Step 1 needs 17.5.0 installed. It measures the eager closure the 17.5.0 bump produces; on
mainthe lockfile still resolves@objectstack/*17.4.0.
Unlocks when objectui#11073 closes with PR #11086 merged. The unlock scan puts it back in
pm:queue, and this lane dispatches it next in order.
Generated by Claude Code
- The loan isn't taken yet. This card's step 3 lowers 「the ceiling back … by the amount recovered」. The raise it pays back lands in PR objectui#11086 (objectui#11073), which this seat is executing now under the objectui#11088 ruling. On
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsUnblocked:
Blocked-by: #11073is closed (PR #11086 MERGED at 2026-09-30T04:00Z, merge commit81f8498, landing record5903783348).pm:blocked→pm:queue. Unlock scan bydomain:devxseat 2 (objectui#10917),session_01TdiauJaVCHuj45EzZGUxHh, 2026-09-30T04:02Z.- Re-derived: no new blocker.
mainnow carries@objectstack/*17.5.0 and the eager-closure re-baseline this card pays back:MAX_EAGER_CLOSURE_GZIP_BYTES3,694,000 over BASELINE 3,648,737;vendor-objectstack1,723,000 over 1,703,690 (objectui#11088 decision 1 = A). - Rides this card: the
BASELINE.squashMergeback-fill inscripts/check-eager-closure-budget.mjs, which chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086 left owed (the field's own instruction; contract review5903181734, section ③). This card lowers the same ceiling, so the back-fill belongs in the same change. - Unclaimed: this seat is closing its shift, so the next
domain:devxseat picks it up.
- Re-derived: no new blocker.
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsClaim: PM loop,
domain:devxlane queue (R5 ofdomain:devxseat 2, marker5912527248). The maintainer's concurrency order 「并发保持3」 fills two dev slots from this lane's queue beside objectui#11070 round 6.
Session:session_01TdiauJaVCHuj45EzZGUxHh
Account:huangyiirene
Branch:claude/issue-11101-lazy-spec-validation
Worktree:objectui-issue-11101
Domain:domain:devx
Seat:domain:devx#2(objectui#10917)
File surface: the console-side payback of objectui#11088 decision 1 A.- Measure first: which
@objectstack/specentries the console's eager closure imports, from which routes, and the gzip weight of the metadata-admin-only ones. The instruments arescripts/check-eager-closure-budget.mjsand the Bundle Analysis comment5888891615. - Lazy-load them by route: a dynamic import at the metadata-admin / designer boundary. The likely files are
apps/console/src/**route wiring and thepackages/app-shell/src/views/metadata-admin/**entry points that pull spec validation (clientValidation.tsand its importers). The measurement names the exact set. scripts/check-eager-closure-budget.mjs: the ceiling and headroom assertion are lowered by the amount recovered. The owedBASELINE.squashMergeback-fill (contract review5903181734③) rides this change.- Tests, and a changeset if a released package changes.
- Excluded ⛔:
- every runtime-shell first-paint import;
- spec validation behaviour itself, since the designers must validate exactly as before once opened;
packages/app-shell/src/utils/resolveActionParams.tsand the other objectui#11070 round-6 files;- the upstream root-entry card in objectstack.
- Stop on breach, or if the measured recoverable weight is below the noise of the instrument; explain in the report.
Container & model:M,mode:subagent, model: opus (TIER_DEFAULT; the--tierrun over the surface printed "no path-derived mandate").
Clause-②: no. Load timing only; no contract, export or accept set moves, and validation is unchanged once loaded.
Thread-read: 5903794882
Serial constraints cleared: 2026-10-01T04:44Z, against objectuiorigin/main5262f7d, over the 9 open PRs (fix(plugin-detail): record:quick_actions.requiredPermissions publishes the contract's shared describe (objectui#10224) #11329, fix(types,layout,app-shell): a nav entry's inline locale-map label passes the door and renders in the viewer's locale; three inert nav resolver props retire (objectui#11299) #11325, fix(react,app-shell,plugin-kanban,plugin-calendar): a standalone object-kanban / object-calendar honours the spec'spagenavigation, and a mode-less block, through the host's record navigator (objectui#11293) #11323, docs: taught action:* nodes move their executor keys into the specpropertiesbag (objectui#11183) #11317, docs(skills): the project-setup guide stops mounting app-shell's ObjectView with an objectName prop it never had (objectui#11011) #11316, feat(cli):objectui validateandobjectui checkjudge through the strict authoring face (objectui#5250, slice A) #11069 parked, dependabot, release). None touchesscripts/check-eager-closure-budget.mjsor the console route wiring. objectui#11070 round 6 (claim5924126483) holdsresolveActionParams.ts,deriveMasterDetail.ts,ObjectChart.tsx,sanitize.ts,field-types.tsand the dashboard fixtures/docs, all excluded here. objectui#11174 is file-disjoint.
- Measure first: which
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11101,
"status": "done",
"branch": "claude/issue-11101-lazy-spec-validation",
"pr": "#11342",
"session": "session_01TdiauJaVCHuj45EzZGUxHh — the dispatching domain:devx seat 2 session (subagent run, parent id; the relay derived the same id from the container)",
"premise_still_valid": true,
"summary": "Measured first on main 5262f7d: every @objectstack/* module sits in the vendor-objectstack chunk, and that chunk is a static import of the entry. clientValidation.ts already reaches every spec entry through await import(), so the PM hypothesis held only in part. Two of its entries, /ai and /integration, had no eager importer at all; the vendor-objectstack chunk group put them on every page load, because an advancedChunks group claims by module id, not by reachability (the objectui#5266 mechanism). Every other entry the validator loads is also imported statically by first-screen code (runtime, data adapter, formula, or the metadata-admin registration leaf), so no lazy import at the validator can move it. Payback: tags: ['$initial'] on the vendor-objectstack group in apps/console/vite.config.ts restricts it to the entry's static closure. /ai, /integration, /contracts and @objectstack/sdui-parser now follow their importers into lazy chunks, and nothing the first screen executes moves. The eager closure went 3,671,724 to 3,638,104 gzip (-33,620; vendor-objectstack -33,735) on two builds of one tree. MAX_EAGER_CLOSURE_GZIP_BYTES came down 3,694,000 to 3,660,380 and the vendor-objectstack ceiling 1,723,000 to 1,689,265, each by exactly the recovered amount, not re-derived. BASELINE and PER_CHUNK_BASELINE were re-pinned onto the 4acbea0 reading, which keeps the live headroom main had to the byte (0.24x / 0.20x). Deviations, named: (1) no new dynamic import was added; the validator's import() calls were already at the designer boundary, and the change makes the bundle honour them. (2) The owed squash handle for 048e7f6 is 81f8498 (#11086, single parent, an ancestor of origin/main). It is back-filled in the header prose that still cites that reading, not in BASELINE.squashMerge: this change re-pins BASELINE onto its own reading, so the field is null again by its own rule and a back-fill for 4acbea0 is owed after merge (see open_questions). (3) The near-ceiling framework fixture pair in the unit test now holds the aggregate at BASELINE by construction, because the lowered aggregate headroom (22,276) became narrower than framework's (27,755). Final pushed head 7d24740. Draft PR #11342 assigned to huangyiirene. Worktree and node_modules removed.",
"tests": "Head 7d24740. Measurement: CI=true pnpm exec vite build (apps/console) under os-verify-lock, before leg (5262f7d vite.config blob on disk) 3,671,724 gzip 330/2447 chunks and after leg (HEAD) 3,638,104 330/2450; node scripts/check-eager-closure-budget.mjs exit 0 both, and exit 0 at the new constants ("3552.8 KB ... budget: 3574.6 KB, headroom: 21.8 KB"). Ablation via objectstack scripts/ablation-replace.mjs (anchor "priority: 95, tags: ['$initial'] }," 1→0, blob 40f6d42c→32c403ab), rebuild: 3,671,724, checker exit 1 ("11.1 KB over the 3574.6 KB budget"; vendor-objectstack "1664.7 KB / 1649.7 KB ceiling (OVER by 15.1 KB)"). Restore: blob == HEAD 40f6d42c, git diff HEAD empty, rebuild 3,638,104, exit 0. Browser probe on the BUILT console (vite preview, VITE_BASE_PATH=/, proxied to a --fresh objectstack 17.5.0 showcase from e2e/live/ci/start-backend.sh, Playwright /opt/pw-browsers/chromium), run with and without the tag. First screen: 331 JS requests, no ai-/integration- chunk. metadata/agent/new fetches ai-rfegJgG7.js; typing "Bad Name!" shows "This metadata does not match the spec — 4 validation error(s). Name: Invalid string: must match pattern ...". metadata/connector/new fetches integration-DM--okeM.js and shows the 3-error banner. Validator text byte-identical untagged vs tagged for both. Only non-2xx: GET /api/v1/usage/storage 404 on both builds; no pageerror. vitest (root, --maxWorkers=2, under lock): scripts/tests 18 files reading the console vite.config or the budget script, 1020 passed (budget test 179, including the new $initial pin and the repaired framework pair). app-shell metadata-admin/** all 373 files: 36 + 1 console file = 398 passed, then 119 files 1066 passed, 104 files 1455 passed / 1 skipped, 114 files 1462 passed. apps/console project: 139 files, 1593 passed. Type-check after turbo run build --filter='@object-ui/console^...' (33/34 cached): pnpm --filter @object-ui/console run type-check exit 0; pnpm --filter @object-ui/app-shell run type-check exit 0. Reverse check: tags ['$bogus'] gives tsc -b tsconfig.node.json exit 1 (TS2769 at the group), then restored. Gates: pnpm check:control-bytes OK (9806 files); node scripts/check-changeset-presence.mjs exit 0; pnpm changeset:check exit 0; pnpm check:changeset-claims exit 0 (report-only: 6681-declared-lazy-marketplace-routes and 7173-ai-pending-actions-inbox-i18n name touched files; both read, neither falsified by this diff); pnpm check:new-line-citations 0 new. Narrowed lint: eslint --no-inline-config --format json on the 3 changed code files gives 3 results, 0 errors, 0 warnings. Population: all inside eslint.config.js, none reported ignored. Invariance: the config enables no type-aware linting, so untouched files cannot move. NOT MEASURED: (a) the app-shell suite outside metadata-admin/** (~594 files), reason: exceeds the foreground window on a 3-dev box, packages/app-shell/src untouched, CI runs it; (b) repo-wide pnpm lint, reason: CI-owned; (c) CI on #11342, reason: in_progress at report time, convergence is the PM's.",
"mcp_calls": "0",
"api_writes": "3 — all through the fleet relay, each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft #11342; (2) label-write --assign huangyiirene on #11342, assignees add, no label verbs, read back MATCHES; (3) this os-dev-report comment on #11101 via post-stamped. git push is not counted.",
"open_questions": [
{
"question": "The brief asked to back-fill BASELINE.squashMerge. This change re-pins BASELINE (aggregate and the vendor-objectstack per-chunk baseline) onto its own 4acbea0 reading, so the 048e7f6 squash handle 81f8498 went into the header prose that still cites that reading, and BASELINE.squashMerge is null again, now owed for 4acbea0. Accept?",
"options": [
"A — accept as shipped: BASELINE is a real reading of a tree under the lowered ceiling, and the per-chunk unit test forbids a ceiling under its baseline (048e7f6 vendor 1,703,690 is above the lowered 1,689,265), so the re-pin is forced. The 4acbea0 squash back-fill rides the next payback (objectstack#20646) or a one-line follow-up.",
"B — keep the aggregate BASELINE at 048e7f6 with squashMerge 81f8498 and re-pin only the per-chunk vendor baseline: mixed provenance across the two baselines, and the aggregate baseline stops being the reading the ceiling derives from."
],
"recommendation": "A: it keeps both baselines measured on one tree, and the back-fill the brief wanted is recorded where 048e7f6 is still cited."
}
],
"out_of_scope_findings": [
"carrier: none · noted, not filed — /shared (81,754 gzip alone) and /identity (9,348) are reached on the first screen only by designer code: register-builtins.ts → inspectors/index.ts and previews/index.ts (bare-imported by the app-shell entry), and ConsoleLayout → DraftPreviewBar → DraftChangesPanel. Recovering them is a lazy inspector/preview registration redesign, not a defect. Dedupe words: register-builtins eager, inspector registry lazy, spec shared eager, DraftPreviewBar",
"carrier: none · noted, not filed — DraftChangesPanel.tsx's comment says @objectstack/core inside @objectstack/client keeps @objectstack/spec/shared eager. In the 17.5.0 bundle measured here, /shared's importers are the three objectui modules plus the linter, so the comment's premise is stale. Dedupe words: DraftChangesPanel comment, pluralToSingular, spec shared importer",
"carrier: none · noted, not filed — e2e/live/studio-editor.spec.ts waits on getByTestId('metadata-edit-page'), and git grep finds that string in no other tracked file; whether the live suite runs it and how it passes is NOT MEASURED. Dedupe words: metadata-edit-page, studio-editor live e2e",
"carrier: none · noted, not filed — on the 17.5.0 showcase backend every console page load gets GET /api/v1/usage/storage 404 (present before and after this change; not investigated). Dedupe words: usage storage 404, api v1 usage"
]
}objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsSeat review of the report
5925769884: ACCEPT PR #11342, pending CI and the at-tier record. Seat answer A on the baseline question.domain:devxseat 2 (objectui#10917),session_01TdiauJaVCHuj45EzZGUxHh, R5, 2026-10-01T06:10Z.PR #11342 (draft, head
7d24740, 4 files, +227/−59).check-governed-merges --prreads NOT governed.- The measurement corrected the seat's hypothesis.
clientValidation.tsalready reached every spec entry throughawait import().- The real leak was the
vendor-objectstackchunk group claiming by module id rather than by reachability. That is the objectui#5266 mechanism, generalised. - So
/aiand/integration, which have no eager importer, rode every page load. - The fix is one tag,
tags: ['$initial'], on that group. It closes the class rather than adding another lookahead exclusion. No new dynamic import was needed, because the boundary already existed.
- The real leak was the
- Payback:
- The eager closure goes 3,671,724 → 3,638,104 gzip (−33,620;
vendor-objectstack−33,735), measured on two builds of one tree. MAX_EAGER_CLOSURE_GZIP_BYTEScomes down 3,694,000 → 3,660,380, and thevendor-objectstackceiling 1,723,000 → 1,689,265, each by exactly the recovered amount.- The ablation (the tag removed) puts the build 11.1 KB over the lowered budget. Restored, it is green.
- The eager closure goes 3,671,724 → 3,638,104 gzip (−33,620;
- Behaviour unchanged:
- A browser probe on the built console against a fresh 17.5.0 showcase: the first screen has no
ai-/integration-chunk. - Opening
metadata/agent/newandmetadata/connector/newlazily fetches each chunk, and the validator's error banner text is byte-identical with and without the tag.
- A browser probe on the built console against a fresh 17.5.0 showcase: the first screen has no
Seat answer on the baseline question: A.
- The per-chunk test forbids a ceiling under its baseline, and
048e7f6's vendor reading (1,703,690) sits above the lowered ceiling. So re-pinning both baselines onto this tree's4acbea07reading is forced, and it keeps both measured on one tree. - The
048e7f6squash handle81f8498is back-filled where that reading is still cited. BASELINE.squashMergefor4acbea07is owed after merge. This seat's landing record will name the squash sha, and the back-fill rides the next change toscripts/check-eager-closure-budget.mjs(the upstream payback objectstack#20646 is the natural carrier).
Out-of-scope findings:
/shared(81.7 KB gzip) and/identitystay eager only through the designer inspector and preview registrations. Moving them would be a lazy-registration redesign, not a defect. Noted only.DraftChangesPanel.tsx's comment on what keeps/sharedeager is stale. Noted only.e2e/live/studio-editor.spec.tswaits on a test id that nothing else carries. NOT MEASURED. Noted only.GET /api/v1/usage/storage404 on every page load is objectui#11002 (domain:ui,pm:queue). Already filed.
Landing:
Clause-②: no, but the changeset prose is a review face, so an at-tier record is owed. Like every objectui PR right now, this PR waits on the redSpec Main Shape Gate(objectui#11330, claimed bydomain:ui). Then: mergemain, the at-tier record, ready and enqueue.Fixes #11101.- The measurement corrected the seat's hypothesis.
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsContract review
Served-tier:
CONTRACT_REVIEW_TIER
Head-sha:235a626177724b6a4da6866643f08f73389cbb17
Local-runs: nonePR #11342 for card #11101, rendered 2026-10-01T07:11Z by an isolated contract-review subagent of the seat session signed below. Inputs: the card body and its five comments (the claim
5924908810, theos-dev-report5925769884, the seat review5925789049included, read as claims to test, not as conclusions), the PR body and file list, the net diff of235a626againstmain(merge-base770cc5b, 3 ahead / 0 behind: exactly the four files the PR lists, so the update-branch merge carried nothing of its own), and the 43 check-runs on the head: 40success, 3skippedby condition (Test (coverage), its shard,dependabot), 0 failed. Nothing was built, run or re-run here; the Bundle Analysis job log was read, not reproduced.① Derived judgments
apps/console/vite.config.ts—tags: ['$initial']on thevendor-objectstackgroup. RIGHT. The group now claims only modules statically reachable from the entry, so a@objectstack/*module reached only throughimport()follows its importer into a lazy chunk:@objectstack/spec/aiand/integration(reached only byclientValidation.ts'sawait import()),/contractsand@objectstack/sdui-parser(reached only by lazy pages and the linter).$initialIS the eager closure, so no module the first screen executes moves; the lint lookaheads stay. No export, no schema, no accept set changes. The published surface that moves is@object-ui/console'sdistchunk layout only: 330 eager chunks on both sides, 2447 to 2450 total. The head's Bundle Analysis job confirms the shape on the merge ref against770cc5b: 330 eager chunks, 2450 weighed, closure 3552.7 KB under the 3574.6 KB budget, and all five legs (closure,chunk,membership,headroom,freshness) pass.scripts/check-eager-closure-budget.mjs— the gate's accept set narrows, by exactly what was recovered. RIGHT.MAX_EAGER_CLOSURE_GZIP_BYTES3,694,000 to 3,660,380 is minus 33,620 = 3,671,724 minus 3,638,104;PER_CHUNK_GZIP_CEILINGS['vendor-objectstack']1,723,000 to 1,689,265 is minus 33,735 = 1,704,699 minus 1,670,964. Every figure in the new prose reproduces: headroom 22,276 = 0.24x of 89 KiB (91,136) and 18,301 = 0.20x; the previous 45,263 (0.50x) and 19,310 (0.21x);main's drift 22,987 = 3,671,724 minus 3,648,737; the recovered 33,620 = 0.37x the regression the gate must catch. Not re-derived as reading plus half a regression, and not rounded, which is what the card's step 3 asks ("by the amount recovered, a loan, not a new baseline").REGRESSION_THIS_GATE_MUST_CATCH_BYTESand theframework(100,000 / 72,245),i18n-locale-en(50,000 / 40,415) andui-components(289,000 / 265,937) rows are untouched.BASELINEandPER_CHUNK_BASELINE['vendor-objectstack']re-pinned onto4acbea07(3,638,104 / 330 / 2450 and 1,670,964),squashMerge: null. RIGHT, and the per-chunk half is forced: the test pinsceilingstrictly greater thanmeasuredper row, and the old vendor reading 1,703,690 sits above the lowered 1,689,265. The commit named is the payback commit alone (mainat5262f7dplus the one vite line), so the reading is of a tree whose only difference frommainis the subject of the measurement, which is the provenance argument the field's own prose makes.scripts/__tests__/check-eager-closure-budget.test.ts. RIGHT on all three edits: the3563.2to3552.8pins (3,638,104 / 1024 = 3552.8); the group-table pin of$initialonvendor-objectstackwith its table-wide control (no other group carries the tag); andframeworkAt, which usesbudgeted's existingtotalDeltato hold the aggregate atBASELINEwhileframeworksits one byte either side of its line. The repair is necessary, not cosmetic: the aggregate's headroom (22,276) is now narrower thanframework's (100,000 minus 72,245 = 27,755), so the old fixture, growingframeworkon an unchanged rest, would have crossed the aggregate line first and tested the wrong verdict.- Governed and published surfaces. None of the four paths is a governed surface (
Governed Surface Queue Guardsuccess); nopackages/spec, docs or published source moves;check-changeset-presenceowes nothing, so the changeset is voluntary and the review face here is its prose (judged under ②). - The card's acceptance. Measured before and after in the PR body (two builds of one tree, same instrument, same lock hold, blob-hash proven): RIGHT. Ceiling and headroom assertion lowered by the recovered amount: RIGHT (items 2 and 4). No first-paint regression: RIGHT, the other 329 eager chunks moved +115 bytes of import bookkeeping over 31 chunks, none by more than 20, against minus 33,735 on the vendor chunk, and the first screen fetched the same 331 JS requests with no
ai-orintegration-chunk. Designers validate as before: RIGHT per the dev's probe on the built console (both designers fetch their chunk on open, banner text byte-identical with and without the tag); not re-run here.
② Semver level
.changeset/11101-vendor-chunk-initial-only.mddeclares'@object-ui/console': patch. RIGHT.@object-ui/consoleis published (publishConfig.access: public,filesincludesdist, in the fixed group), and the diff changes what that package ships: the chunk layout of its built console. Nothing it exports, accepts or rejects moves, sopatchis the level:skip-changesetwould be wrong because a published artifact changes;minorwould claim a surface that did not widen. The changeset prose matches the diff (the mechanism, the four modules that moved, the ceiling lowered by the bytes recovered) and carries no model identifier. The changeset gates on the head (Changeset Bump Policy,Changeset Declaration,Changeset Fixed Group Check,Changeset Claim Re-read,Changeset Overwrite Report) are allsuccess.Clause-②: no. The PR body's
Clause-②: no. Load timing only; no contract, export or accept set moves, and validation is unchanged once loaded.is RIGHT and well-formed (no arm). The accept set that does narrow is the CI gate's own ceiling, which is this card's deliverable under the objectui#11088 decision 1 = A ruling, not a contract surface.③ Boundary flags
open_questions[0], theBASELINEre-pin versus the owedsquashMergeback-fill: A, concurring with the seat's answer in5925789049. The per-chunk pin forces the vendor re-pin (item 3); keeping the aggregate on048e7f6(option B) would read the two baselines off two trees and derive the ceiling from a reading the delta was never measured against. The048e7f6to81f8498handle is recorded in the header prose where that reading is still cited, which is what the brief's "rides this change" can mean once the field itself has moved on. Owed after merge, by the field's own rule:BASELINE.squashMergefor4acbea07. The seat's landing record names the squash sha; the back-fill rides the next edit of the script (the objectstack#20646 console-side payback is the natural carrier, or a one-line follow-up). Not blocking.- Deviation 1, no new dynamic import. Answered, RIGHT. The card's step 2 named the mainstream shape; the measurement showed the boundary already existed in
clientValidation.tsand the chunk group overrode it. One tag closes the class (the objectui#5266 mechanism, generalised) instead of adding another package-specific lookahead, and the acceptance holds (item 6). - Deviation 3, the
frameworkfixture pair. Answered, RIGHT (item 4). - Card step 3, "in the same commit as the payback lands". The branch carries the payback (
4acbea07) and the ceiling (7d24740c) as two commits plus the update-branch merge. This repository squash-lands, so the loan and its payback reachmainas one commit; the split on the branch is what letsBASELINEname a tree that differs frommainby the vite line alone. Answered, acceptable. - NOT MEASURED (a) the app-shell suite outside
metadata-admin/**: closed by the head'sTest (shard 1/8)toTest (shard 8/8), allsuccess. (b) repo-wide lint:Lintsuccess. (c) CI on perf(console): the first screen stops loading the spec entries only the metadata designers validate with; the eager-closure ceiling comes down by what that recovered (objectui#11101) #11342: complete and green on235a626(40 success, 3 skipped, 0 failed). - The claim's stop condition, "recoverable weight below the noise of the instrument": not met; the instrument read identically on three builds per configuration and the recovered 33,620 is 0.37x the regression the gate exists to catch.
- Out-of-scope 1,
/shared(81,754 gzip alone) and/identity(9,348) eager only throughregister-builtins.tsandConsoleLayouttoDraftPreviewBar: answered, not this card's and not a defect; it is the next console-side recoverable share (about 91 KB gzip attribution) and needs a lazy inspector/preview registration design. Escalated to the seat as a candidate payback card, at its discretion. - Out-of-scope 2, the stale comment in
DraftChangesPanel.tsxabout what keeps/sharedeager: answered; a one-line correction that rides the card above or the next touch of that file, no card of its own. - Out-of-scope 3,
e2e/live/studio-editor.spec.tswaits ongetByTestId('metadata-edit-page')and no tracked file renders it: ESCALATED to the seat. A live spec whose selector nothing produces either never runs or always times out, andLive E2E (informational)cannot show which; verify whether the live suite runs that spec and how it passes, and file a card if it does not pass for the right reason. Not blocking this PR. - Out-of-scope 4,
GET /api/v1/usage/storage404 on every page load: already objectui#11002, as the seat found.
Implemented-by:
claude/issue-11101-lazy-spec-validation
Reviewed-by:session_01TdiauJaVCHuj45EzZGUxHhVERDICT: PASS
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsLanded: PR #11342 merged through the queue as
993f27eat 2026-10-01T07:28Z.Fixes #11101closed this card as completed.domain:devxseat 2 (objectui#10917),session_01TdiauJaVCHuj45EzZGUxHh, R5, recorded at 2026-10-01T07:29Z.- Reviewed head = landed head:
- The at-tier contract record
5926531902(PASS,CONTRACT_REVIEW_TIER,Local-runs: none) names235a626177724b6a4da6866643f08f73389cbb17. That head was GitHub's update-branch merge ofmaininto the dev head7d24740, after theSpec Main Shape Gaterepair (objectui#11330) landed. - Nothing was pushed after the record.
- CI on the head: 43 check-runs, 40 success, 3 skipped.
- The at-tier contract record
- Delivered:
tags: ['$initial']on the console'svendor-objectstackchunk group.- Every
@objectstack/*module reached only throughimport()now follows its importer into a lazy chunk, including/ai,/integration,/contractsandsdui-parser. - The eager closure goes 3,671,724 → 3,638,104 gzip (−33,620).
MAX_EAGER_CLOSURE_GZIP_BYTESis lowered to 3,660,380, and thevendor-objectstackceiling to 1,689,265, each by exactly the recovered bytes. The loan from objectui#11088's decision A is repaid by this share.
- Every
- Owed after this merge:
BASELINE.squashMergefor the re-pinned4acbea07reading. The squash commit is993f27e60b47b00e8f04cd09bb65a14aeabdc8f6. The back-fill rides the next change toscripts/check-eager-closure-budget.mjs, and the natural carrier is the upstream payback objectstack#20646. - Reviewer escalation, recorded:
e2e/live/studio-editor.spec.tswaits ongetByTestId('metadata-edit-page'), and nothing onmainrenders that test id; the spec file is its only occurrence. Either the live suite does not run it, or it fails there. It is outside this card. Carrier: none; the seat notes it on its shift brief for thedomain:ui/ e2e owner. - The
pm:dispatchedresidue is stripped in the same act.
- Reviewed head = landed head:
- added a commit that references this issue
on Oct 7, 2026
Unblocked: #11073 closed (PR #11086 merged); see
5903794882.Filed by the director seat (objectstack#12708,
session_01AsCNgFBs8HCjwhyHQsFbx3) as the console-side payback card the maintainer's ruling on objectui#11088 (decision 1, letter A — raise the ceiling now, pay it back) names. ⛔ Not a claim.Why
PR objectui#11086 (the
@objectstack/*17.5.0 bump) raises the console first-screen ceiling by 413.8 KB gzip; the maintainer ruled the raise (precedent objectui#5531) with two payback cards. The larger share is upstream —@objectstack/spec's root entry carries about 1 MB of migration-registry prose the console never runs; that card is objectstack-ai/objectstack (filed with this one, "the root entry stops carrying the migration and conversion registries"). This card is the console's own share: spec validation used only by metadata management (the designers, the metadata-admin views,objectui check-style authoring surfaces) should not be in the eager closure of every console page load.What this card asks
@objectstack/specentries the console's eager closure imports today, and from which routes (the Bundle Analysis comment on PR objectui#11086,5888891615, andscripts/check-eager-closure-budget.mjsare the instruments). Name the metadata-admin-only imports and their gzip weight.Acceptance
Related: objectui#11088 (the ruling), objectui#11073 / PR objectui#11086, objectui#5468 (the ceiling stays as shipped unless the maintainer rules), objectui#5531 (the precedent), the upstream card in objectstack-ai/objectstack.