You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Agents need to authenticate to HTTP services. x402 (Linux Foundation) specs this as the sign-in-with-x extension: the server's 402 response advertises it, the client signs a CAIP-122/SIWE challenge (eip191 for EOAs) and retries with a SIGN-IN-WITH-X header — zero value at risk, no chain interaction, replay-protected by the server nonce.
Corrected 2026-07-10 (codebase re-verified): this issue's original premise — "this is the FIRST message-signing path; the seam lands before payments so parse→policy→card→sign exists with nothing at stake" — is stale. That seam already shipped. So does the general personal_sign path this issue said to "permanently exclude". #32 is still net-new product, but it is NOT a prerequisite for #34, and NOT on the $5/day critical path. Corrections below.
Already shipped (the seam exists — verified 2026-07-10)
The claim to "permanently exclude raw personal_sign of arbitrary bytes" is contradicted — SignMessageKind::PersonalSign { message: Bytes } already exists and evaluate_message returns NeedsApproval for it. Reconcile this stance in-issue before building. (Note: no MCP tool exposes any message path to agents today — the agent surface is still net-new.)
Off the $5/day critical path (#34 → #208 → #209 do not depend on #32). A "nothing at risk" warm-up. Since the message seam already exists, the remaining SIWE parse + capability + domain_allow + MCP tool is smaller than the original body implied — run it in parallel off the same foundations if there's spare capacity; skip it if focused on the demo.
Why
Agents need to authenticate to HTTP services. x402 (Linux Foundation) specs this as the
sign-in-with-xextension: the server's 402 response advertises it, the client signs a CAIP-122/SIWE challenge (eip191for EOAs) and retries with aSIGN-IN-WITH-Xheader — zero value at risk, no chain interaction, replay-protected by the server nonce.Canonical extension spec: https://github.com/x402-foundation/x402/blob/main/specs/extensions/sign-in-with-x.md (signature types
eip191/eip1271/eip6492; auth is an extension, not a zero-amount payment).Already shipped (the seam exists — verified 2026-07-10)
Via #133/#155, on
main:SignerRequest::ProposeMessage/SignMessagewire +SignMessageKind(PersonalSign|TypedDataV4|EthSign|Authorization7702) inmessage_signing.rs.evaluate_messagepolicy path (policy.rs:861).propose_message/sign_message(daemon.rs:875,:366-372).activity_view.rs:1299-1437).Two consequences for this issue:
personal_signof arbitrary bytes" is contradicted —SignMessageKind::PersonalSign { message: Bytes }already exists andevaluate_messagereturns NeedsApproval for it. Reconcile this stance in-issue before building. (Note: no MCP tool exposes any message path to agents today — the agent surface is still net-new.)In scope (the actual net-new work)
SignIn { domain, challenge: SiweFields }request indeckard-contractunder capability namesign-in-with-x(additive per Wire-contract evolution: Hello capability discovery + the five evolution rules #31's evolution rules;capabilities.rsextension point is ready).eip191sign; malformed/unparseable challenge → typed Deny, nothing signed. (Reuses the existing message evaluate/card seam.)domain_allow: Vec<String>; existingApprovalModesemantics apply; mainnet guardrail unchanged (on chain 1, auto-Allow downgrades to NeedsApproval).deckard_x402_sign_in— the first agent-facing message tool — registered only when the daemon advertises the capability.domain_allow→ typed Deny; X10 transcript scan → no key bytes / passphrase / bearer tokens.Not in scope
upto, Permit2, any token/budget policy.TypedDataV4; x402 phase 2: exact/EIP-3009 payments on the Ethereum reference path, fully local demo loop #34 adds the EIP-3009 struct specifically).Sequencing
Off the $5/day critical path (#34 → #208 → #209 do not depend on #32). A "nothing at risk" warm-up. Since the message seam already exists, the remaining SIWE parse + capability +
domain_allow+ MCP tool is smaller than the original body implied — run it in parallel off the same foundations if there's spare capacity; skip it if focused on the demo.Definition of done
cargo fmt --all --checkclean;just checkgreen (both feature configs);cargo test --workspacegreen.