Repository navigation
feat(conformance): wire make testconf-events against the fork's Events suite - #1378
Merged
Merged
Conversation
4 tasks
Owner
Author
panyam
force-pushed
the
feat/testconf-events
branch
from
September 15, 2026 01:38
8e26857 to
6861e17
Compare
Adds the testconf-events target, its runner-agnostic script, and the local-suites manifest entry, driving examples/events/kitchen-sink against the two phase-1 scenarios (events-discovery, events-poll). Those are proposed upstream as a draft in modelcontextprotocol/conformance#504 and tracked on the panyam/mcpconformance fork branch until it lands. INFO rather than a gate. The suite scores against the Events design sketch that merged upstream on 2026-09-08, which has no SEP number yet, so its check IDs still carry a placeholder sep-9999- prefix. And the run is red on purpose: the failures are our divergences from that document, which is what the suite was built to surface. 27 pass / 13 fail / 5 warn against kitchen-sink at c9160cf. Five divergences, all tracked in #1380: events/list answers while no capabilities.events is declared, so the whole surface is unreachable for a client that reads capabilities first; events/poll omits the events key instead of returning an empty array; and the events.topology meta-source does not keep the descriptor contract, sending delivery null, carrying no inputSchema, and answering events/poll despite advertising no poll delivery. #1379 closed the nextPollSeconds rename and #1381 added list_changed and termination plus inputSchema on the three real sources, so those no longer show up here. Flip this to a gate once #1380 closes and the spec text stabilises. path-defaults.{mk,sh,just} are regenerated via gen_conf_paths.py rather than hand-edited. check_local_suites.py reports no drift across 9 suites. Refs #1374 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017kyEZdgh1zjdhURgdcZ4nL
panyam
force-pushed
the
feat/testconf-events
branch
from
September 15, 2026 05:19
6861e17 to
ce674fb
Compare
panyam
added a commit
that referenced
this pull request
Sep 15, 2026
CLAUDE.md - testconf-events joins the conformance target list; the Conformance section records what the Events suite is, why it is red, and that its check ids carry a placeholder SEP number. - Adding a testconf-* target trips TWO independent CI gates. Passing check-local-suites-stale says nothing about check-conformance-stale, because CONFORMANCE.md and the badge are rendered from local-suites.yaml and go stale the moment an entry is added. This cost #1378 a round-trip after everything else had gone green. - The docs-site conformance page is a shim over CONFORMANCE.md, so regenerating that file is the site update. No separate page edit. - Corrected the GitHub-credential guidance. The claim that upstream PR writes need the web UI or a classic PAT is true only of the fine-grained PAT; gh's own stored gho_ login has full repo scope and creates, edits and comments on modelcontextprotocol/* fine (verified on conformance#504). Also corrected the SSH recipe: ~/.ssh/id_github does not exist in the container, only the agent socket. - Removed two stale claims: that conformance/ has a nested CLAUDE.md (there are none in the tree), and a CAPABILITIES.md retirement SHA that does not resolve (the real one is bc402a0, 2026-07-18). Kept the do-not-recreate guard, since that is the half that still does work. conformance/NOTES.md - New "Adding a testconf-* target" checklist: six places, two gates. - New "MCP Events suite" section: the placeholder-SEP reasoning and why the rename is a merge blocker rather than a follow-up, why new-sep needs --spec-url here, the severity rule for the 85 of 131 rows that quote no RFC 2119 keyword, and why the capability gate probes before it skips. - Corrected "Writing to a repo we do not own" with the working credential. - Path table gains MCPCONFORMANCE_EVENTS_PATH; the skills row was still pointing at the retired fork branch. ROADMAP.md - Events conformance phases 2-4 under Near-term, with what #1374 actually requires to close. CONSTRAINTS.md reviewed, no change: it holds architectural rules about the Go surface, and the conformance checklist is build process. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017kyEZdgh1zjdhURgdcZ4nL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changes
Adds a
make testconf-eventstarget that drivesexamples/events/kitchen-sinkagainst the two phase-1 Events scenarios proposed upstream in modelcontextprotocol/conformance#504, plus thelocal-suites.yamlmanifest entry and the regenerated path defaults. The suite runs red on purpose: 27 pass / 13 fail / 5 warn, and every failure is a divergence between our events implementation and the design sketch that merged upstream on 2026-09-08.Wired as
INFOat stage8i, followingtestconf-skills.Prerequisite knowledge
conformance/NOTES.md— how thetestconf-*targets are wired and which upstream changes to watch. TheMCPCONFORMANCE_*_PATHconvention this target follows is described there.CLAUDE.md§ Cross-cutting rules — thepath-defaults.{mk,sh,just}generation rule. Hand-editing two of the three fails CI as case E drift, which is whygen_conf_paths.pyruns here.experimental/ext/events/NOTES.md— our side of the same surface, including the earlier spec-alignment sweeps.Reviewer's guide
A restaurant can cook a dish that is not on the menu. The kitchen has the ingredients and the line knows the recipe, so if you somehow know to ask you get it, but nobody reading the menu ever orders it. Our events server is that dish.
events/listanswers, all three delivery modes work, andcapabilities.eventsappears nowhere, which is the menu a spec-following client reads before deciding what to ask for. That is the single most consequential thing this target surfaces, and it is the kind of gap that stays invisible precisely because every test we wrote ourselves already knows to ask. The rest of the failures have the same flavour: places where our implementation is self-consistent and internally tested, and diverges from the document anyway. Three of the six were unknown before this run. So read the diff as plumbing, and spend the attention on whetherINFOis the right status for a target whose whole value is being red.Read in this order:
noteis the finding, recorded with its date and measurement method.:18101, runs the two scenarios, prints each summary, exits 0 and explains why.justis the one people forget.run_stage 8i ... info.conformance/path-defaults.{mk,sh,just}— generated, skip.Decision log
INFO, not a gate. Two reasons, both outlasting this PR. The suite scores against a design sketch with no SEP number, so its check ids still carry a placeholdersep-9999-prefix that will be renamed. And the failures are ours to fix, so gating would block the umbrella on work this PR deliberately does not do. The precedent istestconf-scope-challenge, INFO for tracking an unmerged PR head. Flip to a gate once the divergences close and the spec text stabilises.feat/events-conformance-suiteonpanyam/mcpconformance, default path../conf-events, matching how every other fork-based suite here resolves. The scenarios are proposed upstream as a draft (feat(sep-xxxx): Conformance suite for triggers and events modelcontextprotocol/conformance#504); retargetsource.branchto upstreammainonce it lands, the same waytestconf-scope-challengeis meant to.EventOccurrencechecks a chance to grade something real. A silenced fixture reports them untestable, which is correct but tells us less.Risk / blast radius
make testallgains stage8i. Because it isrun_stage ... infothe stage cannot fail the umbrella, andconf-events.shexits 0 unconditionally.../conf-eventsonfeat/events-conformance-suite, orMCPCONFORMANCE_EVENTS_PATHset. Absent,require_conf_dirfail-fasts with a remediation message like the other fork-based suites.uv run scripts/check_local_suites.pyreports no drift across 9 suites, which is the gate that would catch a missing mirror or a wrong stage label.conformance/Makefileand not tojustfilepasses localmakeand fails the drift check. All four were touched here; confirm.mainafter chore(conformance): retarget testconf-skills to upstream main, gate it, and move the renderer to pnpm #1377, feat(events)!: align wire fields with the merged design sketch (nextPollMs, maxAgeMs, inputSchema + validation) #1379 and feat(events): emit list_changed and terminate subscriptions on event-type removal (28ec35e9) #1381. chore(conformance): retarget testconf-skills to upstream main, gate it, and move the renderer to pnpm #1377 promotedtestconf-skillsfrominfoto a gate, which conflicted with this branch'stestall.shline; resolved in favour of main, so skills stays gated and events is added asinfoalongside it. feat(events)!: align wire fields with the merged design sketch (nextPollMs, maxAgeMs, inputSchema + validation) #1379 and feat(events): emit list_changed and terminate subscriptions on event-type removal (28ec35e9) #1381 moved the numbers, which are re-measured above. Expect the same again: any events fix restales the counts inlocal-suites.yaml, so re-run and update the note.Before / after
Before, nothing scored our events surface against the spec text. After:
The six divergences, each observed against the running fixture:
sep-9999-capability-events-objectevents/list, declare nocapabilities.eventssep-9999-poll-events-arrayeventsrather than return an empty arraysep-9999-descriptor-delivery-subsetevents.topologysendsdelivery: nullwhere an array is requiredsep-9999-descriptor-input-schemaevents.topologycarries noinputSchemasep-9999-poll-mode-unsupportedevents/pollforevents.topology, which advertises no poll deliveryAll five are tracked in #1380. The bottom three collapse into one question rather than three fixes: with #1381 having added
inputSchemato the three real sources, every remaining descriptor-level failure is theevents.topologymeta-source not keeping the descriptor contract. Whether a meta-source belongs inevents/listas a peer of real event types is worth settling before patching the symptoms.The first one is the one I would fix first. It is not that a field is wrong; it is that a client reading capabilities never learns the surface exists.
#1379and#1381landed while this PR was open and closed three earlier findings: thenextPollSecondsrename (G31), andlist_changedplus termination (G34, G30). The suite confirms all three, which is the first useful thing it has done as a regression check rather than a discovery tool.Out of scope
--headerrunner option needed to scoremetronome-mcp.fly.dev.Refs #1374
🤖 Generated with Claude Code
https://claude.ai/code/session_017kyEZdgh1zjdhURgdcZ4nL