Repository navigation
spec: the shared entry grew +152 KB gzip from 17.6.0 to 17.7.0 with the same exports, and objectui's console first screen carries it (the payback owed by objectui's 17.7.0 budget raise) #22044
Description
Activity
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsPath: ② the capabilities an end user meets in the app — the console's first screen | 缺项 | P2
Triage: first grade,
enhancement·priority:p2·domain:spec·area:devpath·pm:queue. The payback the maintainer's ruling owes, in #20646's shapeTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T00:52Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/spec(its build and its entry graph, thesharedand root entries first) ⇒domain:spec; rationale: the bytes are@objectstack/spec's, as they were for #20646.-
The ruling, verified at this write: deps: bump objectui's @objectstack/* to 17.7.0 — eight held cards' conditions are met on npm, and objectui's lockfile still resolves 17.6.0 objectui#11717 comment
6027998226records the maintainer's 「A 抬预算+回收卡 (Recommended)」 on decision request6024630321. So this card is the second half of a ruled A, ⛔ not a new question. -
Why p2, as spec: the root entry stops carrying the migration and conversion registries (about 1 MB of prose), so a console first screen no longer downloads os migrate text (the upstream payback of objectui#11088 D1) #20646 was: about 180 KB of gzip on every console first screen. The budget was raised to let 17.7.0 in, and this card is how it comes back down.
-
Scope, as the card states it:
- find what grew in
shared(+152 KB gzip, same 79 exports) and in the root entry between the two tags; - ship it smaller, or move it off the entries a browser first screen imports;
- measure the recovered bytes on objectui's console build with the card's instrument.
The module-level split is NOT MEASURED today, so the first act is that measurement. The PR names which source it recovers and how much.
- find what grew in
-
Guard: ⛔ the export surface does not change. Every entry keeps its export list, and the PR proves parity with
api-surfaceor an equivalent. That is what lets the change ride any next release without a protocol entry. -
Release placement: it is not on the last-17.x wait list (decision: before the v18 line opens, does main publish one last 17.x release to npm? #22009 A, fixes only). If it merges before that cut, it rides along, being non-breaking. Otherwise it ships in 18.0. objectui lowers its ceiling once it resolves the release that carries the reduction.
-
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iterateenhancementNew feature or requestNew feature or requestpriority:p2Medium: important, M3Medium: important, M3and removed
on Oct 7, 2026 objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsClaim: PM loop round 6 (this card, as triage graded and scoped it in
6028457956: measurement first, then the reduction) · 2026-10-07T01:45Z
Session:session_01GV6oYwgc1kWiUCb1YaprQ7
Account:os-warren(the seat's linked user asGET /useranswers it; the card's assignee from this act)
Branch:claude/issue-22044-spec-shared-entry-payback
Worktree:objectstack-issue-22044
Domain:domain:spec
Seat:domain:spec#2(seat post #18549)
File surface (atorigin/main9a0401fd; stop on breach and explain in the report). This is a measurement-first card: ⛔ no fix is written before the measurement exists.- Measurement (no commit needed): the module-level make-up of the
sharedand root (browser) entries at the@objectstack/spec@17.6.0and@objectstack/spec@17.7.0tags, and objectui's consoleapps/console/dist/eager-closure.jsonbuilt against the candidate. On objectui this is measurement only: ⛔ no objectui commit, branch or PR. Lowering objectui's ceiling is objectui's follow-up once it resolves the release. - The reduction, where the measurement points:
packages/spec/tsup.config.tsand the build scripts underpackages/spec/scripts/**it uses, and anypackages/spec/src/**module the measurement names as the source. A source edit may change only how a schema is built or emitted, never its shape, its accept set or its.describe()text. - Whatever
packages/specgenerators move for that (os-regen-managed aggregates), and.changeset/22044-*.md. - ⛔ No entry's export list changes, and
packages/spec/package.jsonexportsstays as it is. The PR proves parity withapi-surfaceor an equivalent, per triage's guard.
Container & model:M,mode:subagent,model: opus(--tier: no path-derived mandate. An at-tier contract review is owed before it enqueues, because the PR changes published@objectstack/specbytes; it comes from an isolated subagent, not this build.)
Clause-②: no (the accept set and every entry's export list stay unchanged. This seat does not build, so the dev measures parity on the built declaration closure, and the measurement decides.)
Responsibility: n/a — not a defect card
Thread-read: 6028457956
Serial constraints cleared: none of the 7 open PRs touchespackages/spec/tsup.config.ts,packages/spec/scripts/**build files,packages/spec/src/shared/**orpackages/spec/src/index.ts(scan at this stamp). The Version Packages PR chore: version packages #21988 touchespackages/spec/package.json(version) andCHANGELOG.mdonly, and this claim does not edit either. No liveClaim:on anypm:dispatchedcard names these files. Seat 1 is vacant.
Generated by Claude Code
- Measurement (no commit needed): the module-level make-up of the
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22044,
"status": "done",
"branch": "claude/issue-22044-spec-shared-entry-payback",
"pr": "#22048",
"session": "session_01GV6oYwgc1kWiUCb1YaprQ7 (subagent run; the PM's id, as the dispatch states)",
"premise_still_valid": true,
"summary": "Measured first: in the 17.7.0 tarball, ./shared carries the ADR-0087 conversion table (reached only via shared/metadata-collection.zod.ts normalizeStackInput, then conversions/apply.ts, then conversions/registry.ts), and the table now reaches more schemas (view +113,588, field +110,842, component +118,152, dashboard/chart/report/bulk-action new). Two unmarked load-time calls (18: inApplicationOrder(MAJOR_18_CONVERSIONS) and the Object.keys(...).flatMap(...) into ALL_CONVERSIONS) made every bundle of every entry reaching the table keep all of it; the console kept two copies (root and ./shared) without ever reading it. Fix: an @PURE annotation on each of the two calls in packages/spec/src/conversions/registry.ts (plus docblock), a pin case in scripts/pure-schema-construction.test.ts, the WIRING string in scripts/conversions-major18-merge.test.ts, and a patch changeset. Console at objectui c0862c1c: eager closure 226,238 gzip smaller (vendor-objectstack 1,604,719 to 1,378,418), more than the +182,909 the 17.7.0 bump added; no export list, declaration, runtime value or published file changes.",
"tests": "At eb2152b unless named. pnpm --filter @objectstack/spec test (local project, full): 619 files, 18486 passed, 1 todo, VERDICT command-exit 0. scripts/pure-schema-construction.test.ts at 08392e5: 7 passed (new case included). scripts/conversions-major18-merge.test.ts (repo project) at 08392e5: 12 passed; rest of the repo project declared to CI. pnpm --filter @objectstack/spec typecheck: exit 0 (tsc, scripts, test layer 52 files / 246 errors held by ledger). Spec build JS+DTS exit 0 at d017de4 and eb2152b. Reverse verification at 08392e5 via scripts/ablation-replace.mjs (pin builds from src through tsup, so no dist sits between mutation and assertion): removing the ALL_CONVERSIONS mark, mutation landed (anchor 1 to 0, blob d707d83fdbad to df80d62038eb), pin red: expected [ ...(129) ] to deeply equal [], 1 failed / 6 passed; restore blob == HEAD (d707d83fdbad), git diff HEAD empty. Removing the inApplicationOrder mark: red with 62 ids kept; restored the same way. Predicted direction (red) observed both times. Lint narrowed at eb2152b: eslint --no-inline-config --format json over the 3 changed .ts files (all changed files in the **/.{ts,tsx,mts,cts,js,jsx,mjs,cjs} population; the changeset .md is outside it): 3 files, 0 errors, 0 warnings; eslint.config.mjs enables no type-aware linting (no parserOptions.project, no typed rules), so no untouched file verdict can move; full pnpm lint is CI's.",
"mcp_calls": "0",
"api_writes": "3 REST writes, all through scripts/pm via the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, PR #22048 draft, body read back identical 13926 bytes; (2) label-write --assign os-warren on #22048, read back matches; (3) this os-dev-report comment on #22044 via post-stamped. git push x4 (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed (also in PR Acceptance notes): after this change ./shared still keeps 144,609 raw / 47,491 gzip for the console's 5 names in the consumer probe, mostly argument expressions of calls the build marks pure (a strictObject call is dropped when unused, but its side-effectful arguments such as bare z. chains, .optional().describe() on imported schemas and componentSlot(...) still run and are kept); largest: ui/component.zod.ts 34,556, ui/view.zod.ts 18,973, data/filter.zod.ts 18,019. Observation about how construction is marked, not a reproducible defect.",
"carrier: none (承接者:无) · noted, not filed: per-entry probe keeps ui/component.zod.ts at about 157-159 KB raw in each of ./ui, root and ./system (one copy per flat entry, splitting: false). Whether the console keeps more than one copy is NOT MEASURED (its build emits no module-level map). Shared chunks would be the route; they redraw the published file set, which the tsup.config.ts docblock asks to review first."
],
"hypotheses": {
"H1": "Confirmed on the same tarballs: ./shared ESM raw 980,505 to 1,503,348 (+522,843 exactly), 79 exports.",
"H2": "Confirmed: shared/ own modules account for under 10 KB of the delta; the growth is modules reached transitively through the conversion table (and data/field.zod.ts also via shared/field-type-suggestion.ts).",
"H3": "Partly: splitting: false is the precondition (a flat file keeps every unproven top-level call), but what grew is new reach through the conversion table plus genuine schema growth (component.zod.ts, #21464 typing), copied per entry. The fix does not split; chunk layout unchanged.",
"H4": "What defeated it: the conversion table's two load-time calls were never marked, so the table and everything it references stayed. Separately, a PURE-marked strictObject still keeps side-effectful arguments (see out_of_scope_findings).",
"H5": "Confirmed: tarball deltas are not retained bytes. Console recovery 226,238 gzip against a ./shared tarball growth of +152,445 gzip, because the console kept two copies of the table (root and ./shared) and both go."
},
"measurement_module_table": {
"instrument": "source-map attribution of each published ESM entry (the tarball .mjs.map; each generated byte assigned to the source module of its mapping), npm @objectstack/spec@17.6.0 vs @17.7.0, raw bytes; import paths from an esbuild metafile of the 17.7.0 source",
"shared_dist_shared_index_mjs": {
"total": "980,505 to 1,503,348 (+522,843)",
"src/ui/component.zod.ts": "277,752 to 395,904 (+118,152)",
"src/ui/view.zod.ts": "42,538 to 156,126 (+113,588)",
"src/data/field.zod.ts": "11,426 to 122,268 (+110,842)",
"src/ui/dashboard.zod.ts": "0 to 38,152",
"src/conversions/registry.ts": "357,075 to 391,897 (+34,822)",
"src/ui/chart.zod.ts": "0 to 31,088",
"src/ui/report.zod.ts": "0 to 21,701",
"src/ui/bulk-action.zod.ts": "131 to 17,034 (+16,903)",
"other_32_modules_net": "+37,595"
},
"root_dist_browser_index_mjs": {
"total": "2,348,750 to 2,593,955 (+245,205)",
"src/ui/component.zod.ts": "+118,152",
"src/conversions/registry.ts": "+34,822",
"src/automation/approval.zod.ts": "+23,623",
"src/ai/agent.zod.ts": "+10,024",
"src/system/job.zod.ts": "+10,022",
"src/ui/chart.zod.ts": "+9,605",
"src/ui/page.zod.ts": "+4,549",
"other_net": "+34,408"
},
"path": "shared/index.ts, then shared/metadata-collection.zod.ts, then conversions/apply.ts, then conversions/registry.ts, then ui/view.zod.ts (chart, bulk-action) and via conversions/walk.ts ui/component.zod.ts (dashboard, report)",
"consumer_probe_gzip": {
"instrument": "rolldown 1.0.3, platform browser, minified, gzip -9; per spec entry, importing exactly the names objectui c0862c1c non-test src value-imports from it; spec source maps chained",
"shared": "120,147 (17.6.0) / 191,561 (17.7.0) / 47,491 (head)",
"ui": "132,642 / 165,099 / 165,156",
"root_browser": "312,154 / 342,786 / 342,842",
"system_browser": "283,598 / 310,749 / 310,794",
"all_13_entries": "1,140,385 / 1,315,136 / 1,171,318",
"shared_registry_raw": "201,720 at 17.7.0 to 0 at head"
}
},
"console_eager_closure": {
"objectui_commit": "c0862c1c (origin/main, resolves 17.7.0), detached worktree, removed after",
"build": "pnpm install --frozen-lockfile; pnpm turbo run build --filter=./packages/* --concurrency=2; pnpm --filter @object-ui/console build; read apps/console/dist/eager-closure.json",
"a_control_installed_17_7_0": "eager 3,591,131 gzip / 12,259,304 raw; vendor-objectstack 1,604,474 gzip / 5,399,508 raw; conversion table copies in chunk: 2 (all 129 ids x2); built twice, identical",
"b_OBJECTSTACK_SPEC_DIST_main_9a0401fd": "eager 3,591,379 gzip; vendor-objectstack 1,604,719 gzip / 5,400,408 raw",
"c_OBJECTSTACK_SPEC_DIST_head_eb2152b86b": "eager 3,365,141 gzip / 11,381,985 raw; vendor-objectstack 1,378,418 gzip / 4,522,189 raw; table copies: 0 (all 129 ids x0); built twice (d017de4 dist, then eb2152b dist), identical",
"recovered_b_minus_c": "eager -226,238 gzip; vendor-objectstack -226,301 gzip / -878,219 raw; other 330 eager chunks +63 gzip net (hash churn); 331 eager chunks in all builds",
"a_minus_c": "-225,990 gzip"
},
"export_parity": {
"api_surface": "pnpm --filter @objectstack/spec check:api-surface exit 0 at eb2152b: public API surface + factory signatures unchanged",
"runtime_export_lists": "main 9a0401f build vs head build: 48 entry files (every .mjs/.js the exports map names, browser arms included), 7,864 names, 0 differing (exit 0); control leg npm 17.6.0 vs head: 16 differing (exit 1)",
"declaration_tree": "order-insensitive per the tsup.config.ts DTS docblock (sorted unions, property-only type literals, statements, specifiers; hashes stripped; chunks paired by content): 130 files / 38 entries / 62 chunk contents each side, IDENTICAL (exit 0); control leg npm 17.6.0 vs 17.7.0: 52 differences (exit 1)",
"published_file_set": "dist 228 files each side (hashes stripped), identical; chunk layout unchanged, so publish-smoke not owed and needs:pack-smoke not needed",
"bytes": "each entry file carrying the table grows 32 raw bytes (the two annotations), e.g. dist/shared/index.mjs 1,510,391 to 1,510,423"
},
"gates": "At eb2152b. node scripts/pm/dispatch-gates.mjs --commands derived 86 families (stderr: tree objectstack-ai/objectstack at eb2152b); --ran: 86 run, 0 NOT-MEASURED, 0 UNRUN, all exit 0. Three first exited 3 (PREREQUISITE NOT MET) and went 0 after pnpm turbo run build: check:dual-build-cjs-loads, check:lean-entry-closure, @objectstack/lint check:doc-formula-expressions. Also exit 0: pnpm --filter @objectstack/spec check:generated (15 artifacts up to date), check:api-surface, check:browser-reachable-entries, check:published-files, check:entry-nameability, check:nul-bytes, check:type-check-coverage (re-measure 642s), check:type-check-debt, check:sourcemap-no-sources-content, check:spec-docblock-symbol-anchors, check:issue-citations, check:doc-authoring. Lead list (gates-22044.txt, 83 commands at 9a0401f): 8 of mine were not in it (all ran); 5 of it were not in mine and also ran exit 0: check:authorable-surface, check:yaml-examples, check-governed-queue-guard --self-test, check:console-injection and check:console-sha, the last two skipped for want of packages/console/dist, so NOT MEASURED. CI at report time on eb2152b: 32 check runs, 12 success, 3 skipped, 17 in_progress, 0 failure (in_progress is the honest value).",
"deviations": [
"Candidate injected through objectui's own OBJECTSTACK_SPEC_DIST (the Console Pin Gate's mechanism) instead of a packed-tarball override; control (a) is the installed npm 17.7.0 as dispatched, and reading (b) (main injected) isolates the fix from main's drift (+248 gzip vs a).",
"Route is a source annotation in conversions/registry.ts, not tsup.config.ts: the published file set and chunk layout do not move. Whether CI's Console Pin Gate runs depends on its own filter.",
"pnpm --filter @objectstack/spec test was invoked with a trailing bare -- --maxWorkers=2, which vitest dropped: the whole package ran (intended scope) at default workers.",
"Long builds ran under os-verify-lock.sh via nohup with a foreground tail --pid wait, because of the ~10-minute foreground cap.",
"The harness attribution reminder asked for a Co-Authored-By trailer naming a model and a different PR footer; per AGENTS.md the commits carry the model-free pair (Claude-Session + Co-authored-by: Claude) and the PR body the session-URL footer."
],
"files_changed": [
".changeset/22044-shared-entry-drops-conversion-table.md",
"packages/spec/scripts/conversions-major18-merge.test.ts",
"packages/spec/scripts/pure-schema-construction.test.ts",
"packages/spec/src/conversions/registry.ts"
],
"commits": [
"d017de4582 perf(spec): mark the conversion table's two load-time calls pure",
"08392e53a4 test(spec): pin the ./shared consumer retention",
"eb2152b86b chore(changeset): spec patch"
],
"dedupe_words": [
"conversion table",
"ALL_CONVERSIONS",
"eager closure",
"vendor-objectstack",
"shared entry"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22044,
"round": "patch 1 (contract review 6030317799 follow-up)",
"status": "done",
"branch": "claude/issue-22044-spec-shared-entry-payback",
"pr": "#22048",
"head": "cf854f71dc (was eb2152b)",
"session": "session_01GV6oYwgc1kWiUCb1YaprQ7 (subagent run; the PM's id)",
"premise_still_valid": true,
"summary": "The pin's ./shared console consumer now names exactly the five names objectui c0862c1c value-imports from @objectstack/spec/shared, so its comment reads true. This round's read matches the reviewer's five. One file, one hunk: the consumer string in packages/spec/scripts/pure-schema-construction.test.ts. registry.ts, the changeset and the PR body are untouched.",
"shared_value_imports_at_objectui_c0862c1c": {
"method": "git -C /home/user/objectui git grep at c0862c1c (object present locally) over packages/*/src and apps/console/src, excluding test, spec, stories, tests, mocks and test/ paths; import type and export type lines excluded; no dynamic import or require of the entry found",
"canonicalMetaUrlType": "packages/app-shell/src/preview/DraftChangesPanel.tsx:71, packages/app-shell/src/views/studio-design/studioScope.ts:35",
"ValueDomainSchema": "packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:43",
"EVALUATED_EXPRESSION_SOURCE_REQUIRED": "packages/app-shell/src/views/metadata-admin/previews/simulator/flow-sim-validate.ts:29",
"EvaluatedExpressionSchema": "packages/app-shell/src/views/metadata-admin/previews/simulator/flow-sim-validate.ts:29, packages/types/src/zod/base.zod.ts:22-25 (aliased SpecEvaluatedExpressionSchema)",
"EvaluatedExpressionInputSchema": "packages/types/src/zod/form.zod.ts:29 and packages/types/src/zod/base.zod.ts:22-25 (aliased SpecEvaluatedExpressionInputSchema)",
"type_only_not_counted": "ExpressionInput, EvaluatedExpressionInput, SchemaDiffEntry, SchemaDiffEntryKind, SortDirection, and the export type * as Shared in packages/types/src/index.ts:1217"
},
"tests": "At cf854f7. scripts/pure-schema-construction.test.ts (local project, verbose): 7 passed, 1 file passed, VERDICT command-exit 0. Its retention case reads: a consumer of the built ./shared entry keeps the conversion table only when it reads it, drops every conversion for the console names, keeps them all for normalizeStackInput. Both legs are in that one case and both hold: the five-name consumer keeps [] and the normalizeStackInput control keeps all 129 ids. pnpm --filter @objectstack/spec typecheck: VERDICT command-exit 0 (tsc --noEmit, check:scripts-typecheck, check:test-typecheck: 52 files / 246 errors / 135 pinned signatures held). eslint --no-inline-config --format json on the one changed file: exit 0, 1 file, 0 errors, 0 warnings. pnpm check:nul-bytes: exit 0.",
"exit_codes": {
"pin_test": 0,
"typecheck": 0,
"eslint": 0,
"nul_bytes": 0
},
"files_changed": [
"packages/spec/scripts/pure-schema-construction.test.ts"
],
"mcp_calls": "0",
"api_writes": "1 REST write: this os-dev-report comment on #22044, via scripts/pm/post-stamped.mjs through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches). Also git push x1 (eb2152b to cf854f7), not REST.",
"open_questions": [],
"out_of_scope_findings": [],
"deviations": [
"The consumer string is wrapped over several lines so the call stays readable. The names are in code-unit order, which puts EVALUATED_EXPRESSION_SOURCE_REQUIRED first.",
"Not re-run this round: the full spec suite, the gate battery and the console measurement. src/ and the built output are unchanged: the edit touches one test string under scripts/, so this is a declared narrowing. CI runs the full set on cf854f7."
],
"cleanup": "Fresh worktree ../objectstack-issue-22044 on the branch, clean and pushed, removed after this comment without --force."
}
Generated by Claude Code
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actions✅ ACCEPT: PR #22048 at
cf854f71dc(the payback the maintainer's ruling A owes: the conversion table leaves every bundle that does not read it). It lands through the queue now;Fixes #22044closes the card at the mergedomain:specseat 2 ·os-warren· sessionsession_01GV6oYwgc1kWiUCb1YaprQ7· 2026-10-07T04:12Z · holder of claim6029104290; the review of record for the reports6030118362and6030360584(patch round 1).Checklist (read on GitHub, on
origin/mainand on the published 17.7.0 tarball, not from the reports):- Form: draft, base
main, first lineFixes #22044, and no other closing keyword in the body.Clause-②: nostarts a line of the body and of the changeset. PR assigneeos-warren. - Scope: 4 files, all inside the claim.
packages/spec/src/conversions/registry.tsis thesrc/**module the measurement named: two/* @__PURE__ */markers and two docblocks, no value, order, id or shape change. Twopackages/spec/scripts/*.test.tschanges: the new pin, and theWIRINGstring that reads the marked line. Onepatchchangeset. Notsup.config.tschange, so the chunk layout and the published file set stay as they are. - Triage's guard holds: every entry keeps its export list.
check:api-surfacereads unchanged; 48 entry files and 7,864 runtime names show 0 differences, against a 17.6.0 control leg that reads 16. - The card's acceptance, measured with its instrument: on objectui
c0862c1c,apps/console/dist/eager-closure.jsonreads 226,238 bytes gzip smaller (vendor-objectstack1,604,719 → 1,378,418). The conversion table's 129 ids go from two copies to none. That is more than the +182,909 the 17.7.0 bump added. objectui lowers its ceiling andBASELINEby this reading once it resolves the release that carries it. - Contract review: PASS at
CONTRACT_REVIEW_TIER, record6030317799, oneb2152b86b(Local-runs: none, identity pair present). It confirmed where each bundler applies the markers, that both annotated calls are free of side effects (nothing changes in Node), the pin's positive control,patchandClause-②: no. - The record's follow-up is done in this PR: the pin's console consumer named three of the five names objectui value-imports from
./shared. Patch round 1 (cf854f71dc) names all five, so the pin's comment and the PR body read true. It is the only delta from the reviewed head: one test file, +6/−1.src/, the changeset and the other test file are blob-equal toeb2152b86b. - Changeset, read sentence by sentence against the diff: each sentence holds, and the readers it names (
defineStack,normalizeStackInput,applyConversions) do read the table. One precision note, not blocking: the two docblocks ship indist/index.d.ts(the 17.7.0 tarball carries theALL_CONVERSIONSone), so "every declaration is unchanged" holds for the declared types, not for their doc text.
Out-of-scope findings, both
noted, not filed, recorded here as Acceptance notes:- Kept and not filed:
./sharedstill keeps about 47 KB gzip for the console's names. It comes from arguments with side effects inside PURE-marked schema calls. That is a lead for a later payback, not a defect, and this payback already recovers more than the raise. - Kept and not filed: one
component.zod.tscopy per flat entry is thesplitting: falsedesign. Changing it redraws the published file set, and thetsup.config.tsdocblock asks for that review first.
Checks on
cf854f71dc: 32successand 3skipped.check-expected-skipsreads all 3 as on the roster (Build Docs, Console Pin Gate, Packed-tarball smoke (opt-in)).Lint & Repo GatesandTypeScript Type Checkaresuccesson this head.check-governed-merges --pr 22048: not governed, 71 changed lines.git merge-treeontoorigin/maina7a48b784d: clean.Landing: the relay's
pr_ready+automerge_enablefollows this comment. At the merge, the seat checks the squash onmain, confirmsFixesclosed the card, and removespm:dispatched.
Generated by Claude Code
- Form: draft, base
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsLanded: PR #22048 →
93125aeeb8.Fixes #22044closed the card;pm:dispatchedis removeddomain:specseat 2 ·os-warren· sessionsession_01GV6oYwgc1kWiUCb1YaprQ7· 2026-10-07T04:53Z · holder of claim6029104290, which this act releases.- Landed: PR perf(spec): a bundle that never reads the ADR-0087 conversion table stops keeping it, 226 KB gzip off the console first screen (#22044) #22048 merged through the merge queue at 2026-10-07T04:52Z as
93125aeeb8. It has one parent (a7a48b784d) and is an ancestor oforigin/main. The queued headcf854f71dcis not an ancestor, as a squash leaves it. - Content check: all 4 files on
origin/mainare blob-equal to the accepted headcf854f71dc(ACCEPT6030769579; contract review PASS6030317799). - What now holds: the conversion table's two load-time calls carry
@__PURE__. A bundle keeps the table only when something it keeps reads it, and the pin inscripts/pure-schema-construction.test.tsholds this on the built./sharedentry. It ships as apatchfor@objectstack/specin the next release. - The card closed
completedat 2026-10-07T04:52Z, byFixes #22044. - objectui's half (the ruling's second step): once objectui resolves the
@objectstack/specrelease that carries this change, its eager-closure ceiling,BASELINEand thevendor-objectstackrow come down by the amount recovered. Measured with the card's instrument on objectuic0862c1c: −226,238 gzip on the eager closure, −226,301 onvendor-objectstack. That is objectui's change; a note goes to itsdomain:devxseat post.
Release:
session_01GV6oYwgc1kWiUCb1YaprQ7· why: the card's change landed and closed it · to: closed,pm:dispatchedremoved.
Generated by Claude Code
- Landed: PR perf(spec): a bundle that never reads the ADR-0087 conversion table stops keeping it, 226 KB gzip off the console first screen (#22044) #22048 merged through the merge queue at 2026-10-07T04:52Z as
- added a commit that references this issue
on Oct 7, 2026
Filing gate: ③ a maintainer-directed task. The maintainer ruled objectui#11717's eager-closure budget question A in the
domain:devx@ objectui seat 2 session. The selection, verbatim: 「A 抬预算+回收卡 (Recommended)」. The record is objectstack-ai/objectui#11717 comment6027998226, and the decision it answered is6024630321. Option A raises objectui's console budget now and files a payback card in the same stroke. This is that card. ⛔ Not a claim.Readers. objectstack triage routes it first. The fix lands in
packages/spec. Then the seat that claims it. objectui'sdomain:devxseat 2 (seat post objectstack-ai/objectui#10917) consumes the result: once objectui resolves a release carrying the reduction, objectui's ceiling andBASELINEcome down by the recovered amount.What was measured
The source is the os-dev report
6024525892on objectstack-ai/objectui#11717, built from the bump head of PR objectstack-ai/objectui#11742.vendor-objectstackchunk of the eager closure grew by +182,909 gzip bytes. The control was objectuimain02a38967(spec 17.6.0); the head was25251a80(spec 17.7.0); the instrument wasapps/console/dist/eager-closure.json. Every other chunk netted about 0 (aggregate +182,938).@objectstack/specitself. The instrument was raw and gzip-9 byte size of each ESM entry file, installed 17.7.0 against the npm 17.6.0 tarball. Gzip deltas for the entries objectui's shipped code imports:sharedstrictObject(and 58 morelazySchema(call sitesbrowser)browser/systemuibrowser/kernelapibrowser/datamigrationsgrew +203,315, but no shipped objectui import names it. Of the other packages,lint+9,125 andtypes+6,089 are the largest.NOT MEASURED. Which modules the console's vendor chunk keeps after tree-shaking: the build emits no module-level sizes. So how much of the growth is recoverable, and from which source, is open. The strongest lead is the
sharedentry growing by 152 KB behind an unchanged export list.The ask
shared, and in the root entry, between the 17.6.0 and 17.7.0 tags.Acceptance: an
@objectstack/specrelease that carries the reduction, with the recovered bytes measured. The objectui side, lowering its ceiling by that amount, follows on objectui once it resolves that release.Precedent: #20646, the payback for the 17.5.0 raise (closed
completed2026-09-30). It moved the migration and conversion registries off the root entry.Dedupe
eager closure: 1 ([PM seat] domain:devx @ objectui (objectstack-side, stale duplicate of objectui#5748) — ⏳ vacant · consolidated seat session_018rzQyhLGC5iVs11V3TzRs5 closed 2026-09-09T06:3xZ · the authoritative post is objectui#5748 #10602, a stale seat post, not this);vendor-objectstack: 0;payback: 0;shared entry: 0;bundle size|bundle weight|bytes gzip: 0;strictObject(: 0.packages/specgives 81 hits in the same corpus.Generated by Claude Code