Skip to content

examples/app-todo: the manual test:mcp script fails at step 3 on main ("Organization is required"), and no lane runs it #30928

Closed

Description

@objectstack-fleet

domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

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 main 1697d5ca9. 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.

Activity

  1. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p3 · domain:devx · 2026-11-06T12:22Z

    ⛔ Not a claim.

    • examples/app-todo's manual test:mcp script fails at step 3 on main ("Organization is required"). It is a manual example script, so p3.

    Generated by Claude Code

  2. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7

    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.

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 7, 2026
  4. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7

    Claim amendment · file surface

    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.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    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: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."
    ]
    }


    Generated by Claude Code

  6. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

    Reading Value
    PR #31230 merged: true, merge commit 30f23fef48, head reviewed e2ebb1ea12 (ACCEPT on the PR)
    #30928 closed completed by Fixes #30928

    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.

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

Metadata

Metadata

Labels

bugSomething isn't workingdomain:devxDomain lane — seat card indexed by label:pm:seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions