Skip to content

mcpx: e2e/examples cluster fails with 'may be destructive and was not confirmed' under the PR #2888 sharded suite — main's suite state is masked by #2795 #2896

Closed

Description

@dezren39

Evidence (found by queue task 3294, lane C, 2026-10-31)

PR #2888 (the #1998 first measured CI iteration: new mcpx-test.yml, workflow-only diff) run 41152763644 on head 52d9466f3:

  • init PASS, lint PASS
  • unit FAIL: TestExamples/discover and TestExamples/stateful — demo.structured / demo.open may be destructive and was not confirmed: nobody answered within 45s (plus the known pre-existing conformance/defaults/settings failures, mcpx: internal/settings tests red on clean main — TESTING.md missing from compendium manifest, model.* settings lack effect probes, env doc drift #2846 family)
  • ALL 6 e2e shards FAIL, with a recurring cluster: TestAScriptsQuestionsReachAModernClientAsInputRequired, TestAScriptsQuestionsReachALegacyStdioClient, TestMcpxCallJSONCarriesTheDiagnostics, TestARequestStateOnAnotherRequestIsRefused, TestPassthroughToolQuestionsReachTheClient, TestMcpxCallPrintsTheDiagnostic — errors of the form <tool> may be destructive and was not confirmed: nobody answered within 45s / the answer was cancel.

Why main cannot currently arbitrate

mcpx.yml's go test ./... job is push-only, and every recent main push run (e.g. 41152450893, 41149248602) fails at the dogfood plugin-copy sync step (#2795) BEFORE go test runs — so there is no recent clean-main full-suite result to compare against. The failures may be (a) a real confirmation/elicitation regression on main that the push-only suite has been masking, or (b) an artifact of running e2e subsets via -run in shards (test-order/shared-state assumptions), or (c) a workflow-environment difference vs mcpx.yml (runtimes and working directory were checked and match).

Acceptance

Related: #1998, #2795, #2846.

Activity

  1. added
    app/mcpxPackage/app: mcpx (pkgs/ or apps/ in this repo)
    kind/ciCI/CD pipelines, workflows, and build automation
    priority/highImportant and time-sensitive
    effort/mMedium: expected under 1 day of work
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 31, 2026
  2. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    Intake review

    🤖 Agent note · filed

    Still live: yes — PR #2888 is open and the masking condition (#2795 blocking main's full suite) is named in the body; no merged PR resolves this.

    Related: #1998 (the sharded-suite work that surfaced the cluster), #2795 (dogfood sync failure masking main's suite), #2846 (known pre-existing failures family), PR #2888.

    Notes / risks: until one failing test is reproduced under full-suite conditions, (a) regression vs (b) shard artifact vs (c) environment stays undecided — every other mcpx CI conclusion is provisional while main has no clean full-suite result.

    Suggested approach: follow the body's own Acceptance order — reproduce one test on clean main under mcpx.yml conditions first; only then fix or document shard constraints.

    Labels normalized: kind/ci, priority/high (main's suite state is currently unknowable, which masks everything else), effort/m, status/needs-triage, meta/enriched.

  3. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    agent-note:v1 — reproduced (a): real main regression, bisected to bd48deb (#2829)

    Verdict: (a) a confirmation regression on main — not a shard artifact, not an environment difference

    Reproduced locally on the laptop, single test, no sharding:

    tree TestAScriptsQuestionsReachALegacyStdioClient
    origin/main @ d72c889 FAIL — ask.need_repo may be destructive and was not confirmed: the answer was cancel
    f318fd595 (bd48deb^) PASS (13.2s)
    origin/main + MCPX_POLICY_WRITE=allow FAIL (unchanged)
    • Bisect: git log --oneline origin/main -- pkgs/mcpx/internal/daemon/consumer.go — the last change is bd48deb1e mcpx: write policy gate (policy.write ask/allow/deny) — #1979 Phase 1 (#2829). The test passes on its parent and fails on it.
    • Root cause: mcpx: write policy gate (policy.write ask/allow/deny) — #1979 Phase 1 #2829 added "writePolicy": "ask" to internal/defaults/defaults.json (consumer block). Every tool whose schema carries no readOnlyHint: true is then a write by the specification's defaults, so the gate opens a confirmation on every such call. The e2e harness's fake/ask servers either cannot answer or answer cancel, and the gate reads that as a refusal — hence the answer was cancel and, where nobody is listening, nobody answered within 45s after the 45s AskTimeout (which is why the affected tests each take ~45s).
    • Scope of the breakage: the whole e2e suite plus examples (TestExamples/discover, TestExamples/stateful) — every unannotated tool call. That matches the PR ci(mcpx): first measured iteration — static e2e shards + unit + lint + ci-ok (#1998) #2888 run: all 6 shards red with the same signature.
    • mcpx: write policy gate (policy.write ask/allow/deny) — #1979 Phase 1 #2829 fixed only the handoff tests (handoff_load_test.go sets policy.write=allow "since their raw clients cannot answer questions"). The same reasoning applies to ~40 other e2e tests, which were not updated — so main has been red for mcpx e2e since that merge.

    Suggested fix (test-side, no policy decision needed) — pick one

    1. Harness default (recommended): set MCPX_POLICY_WRITE=allow in newEnv's env list beside MCPX_AUTOSTART_IDLE_EXIT, exactly as mcpx: write policy gate (policy.write ask/allow/deny) — #1979 Phase 1 #2829 did for the handoff tests; the gate's own tests (internal/daemon/write_policy_test.go, TestConfirmDestructiveHoldsOnAColdDaemon, the cold-catalog confirm test) opt back in to ask. This restores main without touching the default.
    2. Per-file test settings for each affected package, as handoff_load_test.go already does.
    3. Only if ask-by-default is not the intended product behaviour, revisit the default itself — but that is Design: mcpx write policy — one gate for writes (ask/allow/deny, argument rules, unknown-outcome ledger) #2126/mcpx: a write policy -- ask, allow, deny -- with the exact call shown when asking #1979's decision, not this issue's.

    Also confirmed pre-existing on clean main (same run, unrelated to this cluster)

    TestNoPackageRedeclaresADefault fails on origin/main @ d72c889 with the same settings/defaults family in #2846 — the unit leg's six guard failures are not #2888's.

    Effect on PR #2888

    #2888 is workflow-only; with this bisect its red legs are fully attributed to main, not to the diff. It stays parked until this lands, then re-runs and merges. Evidence posted on #1998.

  4. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/claimedQueue worker lifecycle state
    on Oct 31, 2026
  5. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · reproduction result (from queue task 4303, lane F)

    This issue's acceptance asks which of (a) real main regression / (b) shard artifact / (c) workflow-env difference holds. Evidence for (a):

    On a clean-main laptop worktree (94fdb0f), single test, no sharding, no CI:
    go test ./internal/e2e/ -run TestExecSurfacesToolErrorsAsExceptions -count=1 → FAIL (45s): demo.boom may be destructive and was not confirmed: nobody answered within 45s (e2e_test.go:302) — the identical signature as PR #2888 run 41167114746's shards.

    So the cluster reproduces locally on clean main under full-suite-style conditions; it is not produced by -run sharding or by the GitHub runner environment. Full diagnosis table (unit + e2e families of PR #2888) is recorded on #1998.

  6. added a commit that references this issue on Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/mcpxPackage/app: mcpx (pkgs/ or apps/ in this repo)effort/mMedium: expected under 1 day of workkind/ciCI/CD pipelines, workflows, and build automationmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/highImportant and time-sensitivestatus/in-progressQueue worker lifecycle statework/assignedQueue worker lifecycle state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions