Skip to content

tooling(objectui-readiness): make the objectui tree merge-ready in its own repo before cutover (objectstack#25685) - #13472

Merged
os-zhuang merged 12 commits into
mainfrom
claude/project-thread-dwhq6r
Oct 24, 2026
Merged

os-zhuang merged 12 commits into
mainfrom
claude/project-thread-dwhq6r

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Fixes objectstack-ai/objectstack#25685

Part of objectstack-ai/objectstack#25677 (sub-issue 2/6).

Clause-②: no
Metadata-protocol: none

One draft PR for the whole card, one commit per scope item in card order. Branch claude/project-thread-dwhq6r, base main at a3c0da9 (chore: release packages, #13289). Nothing under .github/, AGENTS.md, .changeset/config.json or any other governed surface is touched; the objectui tree is prepared in its own repo so the ui/ import (ruling D1 / A+) merges without a follow-up fix-up commit.

What changed, per item

1. One react line (commit 8474f4d)

  • 34 manifests (root package.json devDependencies and pnpm.overrides, every packages/*, apps/console, apps/site, the three examples): react / react-dom 19.2.8 to 19.3.0, @types/react 19.2.18 to 19.3.0, @types/react-dom 19.2.4 to 19.3.0.
  • packages/cli/src/utils/scaffold-dependencies.ts: REACT_RANGE = '19.3.0' and the @types/react* entries of the shared dev-dependency map, which the CLI anchor test compares to the root manifest.
  • pnpm-lock.yaml regenerated with pnpm install --no-frozen-lockfile (1337 lines added / 1337 removed). It also carries item 2's single-zod resolution, because one install produced both.
  • Changeset .changeset/25685-one-react-line.md: patch for the 30 published packages whose manifests moved.

Before: grep -c '"react": "19.2.8"' over the workspace manifests = 33; after = 0, and pnpm ls react --depth 0 across the workspace resolves one react@19.3.0.

2. One zod range (commit 1d6a038)

  • packages/types, components, app-shell, test-support, plugin-timeline: "zod": "^4.6.5" (was ^4.4.3 x3 and ^4.6.1 x2).
  • Changeset .changeset/25685-one-zod-range.md for the four published packages.

Before: three distinct declared ranges; after: one, and the lockfile holds a single zod@4.6.7 for the workspace (the unrelated zod@3.25.76 is a transitive dependency of a third-party tool and is unchanged).

3. uiRoot() instead of .git / pnpm-workspace.yaml lookups (commit 5cc5354)

  • New scripts/ui-root.mjs (UI_ROOT, uiRoot(), derived from the helper's own location; node builtins only) and its declaration twin scripts/ui-root.d.mts: package tsconfigs have no allowJs, so without the twin every migrated package test's import is TS7016 (2195392 removed it, the Type Check job proved it needed, ae7fcc5 restored it). check-lint-rule-coverage reports a .d.mts as a file no ESLint config reaches, so its predicate-2 ledger (UNREACHED_GROUPS, exact paths) carries a row for it, owned by this PR; the gate's own test pins the unreached population as scripts/ui-root.d.mts + vitest.config.mts.
  • Migrated: 15 repoRoot() walkers in package tests (types x7, components, plugin-calendar x2, plugin-gantt, app-shell x2, data-objectstack, core), the sdui-parser census IIFE, four existsSync(join(root, 'pnpm-workspace.yaml')) sanity assertions (now expect(root).toBe(uiRoot())), and four scripts that shelled out to git rev-parse --show-toplevel (cross-file-line-citation-census.mjs, dollar-dialect-alias-census.mjs, check-new-cross-file-line-citations.mjs, check-cross-repo-closer-outcome.mjs). check-new-cross-file-line-citations.mjs now diffs with --relative and reads blobs as rev:./path, so it keeps working when the git toplevel is a parent of the ui root; its root is gateRoot() (7537206): the repository at the cwd via --show-toplevel — its self-test drives the gate against a scratch repository — narrowed to uiRoot() when the objectui tree lies inside it.
  • New gate scripts/check-ui-root-lookups.mjs (pnpm check:ui-root-lookups; --list, --json, --self-test with 13 cases): a TypeScript-AST scan of scripts/, packages/, apps/ for marker probes (existsSync / statSync / lstatSync / accessSync on .git or pnpm-workspace.yaml, directly, via a const binding or a template literal), --show-toplevel / --git-common-dir literals, and find-up. Allowlist is a ledger (a stale entry is red) with five entries: scripts/objectstack-pin.mjs (deleted at cutover), scripts/check-new-cross-file-line-citations.mjs (its subject is the repository at the cwd, above) and three CLI product predicates that probe the USER's cwd (app-generator.ts, workspace-vite.ts, app-generator.test.ts).
  • scripts/check-test-path-roots.mjs classifies uiRoot() / UI_ROOT as the self root (two new self-test cases).

Before: on main the fifteen walkers and four shell-outs resolved the root through .git / pnpm-workspace.yaml / git rev-parse, and check-test-path-roots reported 1264 self / 590 unclassified roots. After: check-ui-root-lookups: OK (7796 files scanned, 55 parsed, 6 probes all on the allowlist, 5 allowlist entries live); check-test-path-roots: OK, 1264 self / 579 unclassified. The card's crude grep (A4) re-derived to 55 unique files on main (the card quoted 71); 20 package test files and 4 scripts were migrated, and the residue is comments, readFileSync DATA reads of the workspace globs, fixture writes, two '.git' directory skip-list entries and the allowlisted CLI predicates — the gate, not the grep, is the instrument that fails when a new lookup lands.

4. tsc heap for app-shell and console (commits 02eaff5, c464a4a)

  • packages/app-shell/package.json and apps/console/package.json: the tsc of build and type-check runs as NODE_OPTIONS=--max-old-space-size=4096 tsc ... — the spelling objectstack's packages/spec uses for the same purpose.
  • scripts/__tests__/helpers/build-program.ts: stripEnvAssignments() skips the leading NAME=value words of a command before classifying the tool, so the two builds are still tsc runs in the turbo-build-inputs sweep and contribute their tsconfig chain.
  • Why not the wrapper script the card suggested: a root scripts/with-heap.mjs (02eaff5) is a file outside the two packages, so turbo-build-inputs.test.ts requires it as a $TURBO_ROOT$ input of build, and docs-build-trigger.test.ts then requires every such input in the docs job's pathspec in ci.yml — a .github/workflows/** edit the maintainer must approve. Shard 15 went red on the second gate; c464a4a removes the wrapper, its test and its turbo.json line. A heap ceiling is not a build input.

Measured (A3) with tsc --noEmit --extendedDiagnostics in this tree: app-shell Memory used: 2234110K (3915 files, 50.7 s), console Memory used: 2355117K (4122 files, 25.4 s). Both exceed what the default old-space limit left on the merged-tree runner in the spike measurement; 4096 MB has headroom.

5. Vite chunk tests derived from the workspace layout (commit 5c76fe3)

  • New scripts/vite-objectstack-workspace.ts: candidateFrameworkPackagesDir(consoleDir) (../../../packages from ui/apps/console), frameworkPackagesDir(consoleDir) (that directory when it exists, else null) and workspaceChunkTests(dir | null) returning { vendor, spec, lint } regexes that keep the baseline node_modules / pnpm-store spellings and add an anchored, escaped dir/ alternative (vendor excludes lint/, which must stay lazy). With null — standalone — it returns BASELINE_CHUNK_TESTS, the baseline literals byte for byte (dde5e6d): vite-objectstack-spec-dist.test.ts pins the vendor literal as one of objectui#4854's flagged surfaces, and an unconditional arm had moved it (shard 7).
  • apps/console/vite.config.ts uses them for VENDOR_OBJECTSTACK_TEST, SPEC_MODULE_TEST and the lazy-linter assertion.
  • Ported from spike commit 3efb112efb (A5) with the unit test it lacked, scripts/__tests__/vite-objectstack-workspace.test.ts: standalone the three tests are the baseline literals; a node_modules/@objectstack/spec/... id is matched in both layouts; <monorepo>/packages/spec/dist/x.mjs is matched by spec and vendor; <monorepo>/packages/lint/... is excluded from vendor and matched by lint; a sibling directory, a FILE named packages and objectui's own ui/packages/* are not matched.
  • scripts/vite-objectstack-client-dist.ts judged and left alone: its chunk test has no node_modules assumption, and packageResolvesFrom walks node_modules/name, which workspace links satisfy.

6. pnpm typecheck alias and workspace: spec ranges (commit 11bc209)

  • Root package.json: "typecheck": "turbo run type-check".
  • scripts/check-spec-range-floors.mjs: WORKSPACE_PROTOCOL; minVersionOf(range, { workspaceVersion }) reads workspace:* / ^ / ~ / bare as the workspace package's own version and workspace:^18.1.0 as its range tail; workspaceSpecVersion(root) reads the installed @objectstack/spec/package.json; a workspace: range met without that version throws instead of passing.
  • scripts/objectstack-floor.mjs: installedVersion, floorOfRange, planRanges(..., { workspaceVersionOf }).
  • packages/core/src/utils/__tests__/normalize-list-view.declaredSpecFloor-9012.test.ts: floorOf reads a workspace: range as the installed spec's own version (the old workspace:* is not a floor assertion replaced by that test).
  • Tests appended to scripts/__tests__/check-spec-range-floors.test.ts and scripts/__tests__/objectstack-floor.test.ts.

Other readers of @objectstack/spec ranges that were NOT changed (they do not fail on workspace: today): scripts/check-changeset-no-major.mjs (majorOfRange) and scripts/sync-quick-reference-release.mjs.

Verification (local, this worktree)

Install: pnpm install --no-frozen-lockfile against a stand-in OBJECTSTACK_ROOT (sibling objectstack checkout at 3efb112efb; pin manifests and sibling manifests have identical dependency names and exports, all 18.1.0, so .objectstack-pin and the file: lockfile snapshots are unchanged). react / react-dom / @types 19.3.0 resolved.

Under the shared verify lock (--concurrency=2, 4096 MB heap):

  • turbo run build for the dependency closure of console, cli and app-shell: 34 tasks, 34 successful.
  • pnpm --filter @object-ui/app-shell type-check, pnpm --filter @object-ui/console build (vite build + sdui manifest + plugin), pnpm --filter @object-ui/cli build, type-check, test: all exit 0.
  • 24 touched package test files (the 21 migrated files, declaredSpecFloor-9012, cli app-generator, console-vite-alias-closure-4925, doc-version-claims): 24 passed, 325 tests.

Unlocked (the dev's run, before the five red shards below): pnpm type-check:scripts exit 0; scripts/__tests__ suites naming an edited script (ui-root, with-heap, check-ui-root-lookups, check-test-path-roots, vite-objectstack-workspace, objectstack-floor, check-spec-range-floors, react-peer-range-norm-3741, quick-reference-commands-4149, turbo-type-check-inputs, turbo-build-inputs, turbo-test-inputs, turbo-lint-inputs, scripts-type-check): all green. Gates exit 0: check:lockfile-integrity, check:lockfile-dedupe, check:phantom-deps, check:unused-deps, check:installed-pin-claims, check:test-path-roots, check:ui-root-lookups, check:entry-guard, check:pre-install-import-graph, check:control-bytes, type-check:coverage, check:new-line-citations, check-changeset-presence, check-changeset-no-major, check-changeset-fixed. eslint over all 41 changed source files: 0 errors (4 pre-existing no-explicit-any warnings on lines this PR did not touch).

pnpm check:spec-floors after the build: exit 1 with two floor-too-low findings (@object-ui/auth MEMBERSHIP_ROLE_EXTERNAL, @object-ui/types navItemVisibleDataNeedsDataSource against the FETCHED @objectstack/spec@18.0.0-next.x). Identical verdict with the unmodified gate script from main on the same dists, and both symbols are referenced by main's source, so this is pre-existing and not introduced here; CI's spec-range-floors.yml runs the gate with --cross-check, which is the measurement that counts.

NOT MEASURED locally (CI's): the full turbo run test, lint and type-check across the workspace, check:published-dist, performance budgets, the react 19.3.0 runtime behaviour beyond building and the touched test files.

Epic PM follow-up (commits 6f3d9d5, c464a4a, dde5e6d, 7537206, 2195392, ae7fcc5)

The first CI run on 11bc209 had five red shards, all in scripts/__tests__: check-hand-rolled-comment-mask (the uiRoot() test stripped comments with its own regex), vite-objectstack-spec-dist (vendor literal moved), check-new-cross-file-line-citations (gate rooted off its scratch repository), check-lint-rule-coverage (ui-root.d.mts unreached), docs-build-trigger (new turbo input not in the governed docs pathspec). The second run's Type Check job then failed on @object-ui/data-objectstack (TS7016, the twin deleted by 2195392 was needed); ae7fcc5 restores it with a ledger row. Fixed as described in items 3–5; verified locally after pnpm run setup (the pin built): vitest run scripts/__tests__ 194 files passed / 2 skipped, vite-objectstack-spec-dist.test.ts 84 passed, check-lint-rule-coverage + ui-root tests green with the twin, pnpm type-check:scripts exit 0, turbo run type-check --filter=@object-ui/data-objectstack --filter=@object-ui/types --filter=@object-ui/core 6/6 tasks, check:ui-root-lookups OK.

Acceptance notes

  • One PR instead of the two the claim mentioned, per the ruling; commit order equals card order 1 to 6.
  • The lockfile effect of item 2 lands in commit 1 (a single pnpm install regenerates the whole file); commit 2 holds the manifest hunks and the changeset.
  • The heap flag is an inline NODE_OPTIONS= prefix rather than the card's cross-platform wrapper: a root wrapper is a build input, and a new build input must be in the governed docs pathspec (item 4). The flag changes the heap, not the program, so turbo's cache verdicts are unaffected.
  • The A4 crude-grep residue (data reads of pnpm-workspace.yaml globs in scripts/objectstack-pin.mjs, release-github-releases.mjs and the workspace-reading tests; '.git' in two directory skip lists) is deliberate: those are not root lookups. The pnpm-workspace.yaml DATA readers will need a path once ui/ has no workspace file of its own; that belongs to the carrier sub-issue, and is listed in the report.
  • Stand-in pin (A1): the sibling checkout is one day newer than the pin SHA; no dependency-name or export surface differs, so no manifest or lockfile snapshot moved. --write-manifests was not passed.

Generated by Claude Code

…to 19.3.0 (objectstack#25685 item 1)

Every manifest that pins `react` / `react-dom` moves 19.2.8 -> 19.3.0 and every
`@types/react` / `@types/react-dom` pin moves to 19.3.0, matching the root
`pnpm.overrides`. objectstack's `@objectstack/client-react` requires react
`^19.3.0`, and a second `@types/react` copy broke `@object-ui/plugin-view`'s
declaration build in the merged `ui/` tree. The CLI scaffold (`REACT_RANGE` and
the shared dev-dependency map) quotes the same pins, as its anchor test
requires. Lockfile regenerated with `pnpm install --no-frozen-lockfile`; it also
carries the single-zod-range resolution that item 2 declares in the manifests.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
…ge that lists it (objectstack#25685 item 2)

`@object-ui/types`, `components`, `app-shell`, `test-support` and
`plugin-timeline` declared three different zod ranges (`^4.4.3`, `^4.6.1`);
in the merged `ui/` tree that resolved to two zod copies and the
`z.ZodType` identity split between them. All five now declare `^4.6.5`, the
range objectstack's own packages use, so the lockfile holds one zod 4.x for
the workspace (commit 1's regenerated lockfile already carries that
resolution).

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
… `.git` or `pnpm-workspace.yaml` (objectstack#25685 item 3)

In the merged tree `ui/` has no `.git` and no `pnpm-workspace.yaml` of its own,
so every test and script that located the repo root by walking up to one of
those markers (or by `git rev-parse --show-toplevel`) would resolve the
OBJECTSTACK root instead. `scripts/ui-root.mjs` exports `UI_ROOT` / `uiRoot()`,
derived from the helper's own location and nothing else.

Migrated: fifteen `repoRoot()` walkers, the sdui-parser census IIFE, four
`pnpm-workspace.yaml` existence assertions, and four scripts that shelled out
to `git rev-parse --show-toplevel`. `check-new-cross-file-line-citations.mjs`
now diffs `--relative` and reads blobs as `rev:./path`, so it keeps working when
the git toplevel is a parent of the ui root.

Two instruments keep it that way: `scripts/check-ui-root-lookups.mjs`
(`pnpm check:ui-root-lookups`, with `--self-test`) scans `scripts/`,
`packages/` and `apps/` with the TypeScript AST for marker probes,
`--show-toplevel` / `--git-common-dir` and `find-up`, against a ledger
allowlist of the four CLI product predicates that legitimately probe the
USER's cwd; and `check-test-path-roots.mjs` now classifies `uiRoot()` /
`UI_ROOT` as the self root.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
…h-heap.mjs` (objectstack#25685 item 4)

`@object-ui/app-shell` and `@object-ui/console` type-check against the whole
objectstack tree once merged, and both OOM at Node's default old-space limit
there. `scripts/with-heap.mjs CMD...` re-runs its arguments with
`--max-old-space-size=4096` appended to NODE_OPTIONS (an old-space size the
caller already set wins), propagates the child's exit code, and is what the two
packages' `build` and `type-check` scripts now run `tsc` through — a
cross-platform spelling instead of an inline `NODE_OPTIONS=...` prefix.

Measured in this tree with `tsc --noEmit --extendedDiagnostics`: app-shell
2 234 110K, console 2 355 117K of heap.

The turbo `build` inputs guard derives each package's build program from its
script; it now understands the wrapper (recorded as part of the program AND
looked through, so the wrapped `tsc` still contributes its tsconfig chain), and
`turbo.json` lists `$TURBO_ROOT$/scripts/with-heap.mjs` as a `build` input.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
…workspace layout (objectstack#25685 item 5)

`apps/console/vite.config.ts` recognised `@objectstack/*` modules for its
vendor / spec / lazy-linter chunk rules only by their `node_modules` and
pnpm-store path spellings. In the merged tree those packages are workspace
siblings resolved from `<root>/packages/<name>/dist/...`, so every rule would
have silently missed them. `scripts/vite-objectstack-workspace.ts` exports
`frameworkPackagesDir(consoleDir)` (`../../../packages` from `ui/apps/console`)
and `workspaceChunkTests(dir)`, which widens each of the three tests with an
anchored, escaped `<dir>/` alternative (vendor excludes `lint/`, which stays
lazy). The baseline spellings are kept, so the standalone layout is unchanged.

Ported from spike 3efb112efb with the unit test it lacked: a standalone
`node_modules/@objectstack/spec/...` id stays matched, `<root>/packages/spec/dist/x.mjs`
is matched by spec and vendor, `<root>/packages/lint/...` is excluded from
vendor and matched by lint, and a sibling `packages-other/` is not matched.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
…floor readers `workspace:` ranges (objectstack#25685 item 6)

Two small pre-conditions for the merged tree. The root `typecheck` script is an
alias of `type-check` (`turbo run type-check`), the spelling objectstack's
fleet tooling invokes. And the three readers of `@objectstack/spec` RANGES —
`scripts/check-spec-range-floors.mjs`, `scripts/objectstack-floor.mjs` and the
`declaredSpecFloor-9012` test — understand the `workspace:` protocol:
`workspace:*` / `^` / `~` / bare mean "the workspace package's own version", read
from the installed `@objectstack/spec/package.json` (`workspaceSpecVersion`,
`installedVersion`) and passed into `minVersionOf` / `effectiveFloor` /
`planRanges` as `workspaceVersion`; `workspace:^18.1.0` reads its range tail.
A `workspace:` range met without that version throws rather than silently
passing, and the gate's self-tests cover both shapes.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 85 chunks) 3014.5 KB 3496.0 KB
Main entry chunk (gzip) 80.3 KB 350 KB
Entry file index-uvgZ26Oq.js —
Status PASS —

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

Package Size Gzipped
app-shell (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.41KB 7.90KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 8.84KB 3.61KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 614.94KB 150.52KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 253.04KB 70.68KB
fields (index.js) 295.90KB 75.88KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.17KB 11.96KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (ServerReadScope.js) 4.03KB 1.82KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.99KB 0.43KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.91KB
plugin-calendar (index.js) 55.41KB 16.19KB
plugin-charts (index.js) 88.30KB 24.33KB
plugin-chatbot (core.js) 5.22KB 2.18KB
plugin-chatbot (index.js) 237.93KB 56.26KB
plugin-dashboard (index.js) 147.15KB 39.95KB
plugin-designer (index.js) 232.83KB 50.01KB
plugin-detail (index.js) 267.21KB 71.14KB
plugin-editor (index.js) 2.21KB 1.04KB
plugin-form (index.js) 185.46KB 48.48KB
plugin-gantt (index.js) 178.19KB 45.06KB
plugin-grid (index.js) 278.30KB 77.57KB
plugin-kanban (index.js) 64.27KB 19.81KB
plugin-list (index.js) 149.60KB 39.26KB
plugin-map (index.js) 27.11KB 8.99KB
plugin-markdown (index.js) 13.79KB 4.79KB
plugin-report (index.js) 46.42KB 13.06KB
plugin-timeline (index.js) 39.30KB 11.87KB
plugin-tree (index.js) 15.25KB 5.38KB
plugin-view (index.js) 94.26KB 24.27KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 129.13KB 42.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…rivate regex (objectstack#25685 item 3)

The `uiRoot()` test strips comments from `scripts/ui-root.mjs` before asserting
what the helper spells and does not spell. It did so with its own
`/\/\*[\s\S]*?\*\//` + `//`-to-end-of-line pair, which the
`check-hand-rolled-comment-mask` gate rightly refuses: that is the naive-regex
family the tree retired, and a `//` inside a string would open a phantom
comment. The test reports neither a line nor an offset, so it now calls
`stripComments` from `scripts/js-comment-mask.mjs`, the one answer to "is this
span a comment". Verified locally: the gate test and `ui-root.test.ts`
(26 tests) pass.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 85 chunks) 3014.5 KB 3496.0 KB
Main entry chunk (gzip) 80.3 KB 350 KB
Entry file index-CXCwml-O.js —
Status PASS —

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

Package Size Gzipped
app-shell (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.41KB 7.90KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 8.84KB 3.61KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 614.94KB 150.52KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 253.04KB 70.68KB
fields (index.js) 295.90KB 75.88KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.17KB 11.96KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (ServerReadScope.js) 4.03KB 1.82KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.99KB 0.43KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.91KB
plugin-calendar (index.js) 55.41KB 16.19KB
plugin-charts (index.js) 88.30KB 24.33KB
plugin-chatbot (core.js) 5.22KB 2.18KB
plugin-chatbot (index.js) 237.93KB 56.26KB
plugin-dashboard (index.js) 147.15KB 39.95KB
plugin-designer (index.js) 232.83KB 50.01KB
plugin-detail (index.js) 267.21KB 71.14KB
plugin-editor (index.js) 2.21KB 1.04KB
plugin-form (index.js) 185.46KB 48.48KB
plugin-gantt (index.js) 178.19KB 45.06KB
plugin-grid (index.js) 278.30KB 77.57KB
plugin-kanban (index.js) 64.27KB 19.81KB
plugin-list (index.js) 149.60KB 39.26KB
plugin-map (index.js) 27.11KB 8.99KB
plugin-markdown (index.js) 13.79KB 4.79KB
plugin-report (index.js) 46.42KB 13.06KB
plugin-timeline (index.js) 39.30KB 11.87KB
plugin-tree (index.js) 15.25KB 5.38KB
plugin-view (index.js) 94.26KB 24.27KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 129.13KB 42.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

… not a root wrapper script (objectstack#25685 item 4)

`scripts/with-heap.mjs` was a file OUTSIDE the two packages whose build runs it,
and this tree's gates chain from that fact to a governed surface:
`turbo-build-inputs.test.ts` requires every out-of-package file a build program
reads to be a `$TURBO_ROOT$` input of `build`, and `docs-build-trigger.test.ts`
requires every such input to be in the docs job's pathspec in `ci.yml` -- a
`.github/workflows/**` edit the maintainer must approve. Shard 15 went red on
the second gate. A heap ceiling is not a build input: the spelling
`packages/spec` in objectstack uses, `NODE_OPTIONS=--max-old-space-size=4096 tsc`
inside the package script, needs no file, no turbo input and no workflow line,
so app-shell and the console carry it that way. `build-program.ts` skips the
leading `NAME=value` words of a command before classifying the tool, so the two
wrapped builds are still tsc runs in the inputs sweep; the wrapper, its test and
its turbo.json line are gone.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
…e monorepo packages dir exists (objectstack#25685 item 5)

`vite-objectstack-spec-dist.test.ts` pins the `vendor-objectstack` test's
literal as one of objectui#4854's four flagged surfaces, and shard 7 went red
because the workspace alternative was prepended unconditionally: standalone it
matched nothing, but the literal had moved. `frameworkPackagesDir()` now returns
`null` when `<console>/../../../packages` is not a directory, and
`workspaceChunkTests(null)` returns `BASELINE_CHUNK_TESTS`, the baseline
literals byte for byte -- so standalone the config is unchanged and the pin
holds, and under `ui/` the directory exists and the arm is added. The helper's
own test pins the literal equality, a real monorepo-shaped temp tree, and that a
FILE named `packages` is not the directory.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
…e cwd, narrowed to the objectui tree (objectstack#25685 item 3)

The gate's self-test drives it against a scratch repository under
`node_modules/`, so its subject is the repository at the cwd; rooting it on
`uiRoot()` alone made `git merge-base` run in the objectui checkout against a
scratch commit (shard 12: "no merge base"). `gateRoot()` reads the toplevel of
the cwd's repository and narrows to `uiRoot()` only when the objectui tree lies
inside it: standalone the two coincide, under the objectstack monorepo the
narrowing is what `--relative` and `rev:./path` rest on, and in the scratch
repository the toplevel is read. The one `--show-toplevel` this adds is on the
`check-ui-root-lookups` allowlist with that reason.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
…s the module (objectstack#25685 item 3)

`check-lint-rule-coverage` reported `scripts/ui-root.d.mts` as a file no ESLint
config reaches and no ledger row declares (shard 13). The twin was never needed:
`tsconfig.scripts.json` reads `.mjs` with `allowJs`, so the JSDoc on
`ui-root.mjs` is its typing, exactly as for every other `.mjs` helper the script
tests import. The test now pins the export surface and the twin's absence.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 85 chunks) 3014.5 KB 3496.0 KB
Main entry chunk (gzip) 80.3 KB 350 KB
Entry file index-CyQ1estm.js —
Status PASS —

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

Package Size Gzipped
app-shell (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.41KB 7.90KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 8.84KB 3.61KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 614.94KB 150.52KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 253.04KB 70.68KB
fields (index.js) 295.90KB 75.88KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.17KB 11.96KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (ServerReadScope.js) 4.03KB 1.82KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.99KB 0.43KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.91KB
plugin-calendar (index.js) 55.41KB 16.19KB
plugin-charts (index.js) 88.30KB 24.33KB
plugin-chatbot (core.js) 5.22KB 2.18KB
plugin-chatbot (index.js) 237.93KB 56.26KB
plugin-dashboard (index.js) 147.15KB 39.95KB
plugin-designer (index.js) 232.83KB 50.01KB
plugin-detail (index.js) 267.21KB 71.14KB
plugin-editor (index.js) 2.21KB 1.04KB
plugin-form (index.js) 185.46KB 48.48KB
plugin-gantt (index.js) 178.19KB 45.06KB
plugin-grid (index.js) 278.30KB 77.57KB
plugin-kanban (index.js) 64.27KB 19.81KB
plugin-list (index.js) 149.60KB 39.26KB
plugin-map (index.js) 27.11KB 8.99KB
plugin-markdown (index.js) 13.79KB 4.79KB
plugin-report (index.js) 46.42KB 13.06KB
plugin-timeline (index.js) 39.30KB 11.87KB
plugin-tree (index.js) 15.25KB 5.38KB
plugin-view (index.js) 94.26KB 24.27KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 129.13KB 42.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…ave no allowJs — and ledger it for the lint census (objectstack#25685 item 3)

2195392 deleted the declaration twin because `tsconfig.scripts.json` reads
`.mjs` with `allowJs`. The PACKAGE tsconfigs do not: `@object-ui/data-objectstack`'s
`type-check` failed with TS7016 on `import { uiRoot } from
'../../../scripts/ui-root.mjs'` in `readme-filter-operator-table.test.ts`, and
every migrated package test imports the helper the same way. So the twin is
back, with its pin test, and `check-lint-rule-coverage`'s predicate-2 ledger
(`UNREACHED_GROUPS`, exact paths only) carries a row for it: two `export
declare` lines no ESLint config reaches, declared rather than repaired because
reaching a `.d.mts` means widening a rule-bearing `files` glob to `.mts`, the
rule-strength decision objectui#8337 kept out of this gate. The gate's own test
pins the unreached population as these two files.

Clause-②: no
Metadata-protocol: none

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 85 chunks) 3014.5 KB 3496.0 KB
Main entry chunk (gzip) 80.3 KB 350 KB
Entry file index-BToWYYol.js —
Status PASS —

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

Package Size Gzipped
app-shell (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.41KB 7.90KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 8.84KB 3.61KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 614.94KB 150.52KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 253.04KB 70.68KB
fields (index.js) 295.90KB 75.88KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.17KB 11.96KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (ServerReadScope.js) 4.03KB 1.82KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.99KB 0.43KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.91KB
plugin-calendar (index.js) 55.41KB 16.19KB
plugin-charts (index.js) 88.30KB 24.33KB
plugin-chatbot (core.js) 5.22KB 2.18KB
plugin-chatbot (index.js) 237.93KB 56.26KB
plugin-dashboard (index.js) 147.15KB 39.95KB
plugin-designer (index.js) 232.83KB 50.01KB
plugin-detail (index.js) 267.21KB 71.14KB
plugin-editor (index.js) 2.21KB 1.04KB
plugin-form (index.js) 185.46KB 48.48KB
plugin-gantt (index.js) 178.19KB 45.06KB
plugin-grid (index.js) 278.30KB 77.57KB
plugin-kanban (index.js) 64.27KB 19.81KB
plugin-list (index.js) 149.60KB 39.26KB
plugin-map (index.js) 27.11KB 8.99KB
plugin-markdown (index.js) 13.79KB 4.79KB
plugin-report (index.js) 46.42KB 13.06KB
plugin-timeline (index.js) 39.30KB 11.87KB
plugin-tree (index.js) 15.25KB 5.38KB
plugin-view (index.js) 94.26KB 24.27KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 129.13KB 42.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读

改了什么 —— 这是 objectui 并入 objectstack ui/ 之前,在 objectui 自己仓里做的 6 项准备(子卡 objectstack#25685,epic #25677 第 2 项):① react 全仓收成一条 19.3 线;② zod 收成一个范围 ^4.6.5;③ 71 个假定"自己就是仓根"的脚本/测试改走 uiRoot();④ Console 与 app-shell 的 tsc 堆内存改为脚本内 NODE_OPTIONS= 前缀;⑤ Console 的 @objectstack 分包正则在 ui/ 树形下才加 workspace 路径臂,独立仓形下与现状逐字相同;⑥ type-check 任务别名。12 个提交,81 个文件,+2637 / −1705。

为什么改 —— 导入 ui/ 时,这 6 件事里任何一件没先做,导入提交后面就要跟一个修补提交(重复的 react 副本、两套 zod、脚本找错仓根、Console 构建堆溢出)。在 objectui 自己仓里先做完、先过一轮 objectui 自己的 CI,导入提交就能是干净的 subtree add。

风险与代价(含回滚) —— 超过 3000 行人工审核线的主因是 pnpm-lock.yaml(2674 行,一次 pnpm install 整体重生成),去掉锁文件是 1668 行。运行时代码零改动:动的是依赖范围、仓内脚本、测试、构建脚本的环境前缀与 Console 的 vite 分包配置。CI 35 项全绿(含 Console 构建与性能预算:eager closure 3014.5 KB / 预算 3496 KB,PASS);完整 scripts/__tests__ 套件、type-check:scripts、受影响包的 turbo type-check 本地逐项复核过。两条 changeset(react 线、zod 范围)进下一个 Version PR,不单独发版。回滚 = revert 一个 squash 提交,无数据与发布副作用。

席位意见 —— 建议批准。无法拆到 3000 行以下:锁文件是整体文件,拆开 react/zod 两项只会产生两个各自超线的锁文件 diff。路径面未命中任何受管面(check-governed-queue-guard --test 答 NOT GOVERNED),等的只是行数线这一条。

你要做的(一个动作) —— 在本 PR 上留一条 APPROVED review(os-zhuang / hotlong 任一),之后由本席翻 ready、挂 auto-merge 走合并队列;或直接合并也可。

席位核对

  1. Shape — one draft PR for the whole card, one commit per scope item in card order (6 dev commits + 6 PM follow-up commits fixing CI reds the dev's partial local run missed). Head ae7fcc585, base main at a3c0da9. Author objectstack-fleet[bot]; dispatched work, so the dispatch seat lands it (AGENTS.md ②).
  2. Premises measured — sibling checkout one day newer than the pin SHA, no export-surface difference, so no manifest snapshot moved; pnpm 10.28 tolerates workspace globs matching nothing; .npmrc node-options REPLACES NODE_OPTIONS (probed) so the inline prefix was chosen over it; apps/console standalone chunk regex equals the baseline literal byte for byte (pinned by vite-objectstack-workspace.test.ts).
  3. Gates — 35 check-runs success, 3 skipped (expected skips), 0 failed on ae7fcc585; mergeable_state: clean; Console Performance Budget PASS (comment 6387712196). check-governed-queue-guard.mjs --test over the 81 paths: NOT GOVERNED. check-governed-merges.mjs --pr: SIZE limb fires (4342 > 3000), hence this terminal.
  4. Accepted deviations — heap flag is an inline NODE_OPTIONS= prefix instead of the card's wrapper script (a root wrapper becomes a turbo input and then a governed docs pathspec edit); scripts/ui-root.d.mts kept and ledgered in check-lint-rule-coverage UNREACHED_GROUPS (package tsconfigs have no allowJs); the lockfile effect of item 2 sits in commit 1.
  5. Out of scope, where it went — data readers of pnpm-workspace.yaml globs (objectstack-pin.mjs, release-github-releases.mjs) need a path once ui/ has no workspace file: carried to child 5 (cutover) on objectstack#25677. Vite chunk regex for the merged tree is exercised only by the mkdtemp test until the subtree exists: verified again in child 3's throwaway PR.
  6. Landing clause — waits for one APPROVED review from GOVERNED_APPROVERS; then the seat runs the relay landing stroke (pr_ready + automerge_enable), re-reading mergeable_state first. No seat flips it ready before that.

ACCEPT for objectstack#25685 points here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment