# V3 x402 closure — 2026-08-25

## Recovery-backed identity closure

The migration matrix now records **all 97 recovered public method/path identities** as a distinct inventory:

- 86 exact core ` /api/x402/*` identities from the recovered manifest/source export;
- 8 exact `/api/solana/*` inventory paths (seven read lanes and the receive-only webhook; method classification is source-only readiness evidence);
- `GET /api/agent/bridge` from the preserved bridge handler and high-confidence count reconciliation; and
- 2 exact well-known routes.

The 132 V2 source routes are preserved separately in `v2SourceRouteDispositions`; they remain `preserve-unchanged` and are not a substitute for the 97 public-identity inventory.

Machine-readable artifacts:

- `pr7/compat/recovered-97-public-x402-identities.json` — recovery-backed identity input, including evidence qualification.
- `pr7/compat/v2-v3-route-disposition-matrix.json` — 97 public dispositions and 132 separate V2 source dispositions.
- `pr7/compat/build-v2-v3-route-disposition-matrix.py` — deterministic builder/check.

## V3 operating boundary

`VAULTFIRE_X402_V3_RELEASE=read-only-fail-closed-v1` admits only additive `/api/v3/**` endpoints. Under that exact flag the working safe surfaces are static discovery/readiness endpoints, a static payment-challenge-status endpoint, and static source-only Solana readiness. They make no RPC call and contain no V3 deployment, payment-address, receipt, Bazaar listing-ID, or indexing claim.

The former V3 payment candidate routes are no longer Bazaar resources and no longer carry a payment address, `accepts`, or a `PAYMENT-REQUIRED` response. The mandate and partnership-action endpoints return `503 v3_payment_challenge_unavailable`; the action does not read or execute its body. Receipt reads fail closed when no configured store is present.

Generated Bazaar/well-known metadata remains explicitly `metadata-candidates-not-live-validated`; it has **zero V3 resource candidates**. This is intentional: it prevents a V2 historical payee from being represented as a V3 address or live listing.

## Mission boundary

Routes whose historical semantic input includes belief, flourishing, reputation, validation/quality, credential/profile, or trust/routing signals are retired for safety in the public identity matrix. No such input is accepted by V3 for custody, access, eligibility, pricing, slashing, settlement, disputes, or routing. Other writes, payment, settlement, and unevidenced reads remain blocked pending route-specific V3 dependency, address/deployment, request-binding/replay, finality, durable receipt, and security-review evidence.

## Validation status

- `cd pr7 && npx vitest run` — PASS: 17 files / 103 tests.
- `cd pr7 && npm run typecheck` — PASS.
- `python3 pr7/compat/build-v2-v3-route-disposition-matrix.py --check` — PASS.
- `python3 pr7/compat/build-v2-v3-compatibility-matrix.py --check` — PASS.
- `SOURCE_DATE_EPOCH=0 python3 pr7/registry/build_full_registry.py` plus `python3 pr7/registry/validate_bazaar_v2.py` — PASS.
- Narrow V3 website TypeScript check with the locked PR7 compiler — PASS.
- `git diff --check` — PASS; protected V2 handler/ABI/manifest/deployed-address paths have no diff.

`npm test` reaches the final `git diff --exit-code -- generated` guard and therefore returns nonzero in this intentionally uncommitted workspace, despite regenerated artifacts being deterministic and validated. No commit, push, deployment, wallet operation, paid endpoint call, or RPC write was performed.
