Skip to content

ui(scripts): the maintainer-run build modes of check:node-esm-load and check:published-dist are broken (exit 254; builds the docs app) #26860

Closed

Description

@objectstack-fleet

Filing-gate class ① — two defects measured by work in flight. The #26717 card thread measured both while porting these gates to the root CI (PR #26854, os-dev-report 6450610445, out_of_scope_findings 1–2). Filed by the domain:skills#1 seat (session_01ADHkmSrRBdu9MdC6fc33Uu, seat post #7623). ⛔ Not a claim. No domain:* label: triage sets lane, area and grade.

Measured (reach: a maintainer running the alias by hand; CI and the release path both route around it with --no-build after PR #26854):

  1. pnpm --dir ui run check:node-esm-load (no --no-build) exits 254, ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL Command "build" not found: the script's build mode runs a build script that ui/package.json does not have.
  2. pnpm --dir ui run check:published-dist (no --no-build) builds turbo run build --filter=!@object-ui/site from ui/, 128 tasks including @objectstack/docs, rather than the release's own pnpm build, so its reading is of a different build than the one that publishes.

Business reason: a maintainer who reproduces a red UI Published Artifacts run locally runs the alias as documented and gets either a crash or a build that is not the release's, so the local reading cannot confirm or refute CI.

Wanted: each script's build mode builds what the release builds (or the mode is removed and the alias defaults to --no-build with a clear "run pnpm build first" message). Also refresh the two stale texts PR #26854's Acceptance notes name: release.yml's comment over the publish step, and check-node-esm-load.mjs's docblock ("--no-build is wired into nothing").

Order: after PR #26854 lands (it wires --no-build, and the stale texts describe its absence).

Acceptance: both aliases run by hand from a clean checkout exit 0 on a clean tree and read the same artifacts the publish path reads; a counter-probe per script (a test file copied into a built dist/, an extensionless relative re-export) turns each red.

Size: XS. ui/scripts/** is not governed; release.yml is (Tier H) if its comment moves.

Dedupe: open issues read by REST for node-esm-load and published-dist → only #26717 (the port).


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — priority:p2 · domain:ui · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T19:05Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch order · domain:ui#5 · session_01JQwxbXGpVJHZTXXerMoY4C · 2026-10-28T00:56Z

    You are the os-dev developer agent for exactly ONE card: #26860, in your own card thread. Your role definition is .claude/agents/os-dev.md in the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/26860" -H "Authorization: Bearer $GH_TOKEN" and /comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with [ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.

    Identity and branch: the seat's Claim: comment on this card is your identity; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Take another ui lane seat" one message with your branch name and wait. Worktree objectstack-issue-26860 on that branch from a fresh origin/main; pnpm install (frozen lockfile); push with git push -u origin <branch> (⛔ no force).

    Writes: PR only through the relay op pr_create (node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array [{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced; --dry-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=26860 --file=F --json run ONCE with output captured to a file (timestamps only as {{WAS:…}} / the now-token). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, line 3 Fixes #26860, then ## 维护者速读 six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on your diff, run each, record exits before any pipe, reconcile with --ran; node scripts/check-sdui-manifest.mjs is a gate on every ui card. Changeset in the root .changeset/ when a published package changes (@object-ui/i18n patch for namespace rows; app-shell is private: true). ⛔ ui/.github/** and the root ci.yml are out of bounds. Hand back: when the PR and report are up, send the seat thread "Take another ui lane seat" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.

    Ruling (cannot be re-ruled)

    Triage first grade 6451094740, verbatim: "p2: the maintainer-run build modes of check:node-esm-load and check:published-dist are broken (exit 254; they build the docs app). They guard what @object-ui/* publishes, so repair them alongside #26717's port (PR #26854). Lane: ui/scripts is domain:ui." Card Wanted, verbatim: "each script's build mode builds what the release builds (or the mode is removed and the alias defaults to --no-build with a clear "run pnpm build first" message)." The card's order condition ("after PR #26854 lands") is met: PR #26854 is merged. No maintainer ruling.

    PM mechanism assumptions (measure; disproof welcome)

    On origin/main 5e99bd93:

    • ui/scripts/check-node-esm-load.mjs build mode runs execFileSync('pnpm', ['build'], …) (≈L920) from ui/, whose package.json has no build script: exit 254.
    • ui/scripts/check-published-dist-tooling.mjs builds turbo run build --filter=!@object-ui/site (≈L308) from ui/, 128 tasks including @objectstack/docs, not the release's build.
    • ui/package.json changeset:publish (≈L117) runs check-published-dist-tooling.mjs with NO --no-build. Measure which command the release actually runs (release.yml, the root package.json, PR ci(ui-merge): port the four objectui gates that guard published @object-ui packages into root CI #26854's wiring) before you change a default: ⛔ a change that makes the publish path build something different, or skip a check it runs today, is out of scope and goes to open_questions.
    • Choose between the card's two shapes by measurement: if "what the release builds" is one stable command, run it; if not, drop the build mode and make the alias say "run pnpm build first". Name the reason in the PR body.

    Scope

    File surface: ui/scripts/check-node-esm-load.mjs, ui/scripts/check-published-dist-tooling.mjs, their tests under ui/scripts/, ui/package.json script lines only if an alias changes, and the stale docblock the card names in check-node-esm-load.mjs. ⛔ .github/workflows/** (release.yml is governed, Tier H): do NOT edit the stale release.yml comment here; list it in the report as follow-up owed — .github/workflows/release.yml and the seat files it. Acceptance (card, verbatim): "both aliases run by hand from a clean checkout exit 0 on a clean tree and read the same artifacts the publish path reads; a counter-probe per script (a test file copied into a built dist/, an extensionless relative re-export) turns each red." Record both counter-probes with their exits.

    Tier

    No path-derived mandate for ui/scripts/**. TIER_DEFAULT, effort medium (XS–S, judgment in what the release builds). Clause-②: no, Metadata-protocol: none expected. Changeset: ui/scripts ships in no package; tests/tooling-only ⇒ the skip-changeset label (not an empty changeset).

  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2
    Session: session_01JQwxbXGpVJHZTXXerMoY4C
    Account: os-warren
    Branch: claude/project-thread-opajp0
    Worktree: objectstack-issue-26860
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: ui/scripts/check-node-esm-load.mjs, ui/scripts/check-published-dist-tooling.mjs, their tests under ui/scripts/, ui/package.json script lines only if an alias changes (stop on breach; explain in the report). ⛔ .github/workflows/** (the stale release.yml comment is a follow-up the seat files).
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: ui/scripts tooling produces it (this lane) | CI and the release path route around it with --no-build since PR #26854 | a maintainer running the alias by hand reaches it
    Thread-read: 6457759840
    Premise: holds (build mode runs pnpm build from ui/ with no such script, ≈L920; published-dist builds --filter=!@object-ui/site, ≈L308, on origin/main 5e99bd93; the card's order condition PR #26854 is merged)
    Serial constraints cleared: open PRs #26995 (ui-merge lockfile gate) and #26556 (dependabot) edit other lines of ui/package.json; no open PR touches either script. Second to land merges main.

    Dispatch order: comment 6457759840. Card thread claude/project-thread-opajp0 may start editing.

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26860,
      "status": "done",
      "branch": "claude/project-thread-opajp0",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27014",
      "session": "session_01JQwxbXWtZtWh3syXudgoFj",
      "premise_still_valid": true,
      "summary": "Both maintainer-run build modes now run the release's own build: the workspace root's build script, from the workspace root (root pnpm build, which pnpm run release opens with and release.yml's publish job runs). check:node-esm-load reuses check:published-dist's buildWorkspace, so both gates read one build; a workspace root without a build script is refused by name. Shape chosen by measurement: the release build is one stable command, so the mode is kept, not removed. The publish path (release-publish.sh, ci.yml) passes --no-build and is unchanged. Stale 'wired into nothing' docblock lines refreshed in both scripts.",
      "tests": "head cf75e342: pnpm --dir ui exec vitest run scripts/__tests__/check-node-esm-load.test.ts scripts/__tests__/check-published-dist-tooling.test.ts -> 2 files, 89/89 passed. Acceptance by hand in a fresh worktree under the lock: check:node-esm-load --force-build exit 0 (turbo 116/116 built, 0 cached; provenance 35/35 own; load 33/36), check:published-dist exit 0 (36 packages, 5813 tarball files, 0 tooling), check:node-esm-load exit 0 (provenance 35/35, load 33/36). Before the fix on 5e99bd93: check:node-esm-load exit 1, Command build not found. Counter-probes: test file copied into ui/packages/core/dist -> check:published-dist --no-build exit 1 (tooling-in-published-output), removed -> exit 0; extensionless re-export appended to ui/packages/core/dist/index.js -> check:node-esm-load --no-build exit 1 (ERR_MODULE_NOT_FOUND @object-ui/core), restored by sha256 match -> exit 0. No ablation: tooling scripts only.",
      "gates": "dispatch-gates --commands derived 18 families on cf75e342; all 18 exit 0 (incl. pnpm --dir ui exec vitest run scripts/: 178 files passed, 2 skipped, 5069 tests passed; check-comment-mask-corpus; check:cross-package-test-inputs; check:type-check-coverage/debt; check:nul-bytes; check:published-files). --ran reconciliation: 18 accounted, 0 NOT-MEASURED. Outside the derivation, also exit 0: node scripts/check-sdui-manifest.mjs, ui eslint on the 4 changed files, check:new-line-citations, check:spec-symbols. PR check-runs: in_progress at report time.",
      "line_budget": "173 changed lines (+139/-34), 4 files, under the 3000 threshold",
      "files_changed": [
        "ui/scripts/check-node-esm-load.mjs",
        "ui/scripts/check-published-dist-tooling.mjs",
        "ui/scripts/__tests__/check-node-esm-load.test.ts",
        "ui/scripts/__tests__/check-published-dist-tooling.test.ts"
      ],
      "deviations": [
        "Commit trailer is the model-free pair per AGENTS.md (harness reminder asked for a model-named co-author; AGENTS.md and the pre-push hook win).",
        "PR body folds the template headings What changes/Why/Verification into the os-dev order; Human Minimum is carried by the 维护者速读 line 需要你做的."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and Clause-② no with no (narrowing) arm",
      "mcp_calls": "1 — mcp__claude-code-remote__subscribe_pr_activity (not a GitHub MCP tool); 0 GitHub MCP calls",
      "api_writes": "3 — git push (branch); relay pr_create -> PR #27014 (labels skip-changeset, assignee os-warren); this os-dev-report comment via post-stamped on issue 26860",
      "open_questions": [],
      "out_of_scope_findings": [
        "follow-up owed — .github/workflows/release.yml: the comment over the publish step is stale as the card names (Tier H; seat files it)",
        "noted, not filed — ui/package.json changeset:publish runs check-published-dist-tooling.mjs without --no-build and nothing invokes it (the release publishes via scripts/release-publish.sh); the wiring test comment in check-published-dist-tooling.test.ts still calls it the command changesets/action runs. class: drift, carrier: none"
      ]
    }

    Generated by Claude Code

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, M3tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions