Production promotion — prod-20260831-073011
What's Changed
- Sync production promotion history back to dev by @d-hinders in #1965
- feat(catalog): SSRF-hardened verification probe + catalogIngest leader lock (#1713) by @AntonioSaaranen in #1966
- docs(workflow): record the reviewer verdict in the PR body, and let a clean design re-review re-arm auto-merge (#1968) by @d-hinders in #1970
- fix(frontend): hide the landing page's decorative arrows and give the investor-briefing header CTA a 44px tap target (#1954, #1955) by @AntonioSaaranen in #1967
- feat(catalog): public self-service submission queue — POST /catalog/submit (#1711) by @PhilipEriksson in #1837
- test(frontend): capture EditAgentModal's on-chain budget list and its remove control (#1935) by @AntonioSaaranen in #1972
- feat: surface the settlement scheme (eip3009|erc7710) in the x402 transaction feed and detail (#1706, #1707) by @PhilipEriksson in #1814
- fix(frontend): name the passkeys[0] signing fallback instead of hiding it (#1952) by @AntonioSaaranen in #1973
- fix(catalog): refuse IP-literal hostnames at CLAIM level, so both ownership paths agree (#1959) by @AntonioSaaranen in #1978
- fix(frontend): every chain Haven offers has a wagmi transport, and a capture that never asked for its data is fatal (#1971) by @AntonioSaaranen in #1979
- feat(catalog): verified-directory listing badges + public submission status + self-service dashboard flow (#1715) by @PhilipEriksson in #1976
- feat(catalog): verified discovery + agent-side submission in SDK and MCP (#1716) by @PhilipEriksson in #1977
- test(frontend): make WalletPopover's presentational prop self-enforcing (#1975) by @AntonioSaaranen in #1983
- fix(frontend): reveal the showcase's transaction columns in two stages, not one (#1827) by @AntonioSaaranen in #1997
- test(frontend): capture UnmanagedDelegateCard, and re-derive the three surfaces that stay unreachable (#1930) by @AntonioSaaranen in #1996
- feat(safe-retirement): close the inflow — 410 on Safe deploy/import, Hybrid-only onboarding (#1984) by @AntonioSaaranen in #2000
- fix(frontend): measure the allowance countdown from chain time, not the device clock (#1995) by @AntonioSaaranen in #2001
- docs(frontend): correct why WalletPopover's presentational role swap exists (#1982) by @AntonioSaaranen in #2003
- feat(safe-retirement): fail closed — HTTP 410 on payments/x402 for the allowance_module rail (#1986) by @AntonioSaaranen in #2005
- feat(safe-retirement): delete the AllowanceModule rail and the allowance-nonce machinery (#1987) by @AntonioSaaranen in #2008
- test(frontend): render WalletButton's collapsed connected-avatar and wrong-network states (#1944) by @AntonioSaaranen in #2010
- feat(safe-retirement): delete the Safe creation and owner-change machinery (#1988) by @AntonioSaaranen in #2009
- fix(safe-retirement): re-base the QA seed on the delegation rail (#2007) by @AntonioSaaranen in #2013
- fix(frontend): key Table's column collapse on the container, not the viewport (#1999) by @AntonioSaaranen in #2014
- feat(safe-retirement): delete the legacy Safe frontend surfaces (#1989) by @AntonioSaaranen in #2015
- docs(safe-retirement): re-base the product docs on the delegation rail (#1992) by @AntonioSaaranen in #2018
- fix(qa): re-base the three legacy money-flow legs onto the delegation rail (#2016) by @AntonioSaaranen in #2022
- feat(catalog): entry lifecycle, re-verification cadence + retention (#1714) by @PhilipEriksson in #1974
- fix(qa): prevent revoked agent seed reuse by @d-hinders in #2026
- fix(safe-exec): report a confirmation timeout as pending, not as a revert (#1754, #1755) by @AntonioSaaranen in #2028
- docs(architecture): hosted x402 works on the delegation rail — correct a stale refusal claim by @d-hinders in #2019
- Block revoked agents from new budget delegations by @d-hinders in #2029
- Remove retired QA credential requirements by @d-hinders in #2035
- feat(frontend): let a capture run shoot a width the committed set does not (#2006) by @AntonioSaaranen in #2037
- fix(frontend): give the Approvers badge positive evidence, not an absence (#2017) by @AntonioSaaranen in #2039
- fix(frontend): separate the sidebar menu focus ring from the popover border (#1877) by @PhilipEriksson in #2032
- fix(frontend): semantic danger tone for the backup/recovery loadError state (#1937) by @PhilipEriksson in #2033
- docs(research): record Haven's position on AP2 — monitor-only, with revisit triggers by @d-hinders in #2040
- fix(screenshot): refuse a capture that is still loading (#2036) by @AntonioSaaranen in #2042
- test(casp): prove the deployed caveat enforcers are Red Line #4's final gate (#2004) by @AntonioSaaranen in #2045
- fix(frontend): make Tooltip content reachable without a mouse, and let it wrap (#2038) by @AntonioSaaranen in #2047
- test(casp): remove three unfalsifiable spies from the Red Line #4 regulatory proof (#2044) by @AntonioSaaranen in #2050
- test(frontend): address WalletIdentityBlock's tooltip trigger by identity, not by ordinal (#2038) by @AntonioSaaranen in #2053
- fix(mcp): let the generic plain-HTTP x402 path reach erc7710 (#2041) by @AntonioSaaranen in #2052
- feat(safe-retirement): drop safe_approver_metadata (#1990) by @AntonioSaaranen in #2024
- fix(mcp): bind the spending cap to the option actually authorized (#2051) by @AntonioSaaranen in #2056
- test(backend): remove the stale allowance-nonce-watermarks vi.mock from six suites (#2048) by @AntonioSaaranen in #2057
- chore(money-path): widen the perimeter to the edge signer + core machine-payment domain (#1905, #1896, #1903) by @PhilipEriksson in #2034
- fix(frontend): dedupe the hero Contact-the-team CTA on /investor-briefing (#1956) by @PhilipEriksson in #2031
- test(casp): Red Line #4's structural guard parses import structure, every shape mutation-proven (#2049) by @AntonioSaaranen in #2058
- fix(rekey): an abandoned post-revoke re-key hands its frozen carry to the successor (#1868) by @AntonioSaaranen in #2059
- feat(safe-retirement): retire the agent_allowances surface (#2020) by @d-hinders in #2060
- test(outbound): characterize the stuck passport_attest lane wedge on real Postgres (#1743) by @AntonioSaaranen in #2061
- fix(frontend): give UnmanagedDelegateCard the revoke /custody promises (#1980) by @AntonioSaaranen in #2062
- Operator-triggered same-nonce lane cancel through the outbound pipeline (#1743 Option A) by @AntonioSaaranen in #2065
- fix(frontend): stop /design-system teaching queue-and-approve unscoped (#1947) by @AntonioSaaranen in #2066
- fix(frontend): offer the passkey signer to marker-less hybrid users, with disclosure (#1969) by @AntonioSaaranen in #2069
- fix(passport): attribute recovered anchors from the chain's own bytes — the one #1847 window that never self-healed by @AntonioSaaranen in #2070
- fix(mcp): make the quote path selection-aware so erc7710-only merchants are reachable (#2054) by @AntonioSaaranen in #2071
- fix(frontend): require the connected wallet to BE the named owner before offering the EOA signer (#2068) by @AntonioSaaranen in #2072
- fix(frontend): de-queue the surviving queue-and-approve copy outside /design-system (#2063) by @AntonioSaaranen in #2075
- feat(safe-retirement): drop approval_requests and delete the residual approvals surface (#2055) by @d-hinders in #2064
- feat(frontend): name the wrong-wallet gate state distinctly (#2073) by @AntonioSaaranen in #2076
- docs(regulatory): re-base the CASP guardrails on the delegation rail (#1991) by @d-hinders in #2078
- fix(qa-agent): stop sending retired
allowancesto POST /agents (#2077) by @d-hinders in #2079 - test(frontend): measure Tooltip's touch-to-mouse suppression window instead of asserting it (#2046) by @AntonioSaaranen in #2083
- test(safe-retirement): guard that nothing routes to the retired rail, and sweep the residue (#1993) by @AntonioSaaranen in #2090
- fix(connect): machine-readable runtime refusal + dead-setup-token classification in --json (#2091) by @d-hinders in #2093
- fix(x402): refuse an over-budget erc7710 authorize before it becomes signable (#2082) by @d-hinders in #2099
- fix(x402): give erc7710 settlement a scheme-agnostic completion seam, verified on-chain (#2092) by @AntonioSaaranen in #2096
- fix(mcp): re-base the first-launch consent gate off the retired approval queue (#2086) by @d-hinders in #2104
- fix(agents): stop instructing agents to expect an approval queue (#2103) by @d-hinders in #2109
- docs(api): stop the OpenAPI spec documenting the retired Safe rail as the live contract (#2105) by @AntonioSaaranen in #2112
- chore(qa-agent): delete the retired-rail pilot scripts (#2087) by @d-hinders in #2114
- fix(sdk,mcp): re-base agent-facing tool prose off the retired Safe rail (#2100, #2101, #2098) by @AntonioSaaranen in #2113
- fix(frontend): rail-branch /custody so delegation accounts see their real on-chain limits (#2106) by @AntonioSaaranen in #2111
- refactor(backend): remove the unreachable approval_request branches (#2085) by @d-hinders in #2119
- docs: re-base the hosted-MCP and connect-flow docs on the delegation rail (#2102) by @d-hinders in #2122
- test(ci): extend the queue-framing census to the surfaces no gate reached (#2107) by @d-hinders in #2123
- fix(backend,sdk): stop the payment-status response promising an approval that cannot arrive (#2115) by @AntonioSaaranen in #2125
- refactor(frontend): delete the dead approval presentation and the fabricated approval fixtures (#2120) by @AntonioSaaranen in #2127
- feat(db): drop the inert allowance_nonce_watermarks table (#2084) by @d-hinders in #2128
- fix(x402): make the erc7710 settlement child intent-unique so a settlement can be attributed exactly (#2094) by @AntonioSaaranen in #2129
- docs(architecture): stop presenting the deleted approval queue as reachable in the x402 sequence doc (#2121) by @d-hinders in #2132
- fix(backend,sdk): complete an unreported erc7710 settlement by passive on-chain observation (#2117) by @AntonioSaaranen in #2135
- refactor(backend): delete the unreachable approval-keyed evidence/reconciliation write builders (#2118) by @d-hinders in #2137
- fix(passport): document the rail values the emitter can actually produce (#2110) by @d-hinders in #2139
- docs(architecture): stop two live sections presenting the approval queue as reachable (#2130) by @d-hinders in #2141
- feat(passport): gate Agent Passport issuance to the delegation rail (#2138) by @d-hinders in #2142
- docs(qa): stop QA instructions pointing a live agent at retired surfaces (#2140) by @d-hinders in #2143
- docs(ship-next): re-read the head SHA at verification time, never a captured one (#2116) by @AntonioSaaranen in #2144
- fix(frontend): measure capture readiness by progress, not a 90s deadline (#2108) by @AntonioSaaranen in #2146
- feat(transactions): scheme-agnostic transaction record with explicit initiator semantics (#2097) by @PhilipEriksson in #2133
- fix(frontend): derive pay-1/pay-2's payment_flow_status instead of fabricating it (#2126) by @AntonioSaaranen in #2148
- feat(qa-agent): preflight reports and blocks on the delegation treasury balance (#2081) by @d-hinders in #2152
- docs(ci): explain queue-framing census by @d-hinders in #2153
- docs(sdk,mcp): stop advertising an x402 resume trigger nothing emits (#2131) by @d-hinders in #2154
- docs(ops): add migration lock check by @d-hinders in #2157
- fix(backend,sdk): x402 funded-but-undelivered reports a reachable retry, never "confirmed, nothing to do" (#2145) by @d-hinders in #2158
- chore(release): bump all published packages to 0.1.31-alpha.0 by @d-hinders in #2160
- chore: sync main back into dev after the 0.1.31-alpha.0 promotion by @d-hinders in #2162
- docs(workflow): add rework caps to ship-next independent review (#2163) by @d-hinders in #2167
- docs(process): record that the never-squash promotion rule is now enforced (#2165) by @d-hinders in #2171
- docs(haven-reset): add verified Hermes reset procedure by @d-hinders in #2172
- fix(ci): exempt an in-place release-bump version write from qa-freshness (#2164) by @d-hinders in #2176
- connect: tombstone record survives agent-dir deletion — mirror under
~/.haven/tombstones(#2155) by @PhilipEriksson in #2156 - connect: report the wired MCP endpoint and superseded agents, and park the outcome on disk (#2173) by @d-hinders in #2177
- connect: add --unwire — tombstone-first removal of one agent's wiring (#2169) by @PhilipEriksson in #2178
- connect: narrow the runtime_undetermined retry with what is installed here (#2174) by @d-hinders in #2180
- docs(workflow): correct ruleset inventory by @d-hinders in #2182
- feat(qa): cover x402 funded-but-unsettled recovery by @d-hinders in #2183
- connect: make a refused tombstone visible, and stop haven-reset addressing by agent id (#2175) by @d-hinders in #2185
- connect: give every subcommand a --json failure record, not just --tombstone (#2184) by @d-hinders in #2189
- refactor(connect): give the missing-api-key refusal one home, keeping both guards (#2187) by @d-hinders in #2190
- docs(casp): state that a merged shard is immutable, and how to correct one (#2188) by @d-hinders in #2193
- test(frontend): seed needs_attention so its badge and the unsettled-payment banner copy are finally captured (#2147) by @AntonioSaaranen in #2197
- fix(docs-gate): require an ADDED satisfied-by file, not merely a changed one (#2192) by @d-hinders in #2201
- perf(db): index payment_intents for the erc7710 replay guard and settlement sweeper (#2095) by @AntonioSaaranen in #2149
- feat(db): let a migration opt out of the runner's transaction, and detect the partial failure that buys (#2150) by @AntonioSaaranen in #2199
- test(connect): isolate Hermes-path suites from a live HERMES_HOME (#2179) by @PhilipEriksson in #2181
- chore(money-path): list the docs coupling gate's control surface (#2200) by @d-hinders in #2206
- test(frontend): reach the recoverable-funds banner by the route production takes (#2194) by @AntonioSaaranen in #2205
- fix(frontend): give HavenMark the full decorative pair and widen the landing sweep (#1954) by @AntonioSaaranen in #1981
- fix(test-harness): poll the migration advisory lock instead of blocking (#2198) by @AntonioSaaranen in #2207
- test(backend): make the passport rail drift guard cheap instead of slow (#2209) by @AntonioSaaranen in #2210
- fix(frontend): refuse a screenshot capture the app still says is loading (#2204) by @AntonioSaaranen in #2212
- test(x402, sdk): absorb PR #2134's coverage the merged #2117 branch did not carry (#2136) by @AntonioSaaranen in #2215
- fix(frontend): put the recoverable-funds surface at spec — tap target, one voice, and an honest link to the rows (#2203, #2195, #2196) by @AntonioSaaranen in #2217
- fix(ci): regenerate baselines on comparison failure, not byte difference (#2218) by @AntonioSaaranen in #2219
- fix(backend): make the settlement sweep observe whether its evidence row landed, and recover it when it did not (#2213) by @AntonioSaaranen in #2220
- ci: re-prove the advisory-lock deadlock nightly, and make the job's absence detectable (#2208) by @AntonioSaaranen in #2222
- fix(screenshot): give agent-ops a legacy-rail account of its own (#2202) by @AntonioSaaranen in #2227
- fix(x402): pin the invariant behind the sweep's NULL-hash exclusion, and give its residue log a remedy (#2214) by @AntonioSaaranen in #2228
- docs: make the packages/** Markdown boundary explicit and checkable (#2088) by @AntonioSaaranen in #2229
- docs(design-system): rule for permanently-open showcase copies of overlays (#2002) by @AntonioSaaranen in #2232
- perf(test): make resetDb() cost track rows written, not migration count (#2211) by @AntonioSaaranen in #2234
- fix(accounts): keep the account name readable beside the Active/default badges (#2223) by @AntonioSaaranen in #2238
- fix(frontend): AgentCard — say the budget is enforced on-chain (#2224), and adopt ApprovalRequiredBanner for both callouts (#2216) by @AntonioSaaranen in #2233
- fix(frontend): bound the wallet menu against the viewport, keep the remainder reachable (#2067) by @AntonioSaaranen in #2231
- fix(frontend): hoist McpServerName's "not recorded" explanation out of a hover-only tooltip (#2043) by @AntonioSaaranen in #2239
- fix(accounts): keep the badges together and derive the hover-action reservation (#2235, #2236) by @AntonioSaaranen in #2240
- docs(regulatory): re-verify the CASP guardrails claim by claim, and scope the last-verified bump (#2244) by @AntonioSaaranen in #2248
- docs(signer): re-verify the published README against the code (#2243) by @AntonioSaaranen in #2249
- fix(signer): correct the gasless-sweep destination comment and pin the expectedSafe-absent path (#2247) by @AntonioSaaranen in #2250
- fix(agents): wrap AgentCard's title row (#2237) and share the paused sentence (#2230) by @AntonioSaaranen in #2252
- chore(release): bump all published packages to 0.1.32-alpha.0 by @d-hinders in #2254
- docs(connect): document unwire teardown by @d-hinders in #2256
- promote: dev → main (0.1.32-alpha.0 release) by @d-hinders in #2255
Full Changelog: prod-20260828-121914...prod-20260831-073011