You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Scenario runner: --packages workspace builds against the workspace's unreleased spec, skills and CLI (default stays published); the exporter refuses workspace records #31147
Filing-gate category: ② maintainer-directed task. Maintainer, verbatim (Claude Code session, 2026-11-07), answering the seat's two options (run on the published packages after each release; and a runner option to run on the workspace's unreleased packages beforehand): 「两种都要」. Routing, verbatim: 「能交给车队开发的你不要自己开发」. Epic: objectstack-ai/cloud#3600.
Problem
Every live run scaffolds with npm create objectstack, so the agent builds against the published packages: create-objectstack, @objectstack/spec, @objectstack/skills and @objectstack/cli, all 18.3.0 today (measured in the 2026-11-07 runs' package.json and skills-lock.json). That is right for what a customer gets. But it means improvements merged on main since 18.3.0 cannot be measured until a release:
The fleet cannot tell whether a skill change makes the agent err less before shipping it.
Ask
--packages published|workspace on run-scenarios, default published, which keeps today's behaviour.
workspace scaffolds the project from the workspace's own create-objectstack. It resolves @objectstack/spec, @objectstack/skills, @objectstack/cli, @objectstack/runtime, @objectstack/verify and every other @objectstack/* the scaffold depends on from the workspace. Packed tarballs (pnpm pack) are the likely route, so the project installs them exactly as it would install from npm; links would let the project see workspace-only files. The skills land in .claude/skills/ from the workspace build of @objectstack/skills.
The run record and the scorecard state the package source: packages: published 18.3.0, or packages: workspace @ <commit sha> (unreleased).
An epic objectstack-ai/cloud#3600 card (scenario runner and cards), from the first complete mid-tier run or the maintainer's 「两种都要」. Routing per 「能交给车队开发的你不要自己开发」.
Claim: PM loop round 1
Session: session_01FEkQ5njkh3xbcDN6EtSfw7
Account: os-project-manager
Branch: claude/project-thread-r1z0z3 (a project card thread, session_01FEkQ5motx584vybgif8qQe; the thread can push only its harness branch, a measured platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-31147
Domain: domain:devx
Seat: domain:devx#3
File surface: packages/qa/scenarios/src/runner/** (cli.ts flag, project.ts scaffold, scorecard.ts / transcript.ts package source), packages/qa/scenarios/src/export/** (refuse workspace records), their tests and the package README. create-objectstack only if the scaffold needs a hook (then a changeset is owed and declared).
Container & model: M, mode:thread, model: default — dispatch-gates --tier: no path-derived mandate, effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card; maintainer-directed runner option
Thread-read: 6708613132
Premise: holds. run-scenarios on main 56baf78e has no --packages flag and scaffolds with npm create objectstack (runner/project.ts).
Serial constraints cleared: none in flight on packages/qa/scenarios/src/runner/cli.ts or src/export/**; #31160 and #31159 (same cli.ts) are queued behind this card.
Order: pm-orders/devx/order-31147.md (project files), handed to the card thread in its opening message.
os-dev-report
{
"issue": 31147,
"status": "done",
"branch": "claude/project-thread-r1z0z3",
"pr": "#31188",
"session": "session_01FEkQ5motx584vybgif8qQe",
"premise_still_valid": true,
"summary": "run-scenarios gains --packages published|workspace (default published, scaffold command unchanged). workspace builds what the release builds for every non-private @objectstack/* and create-objectstack (turbo build build:dist), pnpm-packs each (75), scaffolds with the packed create-objectstack untouched (npx -y file:TARBALL) under a global pnpmfile that points its install at the tarballs, persists them as pnpm overrides and reinstalls, then refuses the scaffold unless every @objectstack/* store entry is a tarball and .claude/skills/ equals packages/skills/dist/skills skill for skill. Every record (env.packages, env.packagesLine) and scorecard states 'packages: published 18.3.0' or 'packages: workspace @ SHA (unreleased)'; the gallery exporter refuses workspace records and records that state no source. No change to create-objectstack (no hook needed), so skip-changeset. Live measurement (no model): workspace scaffold all 61 @objectstack store entries from tarballs, 11 skills byte-identical, validate exit 0, boot health 200; a published 18.3.0 scaffold is refused by the same check (registry entries, 47 skill files differ). Found and fixed a nested-npx trap: --package= leaks npm_config_package into the scaffolder so its own skills step installed nothing.",
"tests": "head 4551309. pnpm --filter @objectstack/scenarios test (after pnpm --filter '@objectstack/scenarios...' build, under the verify lock): Test Files 24 passed (24), Tests 470 passed (470); typecheck exit 0; VERDICT command-exit 0. New: test/runner/packages.test.ts 8 cases (real pnpm pack, npx -y file: scaffold, pnpmfile, both installs, against a temp workspace; marker present only in the workspace build lands in .claude/skills/; negatives: published catalog, registry store entry, no pnpm store), exporter.test.ts 4 cases (workspace record refused, newer workspace record removes the published export, unstated/versionless refused, published exports with the line), units.test.ts 3 cases (flag, lines, installed version). Ablations via scripts/ablation-replace.mjs, each restored blob == HEAD, git diff HEAD empty, src-imported suites (no dist leg): 1 exporter refusal disarmed -> exporter.test.ts -t published: 3 failed | 1 passed; 2 skills differ check disarmed -> packages.test.ts 1 failed | 7 passed; 3 pnpmfile env renamed -> beforeAll scaffold exit 1, suite red, 5 skipped. Recorded-driver end-to-end: NOT MEASURED, no recording in this container and live runs are paused.",
"gates": "local, head 4551309: dispatch-gates --commands --repo objectstack-ai/objectstack -> 51 commands, all 51 exit 0 (captured before any pipe); --ran: 51 derived, 51 run, 0 NOT-MEASURED, 0 UNRUN. Round 1 on an earlier head read check-plugin-teardown-shape --self-test and check:dual-build-cjs-loads exit 3 (prerequisite not met); after git fetch --depth=1 of the pinned commit and the package build both exit 0. eslint packages/qa/scenarios --no-inline-config exit 0. CI check-runs on PR 31188: in_progress at report time (not waited for). List: pm-orders/devx/31147-gates-ran.txt and the PR body.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"line_budget": "14 files, +697 / -30 (727 changed lines, under 3000)",
"files_changed": [
"packages/qa/scenarios/README.md",
"packages/qa/scenarios/src/export/cli.ts",
"packages/qa/scenarios/src/export/exporter.ts",
"packages/qa/scenarios/src/export/record.ts",
"packages/qa/scenarios/src/runner/cli.ts",
"packages/qa/scenarios/src/runner/index.ts",
"packages/qa/scenarios/src/runner/packages.ts",
"packages/qa/scenarios/src/runner/project.ts",
"packages/qa/scenarios/src/runner/scorecard.ts",
"packages/qa/scenarios/test/export/exporter.test.ts",
"packages/qa/scenarios/test/export/fixture.ts",
"packages/qa/scenarios/test/runner/orchestrate.test.ts",
"packages/qa/scenarios/test/runner/packages.test.ts",
"packages/qa/scenarios/test/runner/units.test.ts"
],
"deviations": [
"Order hypothesis held with one change: tarballs via pnpm pack, but installed through a global pnpmfile during the scaffolder's own install plus persisted pnpm overrides, so create-objectstack runs untouched (no --skip-install, no copied skills command). Reasons in the PR Acceptance notes.",
"A record without env.packages (written before this flag) is refused by the exporter as well as a workspace record: the ruling exports only published runs, and such a record does not show it was one.",
"Overrides cover every package the release publishes, not only the scaffold closure, so a package the agent adds later is the workspace one too.",
"Live build in this container covered the scaffold closure plus the Console (98 turbo tasks, 15 min); the runner itself builds all 75 released packages."
],
"mcp_calls": "7 — reads only: issue_read get #31147, issue_read get_comments #31147 x3, issue_read get #30349, issue_read get_labels #31188 (failed: a PR number), pull_request_read get #31188",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches; the relay created PR 31188 draft with label skip-changeset, read-back identical), and this os-dev-report comment via post-stamped. git push is not a REST write.",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": []
}
State change: pm:dispatched removed (card closed). Acceptance notes (NOT MEASURED, in the PR body): the agent's later pnpm add in a real run uses whatever pnpm the project dir resolves, and the persisted overrides were measured on pnpm 10.31 only; the pinned-pnpm shim is POSIX sh. Serial: #31160 (PR #31204) and #31172 (PR #31221) now take their second origin/main merge.
Activity
objectstack-fleet commentedon Nov 7, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p1 kept ·
domain:devx· 2026-11-07T15:00Z⛔ Not a claim.
domain:devx,area:devpathandpm:queuekept.Generated by Claude Code
objectstack-fleet commentedon Nov 7, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7
Claim: PM loop round 1
Session:
session_01FEkQ5njkh3xbcDN6EtSfw7Account:
os-project-managerBranch:
claude/project-thread-r1z0z3(a project card thread,session_01FEkQ5motx584vybgif8qQe; the thread can push only its harness branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-31147Domain:
domain:devxSeat:
domain:devx#3File surface:
packages/qa/scenarios/src/runner/**(cli.tsflag,project.tsscaffold,scorecard.ts/transcript.tspackage source),packages/qa/scenarios/src/export/**(refuseworkspacerecords), their tests and the package README.create-objectstackonly if the scaffold needs a hook (then a changeset is owed and declared).Container & model:
M,mode:thread,model: default — dispatch-gates --tier: no path-derived mandate,effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card; maintainer-directed runner option
Thread-read: 6708613132
Premise: holds.
run-scenarioson main56baf78ehas no--packagesflag and scaffolds withnpm create objectstack(runner/project.ts).Serial constraints cleared: none in flight on
packages/qa/scenarios/src/runner/cli.tsorsrc/export/**; #31160 and #31159 (samecli.ts) are queued behind this card.Order:
pm-orders/devx/order-31147.md(project files), handed to the card thread in its opening message.objectstack-fleet commentedon Nov 7, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5motx584vybgif8qQe
os-dev-report
{
"issue": 31147,
"status": "done",
"branch": "claude/project-thread-r1z0z3",
"pr": "#31188",
"session": "session_01FEkQ5motx584vybgif8qQe",
"premise_still_valid": true,
"summary": "run-scenarios gains --packages published|workspace (default published, scaffold command unchanged). workspace builds what the release builds for every non-private @objectstack/* and create-objectstack (turbo build build:dist), pnpm-packs each (75), scaffolds with the packed create-objectstack untouched (npx -y file:TARBALL) under a global pnpmfile that points its install at the tarballs, persists them as pnpm overrides and reinstalls, then refuses the scaffold unless every @objectstack/* store entry is a tarball and .claude/skills/ equals packages/skills/dist/skills skill for skill. Every record (env.packages, env.packagesLine) and scorecard states 'packages: published 18.3.0' or 'packages: workspace @ SHA (unreleased)'; the gallery exporter refuses workspace records and records that state no source. No change to create-objectstack (no hook needed), so skip-changeset. Live measurement (no model): workspace scaffold all 61 @objectstack store entries from tarballs, 11 skills byte-identical, validate exit 0, boot health 200; a published 18.3.0 scaffold is refused by the same check (registry entries, 47 skill files differ). Found and fixed a nested-npx trap: --package= leaks npm_config_package into the scaffolder so its own skills step installed nothing.",
"tests": "head 4551309. pnpm --filter @objectstack/scenarios test (after pnpm --filter '@objectstack/scenarios...' build, under the verify lock): Test Files 24 passed (24), Tests 470 passed (470); typecheck exit 0; VERDICT command-exit 0. New: test/runner/packages.test.ts 8 cases (real pnpm pack, npx -y file: scaffold, pnpmfile, both installs, against a temp workspace; marker present only in the workspace build lands in .claude/skills/; negatives: published catalog, registry store entry, no pnpm store), exporter.test.ts 4 cases (workspace record refused, newer workspace record removes the published export, unstated/versionless refused, published exports with the line), units.test.ts 3 cases (flag, lines, installed version). Ablations via scripts/ablation-replace.mjs, each restored blob == HEAD, git diff HEAD empty, src-imported suites (no dist leg): 1 exporter refusal disarmed -> exporter.test.ts -t published: 3 failed | 1 passed; 2 skills differ check disarmed -> packages.test.ts 1 failed | 7 passed; 3 pnpmfile env renamed -> beforeAll scaffold exit 1, suite red, 5 skipped. Recorded-driver end-to-end: NOT MEASURED, no recording in this container and live runs are paused.",
"gates": "local, head 4551309: dispatch-gates --commands --repo objectstack-ai/objectstack -> 51 commands, all 51 exit 0 (captured before any pipe); --ran: 51 derived, 51 run, 0 NOT-MEASURED, 0 UNRUN. Round 1 on an earlier head read check-plugin-teardown-shape --self-test and check:dual-build-cjs-loads exit 3 (prerequisite not met); after git fetch --depth=1 of the pinned commit and the package build both exit 0. eslint packages/qa/scenarios --no-inline-config exit 0. CI check-runs on PR 31188: in_progress at report time (not waited for). List: pm-orders/devx/31147-gates-ran.txt and the PR body.",
"dogfood_battery": "n/a — no
!in the PR title and no (narrowing) arm","line_budget": "14 files, +697 / -30 (727 changed lines, under 3000)",
"files_changed": [
"packages/qa/scenarios/README.md",
"packages/qa/scenarios/src/export/cli.ts",
"packages/qa/scenarios/src/export/exporter.ts",
"packages/qa/scenarios/src/export/record.ts",
"packages/qa/scenarios/src/runner/cli.ts",
"packages/qa/scenarios/src/runner/index.ts",
"packages/qa/scenarios/src/runner/packages.ts",
"packages/qa/scenarios/src/runner/project.ts",
"packages/qa/scenarios/src/runner/scorecard.ts",
"packages/qa/scenarios/test/export/exporter.test.ts",
"packages/qa/scenarios/test/export/fixture.ts",
"packages/qa/scenarios/test/runner/orchestrate.test.ts",
"packages/qa/scenarios/test/runner/packages.test.ts",
"packages/qa/scenarios/test/runner/units.test.ts"
],
"deviations": [
"Order hypothesis held with one change: tarballs via pnpm pack, but installed through a global pnpmfile during the scaffolder's own install plus persisted pnpm overrides, so create-objectstack runs untouched (no --skip-install, no copied skills command). Reasons in the PR Acceptance notes.",
"A record without env.packages (written before this flag) is refused by the exporter as well as a workspace record: the ruling exports only published runs, and such a record does not show it was one.",
"Overrides cover every package the release publishes, not only the scaffold closure, so a package the agent adds later is the workspace one too.",
"Live build in this container covered the scaffold closure plus the Console (98 turbo tasks, 15 min); the runner itself builds all 75 released packages."
],
"mcp_calls": "7 — reads only: issue_read get #31147, issue_read get_comments #31147 x3, issue_read get #30349, issue_read get_labels #31188 (failed: a PR number), pull_request_read get #31188",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches; the relay created PR 31188 draft with label skip-changeset, read-back identical), and this os-dev-report comment via post-stamped. git push is not a REST write.",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Nov 7, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7
Landed 2026-11-07T18:41Z · PR #31188 merged through the merge queue at 2026-11-07T18:41Z, as
86e9ef0a687d58b4554d6143a18c3d62f9b38c89.merged: true, merge commit86e9ef0a68, head reviewed38562001b6(ACCEPT on the PR, round 2)completedbyFixes #31147State change:
pm:dispatchedremoved (card closed). Acceptance notes (NOT MEASURED, in the PR body): the agent's laterpnpm addin a real run uses whatever pnpm the project dir resolves, and the persisted overrides were measured on pnpm 10.31 only; the pinned-pnpm shim is POSIXsh. Serial: #31160 (PR #31204) and #31172 (PR #31221) now take their secondorigin/mainmerge.