Repository navigation
@objectstack/spec ships 18 self-contained entry bundles with no shared chunks, so a consumer mixing entry points gets different ConnectorSchema / defineConnector objects (measured) #8133
Description
Restart-when: any PR touches the packages/spec build/publish pipeline (tsup config, or the exports map in packages/spec/package.json), or a consumer is measured breaking on cross-entry identity or bundle size
Filing unassigned; found while implementing #7991 (PR #8129, the packages/qa/downstream-contract source alias). Deliberately not fixed there — that card's ruling is that a problem the dist boundary was hiding is a finding in its own right, and this one is about how packages/spec is built and published, which is a different blast radius from a QA harness alias.
The fact, measured against the published dist directly
Not through vitest, not through any alias — a bare import() of the built artifacts:
const a = await import('./packages/spec/dist/index.mjs');
const b = await import('./packages/spec/dist/integration/index.mjs');
a.defineConnector === b.defineConnector // false
a.ConnectorSchema === b.ConnectorSchema // falseBoth specifiers are public: @objectstack/spec and @objectstack/spec/integration are entry points in the package's own exports map, and both export these symbols. A third party that imports one from the root and one from the namespace holds two different objects.
Why: the subpath bundles share nothing
Each entry bundle inlines its whole dependency graph. dist/integration/index.mjs opens with exactly one import, and it is external:
import { z } from 'zod';There is no shared internal chunk to import — so ConnectorSchema's definition is emitted independently into every entry bundle that reaches it. Measured on a fresh build:
- 18 entry points in the
exportsmap, each a self-contained bundle. ConnectorSchemais defined in 5 of them (index,integration,kernel,system,cloud).- Largest bundles:
system/index.mjs1.9M,index.mjs1.6M,kernel/index.mjs1.4M,cloud/index.mjs1.3M,api/index.mjs1.2M. packages/spec/disttotals 101M.
Impact — stated honestly, because I did not demonstrate a live break
What is measured is the duplication and the identity split. What I did not do is find a consumer that breaks on it today, so this should be graded rather than assumed:
- Identity comparison across entry points is silently false. Anything keyed on schema identity — a
MaporWeakMapkeyed by a Zod schema, a registry that de-dupes by object reference, aninstanceof-style check — gets two entries where the author expected one. This fails quietly; there is no error, just a lookup miss. zoditself is external, so the usual worst case (two Zod runtimes disagreeing about what aZodTypeis) does not apply here. That meaningfully lowers the severity and is why I am not filing this as a P0.- Payload duplication is real regardless of identity: a consumer importing three namespaces pulls three overlapping copies.
The reason it is worth a card even undemonstrated: this is the shape of bug that is invisible until it isn't, and #7991 is a fresh example of the same family — a property of dist that no test could see, being consumed as if it were a property of the source.
Note on how this surfaced
PR #8129 adds a pin case asserting defineConnector is one object across the root and the integration namespace. Aliased to source it passes (one tree, one copy); unaliased it fails. That pin's purpose there is to guard the alias and to stand watch for a dual instance, and it does both — but the underlying duplication it revealed belongs to the build, not to that harness, which is why it is filed here instead.
Fix directions (not chosen here)
- A — enable code splitting for the multi-entry build so shared modules land in a common chunk that every entry imports. Restores identity and collapses the duplication; needs a check that the emitted chunk layout is compatible with the
exportsmap and with CJS consumers. - B — accept the duplication and remove the ambiguity by making namespace subpaths re-export from the root bundle rather than rebuild it.
- C — decide the identity guarantee is not offered and say so in the package docs, so nobody writes identity-keyed code against it.
A is the contract-first shape: the symbols are documented as the same exports, so they should be the same objects. Which of these is right is a maintainer call about how spec is published, which is why this is filed rather than patched.
Prior art (searched before filing)
Searched open issues for dual-instance / subpath-exports / duplicate-chunk / tsup-code-splitting phrasings against this repo; no open issue covers this. Related but distinct:
packages/qa/downstream-contract— the repo's backward-compatibility gate for@objectstack/specreports 14/14 green against a spec change that breaks its own fixture, because it readsspec/dist#7991 / PR test(qa): make the spec backward-compatibility gate read spec source, not spec dist #8129 — the card this was found under. Samedist-versus-source family, different surface: that one is which tree a test resolves, this one is what the published artifact contains.- downstream-contract's OTHER half — its typecheck — still resolves @objectstack/spec types through dist, so a narrowed export type reads green (measured) #8021 (open) — the same package's typecheck half still resolving spec types through
dist/*.d.ts. - A package with unit tests and no
vitest.config.tslets a stale@objectstack/coredist decide its verdicts — #7668 fixed one, nothing stops the next #7849 / PR ci(test-alias): gate that a unit test judges source, not a sibling's dist #7966,attach-requires-parent-editc3: #4757 multi-delete pin can't execute against the prebuilt@objectstack/core(stale-dist / CI) #7668 / PR test(service-storage): resolve@objectstack/corefrom source so a stale dist can't decide a pin (#7668) #7778 — the test-source-alias gate and its constraint. Both readvitest.config.*; neither looks at bundle layout.
Generated by Claude Code
Generated by Claude Code
Activity
hotlong commentedon Aug 12, 2026
Triage: routed
domain:spec-tooling(build/publish machinery ofpackages/spec— the machine face, not the semantic face), held asfinding, type Task.Grading rationale: measured and real (identity split + 101M dist + 5 independent copies of
ConnectorSchema), but no live break demonstrated — the card itself says so, andzodbeing external removes the worst dual-runtime case. Under the startup-scope lens this does not earn a dispatch slot today; under the AI-error-resistance lens the identity trap is real but currently guarded by the #8129 pin standing watch. Choosing between code-splitting the published artifact (A), root re-export (B), or documenting no-identity-guarantee (C) is a publish-shape decision with CJS-compat blast radius — if this promotes, it promotes toneeds-user-decision, not straight to queue.Re-grade triggers, either of which reopens grading: (1) any consumer measured breaking on cross-entry identity or bundle size in practice; (2) the next time spec's build/publish pipeline is touched for another reason — fold the decision in then, when the surface is already hot.
Generated by Claude Code
hotlong commentedon Aug 12, 2026
The same duplication has a type-axis cost, measured under #8021 (PR #8176) — recording it here rather than filing a twin, since it is this issue's root cause seen from the other side.
#8021 put a
pathsblock inpackages/qa/downstream-contract/tsconfig.jsonso the backward-compatibility gate'stypecheckreadspackages/spec/srcinstead ofpackages/spec/dist/*.d.ts. The obvious way to pin the bare-entry rule looked like the type-level twin of this issue's runtime assertion (expect(fromPackageRoot).toBe(fromNamespace)): anEqualidentity check betweentypeof defineConnectorreached through@objectstack/specand through@objectstack/spec/integration.It had to be rejected on measurement. In the mixed state that check exists to detect — root resolving to
dist, the namespace resolving tosrc, i.e. exactly the two-copies condition this issue describes — tsc had not finished comparing the two zod-derived types after nine minutes and was killed. The same configuration with that one assertion removed completes in seconds, so the cost is the cross-tree structural comparison itself, not the mixed program.So the runtime symptom of the 18-self-contained-entry-bundles layout is "two different function objects"; the type-level symptom is a structural comparison that does not terminate in useful time. Practical consequence for anyone else pinning this invariant: the identity assertion is available on the runtime axis and not available on the type axis. PR #8176 pins the bare-entry rule by simulating tsc's
pathsresolution instead, the waycheck:test-source-aliaspins the Vite side.Generated by Claude Code
Generated by Claude Code
hotlong commentedon Aug 13, 2026
State-machine migration, maintainer-authorized (2026-08-13, live triage session: 「我授权你先迁标签」; semantics on #8449): this card is a graded hold — verdict and re-grade triggers are in the grading comments above — so
finding→pm:on-hold. Verdict, triggers, domain unchanged.Generated by Claude Code
os-zhuang commentedon Aug 19, 2026
Evidence update, not a release (triage seat, session
session_014qTKTqjme5Fp5BH9iRmy6t): #10031 measured a consumer-side bundle-size cost of this package's publish shape (+237.3 KB per subpath import, no tree-shaking, nosideEffectsfield) — adjacent to this card's Restart-when second arm but a deliberate consumer trade (objectui#5287 pinned a local copy), not a break, so the hold stands. #10031 is now in the decision inbox with a recommendation to decide both publish-pipeline questions together; if that ruling lands, it supersedes this hold — the implementing seat should treat both cards as one worksite.Generated by Claude Code
objectstack-fleet commentedon Sep 23, 2026
关
not_planned—— 维护者逐张复核 on-hold 卡时同意关闭;体积那一半已解决,身份那一半没有实际受害者分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ),2026-09-23T08:17Z。维护者 2026-09-23 在分诊会话里逐张复核pm:on-hold卡,对第三组的回复原文:「第三组 同意」。 本卡在那一组里的建议是关闭。呈给维护者的事实(本地
main上核对过)@objectstack/specsubpath pulls its whole module graph — measured +237 KB minified, nothing tree-shakes #10031 处理:packages/spec/package.json现在带"sideEffects": false,packages/spec/tsup.config.ts里的pureSchemaConstruction插件给延迟构造的 schema 标了 pure,使用方的打包器可以裁掉没用到的部分。spec: importing one function from a@objectstack/specsubpath pulls its whole module graph — measured +237 KB minified, nothing tree-shakes #10031 已关闭。splitting: false没变,18 个入口依然各自打包,从@objectstack/spec和从@objectstack/spec/integration拿到的ConnectorSchema仍是两个不同的对象。但只有按对象身份做判断的代码才会受影响(zod是外部依赖,不会出现两套运行时),挂起 6 周,没有任何使用方出问题。@objectstack/specsubpath pulls its whole module graph — measured +237 KB minified, nothing tree-shakes #10031、@objectstack/spec/sharedcosts a consumer 60.1 KB gzipped to import one string fold — the /meta spelling contract has no fine-grained export #10096、[seam→spec]@objectstack/spec@17.1.0statically importspg-connection-stringfrom six of its sixteen entry points, with nobrowserexport condition — objectui's site build is red onmain#11072),每次动手的人都选择不带上本卡 ——@objectstack/spec/sharedcosts a consumer 60.1 KB gzipped to import one string fold — the /meta spelling contract has no fine-grained export #10096 甚至直接在tsup.config.ts第 91 行写了「@objectstack/specships 18 self-contained entry bundles with no shared chunks, so a consumer mixing entry points gets differentConnectorSchema/defineConnectorobjects (measured) #8133 stays on hold」。重开条件
有使用方实测到因为跨入口身份不一致而出错(例如以 schema 对象作键的
Map/WeakMap查不到),或者因为包体积出了真实问题。届时按正文 A/B/C 三个方向选一个。关闭理由:
not_planned,同时摘掉pm:on-hold。Generated by Claude Code
3 remaining items
objectstack-fleet commentedon Oct 23, 2026
Reopening: this card's own reopen condition has been met (a measured, user-visible bundle-size cost)
Maintainer-directed session
session_01FLzfC4GSjCxa5gYJky3BAg(2026-10-23T17:01Z), turning the 2026-10-23 whole-project assessment into cards. Maintainer, verbatim: 「使用 pm-dispatch 技能创建 issues」, then 「从业务角度评估合理性」. ⛔ Not a claim. I reopen this card rather than file a new one, per the gate's no-rebuild rule.The close comment (2026-09-23T08:17Z) set the reopen condition: 「或者因为包体积出了真实问题」. It also said 「体积那一半已由 #10031 处理」. The measurements below show both that the cost is real and that #10031 does not reach it.
Business case
@objectstack/specinto its first load.Bundle Analysis, run 39978481965, push tomainat 3a73c07, 2026-10-23):vendor-objectstackalone is 1,575.1 KB, almost half of it.@objectstack/specsubpath pulls its whole module graph — measured +237 KB minified, nothing tree-shakes #10031 does not fix it:sideEffects: falseand thepureSchemaConstructionplugin let a bundler drop schemas within one entry. They cannot merge the copies across entries. Withsplitting: false(packages/spec/tsup.config.ts:320, and the browser pass beside it), each subpath bundle carries its own copy of every schema it reaches. For example, in the 18.0.0 tarballvar FieldSchema =is defined separately in 9 of the main ESMindex.mjsentries, and in 14 counting the browser variants.@objectstack/spec@18.0.0from npm; esbuild withbundle,minifyandplatform: browser; gzip level 9; zod bundled in both arms):dist, they come to 1,542 KB gzip.srcentries) come to 452 KB gzip. That is −71%, about 1.09 MB less on the Console's first load.What would change
Emit shared chunks for the ESM and browser builds (
splitting: true, or one internal module graph that the subpath entries re-export). The CJS build can be judged on its own. This also resolves the identity half (a.ConnectorSchema === b.ConnectorSchema). It changesdistfile layout, not theexportsmap.Done when
Bundle Analysison a pin that carries the change,vendor-objectstackis measured well below 1,575 KB. Name the number in the PR.a.defineConnector === b.defineConnectorholds across the root and/integrationentries.exportsmap is unchanged, and the declaration build is unaffected.Triage: please grade this and queue it.
domain:specis kept from before.Generated by Claude Code
objectstack-fleet commentedon Oct 24, 2026
Claim: PM loop round 3
Session:
session_01PC4NPXPgPmpDRG9DdDnyXTAccount:
sunhaolin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-8133-spec-shared-chunksWorktree:
objectstack-issue-8133Domain:
domain:specSeat:
domain:spec#2(seat post #18549)File surface:
packages/spec/tsup.config.ts: shared chunks for the ESM and browser builds (splitting: true, or one internal module graph the subpath entries re-export;splitting: falseat:320and:343today), with the CJS build judged on its own. Also the tests or gates that pin the dist shape (check:dual-build-cjs-loadsand its kin), and one changeset.changeset/8133-spec-shared-chunks.md(@objectstack/specpatch, non-protocol). Unchanged: theexportsmap inpackages/spec/package.jsonand the declaration build. (stop on breach; explain in the report)Container & model:
L,mode:cloud(thepackages/specbuild pipeline: full builds, every consumer),model: default (TIER_DEFAULT; dispatch-gates --tier for this surface: no path-derived mandate),effort: xhigh(every consumer's first load). Build config, not a schema: the seat's review is atTIER_DEFAULT, and a contract review is owed only if the diff reachespackages/spec/src/**.Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Ruling-ref: none; reopened on its own reopen condition (
6370298049, a maintainer-directed session, with a measured −71% / about 1.09 MB gzip on the Console's first load), graded p2 by triageThread-read: 6370298049
Serial constraints cleared: none. No open PR touches these files (all 18 open PRs' file lists read 2026-10-24T22:26Z), and no open
pm:dispatchedclaim declares them. PR #25640 (Version Packages) touchespackages/spec/package.jsonfor the version only; this card leaves that file alone.Premise: holds on
origin/main47af3dde42.splitting: falseattsup.config.ts:320and:343, 21exportsentries,sideEffects: false. The card's measurement:a.defineConnector !== b.defineConnectoracross the root and/integrationentries, and duplicated schema definitions per entry.Done when (the card's own):
vendor-objectstackin objectui'sBundle Analysison a pin carrying the change is measured well below 1,575 KB and the number is named;a.defineConnector === b.defineConnector; theexportsmap and the declaration build are unchanged. The objectui ceiling re-baseline is objectui's, in its pin move.Generated by Claude Code
objectstack-fleet commentedon Oct 24, 2026
Dispatched · round 3 ·
domain:specseat 2 · 2026-10-24T22:35Zmode:cloud, cloud sessionsession_01Q3XCv7AXcUSSD479Vt1LXy(created throughcreate_session), on branchclaude/issue-8133-spec-shared-chunks. The claim6390321384stays the identity.6370298049verbatim (the change and its done-when), the before/after measurements to take (identity, per-entry duplication,distsize, the 232-symbol esbuild experiment), thedistreaders that must stay green, the deep-import risk to measure in objectui and HotCRM, theWrites:line. The objectuiBundle Analysisnumber belongs to objectui's pin move and is not claimed here.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Pointer (not a claim) · objectui
domain:uiseat 4 · 2026-10-25T03:15ZA consumer measurement for this card's done-when, from objectui#13447 (report
6392630038on that card). Console production build at objectuimain6f629a7, with the spec pinned by its.objectstack-sha:vendor-objectstackis 1,642,324 B gz, and spec subpath bundles are 92.6% of its rendered bytes./system~339 KB, root ~298 KB,/kernel~246 KB,/ui~180 KB,/data~158 KB,/shared~142 KB,/api~92 KB,/automation~51 KB,/security~14 KB./system's source bytes, 52% of/kernel's and 20% of/api's.@objectstack/formulaand@objectstack/clientthemselves pull root,/dataand/apiinto the same chunk. Those stay eager whatever objectui imports, so only a shared-chunk build removes their duplication.SystemFieldNamemeasured +382 B, and/dataexports noSystemFieldName.When this card lands and objectui's pin moves past it, objectui#13447 re-measures the same build and lowers its
MAX_EAGER_CLOSURE_GZIP_BYTESby the measured drop.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
os-dev-report
{ "issue": 8133, "status": "done", "branch": "claude/issue-8133-spec-shared-chunks", "pr": "https://github.com/objectstack-ai/objectstack/pull/25748", "session": "session_01Q3XCv7AXcUSSD479Vt1LXy", "premise_still_valid": true, "summary": "Premise re-measured at BASE 47af3dd and it holds: root vs /integration defineConnector is false in both ESM and CJS, FieldSchema is defined in 14 .mjs files, dist is 123.5M. The PM's mechanism assumption (`splitting: true` at :320 and :343) was measured and REJECTED. esbuild assigns modules to chunks by file-level reachability, so ./shared and ./migrations (no browser condition) linked the pg-connection-string chunk; that is the #11072 breakage, and the experiment failed with Could not resolve fs. Two separate split passes would also have kept two copies of everything the Node and browser graphs share. Implemented instead in packages/spec/tsup.config.ts only: ONE esbuild graph (ESM+CJS) for all 24 outputs. The browser swap applies graph-wide. The Node outputs of the 5 browser-conditioned entries come from a node-side namespace copy of just the modules that reach the pg seam (28 of 459 at BASE). That set is measured per build by a metafile pre-pass, which refuses if the seam disappears. Results at 5a40a420: defineConnector root===/integration true in ESM and CJS; 119/119 shared exports identical under browser, 114/119 under Node (the 5 are root vs /shared metadata-collection normalizers on the seam path), against 0/119 at BASE; FieldSchema defined in 1 file; dist 53.5M; the objectui import experiment is 1628.4 KB to 603.6 KB gzip. The exports map is untouched, and the DTS-pass options are identical to BASE.", "tests": "HEAD 19a8800a: root `pnpm test` (turbo test + test:repo, 152 tasks = every package reading spec through dist) Tasks 152 successful/152, lock VERDICT command-exit 0. The run was interrupted by a worker restart and resumed from turbo cache (125 cached, 27 executed); no failure in either run. Within it: dogfood Test Files 295 passed/3 skipped (298), Tests 2520 passed/18 skipped; cli unit+integration 500/501 files (1 skipped), 6291 tests passed; downstream-contract 3 files/31 tests passed; spec test 721/721, test:repo 79/79. `pnpm build` 76/76 tasks, examples included. spec typecheck exit 0, including the test layer that compiles tsup.config.ts. HEAD 5a40a420 (after merging origin/main c61f75d1): spec test 720 passed, 1 failed (721). The failing file is scripts/liveness/check-liveness.test.ts (23 tests), the same main-red as check:liveness; not this diff. Ablations through scripts/ablation-replace.mjs, each mutation verified on disk and restored blob-identical to HEAD 9c9b83dc, predicted then observed. A1 browser swap off: predicted red on rule 2, observed red with 14 problems (all 10 dist/browser bundles plus ./shared and ./migrations in both formats); a first A1 attempt was refused by the tool as a no-op, so nothing ran. A2 node-side twinning off: predicted positive-control red, observed POSITIVE CONTROL FAILED. A3 seam regex mismatched: predicted build refusal, observed the one-module-graph refusal in both the ESM and CJS runs. Restore leg rebuilt; gate green; measurements identical.", "gates": "Derivation: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, 72 commands. At 19a8800a: 72/72 exit 0; check-plugin-teardown-shape --self-test first exited 3 on a shallow clone and exited 0 after fetching its pinned fixture commit. At 5a40a420: 71 exit 0 and 1 exit 1 (pnpm --filter @objectstack/spec run check:liveness, main-red). --ran reconciliation at 5a40a420: 72 derived, 72 run, 0 NOT-MEASURED, 0 UNRUN (a derived zero from 72 recorded exit codes). Dist-reading gates at 5a40a420, each exit 0: check:browser-reachable-entries (48 bundles; 10 server-only links, all on the Node side), check:dual-build-cjs-loads, check:lean-entry-closure, check:dts-closure, check:sourcemap-no-sources-content, check:published-files, check:dev-prereqs (local-only; after rebuilding plugin-auth and organizations, which the merge moved). check-governed-merges --pr 25748: 0 of 4 paths governed, 268 changed lines. CI check-runs on 25748: in_progress at report time, not awaited per the role file.", "dogfood_battery": "19a8800a · inside the root `pnpm test` lock run, VERDICT command-exit 0 · Test Files 295/298 passed (3 skipped) · Tests 2520/2538 passed (18 skipped) · no failures. Run although neither trigger arm applies (no `!` in the title, no narrowing arm), because the dispatch named the battery.", "mcp_calls": "0. No MCP GitHub tool was called. Card and PR reads were anonymous REST GETs.", "api_writes": "2 relay strokes (POST /repos/objectstack-ai/objectstack/dispatches): 1 pr_create (POST /pulls plus the assignees write on issues/25748) and this os-dev-report comment through scripts/pm/post-stamped.mjs. Plus git push (not REST): 3 pushes, 47af3dd to f6933735 to 19a8800a to 5a40a420.", "open_questions": [ { "question": "Three comments under packages/spec/src/** now misdescribe the layout: src/index.ts:73 ('Every subpath entry is a self-contained bundle'); src/conversions/registry.ts:18144 ('Each published entry is one flat file (tsup.config.ts, splitting: false)'; the PURE reasoning it supports still holds per chunk); src/api/package-api-assembled.zod.ts:40 (a historical sentence, rendered into the generated content/docs/references/api/package-api-assembled.mdx). The dispatch puts src/** out of scope, so they are not edited.", "options": ["A: a comment-only follow-up PR touching src (contract-review tier per the claim; gen:docs for the third)", "B: leave them; the PR body records them"], "recommendation": "A. Declared-vs-actual drift in comments is what the next author reasons from (long-term axis); the cost is one small reviewed PR, and no capability is added (startup axis)." }, { "question": "Under Node, 5 exports still differ between @objectstack/spec and @objectstack/spec/shared: MAP_SUPPORTED_FIELDS, METADATA_ALIASES, normalizeMetadataCollection, normalizePluginMetadata, normalizeStackInput. They live in shared/metadata-collection.zod.ts, which reaches the pg seam, so the root's Node output carries the node-side copy. Making them one object would need /shared to get a browser condition (an exports-map change, out of scope) or the module to stop reaching the driver configs (a src change).", "options": ["A: accept; no consumer compares them by identity (business axis: none measured)", "B: a later card for a src split so metadata-collection no longer reaches the driver configs"], "recommendation": "A. There is no measured consumer of identity on these 5 (business axis), the browser view is already 119/119, and the alternatives widen into the contract (startup axis)." }, { "question": "Implementation trade-off recorded: CJS also takes shared chunks. tsup with treeshake:true converts each esbuild ESM chunk to CJS through Rollup, so this is not esbuild's experimental cjs-splitting path. Measured: 0 cycles across the chunk graph (1158 CJS edges), check:dual-build-cjs-loads green. No new gate was added for chunk-graph acyclicity (new-gate default: no); a cyclic future would surface as a red check:dual-build-cjs-loads.", "options": ["A: as shipped", "B: CJS stays per-entry (a second graph, so CJS identity is lost again)"], "recommendation": "A. CJS consumers get identity too (contract-first), and the existing gate already fails loudly on the failure mode." } ], "out_of_scope_findings": [ "class: a · reach: named producer — main-red: `pnpm --filter @objectstack/spec run check:liveness` and packages/spec/scripts/liveness/check-liveness.test.ts (23 tests) are red on origin/main c61f75d1 and still on f9a1e93f; they were green at this branch's pre-merge head 19a8800a · evidence: ledger row translation/flows.screens cites packages/services/service-automation/src/engine.ts#renderFlowTextSlot, which named `screens` only in a comment ('two screens down') that 0189524a (#25734, resumeInternal moved into run-resume.ts) took away; renderFlowTextSlot now lives in node-text-rendering.ts, which never names `screens` either · proposed patch: drop that clause from the row's evidence (builtin/screen-nodes.ts#registerScreenNodes, already cited, is the reader that spells the key) · dedupe words: liveness, flows.screens, renderFlowTextSlot, run-resume, citation rot", "carrier: none — objectui `Bundle Analysis` vendor-objectstack on a pin carrying this change is NOT MEASURED here; it comes with objectui's pin move, which also re-baselines its ceilings. The local stand-in is 603.6 KB gzip for objectui's 256 value imports (BASE 1628.4 KB; one-graph src control 538.5 KB). noted, not filed", "carrier: none — deep-path consumers measured: objectui a3c0da9 has 3 `@objectstack/spec/dist/index.{js,mjs}` strings, all regex probe inputs in scripts/__tests__/vite-objectstack-spec-dist.test.ts:481/946/1165 and vite-objectstack-client-dist.test.ts:398, not imports; its objectstack-pin.mjs hard-links the whole package tree, so chunks travel. HotCRM a4b3560: zero dist/src/json-schema deep imports. noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Landed ·
domain:specseat 2 (seat post #18549) ·sunhaolin· sessionsession_01PC4NPXPgPmpDRG9DdDnyXT· 2026-10-25T15:04Z3a2d38c6e2. ACCEPT6393800730, atTIER_DEFAULT: the build config reaches nopackages/spec/src/**, so no contract review was owed. The landing head5e93810005carriedmainwith #25796 (liveness) andc1bb4b5b9a(pinyin) merged in;ci-failureread GREEN, 48/48, andcheck-governed-mergesread NOT governedgh-readonly-queue/main/pr-25748-*matching-refs: 0 refs)origin/main3a2d38c6e2;packages/spec/tsup.config.tsnamesoneModuleGraph(4 hits) and builds withsplitting: trueState: the card closed
completedon the merge (Fixes #8133).pm:dispatchedis removed in this stroke, and the dev's cloud sessionsession_01Q3XCv7AXcUSSD479Vt1LXyis archived.6399261373): the objectui pin move that measuresvendor-objectstackunderBundle Analysisand re-baselines the eager-closure ceilings once. This is this card's first done-when; upstream's local stand-in is 1,628.4 → 603.6 KB gzip.packages/spec/src/**comments that still describe the per-entry layout./shared(open question 2, A).Generated by Claude Code