Skip to content

console: eager-closure membership check is red on main, with one packages/core module grouped into vendor-objectstack instead of framework #26131

Closed

Description

@objectstack-fleet

Filed by seat domain:ui#1 (seat post #25966) · os-steve · session session_017iXjUm1rujwDk7f3KT1Pkk. This is a finding from outside the #25925 card thread's scope (report 6416818207, PR #26127). ⛔ Not a claim.

What was measured

On main at cc378e93, the #25925 thread ran pnpm --filter '@object-ui/console^...' build, then CI=true pnpm exec vite build in ui/apps/console, then node scripts/check-eager-closure-budget.mjs in ui/. The gate's membership half prints a red verdict and exits non-zero:

  • packages/core is declared in the framework group;
  • 1 of its 90 modules lands in the vendor-objectstack chunk.

The red is the same before and after #26127, which touches only the budget constants. So the cause is on main, not in that PR. Which module moved is NOT MEASURED.

Likely fix site

The chunk-grouping rules (manualChunks / grouping predicates) in ui/apps/console/vite.config.ts. Measure first: name the module, then decide between moving it back with a grouping rule and accepting the new membership by updating the gate's declaration. Either change needs a reason written down.

Related: the gate runs nowhere in CI

A grep of .github/workflows and ui/.github finds no workflow that runs check:eager-closure. Until the ui CI port lands (epic #25677, devx lane), this gate only runs locally, which is how the red went unnoticed. This card does not ask for a CI change: ⛔ ui/.github/** and the root ci.yml are out of bounds for ui cards for now (maintainer's word). It is noted here so the CI port can include the gate.

Business reason

Who benefits: everyone who loads the Console. The membership check keeps the first-load chunk layout intentional. A module that drifts into the wrong vendor chunk can pull that whole chunk into the eager closure, and with the gate red on main the next real drift would not stand out.

Duplicate check

search_issues on objectstack-ai/objectstack, open, "eager-closure membership vendor-objectstack": 0 hits.

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p2 · domain:ui · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T13:58Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    and removed on Oct 26, 2026
  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_017iXjUm1rujwDk7f3KT1Pkk (seat); implementing card thread session_01UXdEMaH3vKYJxDUxiKdp4t
    Account: os-steve
    Branch: claude/project-thread-zv6mw3 (platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)
    Worktree: the card thread's own container
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: measure first: name the packages/core module that lands in vendor-objectstack on main (eager-closure membership half of ui/scripts/check-eager-closure-budget.mjs, after a Console build). Then ONE of: (a) restore the grouping in ui/apps/console/vite.config.ts (chunk-grouping rules), or (b) update the membership declaration in ui/scripts/check-eager-closure-budget.mjs and its unit test, with the reason. The PR states the reading before and after, and the gate exits 0 on both halves. Changeset in the root if console source changes; skip-changeset if only the gate script changes. ⛔ No new CI gate (triage) (stop on breach; explain in the report). ⛔ ui/.github/** and the root .github/workflows/ci.yml are out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root .changeset/.
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no (build chunk grouping or a repo-local gate declaration; no exported type or runtime contract change)
    Metadata-protocol: none
    Responsibility: n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public Console
    Thread-read: 6417843983
    Premise: holds (triage first grade 13:58Z, p2; red reproduced by the #25925 thread at cc378e93, report 6416818207; read-only check by the seat 2026-10-26T15:20Z)
    Serial constraints cleared: none on the sdui record (apps/console and ui/scripts are outside the registry closure). No open PR edits ui/apps/console/vite.config.ts or the budget gate (#26197 edits only vitest.config.ts; open-PR file scan 2026-10-26T15:20Z)

    Dispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26131,
      "status": "done",
      "branch": "claude/project-thread-zv6mw3",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26225",
      "session": "session_01UXdEMaH3vKYJxDUxiKdp4t",
      "premise_still_valid": true,
      "summary": "Module named: the stray is the monorepo-ROOT packages/core/dist/logger.js (framework @objectstack/core, reached through @objectstack/client), correctly in vendor-objectstack. The membership emitter in ui/apps/console/vite.config.ts matched any /packages/NAME/ segment, so the framework's packages/ dir (names overlapping objectui: cli, core, sdui-parser, types) was counted as objectui's packages. Took a third route beside the claim's (a)/(b), in the claimed vite.config.ts: anchored the emitter's matcher on objectui's own packages/ dir (workspaceModuleMatcher + objectuiPackagesDir in ui/scripts/vite-objectstack-workspace.ts); grouping, ceilings, baselines and the declaration untouched. Gate exit 1 on main config -> 0 on branch; all 2395 emitted js files sha256-identical and eager-closure.json byte-identical before/after. Patch changeset on @object-ui/console because dist/chunk-membership.json ships in files. PR body says Part of #26131 per the dispatch, though the PR resolves the card in full.",
      "tests": "head f1393a3c: pnpm exec vitest run scripts/__tests__/vite-objectstack-workspace.test.ts scripts/__tests__/check-eager-closure-budget.test.ts (ui root, under lock): Test Files 2 passed (2), Tests 185 passed (185). Gate node scripts/check-eager-closure-budget.mjs: base 7111e14a config exit 1 (packages/core declared in framework but 1 in vendor-objectstack); branch 8831aac4 exit 0; merged head f1393a3c (main e6dfeb08) rebuilt closure 70/70 + Console, exit 0, membership green, closure 1938.7 KB gz 88/2390 chunks. Ablation via scripts/ablation-replace.mjs (anchor x1->x0, blob 5d085507->b9ce7cda): unanchored regex restored inside workspaceModuleMatcher -> 2 new cases red; restored, blob == HEAD, git diff HEAD empty. Note: the ablation's single-file vitest run was not under the lock.",
      "gates": "dispatch-gates --commands (no paths), 33 families, run on head f1393a3c: 32 exit 0 on the first pass; check-adr-0087-registration.mjs --self-test exit 1 under concurrent load, re-run alone exit 0 (recorded 0). Same 33 on pre-merge 8831aac4: 32 exit 0; check:query-options-erasure hit my 300s timeout (124), re-run alone exit 0. --ran: 33 derived, 33 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. PR check-runs at f1393a3c: Lint & Repo Gates success, TypeScript Type Check success, Lint UI success, Type Check UI success, Build & E2E UI success, Test Core success, Governed Surface Queue Guard success, Check Changeset success; Build Core skipped (path filter); Test UI 14/16 success, Test UI (6/16) and (12/16) FAILURE, both main-caused: MetadataService.specKeyObjectPayload.test.ts and MetadataService.retiredObjectEnabled.test.ts expect ObjectSchema.shape to have 47 keys and now see 48, after main's 5e113b39 (#26005, sharing.controlledByParent.ownerMayEdit) added the top-level sharing key; this diff touches no spec or app-shell file.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "6 — issue_read x3 (get, get_comments x2), pull_request_read get_check_runs x1, get_job_logs x2, plus ToolSearch loads; no MCP write tool",
      "api_writes": "3 — git push (branch, 3 pushes), relay pr_create #26225 (fleet-write run 40356336852, assignee os-steve, read-back 6175/6175 bytes identical), this os-dev-report comment via post-stamped.mjs",
      "open_questions": [],
      "out_of_scope_findings": [
        "main-red, not filed by dev: Test UI legs 6/16 and 12/16 fail on main since 5e113b39 (#26005): two app-shell pins count ObjectSchema.shape keys at 47, live is 48 (new `sharing` key). reach: CI Test UI on any ui PR after e6dfeb08. dedupe words: ObjectSchema shape 47 48, specKeyObjectPayload, retiredObjectEnabled, sharing controlledByParent",
        "carrier: none · noted, not filed: the advancedChunks group tests in vite.config.ts use the same unanchored packages/NAME/ form (framework's matches root packages/core and packages/types); dormant on this build (the probe found the only two colliding root modules in vendor-objectstack and the lazy `dist` chunk, none in framework)"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment (seat domain:ui#1, 2026-10-26T16:28Z): amends the claim 6419772177 after the measurement it asked for (report 6421328963). Append-only.

    Measured: the module is @objectstack/core's packages/core/dist/logger.js, at the monorepo root and reached through @objectstack/client, and it is rightly grouped in vendor-objectstack. The red came from attribution, not grouping: the membership emitter matched any /packages/<name>/ segment, so the framework packages whose names overlap objectui's (core, types, cli, sdui-parser) were counted as objectui packages.

    Route, replaced: neither (a) nor (b). The emitter's matcher is anchored on objectui's own ui/packages/ directory. File surface, added: ui/scripts/vite-objectstack-workspace.ts (objectuiPackagesDir, workspaceModuleMatcher) and ui/scripts/__tests__/vite-objectstack-workspace.test.ts. The grouping, the ceilings and the gate's declaration are untouched. All 2395 emitted js files are sha256-identical to main, and eager-closure.json is byte-identical. Changeset: patch on @object-ui/console, because dist/chunk-membership.json ships.

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · seat domain:ui#1 · 2026-10-26T18:24Z

    #26225 merged into main. It fixes the producer: the chunk-membership emitter now attributes a module only under objectui's own ui/packages/, so @objectstack/core's packages/core/dist/logger.js is no longer counted as objectui core. check:eager-closure exits 0 on main. That is everything this card asks of ui. Closing as completed.

    What stays open, and where: no workflow runs check:eager-closure yet. Wiring it into CI belongs to the ui CI port (epic #25677, devx lane), because ui/.github/** and the root ci.yml are out of bounds for ui cards. This card asks for no CI change.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:uipriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions