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
examples/app-todo: the manual test:mcp script fails at step 3 on main ("Organization is required"), and no lane runs it #30928
Filing gate: ① defect, named location. This is an out-of-scope finding of the #30804 PR 2 dev work (os-dev-report 6684399669 on #30804, PR #30927). ⛔ Not a claim. Triage sets the grade and the lane.
Business reason.examples/app-todo ships a manual MCP end-to-end script that is meant to prove the todo app's actions work over MCP. It fails on main, and nothing runs it, so a regression on that path stays invisible and anyone who follows the script gets a red they did not cause.
What happens
pnpm --filter @objectstack/example-todo test:mcp (tsx test/mcp-actions.e2e.ts, examples/app-todo/package.json:20) exits 1 at its step 3 on main1697d5ca9. Steps 1 and 2 pass. The seed and the step-3 insert both fail with Organization is required, because the script boots without an organization. The renames in PR #30927 do not change this: the script fails the same way before and after them.
No workflow or package script runs test:mcp, so CI never sees it.
Wanted
Make the script boot with an organization (or seed under the system context the other example e2e boots use), so all its steps pass on main.
Then either wire it into a lane that runs (an example or dogfood suite), or delete it if another test already covers the same MCP action path. Name which one in the PR.
Suggested grade: p3. The script is manual, and the product path it exercises may be covered elsewhere.
Claim: PM loop round 1
Session: session_01FEkQ5njkh3xbcDN6EtSfw7
Account: os-project-manager
Branch: claude/project-thread-cv42l4 (a project card thread, session_01FEkQ5k9SPSJRVA5sTSKkU8; the thread can push only its harness branch, a measured platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-30928
Domain: domain:devx
Seat: domain:devx#3
File surface: examples/app-todo/** (test/mcp-actions.e2e.ts boot, its package script, a test file if wired) and, only if wired there, packages/qa/dogfood/**. ⛔ Root ci.yml out of bounds; ⛔ no platform package change (a platform defect is reported, not fixed).
Container & model: S/M, mode:thread, model: default — dispatch-gates --tier: no path-derived mandate, effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: the failing script's own boot (no organization) in objectstack examples/app-todo; the platform path that already covers MCP actions is to be named by the dev; nobody reaches the script but a person running it by hand, and no lane runs it today
Thread-read: 6684718214
Premise: holds per the card (step 3 "Organization is required" on main 1697d5ca9); examples/app-todo/package.json still declares test:mcp on main 56baf78e. The dev re-measures on current main.
Serial constraints cleared: none in flight on examples/app-todo/**.
Ruling-ref: 「p1 p2 处理完了,就可以处理 p3」 (maintainer, 2026-10-26T10:29Z) — the lane's only unclaimed p1 (#31159) is serialized behind in-flight PRs on the runner CLI/driver.
Order: pm-orders/devx/order-30928.md (project files), handed to the card thread in its opening message.
Measured by the card thread on main 4c318214: test:mcp exits 1 at step 3 as the card says; mounting plugin-auth's createIdentityObjectsPlugin() (the documented reduced-kernel recipe, which creates the Default Organization before AppPlugin seeds) makes all 7 steps pass with no platform change. Route chosen: wire. packages/mcp/src/mcp-action-confirmation-member.test.ts names this script as the only place the confirmation gate's two halves run together against a real engine, so it has no duplicate. The script becomes examples/app-todo/test/mcp-actions.test.ts (vitest, in the example's own suite) and test:mcp goes.
The claim's file surface (above) gains two paths, both direct fallout of the wire:
pnpm-lock.yaml: the new workspace devDependency @objectstack/plugin-auth on the example. Lockfile only; a conflict with another in-flight PR is settled by a main merge and re-resolve, never by hand-editing.
packages/mcp/src/mcp-action-confirmation-member.test.ts: the one comment line that names the old .e2e.ts path, re-pointed. Comment only; the "no platform package change" bound still holds for code.
packages/qa/dogfood/** stays unused under this route. Everything else in the claim stands.
os-dev-report
{
"issue": 30928,
"status": "done",
"branch": "claude/project-thread-cv42l4",
"pr": "#31230",
"session": "session_01FEkQ5k9SPSJRVA5sTSKkU8",
"premise_still_valid": true,
"summary": "Premise re-measured on main 4c31821: pnpm --filter @objectstack/example-todo test:mcp exits 1 at step 3 with 'Organization is required' (the kernel registers no organization object, so AppPlugin's seed and every system insert are refused). Fix is the boot only: the suite mounts plugin-auth's createIdentityObjectsPlugin() (the reduced-kernel recipe whose start() creates the Default Organization before AppPlugin seeds), so all steps pass with no platform change. Choice: WIRED, not deleted: the script became examples/app-todo/test/mcp-actions.test.ts (vitest, one case per step plus a new case pinning one organization and the app's seed rows), runs in the example's own pnpm test (Test Core), and the test:mcp script is gone. Also: example-todo devDependency @objectstack/plugin-auth (+3 lockfile lines), anchored source aliases in examples/app-todo/vitest.config.ts for mcp/runtime/plugin-auth (check:test-source-alias required them), the same boot for the second manual script test/seed-check.ts (bounded in-place fix, same class), and path pointers to the old file name (README, node-shim.d.ts, task-completion-trigger.test.ts comment, and the one comment line in packages/mcp/src/mcp-action-confirmation-member.test.ts, on the seat's amended surface). Card assignee not touched; no claim of my own.",
"tests": "examples/app-todo on head e2ebb1e: pnpm exec vitest run Test Files 9 passed (9), Tests 249 passed (249); mcp-actions.test.ts 9 passed, file line 887 ms. pnpm typecheck (tsc --noEmit, includes test/**) exit 0. packages/mcp vitest run src/mcp-action-confirmation-member.test.ts 6 passed (comment-only edit). tsx test/seed-check.ts exit 1 before (8 seed refusals 'Organization is required'), exit 0 after ('Found Tasks: 8'). Red-first (committed head, ablation-replace.mjs --delete of the createIdentityObjectsPlugin() line; anchor 1 -> 0, blob 08e51a7e -> e95cbeaa): 5 failed | 4 passed — the boot case (Object 'sys_organization' not found) and steps 3, 5, 6, 7 (ValidationError: Organization is required); restored blob == HEAD 08e51a7e, git diff HEAD empty. Run on head 18de736 and again on e2ebb1e, same reading. Not used instead: the example testkit installDefaultOrganization after bootstrap — measured too late (8 seed refusals at boot, then SystemWriteOrganizationRequiredError at step 3 because the engine memoised the empty organization probe during the seed).",
"gates": "Derived by node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 64 commands, run on final head e2ebb1e, each exit captured before any pipe (redirect then $?). --ran: '64 derived famil(ies) accounted for — 64 run, 0 NOT-MEASURED'; all 64 exit 0. The first union run (head 59c1bd9) read pnpm check:test-source-alias exit 1 (new dist imports @objectstack/mcp, runtime, plugin-auth) — fixed by the vitest.config.ts aliases, then rerun in full. check-plugin-teardown-shape.mjs --self-test needed git fetch --depth=1 origin 621a4876 on the shallow clone, then exit 0. Scoped lint: pnpm exec eslint --no-inline-config examples/app-todo packages/mcp/src/mcp-action-confirmation-member.test.ts exit 0. Gate record: pm-orders/devx/30928-gates-ran.txt (project files). CI at report time (e2ebb1e): Check Changeset success; Lint · *, Type Check · *, PR-body guards, Governed Surface Queue Guard, Validate Package Dependencies in_progress. test:repo not run locally (diff touches no repo-project test); CI Test Core runs it and the example suite.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0 — no MCP GitHub calls (reads via gh api REST)",
"api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create: #31230, draft, labels skip-changeset, read back identical 8902/8902 bytes, assignees none, labels confirmed by REST read of the pull); POST /repos/objectstack-ai/objectstack/dispatches (relay comment: this os-dev-report on #30928 via post-stamped.mjs). Plus three git pushes (not REST).",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"Coverage reading, noted not filed (carrier: none): partial MCP action overlaps exist — mcp-system-object-action-exposure.dogfood.test.ts drives run_action 428/confirmed through live MCP but only for sys_user type 'api' actions, and dogfood skips PR CI; packages/mcp door tests use a bridge double; runtime action-confirmation-gate.test.ts has no MCP door. No test besides this suite drives an app script action with a registered handler, the requiredPermissions gate, or the ai.exposed gate through MCPServerRuntime -> buildMcpBridge -> a real engine. Dedupe words: mcp run_action e2e, example-todo mcp, confirmation gate real engine."
]
}
State change: pm:dispatched removed (card closed). Acceptance note: examples/app-todo/vitest.config.ts now spells its own defineConfig rather than merging the root preset, the same shape examples/app-showcase uses; a key later added to the preset would not reach this package.
Activity
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p3 ·
domain:devx· 2026-11-06T12:22Z⛔ Not a claim.
examples/app-todo's manualtest:mcpscript fails at step 3 onmain("Organization is required"). It is a manual example script, so p3.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-cv42l4(a project card thread,session_01FEkQ5k9SPSJRVA5sTSKkU8; the thread can push only its harness branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30928Domain:
domain:devxSeat:
domain:devx#3File surface:
examples/app-todo/**(test/mcp-actions.e2e.tsboot, its package script, a test file if wired) and, only if wired there,packages/qa/dogfood/**. ⛔ Rootci.ymlout of bounds; ⛔ no platform package change (a platform defect is reported, not fixed).Container & model:
S/M,mode:thread,model: default — dispatch-gates --tier: no path-derived mandate,effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: the failing script's own boot (no organization) in objectstack
examples/app-todo; the platform path that already covers MCP actions is to be named by the dev; nobody reaches the script but a person running it by hand, and no lane runs it todayThread-read: 6684718214
Premise: holds per the card (step 3 "Organization is required" on main
1697d5ca9);examples/app-todo/package.jsonstill declarestest:mcpon main56baf78e. The dev re-measures on current main.Serial constraints cleared: none in flight on
examples/app-todo/**.Ruling-ref: 「p1 p2 处理完了,就可以处理 p3」 (maintainer, 2026-10-26T10:29Z) — the lane's only unclaimed p1 (#31159) is serialized behind in-flight PRs on the runner CLI/driver.
Order:
pm-orders/devx/order-30928.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_01FEkQ5njkh3xbcDN6EtSfw7
Claim amendment · file surface
Measured by the card thread on main
4c318214:test:mcpexits 1 at step 3 as the card says; mounting plugin-auth'screateIdentityObjectsPlugin()(the documented reduced-kernel recipe, which creates the Default Organization before AppPlugin seeds) makes all 7 steps pass with no platform change. Route chosen: wire.packages/mcp/src/mcp-action-confirmation-member.test.tsnames this script as the only place the confirmation gate's two halves run together against a real engine, so it has no duplicate. The script becomesexamples/app-todo/test/mcp-actions.test.ts(vitest, in the example's own suite) andtest:mcpgoes.The claim's file surface (above) gains two paths, both direct fallout of the wire:
pnpm-lock.yaml: the new workspace devDependency@objectstack/plugin-authon the example. Lockfile only; a conflict with another in-flight PR is settled by a main merge and re-resolve, never by hand-editing.packages/mcp/src/mcp-action-confirmation-member.test.ts: the one comment line that names the old.e2e.tspath, re-pointed. Comment only; the "no platform package change" bound still holds for code.packages/qa/dogfood/**stays unused under this route. Everything else in the claim stands.Generated by Claude Code
objectstack-fleet commentedon Nov 7, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5k9SPSJRVA5sTSKkU8
os-dev-report
{
"issue": 30928,
"status": "done",
"branch": "claude/project-thread-cv42l4",
"pr": "#31230",
"session": "session_01FEkQ5k9SPSJRVA5sTSKkU8",
"premise_still_valid": true,
"summary": "Premise re-measured on main 4c31821:
pnpm --filter @objectstack/example-todo test:mcpexits 1 at step 3 with 'Organization is required' (the kernel registers no organization object, so AppPlugin's seed and every system insert are refused). Fix is the boot only: the suite mounts plugin-auth's createIdentityObjectsPlugin() (the reduced-kernel recipe whose start() creates the Default Organization before AppPlugin seeds), so all steps pass with no platform change. Choice: WIRED, not deleted: the script became examples/app-todo/test/mcp-actions.test.ts (vitest, one case per step plus a new case pinning one organization and the app's seed rows), runs in the example's own pnpm test (Test Core), and the test:mcp script is gone. Also: example-todo devDependency @objectstack/plugin-auth (+3 lockfile lines), anchored source aliases in examples/app-todo/vitest.config.ts for mcp/runtime/plugin-auth (check:test-source-alias required them), the same boot for the second manual script test/seed-check.ts (bounded in-place fix, same class), and path pointers to the old file name (README, node-shim.d.ts, task-completion-trigger.test.ts comment, and the one comment line in packages/mcp/src/mcp-action-confirmation-member.test.ts, on the seat's amended surface). Card assignee not touched; no claim of my own.","tests": "examples/app-todo on head e2ebb1e:
pnpm exec vitest runTest Files 9 passed (9), Tests 249 passed (249); mcp-actions.test.ts 9 passed, file line 887 ms.pnpm typecheck(tsc --noEmit, includes test/**) exit 0. packages/mcpvitest run src/mcp-action-confirmation-member.test.ts6 passed (comment-only edit).tsx test/seed-check.tsexit 1 before (8 seed refusals 'Organization is required'), exit 0 after ('Found Tasks: 8'). Red-first (committed head, ablation-replace.mjs --delete of the createIdentityObjectsPlugin() line; anchor 1 -> 0, blob 08e51a7e -> e95cbeaa): 5 failed | 4 passed — the boot case (Object 'sys_organization' not found) and steps 3, 5, 6, 7 (ValidationError: Organization is required); restored blob == HEAD 08e51a7e, git diff HEAD empty. Run on head 18de736 and again on e2ebb1e, same reading. Not used instead: the example testkit installDefaultOrganization after bootstrap — measured too late (8 seed refusals at boot, then SystemWriteOrganizationRequiredError at step 3 because the engine memoised the empty organization probe during the seed).","gates": "Derived by
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 64 commands, run on final head e2ebb1e, each exit captured before any pipe (redirect then $?).--ran: '64 derived famil(ies) accounted for — 64 run, 0 NOT-MEASURED'; all 64 exit 0. The first union run (head 59c1bd9) readpnpm check:test-source-aliasexit 1 (new dist imports @objectstack/mcp, runtime, plugin-auth) — fixed by the vitest.config.ts aliases, then rerun in full.check-plugin-teardown-shape.mjs --self-testneededgit fetch --depth=1 origin 621a4876on the shallow clone, then exit 0. Scoped lint:pnpm exec eslint --no-inline-config examples/app-todo packages/mcp/src/mcp-action-confirmation-member.test.tsexit 0. Gate record: pm-orders/devx/30928-gates-ran.txt (project files). CI at report time (e2ebb1e): Check Changeset success; Lint · *, Type Check · *, PR-body guards, Governed Surface Queue Guard, Validate Package Dependencies in_progress. test:repo not run locally (diff touches no repo-project test); CI Test Core runs it and the example suite.","dogfood_battery": "n/a — no
!in the PR title and no (narrowing) arm","mcp_calls": "0 — no MCP GitHub calls (reads via gh api REST)",
"api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create: #31230, draft, labels skip-changeset, read back identical 8902/8902 bytes, assignees none, labels confirmed by REST read of the pull); POST /repos/objectstack-ai/objectstack/dispatches (relay comment: this os-dev-report on #30928 via post-stamped.mjs). Plus three git pushes (not REST).",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"Coverage reading, noted not filed (carrier: none): partial MCP action overlaps exist — mcp-system-object-action-exposure.dogfood.test.ts drives run_action 428/confirmed through live MCP but only for sys_user type 'api' actions, and dogfood skips PR CI; packages/mcp door tests use a bridge double; runtime action-confirmation-gate.test.ts has no MCP door. No test besides this suite drives an app script action with a registered handler, the requiredPermissions gate, or the ai.exposed gate through MCPServerRuntime -> buildMcpBridge -> a real engine. Dedupe words: mcp run_action e2e, example-todo mcp, confirmation gate real engine."
]
}
Generated by Claude Code
objectstack-fleet commentedon Nov 7, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7
Landed 2026-11-07T19:37Z · PR #31230 merged through the merge queue at 2026-11-07T19:36Z, as
30f23fef481c89e8e94beb45f6b912d56dea0ea1.merged: true, merge commit30f23fef48, head reviewede2ebb1ea12(ACCEPT on the PR)completedbyFixes #30928State change:
pm:dispatchedremoved (card closed). Acceptance note:examples/app-todo/vitest.config.tsnow spells its owndefineConfigrather than merging the root preset, the same shapeexamples/app-showcaseuses; a key later added to the preset would not reach this package.