Repository navigation
fix(types): AnyComponentSchema prints every category union by name, so its declaration leaves TypeScript's serialization ceiling (objectui#11573) - #11590
Conversation
… lists (objectui#11573) Each of the sixteen category unions composed into `AnyComponentSchema` now has a named exported interface in its own module that extends the union's inferred type and adds no member, so declaration emit prints a reference to it instead of re-serializing every union's body inside `AnyComponentSchema`. The values and the types a consumer reads are unchanged; only the printed `.d.ts` text moves. Claude-Session: https://claude.ai/code/session_01CPvhwGcirXqBGEdPSb72TZ Co-authored-by: Claude <noreply@anthropic.com>
…very member's named/inline status (objectui#11573) Reads the node builder's own counter for `AnyComponentSchema`'s declaration (declaration emit's flags, through `checker.typeToTypeNode`'s run-time `maximumLength` parameter, with a lit control that the parameter is honoured), fails past a tenth of the ceiling below it, enumerates every member as named or inline, and pins with compile-time rows that each named category-union type is its union. Claude-Session: https://claude.ai/code/session_01CPvhwGcirXqBGEdPSb72TZ Co-authored-by: Claude <noreply@anthropic.com>
… (objectui#11573) Claude-Session: https://claude.ai/code/session_01CPvhwGcirXqBGEdPSb72TZ Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: Inputs, and nothing else: card objectui#11573 (body; triage 5972917927; claim 5975377899; os-dev-report 5975890312), PR #11590 (body, its 18-file list, the net diff against ① Derived judgmentsAccept set — unchanged. RIGHT.
Public surface — per the package's
The pin (
Card acceptance — met.
Repo rules on the diff — clean.
Gate readings on the head (read at 2026-10-04T02:57Z; each conclusion recorded as read;
② Semver levelClause-②: no — the diff relaxes no accept set (A1–A3) and widens no public surface (P1–P4). The claim declared
③ Boundary flagsDev deviations (os-dev-report 5975890312):
Open questions:
Out-of-scope findings (dev's carriers, confirmed or re-routed):
Implemented-by: VERDICT: PASS Generated by Claude Code |
… and a bare --pr beside a PM_SWEEP_REPO naming another repository (objectstack-ai#21690) Fixes objectstack-ai#21675 Clause-②: no `scripts/pm/check-governed-merges.mjs` now has a closed argument set for each mode. If a run passes a flag its mode does not read, the tool refuses with a usage error (exit 1) and names the flag. It does this before any git read, network read or child process. A bare `--pr N` is refused when `PM_SWEEP_REPO` names a repository other than the one a bare number answers. That refusal prescribes the documented `--pr OWNER/REPO#N` spelling. No new `--repo` meaning was added: `--repo` is refused like any other flag the tool does not read, and the refusal spells out the qualified number. The exit code table is unchanged, because every new refusal uses the existing code 1. `--test`, `--branch`, the sweep and `--self-test` answer exactly as before for every argument list they accepted before. One file changed: `scripts/pm/check-governed-merges.mjs` (+383 / -7). ## The ruling this implements (triage comment on the card, quoted) > **Direction: the card's second option, which adds no new spelling.** > - An unrecognised flag is a usage refusal (exit 1), as `label-write.mjs`, `post-stamped.mjs` and `issue-create.mjs` already refuse. > - A bare `--pr N` is refused when `--repo` or `PM_SWEEP_REPO` names any repository other than objectstack. The refusal prescribes the documented `owner/repo#N` spelling. > - ⛔ No new `--repo` meaning for this tool: one spelling, the documented one. > - **Pins (one self-test row per refusal):** an unknown flag is refused; `--pr N --repo objectstack-ai/objectui` is refused; `PM_SWEEP_REPO=objectstack-ai/objectui --pr N` is refused; `--pr objectstack-ai/objectui#N` answers as today. ## Reading 1: the card's four invocations, before and after Before: base `7d0781482d` (`origin/main` at worktree creation). After: head `6854ff6062`. Each `--pr` row made real read-only `GET`s against the GitHub API. Angle-bracket placeholders in the tool's usage text are written below as `N`, `OWNER/REPO` and `PATH`, because the body sanitizer removes angle-bracket fragments. | # | invocation | before (`7d0781482d`) | after (`6854ff6062`) | |:--|:--|:--|:--| | 1 | `--pr 11590 --repo objectstack-ai/objectui` | exit 0, read `objectstack-ai/objectstack/pulls/11590` (7 files), ✅ NOT governed | exit 1, refused, no read, prescribes `--pr objectstack-ai/objectui#11590` | | 2 | `PM_SWEEP_REPO=objectstack-ai/objectui` + `--pr 11590` | exit 0, same objectstack PR (7 files), ✅ NOT governed | exit 1, refused before the first API read, prescribes both qualified spellings | | 3 | `--pr 11590 --bogus-flag x` | exit 0, same objectstack PR (7 files), ✅ NOT governed | exit 1, refused by name, no read | | 4 | `--pr objectstack-ai/objectui#11590` | exit 0, read `objectstack-ai/objectui/pulls/11590` (18 files), ✅ NOT governed | exit 0, **byte-identical** stdout and stderr to before (`diff` empty); also identical with `PM_SWEEP_REPO=objectstack-ai/objectui` set | Before, rows 1 to 3 (all three printed the same thing): ``` derived from GET /repos/objectstack-ai/objectstack/pulls/11590/files (three-dot by construction): 7 path(s) from 7 changed file(s), over 1 page(s). ✅ NOT governed — ordinary queue landing applies to a PR with exactly this file list. ``` After, row 1: ``` ❌ `--repo` is not a flag --pr reads. An unrecognised flag is REFUSED, never ignored: an ignored flag still lets the run print a verdict, about a question nobody asked, under the same ✅ as a real answer. This tool takes no `--repo`, and a bare `--pr 11590` answers THIS checkout's own repository whatever `--repo` names. Name the repository inside --pr, the one spelling it takes: node scripts/pm/check-governed-merges.mjs --pr objectstack-ai/objectui#11590 (usage block follows: the active mode's line, then every mode's line) ``` After, row 2: ``` ❌ --pr 11590 is a bare number, and a bare number answers THIS checkout's own repository (objectstack-ai/objectstack) — but PM_SWEEP_REPO names objectstack-ai/objectui. This tool takes no repository from the environment, so the run is refused rather than answered about a different PR in a different repository. Name the repository inside --pr, the one spelling it takes: node scripts/pm/check-governed-merges.mjs --pr objectstack-ai/objectui#11590 or, if this checkout's own PR is the one you mean: node scripts/pm/check-governed-merges.mjs --pr objectstack-ai#11590 ``` After, row 3: ``` ❌ `--bogus-flag` is not a flag --pr reads. An unrecognised flag is REFUSED, never ignored: an ignored flag still lets the run print a verdict, about a question nobody asked, under the same ✅ as a real answer. --pr reads: node scripts/pm/check-governed-merges.mjs --pr N | --pr OWNER/REPO#N [--root PATH] [--json] ``` Two more invocations show the same problem through a flag that belongs to another mode. Both were measured on the base and are closed by the per-mode sets: - `--pr 11590 --repos objectui`: before, exit 0, read objectstack's PR 11590. After, exit 1, ``--repos` is not a flag --pr reads``. - `--test src/x.ts --since 7d`: before, exit 0 with `0 of 2 path(s)`, because `7d` had joined the path list. After, exit 1, ``--since` is not a flag --test reads``. ## Reading 2: self-test cases and battery floors, before and after | | base `7d0781482d` | head `6854ff6062` | |:--|:--|:--| | `node scripts/pm/check-governed-merges.mjs --self-test` | `✓ … 454 assertions`, exit 0 | `✓ … 476 assertions`, exit 0 | | declared batteries / `SELF_TEST_BATTERY_FLOOR` | 31 / 31 | 32 / 32 | | new battery `⭐ the argv is CLOSED: …` | (none) | 22 cases registered, floor 22 | How the batteries and floors were handled: the rows pin a different predicate from the ones in the existing `objectstack-ai#17003` battery. That battery is about how the file list is derived. These rows are about which arguments a run may carry at all. So they get a battery of their own instead of raising another battery's count. As AGENTS.md requires ("pin battery NAMES, never one total"), the roster floor moves from 31 to 32 in the same edit. If the new battery were deleted from the roster, it would fail at the floor instead of disappearing without a trace. The battery floor equals the cases the battery registers (22): 454 + 22 = 476. Each ruled pin has its own row, and the API is a fake on 127.0.0.1 (`GITHUB_API_URL`) that records every request. The child process gets both token variables blanked, `PM_SWEEP_REPO` cleared and `NO_PROXY` set for loopback, so the self-test still makes no external connection: - unknown flag: `⭐ e2e-pr-N-with-a-bogus-flag-exits-1-names-it-prints-no-verdict-and-READS-NOTHING`, plus pure rows for the walker, flags from another mode, `--since=7d` (the refusal prescribes `--since 7d`), and `--pr --bogus` (a flag is never taken as a value) - `--pr N --repo objectstack-ai/objectui`: `⭐ e2e-pr-N---repo-objectui-exits-1-prescribes---pr-objectui#N-and-READS-NOTHING`, plus pure rows. A governed repo id after `--repo` is written out as its slug. `--repo` naming objectstack itself is still refused, so no new meaning exists. - `PM_SWEEP_REPO=objectstack-ai/objectui --pr N`: `⭐ e2e-PM_SWEEP_REPO-objectui-with-a-bare---pr-N-exits-1-prescribes---pr-objectui#N-and-READS-NOTHING`, plus pure rows. If the variable names this checkout's own repository (in any letter case), or is blank or unset, nothing is refused. - `--pr objectstack-ai/objectui#N` answers as today: `⭐ e2e---pr-objectui#N-answers-as-today-NOT-governed-on-exit-0-every-read-from-objectuis-PR-N` (exactly 3 reads, all under `/repos/objectstack-ai/objectui/`), and `and-PM_SWEEP_REPO-beside-the-qualified-spelling-changes-not-one-byte-of-the-answer`. - Control and preservation rows: - `PM_SWEEP_REPO` naming objectstack with a bare number still answers from objectstack. - Every argument list the earlier batteries spawn still passes. This includes `--additions`/`--deletions` beside `--branch`, so that mode's own "two readings" refusal still fires. - Every usage example the header gives (13, read from the header itself) still passes. - Every flag a mode's usage line names is a flag that mode reads. ### Ablations: each refusal's pin turns red, and the file is restored to the HEAD blob Each ablation ran through `node scripts/ablation-replace.mjs --file ABS_PATH --anchor … --replacement … -- node ABS_PATH --self-test`. The fix was committed first, each anchor count went from 1 to 0, and each restore reported `ok restored: blob == HEAD (89af2f9) and git diff HEAD is empty`, which was checked again independently after each leg. | leg | mutation | self-test | rows that turned red | |:--|:--|:--|:--| | A1 unknown flag | `if (unreadRefusal !== null)` changed to `if (false && …)` in `main()` | exit 1, 3 failures | e2e bogus-flag, e2e `--repo` and e2e `--test … --since`: each `status=0`, and the first two read `/repos/objectstack-ai/objectstack/pulls/11590…`, which is the card's measured wrong answer | | A2 `--repo` | `'--repo': 'value'` added to the `--pr` table (`--repo` silently accepted) | exit 1, 3 failures | the pure `--repo` prescription row, the "no new spelling" row, and e2e `--repo` (`status=0`, read objectstack's PR) | | A3 `PM_SWEEP_REPO` | `if (ambiguous !== null)` changed to `if (false && …)` in `runPullMode` | exit 1, 1 failure | e2e `PM_SWEEP_REPO` (`status=0`, read objectstack's PR) | | A4 qualified spelling | `bareTargetRefusal` also refuses a qualified `--pr` (over-refusal) | exit 1, 3 failures | the pure qualified row, e2e "answers as today" (`status=1`, `reads=[]`), and the byte-identical row | ## Gates (run at head `6854ff6062`) `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no path argument) derived 32 commands from the change set: 1 path against merge base `7d0781482`, +383 / -7. That list is identical to the one in the dispatch. All 31 commands outside the lock exited 0, and each printed its own pass line. Among them: `pnpm check:pm-governed-merges` (476 assertions), `check-scripts-symbol-anchors` (3760 anchors resolve), `check:entry-guard` (221 export bindings, all inert on import), `check-self-test-wired` and `check-self-test-workflow-commands`, `check-comment-mask-corpus` (8140 files, 0 disagree) and `check:nul-bytes` (OK). `pnpm check:pm-dispatch-gates` ran under the shared verify lock and passed: `VERDICT command-exit 0`, `✓ check:pm-dispatch-gates --self-test: the exit contract holds in all three directions.` and `✓ dispatch-gates self-test: 1976 cases pass.` It held the lock for 1224s (20m24s). The box was shared, and unlocked sibling work ran alongside it. The first attempt was still queued behind another seat's run of the same gate when its budget ran out (exit 99, slot kept). The resumed slot acquired after 476s more. Reconciliation: `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran.list` (one `COMMAND :: exit CODE` line per command, recorded as each one ran) printed `✓ dispatch-gates --ran: 32 derived famil(ies) accounted for — 32 run, 0 NOT-MEASURED (a DERIVED zero — all 32 recorded an exit code and none of them is 3).` Lint, narrowed and stated as such: `eslint --no-inline-config --format json scripts/pm/check-governed-merges.mjs` checked 1 file and found 0 errors and 0 warnings. The resolved config for the file (`--print-config`) applies 2 rules (`no-restricted-imports`, `comment-swallow/no-code-inside-block-comment`) with `parserOptions` limited to `ecmaVersion`/`sourceType`. Type-aware linting is off (no `project`/`projectService` anywhere in `eslint.config.mjs`), so this diff cannot change the lint result for any file it does not touch. The repo-wide `pnpm lint` is left to CI. ## Acceptance notes - **How "objectstack" in the ruling is read.** The `PM_SWEEP_REPO` comparison is made against the repository a bare number actually answers, which is the slug this checkout's `origin` parses to. That is `objectstack-ai/objectstack` in every run from this repo, so the behaviour is exactly the ruling's. It differs only under `--root` pointing at another checkout, where it also refuses the reverse mismatch. The comparison ignores letter case. A malformed `PM_SWEEP_REPO` value also refuses, and the prescription then uses an `OWNER/REPO` placeholder. - **Why the sets are per mode and not one list for the whole tool.** With a single tool-wide list, `--pr 11590 --repos objectui` would still answer about objectstack's PR, which is the same class of wrong answer. Both cases were measured on the base (Reading 1). `--additions`/`--deletions` stay readable to `--pr`/`--branch` only so that those modes' existing, more specific refusal keeps its own words. - **Where the refusals happen.** The closed-set refusal happens in `main()`, before the proxy re-exec, so a refused run starts no child process. The `PM_SWEEP_REPO` refusal happens in `runPullMode` beside the existing `--pr` argument errors. In a proxied container that means after the one re-exec, but still before any API read. - **What this does not cover.** - `GITHUB_REPOSITORY` is not read: the ruling names two spellings. The board tools' `resolveSweepRepo` falls back to it, but nothing here adopts that. - `--self-test` keeps its own arguments. Its exit 1 means "a finding about this file", and it takes the `--fixture-child` marker. - Positional tokens no mode consumes (`--pr 42 43`), and a repeated single-value flag (`--pr 1 --pr 2` reads the first), are still accepted. The ruling covers flags, and these were read from the code but not measured. Recorded here, not filed. - No changeset: `scripts/pm/**` belongs to no published package (`skip-changeset`). --- _Generated by [Claude Code](https://claude.ai/code/session_01CB6W87z22K2yjUCDyVrJRk)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Fixes #11573
Clause-②: yes
objectstack
mainwas not over the ceiling when this was measured. At objectui BASE7a7660cagainst objectstackmain1a23054,AnyComponentSchema's declaration read 992,625 on TypeScript's own counter (TypeScript 6.0.3). The ceiling is 1,000,000, so the headroom was 7,375 (0.74%), smaller than the card's 9,426. With this PR the declaration reads 12,294, and the reading is the same against both specs.What changed
AnyComponentSchemalists now each have a named type. It is an exported interface in the union's own module. It extends the union's inferred type and adds no member:optionsis restated by reference only because an empty interface is refused by lint. The value is unchanged: the union is bound to a module-privateXSchemaInferredconst, andexport const XSchema: XZodType = XSchemaInferred.LayoutZodType,FormComponentZodType,DataDisplayZodType,FeedbackZodType,DisclosureZodType,OverlayZodType,NavigationZodType,ComplexZodType,ObjectQLComponentZodType,ObjectQLPublicBlockComponentZodType,CRUDComponentZodType,ReportUnionZodType,ViewComponentZodType,AIComponentZodType,DesignerUnionZodType,PublicBlockComponentZodType.ZodTypesuffix followsReportNodeZodType/DrillDownReportZodType, because theXSchemaTypenames in these files arez.inferaliases.AnyComponentSchemainindex.zod.ts, and each union site's docblock points to it. TheRecordLineItemsBlockSchemaTypedocblock inpublic-blocks.zod.tssaid the headroom was "tracked in objectui#11573" and used the present tense for the inline print. It now points to the pin, and the inline print is in the past tense.packages/types/src/__tests__/any-component-emit-headroom-11573.test.ts. It sits besideany-component-union-fanout.test.ts. Nothing in any workflow changed..changeset/11573-any-component-emit-headroom.md, apatchfor@object-ui/types.The printed
.d.tstext of existing exports changes; the types do notAnyComponentSchema's declaration indist/zod/index.zod.d.tsused to spell out every union inline. It now printsimport("./layout.zod.js").LayoutZodTypeand its siblings. The sixteen unions' own declarations now readexport declare const LayoutSchema: LayoutZodType;, and the union's body is printed once, on the privatedeclare const LayoutSchemaInferred.dist/zod/index.zod.d.tswent from 2,300,932 to 1,232,912 bytes.dist/zod/*.d.tstotal went from 4,953,529 to 3,895,071 bytes.node_modules, so they read the samezodand@objectstack/spec.7a7660cdist vs this branch's dist (both built against the installed spec): 56 compile-time rows undertsc --strict, exit 0.AnyComponentSchemaandStrictAnyComponentSchema:Equalonz.input,Equalonz.output, and mutual assignability of the schema types.Equalon the return types ofvalidateSchemaandsafeValidateSchema.@object-ui/types/zodentry. Declaration emit can reference a name from another module only if that module exports it. The barrelindex.zod.tsre-exports none of them, so nothing new is importable.Clause-②: yesabove is copied from the claim. The claim expected the names to widen the./zodsurface and said the review would read the answer from the diff. The answer is that the barrel is unchanged.Readings (TypeScript's
approximateLength, worktree TypeScript 6.0.3)@objectstack/specAnyComponentSchema(counter)7a7660c7a7660cmain1a2305447c8c67(named)47c8c67(named)main1a2305447c8c67,DisclosureSchemaalone un-named (ablation)approximateLengthat the end of declaration emit'sserializeTypeForDeclaration, read from an instrumented copy of the worktree'stypescript.jsin scratch. That is the card's own instrument, and nothing from it lands in the tree.main. Before this PR the two specs differed by +12,296 on this declaration, about 1.2% of the ceiling. After it they differ by 0. The spec's shapes are now printed inside the named unions' own declarations, never inAnyComponentSchema's.ObjectQLPublicBlockComponentSchema, 98,183 → 111,269, withObjectGridBlockSchemainside it going 15,011 → 23,219.LayoutSchemawent 281,061 → 280,333.LayoutSchema281,061 ·PublicBlockComponentSchema143,622 ·ObjectQLComponentSchema119,738 ·ObjectQLPublicBlockComponentSchema98,183 ·FormComponentSchema54,759 ·ComplexSchema51,829 ·DataDisplaySchema45,434 ·ReportUnionSchema33,923 ·OverlaySchema31,460 ·ViewComponentSchema23,790 ·DesignerUnionSchema22,461 ·FeedbackSchema18,982 ·NavigationSchema17,300 ·DisclosureSchema9,245 ·AIComponentSchema9,108 ·CRUDComponentSchema7,528.AppComponentSchema9,042 andCloudPlanStatusSchema2,297.AppSchemaRendererNodeSchemaTypeandPageKindNodeSchemaType.PublicBlockComponentSchemais confirmed: 143,622.The pin
It reads the node builder's own counter and does not use a proxy.
checker.typeToTypeNodepasses its run-timemaximumLengthparameter straight through. The parameter is not on the typed public surface. The pin calls it with declaration emit's flags andAnyComponentSchema's type. WithNoTruncationset, the builder reports truncation to the tracker exactly when the counter crosses the stated maximum, which is the comparison TS7056 makes at the ceiling.noTruncationMaximumTruncationLength), not restated.trackSymbolwithtrue, so the builder caches nothing from a probing call.pnpm testresolves.main. That delta was +12,296 before this PR and is 0 after it.maindelta measured, and about 10× the largest arm ever added inline (record:line_items, 9,871). A green pin under the installed spec leaves the gate's compile under the ceiling with room to spare.inline. A new member, a member that loses its name, or a renamed type turns the pin red until it is classified there. A second assertion encodes the rule: a category union prints by name, while arms may stay inline.inline;H3: naming changes print, not type
NamesItsUnion):z.input,z.outputand_zodequal those ofz.ZodDiscriminatedUnionover its own options;AnyComponentSchemacarries (theExtractrow, as inrecord-line-items-arm-10872.test.ts).A & B.true & falseisnever, andneversatisfiesAssert's constraint.3b4f156). ThenDisclosureZodTypegained_zod: DisclosureSchemaInferredType['_zod'] & { input: any }, through the objectstackscripts/ablation-replace.mjs(wrap mode; anchor 1 → 0, blob0833fd7240cc→24c4d1e693f3).tsc --noEmitexit 0. It is invisible to assignability.tsc -p tsconfig.test.jsonrefused exactly the_Disclosurerow: TS2344, exit 2.git checkout HEAD -- PATH: blob == HEAD0833fd7240cc, andgit diff HEADis empty.DisclosureSchema's annotation was dropped, by the same tool and restore. The pin went red, 2 failed / 2 passed. The diff showsDisclosureSchemachanging fromDisclosureZodTypetoinline. The reading moved 12,260 → 21,458.Gates
All exit codes were read before any pipe.
On landing head
f3d1dce(the last commit only adds the changeset):pnpm --filter @object-ui/types build: exit 0, "dist completeness: 1 package(s) complete (146 emitted files verified)"pnpm --filter @object-ui/types type-check: exit 0; this istsc --noEmit, the examples project and the test projectpnpm --filter @object-ui/types test: exit 0, 351 files / 9,424 tests passed; the pin file is included (350 test files at BASE, 351 here)check:readme-exports: exit 0, "563 of them self-imports judged (563 real, 0 wrong-path, 0 fabricated)"check:skill-examples: exit 0check:doc-snippets: exit 0, "777 of 777 block(s) judged, 0 failed"check:doc-examples: exit 0check:published-dist: exit 0check:doc-types: exit 0check:spec-symbols: exit 0check:changeset-claims: exit 0check:pending-changeset-literals: exit 0check:control-bytes: exit 0changeset:check: exit 0check:new-line-citations: exit 0, "0 new citation(s)"check:test-path-roots: exit 0type-check:coverage: exit 0check-changeset-presence: exit 0Consumers, at
3b4f156(src identical tof3d1dce):turbo run type-checkfor@object-ui/core,@object-ui/cliand@object-ui/react: 12/12 tasks successful.turbo run type-checkfor@object-ui/components,@object-ui/plugin-kanban,@object-ui/plugin-tree,@object-ui/plugin-dashboard,@object-ui/plugin-detailand@object-ui/app-shell: 35/35 tasks successful. Every type-check task was a cache miss, so each one really ran.plugin-*consumers of./zodare left to CI. The structural identity check above is why they cannot differ.Spec Main Shape Gate reproduction, narrowed.
@objectstack/specwas built and packed from objectstackmain1a23054in a separate objectstack worktree, then injected withscripts/spec-main-shape-gate.mjs injectinto a separate objectui worktree.TURBO_FORCE=true turbo run type-checkran for core, cli and react, with their build closure, which includes@object-ui/typesbuild (where TS7056 surfaces).7a7660c): 12/12 tasks successful. After (f3d1dce): 12/12 tasks successful.pnpm type-check, and CI runs it on this PR. The injection never touched this branch's install or any commit.Lint, targeted at the 17 changed
.tsfiles:eslint --no-inline-config, 0 errors. There were 3 warnings, allno-explicit-anyon lines this PR does not touch. The fullpnpm lintbelongs to CI.Acceptance notes
validateSchemaandsafeValidateSchemastill print in full. Their inferred return types print the full output union: counter 446,147 / 446,122 on 17.6.0, and 450,694 / 450,669 onmain. Naming the containers does not change that, becausez.outputis computed structurally. That is about 45% of the ceiling, so it is no reach today. It is an observation, not a finding; carrier: none.node_modules, and the gate workflow's header warns about exactly this.TURBO_FORCE=truereproduction runs against the injectedmainspec wrote main-spec build outputs into that cache, keyed on objectui sources at7a7660candf3d1dce.check:doc-snippetswent red on three blocks ofpackages/plugin-grid/README.md(TS2322). After a forced rebuild against the installed spec it read 0 failed.f3d1dcewere overwritten by that forced rebuild. The 23 entries from the reproduction runs, including the ones keyed on7a7660c(mainat dispatch), could not be removed from here: the deletion was refused by this session's permission check. The run's report names them.packages/plugin-grid/README.mdsnippets fail against declarations built from objectstackmain. It is an observation for the 17.7.0 adoption; carrier: objectui#11334.This PR's attribution, written as prose because a footer does not survive an edit: session
https://claude.ai/code/session_01CPvhwGcirXqBGEdPSb72TZ, dispatched by thedomain:spec @ objectuiPM seat.Generated by Claude Code