Releases: d-hinders/Haven-AI
Releases · d-hinders/Haven-AI
Release list
Production promotion — prod-20260907-110404
What's Changed
- ci(frontend): give the visual gate two product screens and make its tick say what it compared (#2318) by @AntonioSaaranen in #2378
- docs(pr-template): make the Issue Link keyword bare so filling it in place actually closes (#2382) by @d-hinders in #2386
- docs: state that the emitted closing keyword is bare, not code-spanned (#2385) by @d-hinders in #2388
- fix(accounts): make the card's set-active / set-default controls reachable and 44px on touch (#2241) by @AntonioSaaranen in #2380
- docs: fix two stale sentences in the docs system (#2375, #2389) by @AntonioSaaranen in #2390
- test(qa-agent): pin the erc7710 scenarios' authorize body so dropping paymentRequired fails a unit test (#2384) by @AntonioSaaranen in #2391
- fix(mcp-server): close the strict-input list — twelve more hosted tools refuse undeclared arguments, three stay permissive by decision (#2349) by @AntonioSaaranen in #2394
- docs: state the bare-emit rule in branch-and-release-flow.md, quoting its canonical home (#2387) by @AntonioSaaranen in #2396
- test(demo-merchant): pin that a version mismatch is refused with a perfect extensions echo (#2397) by @d-hinders in #2401
- docs(demo-merchant): document the advertised haven-demo extensions and the enforced x402 v2 echo (#2383) by @AntonioSaaranen in #2399
- fix(ci): put the hosted MCP tool surface on the money-path perimeter (#2300) by @AntonioSaaranen in #2398
- test(backend): pin GET /dashboard/overview and POST /agents to the spec, and fix the phantom PATCH emitter (#2392) by @AntonioSaaranen in #2402
- docs(signer): name the hosted tool that actually sets the x402 expected context, not the deleted alias (#2395) by @AntonioSaaranen in #2406
- fix(openapi): name the dashboard allowance shape and close the PUT /agents open envelope (#2400) by @d-hinders in #2405
- test(demo-merchant): pin the remaining extensions-echo branches the README claims (#2403) by @AntonioSaaranen in #2407
- ci(qa-freshness): let the promotion gate see deployment_status runs — select the green run by SHA and job, not by branch label (#2404) by @AntonioSaaranen in #2409
- Retire legacy Safe agent surfaces by @d-hinders in #2331
- test(frontend): pin WalletButton's collapsed connected-EOA state on the live rail, not the retired one (#2284) by @AntonioSaaranen in #2410
- test(backend): make a warm resetDb() honest under contention — scope the cycle fallback, bound and name lock waits (#2354) by @AntonioSaaranen in #2417
- ci(qa): fire the post-deploy money-flow QA from GitHub deployment_status instead of a dispatch nothing sends (Refs #2273, #2268, #2271) by @AntonioSaaranen in #2412
- fix(sdk): name the declared
tofield for haven_pay in the shipped skill (Fixes #2393) by @PhilipEriksson in #2419 - fix(backend): activate a budget delegation without retiring it — sweep the slot before the flip, excluding the new row by id (Refs #2411) by @AntonioSaaranen in #2430
- fix(frontend): reword passkey.ts thrown Error to product term "secure passkey" (#2332) by @PhilipEriksson in #2377
- fix(frontend): surface the account-unlink refusal instead of failing silently (Closes #2414) by @d-hinders in #2434
- fix(frontend): align account removal copy (Closes #2432) by @d-hinders in #2435
- refactor(backend): delete the legacy connect-approval half and the last AllowanceModule readers (Closes #2259) by @d-hinders in #2437
- refactor(frontend): extract inline danger alert (Closes #2433) by @d-hinders in #2436
- test(frontend): pin the human-decimal allowance_amount shape on /agents across both harnesses (#2298) by @AntonioSaaranen in #2429
- test(frontend): name the machine when a modal suite times out under load, and pin the timeout posture (#2319) by @AntonioSaaranen in #2431
- docs(qa): replace the predicted "no branch label" premise with the measurement (Refs #2427) by @AntonioSaaranen in #2439
- fix(backend): name the reason a budget build is refused, not just "revoked" (#2416) by @AntonioSaaranen in #2441
- test(backend): expectMatchesSpec round trip for AllowanceSummary (#2328) by @PhilipEriksson in #2438
- fix(backend): move the delegate-address derivation off the locked activation path (#2415) by @AntonioSaaranen in #2442
- refactor(db): drop the inert Safe-rail schema and repoint execution_rail's default (#2263) by @d-hinders in #2440
- fix(agents): drop the last-activity stamp below the card header under sm so the MCP chip is legible at 390 (#2325) by @AntonioSaaranen in #2446
- docs(signer): correct the false "makes no network calls" claim in six places (Refs #2242) by @AntonioSaaranen in #2447
- fix(frontend): give machine-payment rows user-facing titles (#2357) by @AntonioSaaranen in #2450
- fix(accounts): drop the card's unlabelled set-as-default star (Closes #2374) by @AntonioSaaranen in #2451
- fix(qa-agent): poll the fresh-agent getCode to a deadline and stop blaming the deploy (Closes #2445) by @AntonioSaaranen in #2452
- fix(qa-agent): stop x402-delegation-3009 declaring PASS on an undelivered payment (Refs #2444) by @AntonioSaaranen in #2456
- fix(design-system): retitle the showcase's machine-payment sample rows (Closes #2448) by @AntonioSaaranen in #2454
- docs: retire the last live doc text saying a Haven payment queues (#2265) by @d-hinders in #2453
- fix(openapi): make allowanceHumanAmount discriminate the two allowance_amount wire shapes (#2408) by @AntonioSaaranen in #2458
- fix(frontend): drop advanced-surface term 'delegate' from the sweep movement label (Fixes #2356) by @PhilipEriksson in #2428
- refactor: stop rendering legacy Safe accounts, then delete every account_type branch (Closes #2413) by @d-hinders in #2460
- refactor(core): remove allowance module registry (Closes #2260) by @d-hinders in #2461
- docs: tag untagged @haven_ai/* install commands @Alpha (Fixes #2310 docs half) by @PhilipEriksson in #2462
- chore(safe-retirement): sweep retired-rail copy and dead code (#2266) by @d-hinders in #2470
- chore(frontend): remove retired investor briefing (Closes #2468) by @d-hinders in #2471
- fix(frontend): offer chain tokens for a first budget grant, never render an empty budget card by @d-hinders in #2476
- Fix manual credential approval transition by @d-hinders in #2475
- feat(backend): make the connector handout channel-aware (HAVEN_CONNECTOR_CHANNEL) for the dev dashboard by @AntonioSaaranen in #2467
- test(ci)+docs: pin the ci aggregator gate on ci_config_checks; inventory it as the sixteenth required context (Refs #2321) by @PhilipEriksson in #2474
- test(frontend): delete zero-caller optDownToLegacyRail helper, decide legacySafe cascade (Fixes #2459) by @PhilipEriksson in #2465
- Closes #2457: report reverse docs coupling claims by @d-hinders in #2478
- ci(publish): publish 0.0.0-dev snapshots under the dev dist-tag on pushes to dev by @AntonioSaaranen in #2463
- Fix capture provenance for dirty worktrees by @d-hinders in #2481
- docs: chain-integrity now fails on duplicated last-verified entries + size ceiling (#2477) by @PhilipEriksson in #2480
- refactor(backend): rename ChainRail to ChainClientImpl, delete four dead x402-authorization exports (#2469) by @PhilipEriksson in #2479
- fix(backend): setup prompt tells an agent to append --json and relay the approval first (Closes #2483) by @d-hinders in #2487
- ci(agents): make the reviewer's disposable copy checkable by execution (Closes #2455) by @AntonioSaaranen in #2488
- docs(chain): compact mcp-runtime-comp...
Production promotion — prod-20260901-191951
What's Changed
- fix(test): charge the db-harness cold cost to the hook budget, not testTimeout by @AntonioSaaranen in #2352
- fix(mcp): refuse undeclared arguments on the record-reading hosted tools (#2312) by @AntonioSaaranen in #2355
- ci(copy-lint): scan three more rendered-copy modules under src/lib, and enforce the naming that keeps the list current (#2333) by @AntonioSaaranen in #2358
- feat(gtm): discovery-source attribution + agent-crawler fetch log (#2302) by @AntonioSaaranen in #2305
- fix(mcp,signer): correct Haven-as-authorizer attribution in comments and two agent-facing strings by @AntonioSaaranen in #2362
- fix(x402): echo the challenge's resource and extensions in the v2 payment envelope (#2361) by @d-hinders in #2364
- fix(sdk): stop the shipped skill telling agents to pass an undeclared payment_required (Refs #2353) by @AntonioSaaranen in #2359
- fix(docs): report a parent doc a CASP shard cleared instead of hiding it by @AntonioSaaranen in #2367
- docs: correct the EXEMPT_PACKAGE_DOCS count from five to six by @AntonioSaaranen in #2369
- fix(frontend): state the real payment actors in the agent-usage modal (#2246) by @AntonioSaaranen in #2370
- fix(mcp-server): refuse the local MCP's argument spelling instead of stripping it (#2348) by @AntonioSaaranen in #2368
- fix(mcp-server): state the real blocker on the haven_complete_mcp_tool strictness exclusion (#2363) by @AntonioSaaranen in #2371
- fix(x402): erc7710 authorize sends the full 402 challenge so the settle echo has something to echo (#2373) by @d-hinders in #2376
- release: 0.1.34-alpha.0 by @d-hinders in #2379
- Promote dev → main: 0.1.34-alpha.0 (x402 v2 resource/extensions echoes, epic #2288) by @d-hinders in #2381
Full Changelog: prod-20260901-093003...prod-20260901-191951
Production promotion — prod-20260901-093003
What's Changed
- sync: main → dev after the 0.1.32-alpha.0 promotion by @d-hinders in #2267
- docs(release): start the money-flow QA run in preflight, not at the promotion by @d-hinders in #2269
- ci: make the dead
dev-deployedpost-deploy QA trigger's silence detectable (#2268) by @AntonioSaaranen in #2272 - fix(x402): resolve the rail before the settlement-scheme guards, so a retired rail cannot be diverted off its 410 (#2245) by @AntonioSaaranen in #2275
- refactor(backend): retire Haven x402 resource surface by @d-hinders in #2270
- docs(qa): the Railway post-deploy hook this doc instructs does not exist by @d-hinders in #2277
- fix(connect): approve-budget CTA at the dashboard-unlock moment + elapsed-time wait visibility (#2279) by @d-hinders in #2280
- fix(sdk,api): the 'approved' branch stops and tells the user (#2262) by @AntonioSaaranen in #2281
- test(ci): point the Playwright harness at the live rail, not the retired one by @AntonioSaaranen in #2285
- Document Connect setup network requirement by @d-hinders in #2287
- fix(agents): render a delegation budget as 250.00, not 250.000000 (#2283) by @AntonioSaaranen in #2294
- fix(mcp): resolve x402 merchant-call context before relaying funding (#2282) by @AntonioSaaranen in #2296
- fix(sdk): send PAYMENT-SIGNATURE alongside X-PAYMENT on every merchant retry by @d-hinders in #2297
- Lower sweep floor for x402 micropayments by @d-hinders in #2299
- feat(gtm): Agent Discovery Phase 0 — llms.txt, canonical 402 page, npm metadata pass by @AntonioSaaranen in #2303
- fix(x402): unblock the funded-but-unsettled resume path (#2290) by @d-hinders in #2304
- docs(architecture): the doc-4 index row names the resume cure, not just its trigger by @d-hinders in #2306
- fix(x402): one contract for the quote → signer → merchant retry chain (#2291) by @d-hinders in #2308
- test(money-path): remove 56 unfalsifiable retired-rail guards and guard the mechanism (#2307) by @AntonioSaaranen in #2309
- fix(ship-next): make
Closes #<issue>conditional on operator-verify mode, and enforce it by @AntonioSaaranen in #2314 - feat(mcp,sdk,backend): let an agent report a plain-HTTP x402 merchant retry (#2292) by @AntonioSaaranen in #2311
- fix(ci): label descriptions exceed GitHub's 100-char limit, so operator-verify was never created by @AntonioSaaranen in #2315
- refactor(frontend): delete the dead PasskeyEnrollFlow onboarding flow (#2261) by @AntonioSaaranen in #2316
- fix(backend): refuse the retired rail before resolving payable assets (#2274) by @AntonioSaaranen in #2322
- fix(agents): let the agent card shrink to its grid track at 390 (#2251) by @AntonioSaaranen in #2324
- fix(api): name the two wire shapes of allowance_amount apart (#2295) by @AntonioSaaranen in #2326
- docs: retire approval-queue residue across eight docs (#2313) by @AntonioSaaranen in #2336
- fix(ci): scan allowlisted prose files outside app/ and components/ (#2317) by @AntonioSaaranen in #2335
- fix(x402): name both wire header names wherever an agent retries a merchant by @d-hinders in #2339
- fix(x402): send the v1 alias only where it can help — erc7710 is v2-only by @d-hinders in #2342
- fix(x402): convert the nested mcp_transport — the settle handoff refused its own output by @d-hinders in #2344
- docs: resolve the post-merge review findings on #2313 (refs #2313) by @AntonioSaaranen in #2338
- fix(ci): make the operator-verify close guard read every emitter, and read assertions rather than words by @AntonioSaaranen in #2337
- chore(release): bump all published packages to 0.1.33-alpha.0 by @d-hinders in #2345
- fix(copy): the downloadable SKILL.md said Haven authorizes the amount (#2334) by @AntonioSaaranen in #2350
- fix(ci): the operator-verify guard must not re-read commits already on dev by @d-hinders in #2351
- Promote dev → main: 0.1.33-alpha.0 (x402 v2 merchant leg, epic #2288) by @d-hinders in #2346
Full Changelog: prod-20260831-073011...prod-20260901-093003
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 https://github.co...
Production promotion — prod-20260828-121914
What's Changed
- promote: dev → main (0.1.31-alpha.0 release) by @d-hinders in #2161
Full Changelog: prod-20260824-080310...prod-20260828-121914
Production promotion — prod-20260824-080310
What's Changed
- chore: sync main's promotion merge commit back into dev (#1784) by @d-hinders in #1785
- fix(backend): converge revocation_status when a revoke mines after its wait expires (#1758) by @AntonioSaaranen in #1786
- fix(release): stop the bump sign-off instructing a manual npm publish (#1788) by @d-hinders in #1794
- docs(release): make the manual-publish fallback cover all five packages, and guard it (#1791) by @d-hinders in #1796
- fix(frontend): one focus-ring treatment that clears WCAG 3:1 (#1741, #1746) by @AntonioSaaranen in #1798
- test(frontend): measure horizontal overflow inside fixed-position overlays (#1773) by @AntonioSaaranen in #1799
- docs: qa-freshness proves coverage, not recency — and hotfix is not a bypass (#1787) by @d-hinders in #1802
- feat(backend): re-key an agent — revoke-before-issue, meter carry, credential rotation (#1698) by @AntonioSaaranen in #1762
- fix(frontend): make TopBar's reserved hamburger slot survive a phone (#1767) by @AntonioSaaranen in #1804
- docs(operations): stuck-revoke alarm runbook (#1793) by @AntonioSaaranen in #1806
- fix(backend): derive the ops-probe subprocess budget and make its timeout legible by @AntonioSaaranen in #1808
- docs(release): one truth for the published set, and a shard name you can write before the PR exists (#1795) (#1789) by @AntonioSaaranen in #1807
- feat(connect): remove the runtime picker — one setup command for every environment (#1720) by @d-hinders in #1812
- feat(release): the bump writes the manifest re-pin it already verifies (#1790) by @AntonioSaaranen in #1810
- fix(frontend): a per-worktree capture port, and a server that has to prove it is ours (#1800) by @AntonioSaaranen in #1822
- refactor(frontend): delete three unreachable connect surfaces and their private libs (#1813) by @d-hinders in #1823
- fix(frontend): destructive icon buttons focus in their own tone (#1792) by @AntonioSaaranen in #1821
- fix(frontend): give the visual gate a budget it cannot outgrow, and baselines it can actually refresh (#1805, #1760) by @AntonioSaaranen in #1811
- docs(casp): cover release plumbing — #1736's deferral analysed the wrong event (#1739) by @AntonioSaaranen in #1825
- docs(casp): cover the agent-authority surface — the CLI relays, routes/agents.ts decides (#1826) by @AntonioSaaranen in #1828
- fix(frontend): destructive controls focus in their own tone, solid fills included (#1817, #1809) by @AntonioSaaranen in #1829
- fix(frontend): destructive controls get a focus indicator at all (#1819) by @AntonioSaaranen in #1831
- fix(frontend): make TopBar's background actually compile, and guard the pattern rather than the instance (#1818) by @AntonioSaaranen in #1836
- docs: release PRs target dev, not main (#1815) by @AntonioSaaranen in #1838
- fix(docs): drop the coupling gate's same-day suppression (#1824) by @AntonioSaaranen in #1839
- fix(frontend): convert the 91 dead border-*/N classes to channel-backed aliases (#1709) by @d-hinders in #1834
- fix(frontend): give the e2e run a per-worktree port and a server it can identify (#1816) by @AntonioSaaranen in #1832
- docs: name scratchpad files for the task, not the file (#1801) by @AntonioSaaranen in #1842
- test(frontend): run the dialog overflow guard at a mobile viewport (#1797) by @AntonioSaaranen in #1841
- docs(security): record the re-key budget-meter carry as an invariant (#1702 carve-out) by @AntonioSaaranen in #1848
- feat(docs): fail a PR that drops an entry from a doc's last-verified chain (#1843) by @AntonioSaaranen in #1851
- fix(frontend): sweep the last 9 dead colour utilities and make the gate absolute (#1710) by @d-hinders in #1845
- fix(frontend): stop defaulting an unresolved chain to Base mainnet in Add funds (#1844) by @AntonioSaaranen in #1853
- fix(frontend): stop ReceiveFundsModal throwing on an unresolved chain, and hedge the network it names (#1852) by @AntonioSaaranen in #1855
- fix(frontend): stop the mobile transaction row stranding its arrow and collapsing its title (#1774, #1750) by @AntonioSaaranen in #1835
- fix(frontend): ConfiguredAllowanceRow renders no meter — it has nothing to measure (#1846) by @AntonioSaaranen in #1859
- docs(design-system): replace § 5's false arrow claim with a one-file allowlist and a runnable check (#1840) by @AntonioSaaranen in #1862
- test(frontend): scope-capture the app shell sidebar in the visual gate (#1820) by @AntonioSaaranen in #1861
- test(frontend): capture SendModal's review step — the last unphotographed TransactionMovement consumer (#1856) by @AntonioSaaranen in #1864
- fix(frontend): scope the compact row's fixed height to the breakpoint it was measured for (#1833) by @d-hinders in #1860
- fix(frontend): convert the ten gated raw arrows to lucide icons (#1857) by @AntonioSaaranen in #1865
- docs(design-system): document the tertiary Button variant, and replace two false claims and an unchecked catalog with published checks (#1830) by @AntonioSaaranen in #1866
- fix(docs-gate): stop the e2e carve-out protecting generated visual baselines (#1854) by @AntonioSaaranen in #1871
- fix(ci): make the baseline-push deadlock visible on the PR, and name the runs to approve (#1777) by @AntonioSaaranen in #1872
- test(frontend): drive keyboard focus onto #1831's eleven indicators and capture them (#1863) by @AntonioSaaranen in #1875
- feat(frontend): the dashboard can replace an agent's signing key (#1701) by @AntonioSaaranen in #1881
- docs: tell the truth about same-day suppression, and restore frontend.md's lost #1447 (#1869, #1876) by @AntonioSaaranen in #1883
- docs: triage and repair seven unrestored
last-verifiedchain breaks (#1882) by @AntonioSaaranen in #1884 - fix(frontend): shoot()'s clip guard measures the deepest scroller in the subtree, not the target it was handed (#1879) by @AntonioSaaranen in #1889
- fix(backend): the re-key revoke tells the account which signer will sign (#1870) by @AntonioSaaranen in #1891
- fix(frontend): the re-key point-of-no-return button moves below its own gate (#1887) by @AntonioSaaranen in #1894
- test(frontend): a durable, mutation-proven CI gate for the clip guard (#1886) by @AntonioSaaranen in #1895
- fix(ci): the money-path perimeter learns about re-key, and its copies agree in both directions (#1892) by @AntonioSaaranen in #1900
- fix(frontend): the re-key sends its signing scheme, and the type stops lying (#1890) by @AntonioSaaranen in #1902
- fix(docs): chain-sweep classifies a declared reset instead of reporting it forever (#1885) by @AntonioSaaranen in #1901
- fix(ci): retire the dead machine-payments glob and pin the fourth copy of the money-path list (#1897, #1899) by @AntonioSaaranen in #1906
- feat(passport): re-anchor on re-key, with standing unbroken (#1699) by @d-hinders in #1907
- test(frontend): render the four AgentCard states the fixture never served — #1831's eleven focus indicators, all eleven (#1873) by @AntonioSaaranen in #1908
- feat(connect): --rekey replaces an agent's signing key in place (#1700) by @d-hinders in #1912
- chore(ci): close the general fifth-copy detector with a measurement, not a threshold (#1904) by @AntonioSaaranen in #1913
- docs: agent key rotation, and the line between it and account recovery (#1702) by @d-hinders in #1914
- fix(agents): AgentCard action-row focus-ring clearance, and stop 'Restore to list' wrapping on Linux (#1909) by @AntonioSaaranen in #19...
Production promotion — prod-20260822-083432
What's Changed
- chore: sync main back into dev after promotion #1664 by @d-hinders in #1665
- fix(release): make the lockfile bump deterministic and guarded (#1663) by @AntonioSaaranen in #1668
- docs(auth): accept the signup enumeration disclosure, with the reasoning written down (#1654) by @AntonioSaaranen in #1671
- fix(x402): deploy the counterfactual delegate account on erc7710 authorize (#1667) by @d-hinders in #1675
- docs+hooks: one canonical home for releases, and an unconditional reviewer rule by @d-hinders in #1666
- feat(auth): per-client rate limits on signup/login, armed by a trusted proxy (#1670) by @AntonioSaaranen in #1676
- fix(config): make the trust-proxy state observable, and its parsing refuse to guess (#1670) by @AntonioSaaranen in #1678
- feat(connect): detection-first runtime resolution — the setup command drops --runtime (#1672) by @d-hinders in #1677
- feat(rate-limit): share the counters across replicas (#1680) by @AntonioSaaranen in #1683
- fix(hybrid): serialize concurrent deploys of the same counterfactual account (#1673) by @AntonioSaaranen in #1687
- feat(connect): name-first runtime picker — pick your app by name; modality is the row's property (#1682) by @d-hinders in #1689
- test(rate-limit): prove the plugin → store → Postgres wiring end to end (#1680) by @AntonioSaaranen in #1691
- test(qa): cover the fresh agent whose first-ever payment is erc7710 (#1674) by @AntonioSaaranen in #1703
- Passkey terminology: "Passkey · added {date}" replaces "Face ID / Touch ID" credential names (#1679) by @d-hinders in #1692
- fix(catalog): label the stranded-funds test fixture so agents know it will not settle (#1669) by @AntonioSaaranen in #1718
- docs(scaling): record the accepted cost of the deploy lock's pooled connection (#1686) by @d-hinders in #1723
- feat(signer): refuse to sign another agent's quote — payer identity in the x402 expected context (#1690) by @AntonioSaaranen in #1724
- feat(connect): a superseded agent with a live key fails the doctor, and setup names it (#1688) by @AntonioSaaranen in #1728
- feat(connect): tombstone retired agent directories and restart-every-host guidance (#1681) by @AntonioSaaranen in #1729
- feat(connect): named MCP server pairs in every runtime config writer (#1695) by @AntonioSaaranen in #1730
- docs(ops): a drained relayer blocks grants AND the first erc7710 payment of an undeployed account (#1721) by @AntonioSaaranen in #1731
- test(screenshot): capture the Backup & recovery card unobstructed (#1693) by @d-hinders in #1727
- fix(connect): visible step connectors, one gate name, and a promoted restart (#1684) by @d-hinders in #1733
- feat(connect): --name wiring slug end to end (#1696) by @AntonioSaaranen in #1732
- feat(api): add settlementScheme to the transaction wire contract (#1705) by @AntonioSaaranen in #1734
- fix(rails): bound the hybrid deploy's confirmation wait and hand expiry to the bump worker (#1722) by @AntonioSaaranen in #1737
- docs(casp): cover the delegation rail, approvals and outbound machinery so money-path changes are actually gated (#1736) by @AntonioSaaranen in #1744
- fix(ui): give Button sm/md a 44px tap target without moving any pixels by @AntonioSaaranen in #1740
- fix(passport): a wait timeout leaves the anchor reconcilable instead of failed (#1735) by @AntonioSaaranen in #1751
- feat(connect): per-agent doctor inventory and a hosted-vs-local identity check (#1697) by @AntonioSaaranen in #1752
- fix(frontend): capture the whole page for rendered evidence, and prove it is not blank (#1738) by @d-hinders in #1748
- fix(frontend): make var()-backed colour tokens alpha-capable and restore the brand focus ring (#1708) by @AntonioSaaranen in #1747
- fix(passport): bound the revoke's confirmation wait, hand expiry to the bump worker, and sweep the repo for the same defect (#1742) by @AntonioSaaranen in #1759
- fix(sdk): bound the delegate sweep's confirmation waits and report an expiry instead of hanging the caller (#1756) by @AntonioSaaranen in #1764
- fix(passport): a re-mint requires positive evidence the prior attest is dead (#1745) by @AntonioSaaranen in #1765
- fix(frontend): make the mobile navigation toggle reachable, on a named z-index scale (#1749) by @AntonioSaaranen in #1769
- ci(frontend): gate every PR on a real mobile viewport (#1768) by @AntonioSaaranen in #1770
- test(frontend): make the horizontal-overflow guard able to fail inside the app shell (#1771) by @AntonioSaaranen in #1776
- fix(frontend): stop /transactions clipping 106px of its table on mobile (#1772) by @AntonioSaaranen in #1775
- fix(frontend): give the mobile sidebar toggle a 44px tap target without moving a pixel (#1766) by @AntonioSaaranen in #1778
- feat(connect): resolve the runtime itself — agent self-report, installed-client prompt, real failure vocabulary (#1719) by @d-hinders in #1780
- test(frontend): anchor the mobile-shell guards against the viewport (#1779) by @AntonioSaaranen in #1781
- fix(backend): a no-database test run fails, and says what it skipped after the summary (#1763) by @AntonioSaaranen in #1782
- chore(release): bump all published packages to 0.1.29-alpha.0 by @d-hinders in #1783
- Promote dev → main: release 0.1.29-alpha.0 + 63 commits by @d-hinders in #1784
Full Changelog: prod-20260821-070302...prod-20260822-083432
Production promotion — prod-20260821-070302
What's Changed
- docs(api): document the delegation lifecycle API in the OpenAPI spec (#1446 slice 2) by @AntonioSaaranen in #1628
- SDK: Characterize HavenClient boundaries and growth by @d-hinders in #1631
- docs(api): document the x402 demo-resource surface in the OpenAPI spec (#1446 slice 3) by @AntonioSaaranen in #1629
- docs(api): document the Agent Passport surface in the OpenAPI spec (#1446 slice 4) by @AntonioSaaranen in #1632
- docs(api): document the Safe-management surface in the OpenAPI spec (#1446 slice 5) by @AntonioSaaranen in #1633
- refactor(sdk): extract Haven API transport and payment mapping by @d-hinders in #1634
- docs(api): document the dashboard account + owner directory in the OpenAPI spec (#1446 slice 6) by @AntonioSaaranen in #1635
- refactor(sdk): extract paid MCP merchant transport by @d-hinders in #1636
- docs(api): document the bookkeeping export + reporting feed in the OpenAPI spec (#1446 slice 7) by @AntonioSaaranen in #1637
- refactor(ci): extract the change classifier into a dependency-free tested script (#1622) by @d-hinders in #1639
- docs(api): document the Fortnox OAuth surface in the OpenAPI spec (#1446 slice 8) by @AntonioSaaranen in #1641
- docs(api): document the Hybrid DeleGator account surface in the OpenAPI spec (#1446 slice 9) by @AntonioSaaranen in #1643
- test(ci): characterize the package-to-job routing matrix (#1623) by @d-hinders in #1642
- refactor(ci): declarative root-guard ownership manifest (#1624) by @d-hinders in #1645
- docs(api): document the approval queue in the OpenAPI spec (#1446 slice 10) by @AntonioSaaranen in #1644
- docs(api): document the session and passkey surface in the OpenAPI spec (#1446 slice 11) by @AntonioSaaranen in #1647
- docs(api): document the activity feed and onboarding funnel in the OpenAPI spec (#1446 slice 12) by @AntonioSaaranen in #1648
- docs(api): document the ten individually-excluded routes — the spec backfill is complete (#1446 slice 13) by @AntonioSaaranen in #1650
- refactor(ci): derive job fan-out from one package dependency table (#1625) by @d-hinders in #1649
- test(ci): enforce that every gated root guard has a routing owner (#1626) by @d-hinders in #1651
- fix(ci): read the changed-file list NUL-delimited so exotic paths route (#1638) by @d-hinders in #1652
- fix(auth): a purpose-scoped token is not a session credential (#1640) by @AntonioSaaranen in #1653
- refactor(sdk): extract account reads and delegate sweeps by @d-hinders in #1655
- fix(auth): equalise login cost so latency cannot enumerate accounts (#1646) by @AntonioSaaranen in #1656
- fix(x402): format receipt amount_human with the token's own decimals (#1630) by @AntonioSaaranen in #1657
- refactor(sdk): extract the EIP-3009 x402 funding-leg lifecycle (#1618) by @AntonioSaaranen in #1658
- refactor(sdk): extract the erc7710 no-funding-leg lifecycle (#1619) by @AntonioSaaranen in #1659
- refactor(sdk): reduce HavenClient to a compatibility facade (#1620) by @AntonioSaaranen in #1660
- tooling: measure branch hygiene instead of hoping for it (#1500) by @AntonioSaaranen in #1661
- chore(release): bump all published packages to 0.1.28-alpha.0 by @d-hinders in #1662
- promote: dev → main (SDK decomposition, auth hardening, OpenAPI backfill complete + 0.1.28-alpha.0) by @d-hinders in #1664
Full Changelog: prod-20260820-072606...prod-20260821-070302
Production promotion — prod-20260820-072606
What's Changed
- fix(demo-merchant): a restarted merchant serves the erc7710 buyer it already charged (#1515) by @AntonioSaaranen in #1551
- docs(agent-qa): what a session cannot see, and what to ask for (#1531) by @AntonioSaaranen in #1552
- fix(backend): passport EAS submissions join the relayer's nonce lane (#1546) by @AntonioSaaranen in #1553
- docs(quality): scan-ledger entry 2026-08-18 — outbound-tx-queue finding (epic #1554) by @AntonioSaaranen in #1560
- feat(backend): outbound_txs — durable record for the relayer's outbound queue (#1555) by @AntonioSaaranen in #1561
- feat(backend): hybrid-provisioning + passport submit through the outbound record (#1556) by @AntonioSaaranen in #1563
- feat(backend): the sweep relay submits through the outbound record (#1557, money-path) by @AntonioSaaranen in #1564
- feat(backend): leader-locked bump/replacement worker for the outbound lane (#1558) by @AntonioSaaranen in #1565
- fix(connect): approval-aware completion handoff, immediate first approval check, one name for the gate (#1542) by @d-hinders in #1566
- feat(connect): report runtime-configured the moment the config write settles (#1543) by @d-hinders in #1567
- test(connect): characterize re-run behavior against an already-configured workspace (#1544) by @d-hinders in #1570
- feat(backend): nonce allocation moves into the stamp — the interim lock retires as authority (#1559) by @AntonioSaaranen in #1568
- feat(connect): surface --json to agent operators, one name for the approval gate across the flow (#1545) by @d-hinders in #1571
- fix(connect): Claude Code local-stdio re-run replaces the previous agent's MCP entry (#1569) by @d-hinders in #1573
- feat(frontend): one name for the connect flow's approval gate — agent budget (#1572) by @d-hinders in #1574
- fix(design-system): Modal demo copy follows the one-gate-one-name rule by @d-hinders in #1575
- fix(mcp): haven_prepare_catalog_purchase honours the #1450 erc7710 preference (#1547) by @d-hinders in #1576
- feat(demo-merchant): English default, per-call locale, and a summary result mode (#1550) by @d-hinders in #1577
- fix(backend-tests): un-awaited initDbHarness raced the worker's own migration DDL — the 42P01/40P01 CI flake by @d-hinders in #1579
- docs(quality): scan-ledger — outbound-queue finding shipped (epic #1554) by @AntonioSaaranen in #1580
- test(backend): the worker schema is the whole search_path — no public fallback (#1562) by @AntonioSaaranen in #1581
- docs(mcp): the no-user-cap convention — quote first, cap at the live quote (#1548) by @d-hinders in #1582
- feat(mcp): compact the x402 prepare/pay responses — payment_required behind include_signing_payload (#1549) by @d-hinders in #1584
- fix(demo-merchant): unknown MCP session fails closed before the payment gate (#1578) by @AntonioSaaranen in #1583
- fix(connect): signer preinstall fails loud and closed — no silent npx fallback (#1586) by @AntonioSaaranen in #1594
- feat(connect): handshake-probe the local signer before reporting success (#1587) by @AntonioSaaranen in #1595
- feat(mcp): runtime-neutral next_tool — next_tool_server + next_tool_name (#1588) by @AntonioSaaranen in #1596
- feat(connect): --doctor and --repair — one-command setup diagnosis (#1589) by @AntonioSaaranen in #1597
- feat(sdk,mcp): spend_authority_readiness — name the signal for what it covers (#1590) by @AntonioSaaranen in #1598
- mcp: slim tool descriptions — shared guidance into server instructions (#1591) by @AntonioSaaranen in #1599
- backend: normalize catalog price_display — drop the redundant $ prefix (#1592) by @AntonioSaaranen in #1600
- connect: harden the LOCAL MCP runtime install like #1586 did the signer's (#1593) by @AntonioSaaranen in #1601
- docs: quality-scan — guard-effectiveness probe, measurement blocks, probed-clean baselines, disposition trigger (#1602) by @AntonioSaaranen in #1603
- docs: scan-ledger entry for the 2026-08-19 quality-scan run (no qualifying finding) by @AntonioSaaranen in #1604
- docs: ship-next corrections — CI-waiting claims, outbound money-path coverage, flake triage, sdk playbook refresh (#1607) by @AntonioSaaranen in #1608
- docs(code): correct four stale 'until #N' comments that claim to wait for shipped work (#1605) by @AntonioSaaranen in #1606
- ci: gate Playwright install on browser-cache hit — apt-get leaves the warm-cache path (#1609) by @AntonioSaaranen in #1611
- chore(release): bump all published packages to 0.1.27-alpha.0 by @d-hinders in #1610
- promote: dev → main (outbound-tx queue epic #1554 + connector setup chain + 0.1.27-alpha.0) by @d-hinders in #1612
Full Changelog: prod-20260818-132909...prod-20260820-072606
Production promotion — prod-20260818-132909
What's Changed
- fix(sdk): never authorize an x402 payment that already settled (#1521) by @claude[bot] in #1527
- fix(build): mcp-server is a private workspace consumer, not a published one (#1526) by @claude[bot] in #1528
- feat(qa): preflight the resources a money-flow run consumes (#1530) by @claude[bot] in #1532
- test(qa): drop the legacy-rail x402 legs — x402 coverage is delegation-rail only by @d-hinders in #1535
- fix(qa): give every purchasing leg a per-attempt idempotency key (#1534) by @claude[bot] in #1536
- fix(relayer): one nonce view per chain — delete the duplicate provider pair (#1533) by @claude[bot] in #1537
- chore(release): bump all published packages to 0.1.26-alpha.0 by @claude[bot] in #1539
- promote: dev → main (QA reliability chain + #1521 SDK fix + 0.1.26-alpha.0) by @claude[bot] in #1540
Full Changelog: prod-20260817-193022...prod-20260818-132909