I3315 — The image smoke completes an MCP initialize on /mcp and a WebSocket upgrade on /events, not only a ready probe
Extend the one image smoke definition so that the container it judges answers a protocol-level MCP initialize on /mcp and upgrades a WebSocket on /events, completes a minimal exchange and closes cleanly, in docker-image.yml and release.yml alike.
READY wave 0 · p2 · implementation profile · parallel safe
Ready. Every dependency is done, so majordomus plan start I3315 will be accepted.
Objective
Extend the one image smoke definition so that the container it judges answers a protocol-level MCP initialize on /mcp and upgrades a WebSocket on /events, completes a minimal exchange and closes cleanly, in docker-image.yml and release.yml alike.
Why
On 2026-09-06 the owner asked for the deployed MCP and live channel to be smoke tested as protocols, because a proxy or a misbuilt image can answer HTTP 200 while it kills upgrades or speaks no MCP (c042#5). The image is still the deployment published to the container registry, and the hub target (I3195) puts a proxy in front of it; a ready probe proves neither path. Sources: chatgpt-majordomus:c042#5.
Current state
Verified on master 707a04c7ce8: .github/actions/image-smoke/action.yml checks that the image runs unprivileged, carries no Rust toolchain, answers /api/v1/ready with capabilities and objects, and names its commit on /api/v1/live. Nothing in it calls /mcp (http/mcp.rs PATH) or upgrades /events (http/events.rs PATH). The only raw WebSocket upgrade in the suite is test/cases/100_execution_plane.sh against a local server, not the image.
Desired state
The image smoke sends an MCP initialize and one read (tools/list) and asserts a protocol answer with the image's server info, opens a WebSocket on /events, reads the first frame the protocol promises and closes cleanly; any failure names the step. Whether the probe goes through the published port or from inside the container is decided by what ADR 0126 (proposed) admits for an unauthenticated caller, read from the deployment object, not assumed.
Scope
- .github/actions/image-smoke
- docs/DISTRIBUTION.md
Out of scope
- Deploying to a hosting provider
- Authenticating a remote caller (proposed in ADR 0126)
- Smoke of a deployed URL
Dependencies
None. This issue is a root of the graph.
Acceptance criteria
- An image whose /mcp answers HTTP 200 with a non-MCP body fails the smoke, naming the MCP step
- An image that refuses the WebSocket upgrade on /events fails the smoke, naming the upgrade step
- A good image passes in docker-image.yml and release.yml through the same action, with no second definition
- The smoke adds no network access beyond the container it started
Validation
- majordomus deploy check
- bash test/run.sh 86_deployment_projections
Evidence required
- image_smoke_speaks_mcp_case
- image_smoke_upgrades_websocket_case
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I3315.yaml. Read it back with majordomus plan show I3315.