Skip to content

Commit 2ffeeed

Browse files
bb-connorclaude
andcommitted
Phase 0 issue #3: 9 more conformance fixtures (20/20 — gate cleared)
Hand-curated 9 fixtures from arc's untapped scenario hierarchy: auth/ auth-unauthorized-challenge (401 + WWW-Authenticate emission) auth-token-exchange-initialize (RFC 8693 narrowing exchange) mcp_core/ initialize (protocol version negotiation) tools-call-simple-text (CallToolResult content shape) chio-extensions/ deny-receipt-emitted (verdict-receipt obligation) tasks/ tasks-call-get-result (premature Done status race) nested_callbacks/ nested-elicitation-form-create (callback round-trip routing) notifications/ resources-subscribe-updated (long-lived transport state) arc PRs/ peer-lock-resolution-pr-147 (runtime peer-lock resolution sub-fix) Each has a plausible failure_message modeled on the relevant driver's assertion-failure output (HTTP 401 with header expectations, Status::Done timing, JSON content-type negotiation, etc), ranked canonical_fix files with real anchors, and curator notes explaining why the fixture is good fixture material. Coverage now spans the MCP surface broadly: auth, lifecycle, tools, tasks (experimental), notifications, nested callbacks, chio-extension verdict-receipts. 12 of 20 fixtures came from real arc scenarios; 8 came from real arc PR fixes. eval-outcomes report status flips: | conformance-harness-recall | 20 | BLOCKED — runner | fixtures present; runner is Phase 1 deliverable | **All four Phase 0 outcome evals are now runner-blocked**, not fixture-blocked. Issue #3's fixture deliverable is complete. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 079fbba commit 2ffeeed

10 files changed

Lines changed: 271 additions & 2 deletions
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
id: auth-token-exchange-initialize-2026-05-07
2+
failing_test: "tests/conformance/scenarios/auth/auth-token-exchange-initialize.json#auth-token-exchange-initialize"
3+
failure_message: |
4+
FAILED auth-token-exchange-initialize (RFC 8693)
5+
Expected: token exchange request → response with new access token
6+
bound to the requested resource scope
7+
Got: response token has scope "*" instead of the requested
8+
narrow scope `chio:tool:database_read`
9+
The token endpoint over-granted scope. Per RFC 8693, the issued
10+
token MUST NOT have wider scope than was requested AND wider than
11+
the original token's scope. Both bounds were violated.
12+
canonical_fix:
13+
- file: "tests/conformance/scenarios/auth/auth-token-exchange-initialize.json"
14+
section: "expected response scope"
15+
- file: "crates/chio-mcp-adapter/src/transport.rs"
16+
section: "token exchange handling"
17+
- file: "crates/chio-core-types/src/capability.rs"
18+
section: "scope narrowing"
19+
- file: "spec/PROTOCOL.md"
20+
section: "RFC 8693 token exchange"
21+
relevant_arc_pr: "(scenario authored on origin/codex/chio-kb-a-grade-dogfood)"
22+
relevant_arc_commit: "(scenario fixture)"
23+
commit_subject: "Conformance scenario: token exchange narrows scope correctly"
24+
commit_date: "2026-05-07T00:00:00-04:00"
25+
notes: |
26+
Hand-curated. RFC 8693 token exchange is a security-critical MCP
27+
surface — over-granting scope here is a privilege-escalation bug.
28+
Pairs with capability-scope-related vault content. The agent must
29+
recognize that "scope: *" in a response is NEVER correct for a
30+
narrowing exchange.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
id: auth-unauthorized-challenge-2026-05-07
2+
failing_test: "tests/conformance/scenarios/auth/auth-unauthorized-challenge.json#auth-unauthorized-challenge"
3+
failure_message: |
4+
FAILED auth-unauthorized-challenge (specVersion 2025-11-25, streamable-http)
5+
Expected: HTTP 401 with WWW-Authenticate: Bearer realm="...", resource_metadata="..."
6+
Got: HTTP 200 (unauthenticated initialize succeeded)
7+
The server returned a successful initialize response to an
8+
unauthenticated request — should have challenged with a
9+
protected-resource metadata reference.
10+
canonical_fix:
11+
- file: "tests/conformance/scenarios/auth/auth-unauthorized-challenge.json"
12+
section: "expected pass criteria"
13+
- file: "crates/chio-mcp-edge/src/runtime.rs"
14+
section: "auth challenge handling"
15+
- file: "crates/chio-mcp-adapter/src/transport.rs"
16+
section: "WWW-Authenticate emission"
17+
- file: "spec/PROTOCOL.md"
18+
section: "Authorization challenge"
19+
relevant_arc_pr: "(scenario authored on origin/codex/chio-kb-a-grade-dogfood)"
20+
relevant_arc_commit: "(scenario fixture)"
21+
commit_subject: "Conformance scenario: unauthenticated initialize gets WWW-Authenticate challenge"
22+
commit_date: "2026-05-07T00:00:00-04:00"
23+
notes: |
24+
Hand-curated. Auth challenge is the entry point to OAuth-style
25+
protected-resource discovery. A server that fails closed (401 with
26+
metadata reference) is the spec'd behavior; failing open (200) is the
27+
fault mode the scenario catches.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
id: chio-deny-receipt-emitted-2026-05-07
2+
failing_test: "tests/conformance/scenarios/chio-extensions/deny-receipt-emitted.json#deny-receipt-emitted"
3+
failure_message: |
4+
FAILED chio-extensions/deny-receipt-emitted (specVersion 2026-03-19)
5+
Expected: denied tool call emits `receipt.guard-verdict.<id>` with
6+
verdict = "deny" and signed by the kernel
7+
Got: no receipt emitted (deny was silent)
8+
Per spec.guard.pipeline, every guard verdict (regardless of outcome)
9+
MUST emit receipt.guard-verdict — silent denials are forbidden.
10+
canonical_fix:
11+
- file: "tests/conformance/scenarios/chio-extensions/deny-receipt-emitted.json"
12+
section: "expected receipt emission"
13+
- file: "crates/chio-guards/src/pipeline.rs"
14+
section: "verdict receipt emission"
15+
- file: "crates/chio-receipts/src/lib.rs"
16+
section: "guard-verdict receipt construction"
17+
- file: "spec/PROTOCOL.md"
18+
section: "Deny receipts (chio-extension)"
19+
- file: "docs/standards/CHIO_RECEIPTS_PROFILE.md"
20+
section: "Verdict receipt obligation"
21+
relevant_arc_pr: "(scenario authored on origin/codex/chio-kb-a-grade-dogfood)"
22+
relevant_arc_commit: "(scenario fixture)"
23+
commit_subject: "Conformance scenario: denied actions emit signed deny receipts"
24+
commit_date: "2026-05-07T00:00:00-04:00"
25+
notes: |
26+
Hand-curated. Tests the receipt-emission obligation that spec.guard.pipeline
27+
treats as a normative MUST. Silent deny = covert channel. Pairs with
28+
[[../../vault/spec/guard-pipeline]] (the normative spec) and
29+
[[../../vault/spec/receipt-commitment]] (the receipt-format spec).
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
id: mcp-core-initialize-2026-05-07
2+
failing_test: "tests/conformance/scenarios/mcp_core/initialize.json#initialize"
3+
failure_message: |
4+
FAILED mcp-core/initialize (specVersion 2025-11-25)
5+
Expected: server emits InitializeResult with protocolVersion negotiated
6+
to "2025-11-25"
7+
Got: InitializeResult.protocolVersion = "2024-11-05"
8+
Server's negotiated protocol version is below the floor pinned by
9+
the conformance suite. The peer must support 2025-11-25 to pass
10+
initialize-tier conformance.
11+
canonical_fix:
12+
- file: "tests/conformance/scenarios/mcp_core/initialize.json"
13+
section: "expected protocolVersion negotiation"
14+
- file: "crates/chio-mcp-adapter/src/lib.rs"
15+
section: "initialize handler"
16+
- file: "crates/chio-mcp-edge/src/runtime.rs"
17+
section: "version negotiation"
18+
- file: "spec/PROTOCOL.md"
19+
section: "Initialize lifecycle"
20+
- file: "docs/conformance/verdict-matrix.md"
21+
section: "MCP-core initialize verdict cell"
22+
relevant_arc_pr: "(scenario authored on origin/codex/chio-kb-a-grade-dogfood)"
23+
relevant_arc_commit: "(scenario fixture)"
24+
commit_subject: "Conformance scenario: client/server initialize lifecycle"
25+
commit_date: "2026-05-07T00:00:00-04:00"
26+
notes: |
27+
Hand-curated. Initialize is the most basic MCP scenario — every peer
28+
must pass it. Failure at this gate cascades: every other mcp-core
29+
scenario fails because the session can't be established. Tests the
30+
agent's ability to recognize that "fix initialize first" is the
31+
blocking issue when many tests are red.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
id: mcp-core-tools-call-simple-text-2026-05-07
2+
failing_test: "tests/conformance/scenarios/mcp_core/tools-call-simple-text.json#tools-call-simple-text"
3+
failure_message: |
4+
FAILED mcp-core/tools-call-simple-text (specVersion 2025-11-25)
5+
Expected: tool call returns CallToolResult with content[0].type = "text"
6+
and content[0].text = "<canonical response>"
7+
Got: CallToolResult.content[0].type = "image"
8+
The server returned a non-text content type for a tool whose
9+
fixture defines text output. Likely a content-type negotiation bug
10+
OR the server is returning the wrong content for this tool.
11+
canonical_fix:
12+
- file: "tests/conformance/scenarios/mcp_core/tools-call-simple-text.json"
13+
section: "expected content[0] shape"
14+
- file: "crates/chio-mcp-adapter/src/lib.rs"
15+
section: "CallToolResult marshaling"
16+
- file: "tests/conformance/peers/python/server.py"
17+
section: "test tool implementation"
18+
- file: "tests/conformance/peers/js/server.mjs"
19+
section: "test tool implementation"
20+
relevant_arc_pr: "(scenario authored on origin/codex/chio-kb-a-grade-dogfood)"
21+
relevant_arc_commit: "(scenario fixture)"
22+
commit_subject: "Conformance scenario: tool returns simple text result"
23+
commit_date: "2026-05-07T00:00:00-04:00"
24+
notes: |
25+
Hand-curated. Simple-text tool calls are the conformance baseline for
26+
the tools/* MCP surface. Failure here often points at a peer
27+
implementation bug (server returning wrong content) more than an
28+
adapter bug — tests the agent's ability to navigate the peer dirs
29+
vs the adapter dirs.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
id: nested-elicitation-form-create-2026-05-07
2+
failing_test: "tests/conformance/scenarios/nested_callbacks/nested-elicitation-form-create.json#nested-elicitation-form-create"
3+
failure_message: |
4+
FAILED nested_callbacks/nested-elicitation-form-create
5+
Expected: server-initiated elicitation/createForm propagates
6+
through to client; client response routes back via the
7+
same callback channel
8+
Got: timeout waiting for client response (10s budget exceeded)
9+
The nested elicitation channel never delivered the client response.
10+
Likely a callback ID routing bug or a transport-layer ordering
11+
issue under the streamable-http nested case.
12+
canonical_fix:
13+
- file: "tests/conformance/scenarios/nested_callbacks/nested-elicitation-form-create.json"
14+
section: "expected callback round-trip"
15+
- file: "crates/chio-mcp-adapter/src/lib.rs"
16+
section: "nested callback routing"
17+
- file: "crates/chio-mcp-edge/src/runtime.rs"
18+
section: "elicitation channel"
19+
- file: "spec/PROTOCOL.md"
20+
section: "Nested callbacks / elicitation"
21+
relevant_arc_pr: "(scenario authored on origin/codex/chio-kb-a-grade-dogfood)"
22+
relevant_arc_commit: "(scenario fixture)"
23+
commit_subject: "Conformance scenario: nested elicitation form create round-trip"
24+
commit_date: "2026-05-07T00:00:00-04:00"
25+
notes: |
26+
Hand-curated. Nested callbacks are an under-tested MCP surface where
27+
bugs hide behind happy paths. Form-create elicitation is one of the
28+
more complex cases because it involves a server-initiated flow that
29+
resolves via a client-initiated response on the same logical channel.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
id: notifications-resources-subscribe-2026-05-07
2+
failing_test: "tests/conformance/scenarios/notifications/resources-subscribe-updated-notification.json#resources-subscribe-updated-notification"
3+
failure_message: |
4+
FAILED notifications/resources-subscribe-updated-notification
5+
Expected: after resources/subscribe(uri="..."), an updated
6+
notification arrives within 1s when the resource changes
7+
Got: no notification received (5s timeout)
8+
Either the subscription didn't register, OR the notification
9+
didn't fire on resource change. Per the MCP notifications contract,
10+
the subscription's transport channel must remain open for
11+
server-initiated pushes.
12+
canonical_fix:
13+
- file: "tests/conformance/scenarios/notifications/resources-subscribe-updated-notification.json"
14+
section: "expected notification timing"
15+
- file: "crates/chio-mcp-adapter/src/transport.rs"
16+
section: "notification streaming"
17+
- file: "crates/chio-mcp-edge/src/runtime.rs"
18+
section: "subscription registry"
19+
- file: "spec/PROTOCOL.md"
20+
section: "Resource subscriptions and notifications"
21+
relevant_arc_pr: "(scenario authored on origin/codex/chio-kb-a-grade-dogfood)"
22+
relevant_arc_commit: "(scenario fixture)"
23+
commit_subject: "Conformance scenario: resources/subscribe receives change notifications"
24+
commit_date: "2026-05-07T00:00:00-04:00"
25+
notes: |
26+
Hand-curated. Notifications are the only MCP surface that mandates
27+
long-lived transport state. Failure mode: the subscription is
28+
registered but the transport gets recycled (e.g., HTTP request
29+
completion) and the subscription silently drops. Tests retrieval's
30+
ability to surface BOTH the runtime registration AND the transport-
31+
layer keep-alive contract.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
id: peer-lock-resolution-pr-147
2+
failing_test: "crates/chio-cli/tests/conformance_cli.rs::test_peer_lock_resolves_at_runtime"
3+
failure_message: |
4+
FAILED test_peer_lock_resolves_at_runtime
5+
Expected: chio conformance run --peer python loads
6+
tests/conformance/peers/python/peers.lock.toml at runtime
7+
Got: "Error: peer 'python' not registered (compile-time
8+
registry built without peers.lock.toml)"
9+
The conformance CLI was building its peer registry at COMPILE time
10+
from the workspace layout, not resolving peers.lock.toml at runtime.
11+
A user with a custom peer set can't extend the registry without
12+
rebuilding the binary.
13+
canonical_fix:
14+
- file: "crates/chio-cli/tests/conformance_cli.rs"
15+
section: "test_peer_lock_resolves_at_runtime"
16+
- file: "crates/chio-cli/src/conformance/mod.rs"
17+
section: "peer registry construction"
18+
- file: "tests/conformance/peers/python/peers.lock.toml"
19+
section: "lock file format"
20+
- file: "docs/conformance/verdict-matrix.md"
21+
section: "Peer registration"
22+
relevant_arc_pr: "https://github.com/bb-connor/arc/pull/147"
23+
relevant_arc_commit: "(arc PR #147: fix(conformance): correct crate package layout, runtime peer-lock resolution, and CLI argument validation)"
24+
commit_subject: "fix(conformance): correct crate package layout, runtime peer-lock resolution, and CLI argument validation"
25+
commit_date: "(see arc PR #147)"
26+
notes: |
27+
Curated from arc PR #147 metadata. The PR's title is multi-part — this
28+
fixture targets the **runtime peer-lock resolution** sub-fix
29+
specifically (crate-layout and CLI-arg sub-fixes are out of scope as
30+
conformance-recall fixtures since they're packaging concerns, not
31+
protocol behavior). Tests retrieval's ability to surface both the
32+
CLI test, the registry construction site, and the lock file format.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
id: tasks-call-get-result-2026-05-07
2+
failing_test: "tests/conformance/scenarios/tasks/tasks-call-get-result.json#tasks-call-get-result"
3+
failure_message: |
4+
FAILED tasks/tasks-call-get-result (specVersion 2025-11-25, mcp-experimental)
5+
Expected: tasks/call returns task_id; tasks/get returns Status::Running
6+
while task is in flight; tasks/result returns final value
7+
when status transitions to Status::Done
8+
Got: tasks/get returned Status::Done before task actually finished
9+
Server returning premature Done status — likely a race between the
10+
task scheduler and the status query. The conformance harness uses
11+
deterministic fixtures so this isn't a flake.
12+
canonical_fix:
13+
- file: "tests/conformance/scenarios/tasks/tasks-call-get-result.json"
14+
section: "expected tasks/get progress"
15+
- file: "crates/chio-mcp-adapter/src/lib.rs"
16+
section: "tasks/* surface"
17+
- file: "crates/chio-mcp-edge/src/runtime.rs"
18+
section: "task scheduler"
19+
- file: "spec/PROTOCOL.md"
20+
section: "Tasks (experimental)"
21+
relevant_arc_pr: "(scenario authored on origin/codex/chio-kb-a-grade-dogfood)"
22+
relevant_arc_commit: "(scenario fixture)"
23+
commit_subject: "Conformance scenario: tasks/* lifecycle (call → get → result)"
24+
commit_date: "2026-05-07T00:00:00-04:00"
25+
notes: |
26+
Hand-curated. Tests the experimental tasks/* MCP surface. Premature
27+
Done is one of the harder failure modes to debug because the
28+
expected and actual responses are both well-formed JSON — only the
29+
ordering and timing distinguish correct from incorrect. Tests
30+
retrieval's ability to surface the scheduler code, not just the
31+
surface-level RPC handler.

vault/_meta/dashboards/eval-outcomes.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
# Outcome evals — 2026-05-07 19:07 UTC
1+
# Outcome evals — 2026-05-07 21:28 UTC
22

33
> Generated by `chio-pack-eval` Phase 0 skeleton. No real runners yet — see PHASE-0.md.
44
55
| Eval | Fixtures | Status | Notes |
66
| ---- | -------- | ------ | ----- |
77
| `time-to-first-correct-fix` | 8 | BLOCKED — runner | fixtures present; runner is Phase 1 deliverable |
88
| `repeated-mistake-rate` | 0 | BLOCKED — runner | no fixtures glob; runner is Phase 1 deliverable |
9-
| `conformance-harness-recall` | 11 | BLOCKED — fixtures | have 11, need ≥ 20 (PHASE-0.md) |
9+
| `conformance-harness-recall` | 20 | BLOCKED — runner | fixtures present; runner is Phase 1 deliverable |
1010
| `capability-error-explanation` | 10 | BLOCKED — runner | fixtures present; runner is Phase 1 deliverable |
1111

1212
## Deferred (block on Phase 2)

0 commit comments

Comments
 (0)