Conversation
…t-forbidden, route signed_requests at all three Closes #4096 https://claude.ai/code/session_01KnP4sw6wkheGXwHFTWjrFU
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.
Closes #4096
Summary
The
signed_requestsstoryboard skips 9 vectors per tenant: 4 are explicit (skipVectors: 007/018/025 +skipRateAbusefor 020) and 5 are capability-incompatible because/<tenant>/mcp-strictadvertisescovers_content_digest: 'either', causing the grader to skip vectors requiring'required'or'forbidden'profiles. The authenticators and capabilities for both new profiles already existed inrequest-signing.ts— this PR mounts the routes and routes the storyboard runner at all three.Changes:
server/src/training-agent/index.ts: adds lazy auth singletons (_strictRequiredSigningAuth,_strictForbiddenSigningAuth), authenticator builders,requireTokenmiddleware, and route mounts for/<tenant>/mcp-strict-requiredand/<tenant>/mcp-strict-forbiddenper tenant, following the/<tenant>/mcp-strictpattern. RefactorsstrictMcpHandlerinto amakeStrictMcpHandler(digestMode?)factory to share transport/error-handling logic across variants without duplication.server/tests/manual/run-storyboards.ts: replaces the singlesigned_requests → /mcp-strictrun with a 3-variant sequential loop. Per-routeskipVectors:/mcp-strictkeeps 007/018/025;/mcp-strict-requireddrops 007 (runs and passes);/mcp-strict-forbiddendrops 018 (runs and passes).Coverage lift per tenant:
Across all six tenants: +30 steps recovered.
Non-breaking justification: adds new routes; existing
/<tenant>/mcp-strictand/<tenant>/mcproutes are untouched. No schema changes. Changeset is--empty(no protocol spec impact).Pre-PR review:
digestMode !== undefinedguard appliedcovers_content_digest: 'either'so it grades as capability-incompatible on the two new routes — correct behavior, 027 still runs on/mcp-strictselectSigningCapability(ctx)is called attask-handlers.ts:2950insidehandleGetAdcpCapabilities.ctx.digestModeflows through themakeStrictMcpHandler(digestMode)factory correctly — the new routes advertise the rightcovers_content_digestprofile ('required'/'forbidden') in their capabilities response.Session: https://claude.ai/code/session_01KnP4sw6wkheGXwHFTWjrFU