Repository navigation
Support signed confirmation receipts on stateless MCP - #594
Closed
adrianwebb wants to merge 9 commits into
Closed
adrianwebb wants to merge 9 commits into
adrianwebb wants to merge 9 commits into
Conversation
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.
Outcome
An authorized coordinator on a stateless MCP2025 connection can receive and return the existing signed confirmation as tool data. Previously real workdays.start failed because the per-request transport cannot perform server-to-client elicitation.
Work authority
Contributor mode (select one):
Plan
Reuse ConfirmationService, signed argument binding, nonce store and the existing REST confirmation header. Advertise that optional header only on confirmation-requiring MCP tools. Legacy first calls return an input_required error containing the signed receipt; authorized retries supply its existing encoding. Modern multi-round elicitation remains supported.
Changes and commits
0d0a0cf implements the data exchange without a new endpoint, session store, runner, identity or unsigned confirmation flag. Confirmation data is excluded from its own argument digest; idempotency, version, principal, client, operation and request arguments remain bound.
Verification
Regression reproduced the real Cannot request input confirm failure before repair. Five focused files / 29 tests pass: legacy confirmation, schema dialect, protocol contract, authorization equivalence, confirmation service. Legacy HTTP proves no dispatch before receipt, changed preflight/idempotency, wrong principal, malformed receipt and nonce reuse rejection; valid retry invokes the handler once. Existing modern multi-round and expiry/client/operation binding remain covered. Build/declarations and file policies pass after correcting a strict-TypeScript spread error.
An additional PostgreSQL mutation test failed its explicit disposable-database prerequisite; 14 accompanying checks passed. PostgreSQL confirmation settlement and full workflow acceptance remain unproven locally; required Actions pending.
Risk and rollback
The same signed confirmation can be transported as an explicit tool header after approval; it grants no new operation authority. Revert this commit to remove data exchange. Existing REST and modern confirmation paths and persistent history remain.
Completion summary
Small unblock for real MCP simulation admission. Live native signed-receipt start succeeded for simulation workday-cb95624a-1861-4d9a-8102-34b572352403: group-driven A/E/R planning and separate E/R estimates all five completed; proposal v3 votingReady and executionPlanReady. Native signed-receipt stop entered closing with five completed, zero failed/unfinished assignments and zero settlement errors. Reporter/end-state read-back, approval, independent implementation/review and simulated release remain pending.
289d2f4 consumes merged SDK439 staging ee3d869cb38a5e74485da58553db4057e5cdcdd6 in manifest/lock/exact Actions installer. Its source tree equals tested a0defe6e; local tarball cb98bc1aa863513b88b60b1c3b3743a20b4696dd7630c43845fa18b7b1a46bf7. Five focused files/29 checks, strict build/declarations and file policies pass with that dependency. This is local development evidence, not a sealed release artifact.
AGPL committer authorization
Existing provider-authenticated approved-author workflow applies; no allowlist changes.
Submission checklist
Superseded candidate
Consolidated into #595 at 8747a50. This PR's source changes, focused checks and failed observations remain retained. The complete current MCP candidate runs the unchanged required verification/996-step component scene; do not merge this older partial candidate or rerun its redundant campaign. No implementation/product evidence is replaced.