Skip to content

docs(compliance): SHOULD on runner session reuse and 404-as-terminal (#6204) - #6205

Open
fgranata wants to merge 2 commits into
adcontextprotocol:mainfrom
fgranata:fix/runner-session-lifecycle-should
Open

docs(compliance): SHOULD on runner session reuse and 404-as-terminal (#6204)#6205
fgranata wants to merge 2 commits into
adcontextprotocol:mainfrom
fgranata:fix/runner-session-lifecycle-should

Conversation

@fgranata

@fgranata fgranata commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Implements the runner-output-contract.yaml follow-on from the #6204 triage ("Add one SHOULD on session reuse across steps and 404-as-terminal. Patch-eligible; no changeset.").

Adds a session_lifecycle guidance block: runners SHOULD establish one MCP session per storyboard and reuse it across steps (a fresh session per call spends 4–5 round trips on handshake, ~5× per-step wall time, and attributes runner overhead to the agent under test), SHOULD close sessions gracefully, and SHOULD treat expired-session 404s as terminal rather than retryable (the streamable-HTTP session layer answers them silently, so reconnect loops read as rate limiting).

Evidence for the numbers is in #6204. YAML strict-parses clean (yaml.safe_load). The core session-per-storyboard fix lands in adcp-client per the triage's sibling-repo item.

Per the adcontextprotocol#6204 triage: one SHOULD in runner-output-contract.yaml closing
the doc gap while the session-per-storyboard fix lands in adcp-client.
Runners SHOULD reuse one MCP session across a storyboard's steps, close
gracefully, and treat expired-session 404s as terminal — fresh-transport
-per-call multiplies per-step wall time ~5x and orphaned reconnect loops
generate silent 4xx volume misread as rate limiting.

Patch-eligible per triage; no changeset.
# capability v{expires_after_version};
# promoted at v{runner_capability_version}]".

session_lifecycle:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MUST FIX: This adds a new normative session_lifecycle block (three SHOULDs on session reuse, graceful close, and 404-as-terminal) to a file under static/compliance/source/** — a protocol-scoped path per check-changeset-protocol-scope.cjs. The PR ships no changeset.

The changeset-check workflow does not skip here: --has-protocol-scoped-changes returns true for static/compliance/source/, the file is not in CHANGESET_STATUS_EXEMPT_MAINTENANCE_PATHS, so the job runs changeset status --since=origin/main and fails with no pending changeset. Beyond CI, omitting the changeset ships this normative addition untracked against the AdCP versioning surface — the compliance contract carries its own version: "2.6.0" and builds into dist/compliance/<semver>/.

The PR body cites #6204's "patch-eligible; no changeset." Patch-eligibility is the errata test — a clarification of prior ambiguity that every conformant implementation already satisfies. New session-reuse and 404-handling SHOULDs are new requirements, not errata; this is Normative-class and needs a patch/minor changeset. "Patch-eligible" would still mean a patch changeset, not none.

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ladon verdict: Request changes

Request changes — 1 blocking finding.

Blocking findings

  • static/compliance/source/universal/runner-output-contract.yaml:607 — Compliance-source change ships no changeset; changeset-check CI will fail and a Normative addition ships untracked.

This PR adds a normative session_lifecycle guidance block (session reuse, graceful close, 404-as-terminal SHOULDs) to the runner output contract under static/compliance/source/**. That path is part of the published protocol surface, so per the mandatory changeset-scope rule a PR touching it with no .changeset/*.md is high. The YAML itself is well-formed and introduces no lint or schema-parity failures, but the missing changeset is a hard blocker: it fails changeset-check CI and ships an untracked wire/normative change. Add a correctly-scoped (non-empty) changeset reflecting this Normative addition to unblock.

Blocking findings

  • static/compliance/source/universal/runner-output-contract.yaml:607 — Compliance-source change ships no changeset; changeset-check will fail

Per Ladon's review: patch-eligible means a patch changeset, not none —
the SHOULDs are a Normative addition to the compliance source surface.
@fgranata

fgranata commented Aug 4, 2026

Copy link
Copy Markdown
Contributor Author

Changeset added (patch scope, .changeset/runner-session-lifecycle-should.md) — agreed on the reading: patch-eligible means a patch changeset, not none; the SHOULDs are Normative-class. Thanks for the catch.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant