Skip to content

signed-requests-runner.yaml header undercounts the conformance vector set (28 vs 40) #6071

Description

@KonstantinMirin

Summary

The header comment in test-kits/signed-requests-runner.yaml says the signed-requests storyboard grades a verifier against 28 conformance vectors. The vector set is 40 — 12 in positive/ and 28 in negative/.

# static/compliance/source/test-kits/signed-requests-runner.yaml:6-7
# The signed-requests storyboard grades an agent's RFC 9421 verifier against 28
# conformance vectors at /compliance/{version}/test-vectors/request-signing/.

28 is exactly the size of negative/ at 3.1.x, so the count appears to omit the positive set.

Scope — comment only

The graded contract is correct and unaffected. universal/signed-requests.yaml states no total: it has separate Positive conformance vectors and Negative conformance vectors steps, and its expected outcome reads "All vectors in positive/ produce 2xx, and all vectors in negative/ produce 401…". A runner reading the storyboard grades all 40. No runner behavior changes.

Why it is still worth fixing

That header is the first prose an implementer reads about the vector set, and it lives in the file the storyboard points at for the stateful-vector contract — so it is reached precisely when someone is planning their conformance run.

Taking it at face value drops the 12 positive vectors, which are the canonicalization edges: default-port stripping, dot-segment paths, percent-encoded path/unreserved/slash handling, query-byte preservation, IPv6 authority, multiple signature labels, ES256. A verifier can pass all 28 negatives and still fail those — the symptom being rejection of validly-signed requests from conformant counterparties, which is the failure the positive set exists to catch. Signing-base construction is the known hard part of RFC 9421 interop, so under-grading exactly there is the costly direction to be wrong in.

Concretely: it caused us to write "28 vectors" into an implementation plan's acceptance criteria, which would have let that task pass while grading only the negative set. We caught it by counting the directories.

Affected versions

The header has said 28 in every published version from 3.0.1 through 3.1.1 (44 versions), and originates in the generator input at static/compliance/source/test-kits/signed-requests-runner.yaml.

Worth noting it was never accurate: at 3.0.x the set was 39 (12 positive + 27 negative), so 28 did not match the total or the negative count there either. Vector 028-unsigned-protocol-method-required was added in 3.1.0, which is what made 28 coincide with len(negative/).

Suggested fix

In the source file, either state the split or drop the number:

# The signed-requests storyboard grades an agent's RFC 9421 verifier against 40
# conformance vectors (12 positive + 28 negative) at
# /compliance/{version}/test-vectors/request-signing/.

Dropping the count entirely would also match universal/signed-requests.yaml, which deliberately refers to the directories rather than a number and therefore cannot drift.

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.compliance-suitedocumentationImprovements or additions to documentation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions