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-compatibility.md's last-verified chain under the 64 KiB ceiling (Closes #2477) by @AntonioSaaranen in #2491
- feat(sdk,connect,signer,mcp-server): derive every connect@ re-run hint from one build-time channel constant (Closes #2423) by @AntonioSaaranen in #2492
- feat(connect): local runtime-spec override (HAVEN_SIGNER_SPEC / HAVEN_SDK_SPEC / HAVEN_MCP_SPEC) for unpublished signer/SDK/MCP builds (Closes #2424) by @AntonioSaaranen in #2495
- fix(mcp-server): haven_complete_mcp_tool refuses an undeclared payment_required (#2353) by @PhilipEriksson in #2493
- fix(connect): skip the approval wait on non-TTY prose runs; carry budget + wallet label in the approve-budget CTA (Closes #2484) by @PhilipEriksson in #2494
- docs(operations): package dev-channel runbook + operator steps; point release/branch-flow/dev-environment docs at it (Closes #2425) by @AntonioSaaranen in #2497
- Connect: make the server-side credential path findable and friendly (#2482) by @PhilipEriksson in #2498
- docs: finish the connector-channel @Alpha audit (the sites #2422 left) (#2466) by @AntonioSaaranen in #2503
- fix(backend): setup prompt asks for the budget approval once per mode, never unconditionally (Closes #2486) by @AntonioSaaranen in #2502
- docs(quality-scan): add the seven wave dimensions as measurement blocks (Closes #2501) by @AntonioSaaranen in #2506
- docs(ship-next): build so the reviewer finds less — mutation by execution, sourced numbers, one stop rule, checked squash, and a named-set CI wait (Closes #2500) by @AntonioSaaranen in #2509
- docs(agents): haven-doc-reviewer derives scope from the diff's claims, re-runs figures, binds its verdict to a SHA (Closes #2499) by @AntonioSaaranen in #2505
- fix(qa): split the merchant settlement-gas signal into warn and fail bands (#2490) by @PhilipEriksson in #2510
- docs: land the 2026-09-03 issue retrospective and its classification data by @AntonioSaaranen in #2513
- docs-quality: catch a chain entry that survives by reference but not by text by @AntonioSaaranen in #2514
- ship-next: a title saying "still" names a boundary, not an instance by @AntonioSaaranen in #2517
- docs(operations): record the 2026-09-04 dev-channel rollout as history, not as ticked boxes by @d-hinders in #2518
- docs(connect,signer): make the connector command examples channel-neutral by @AntonioSaaranen in #2541
- docs: land the 2026-09-04 agent-first cold-test report as the epic baseline (Closes #2544) by @d-hinders in #2545
- docs(operations): complete the dev-channel rollout record — step 8, the #2515 close, and the end-to-end run by @d-hinders in #2547
- agent-first: point the agent-readable artifacts at hosts that exist, and guard it by @AntonioSaaranen in #2549
- fix(mcp-server): add next_tool_server_role so a --name install can resolve its own signer by @d-hinders in #2555
- ci: give Frontend checks room for the npm ci long tail (Closes #2556) by @d-hinders in #2558
- feat(frontend): advertise the agent-readable artifacts and mark the auth wall (Closes #2521) by @d-hinders in #2554
- docs(skills): name agent-facing source strings in the ship-next claim-sweep surfaces by @PhilipEriksson in #2559
- fix(backend): restrict health diagnostics (refs #2542) by @d-hinders in #2546
- docs(operations): compact the mcp-runtime-compatibility last-verified chain by @d-hinders in #2563
- fix(sdk,mcp-server): make AgentNextStep describe what the hosted MCP actually emits, and bind the emission to it by @d-hinders in #2565
- feat(connect): resolve an existing-agent wiring collision at setup, before registration (Closes #2551) by @d-hinders in #2567
- fix(docs-quality): measure the chain ceiling in bytes, warn before it, and compact the two docs it names (Closes #2562) by @d-hinders in #2569
- feat(frontend,backend): hand-off links that land the human on the exact step (Closes #2522) by @AntonioSaaranen in #2560
- feat(sdk,frontend,backend): publish the agent onboarding runbook at /for-agents.md (Closes #2523) by @d-hinders in #2571
- feat(cli): a machine contract — --json on every command, documented exit codes, haven guide (Closes #2525) by @d-hinders in #2572
- feat(frontend): tell an agent what to do on signup, login and the passkey step (Closes #2524) by @d-hinders in #2573
- feat(backend,connect): the approval link reaches the agent, and a setup records how it was run (Closes #2528) by @d-hinders in #2574
- feat(frontend): serve the product docs as Markdown at stable paths (Closes #2532) by @AntonioSaaranen in #2566
- feat(backend): make the API discoverable from a bare URL (Closes #2530) by @AntonioSaaranen in #2568
- feat(backend,frontend): measure the agent-driven funnel from
viaandrun_mode(Closes #2529) by @d-hinders in #2575 - feat(frontend,backend): machine-readable capability manifest at /.well-known/haven.json (Closes #2531) by @AntonioSaaranen in #2570
- docs(readme,frontend): one agent-facing README entry, and one vocabulary (Closes #2533) by @d-hinders in #2577
- docs(copy): extend the connector-command vocabulary to the rest of its class (Closes #2576) by @d-hinders in #2579
- ci(publish): move the latest dist-tag onto each prod release (Refs #2536) by @d-hinders in #2581
- feat: browser-approved CLI login (device-code flow) with an owner_cli allow-list — Closes #2526 by @AntonioSaaranen in #2578
- fix(npm): point the five published packages' homepage at the public repository (Closes #2548) by @PhilipEriksson in #2582
- fix(backend,qa): make the Base Sepolia RPC default visible and the observer node configurable (refs #2511) by @PhilipEriksson in #2553
- feat(release): refuse a bump that does not move the version forward (Closes #2580) by @d-hinders in #2584
- feat: haven agents connect — the connect flow without the dashboard modal — Closes #2527 by @AntonioSaaranen in #2583
- feat: the dashboard offers to revoke the agents a setup superseded — Closes #2561 by @AntonioSaaranen in #2585
- docs: the connect/CLI code reuse was measured and declined — Closes #2540 by @AntonioSaaranen in #2587
- feat(cli,frontend): funding as a machine-readable step — owner-scoped funding instructions endpoint and haven wallets funding (Closes #2534) by @PhilipEriksson in #2589
- feat(2537): an onboarding section in the shipped haven-pay skill by @AntonioSaaranen in #2588
- feat(2538): the cold-agent onboarding scenario, on the cadence by @AntonioSaaranen in #2592
- fix(2590): the CLI help omitted
agents connectand misdescribedloginby @AntonioSaaranen in #2593 - fix(2591): the runbook named a chain it cannot know, and never named the API base by @AntonioSaaranen in #2595
- feat(frontend,sdk): a copyable onboarding prompt for the whole setup — Closes #2535 by @d-hinders in #2598
- fix(2596): no served artifact asserts a chain the deployment can contradict by @AntonioSaaranen in #2597
- feat(2366): the hosted haven_quote_x402 can quote a body-bearing paywall by @AntonioSaaranen in #2600
- docs(2601): give the review root an end of life by @AntonioSaaranen in #2602
- fix(2511): the QA observer knob was unreachable from CI by @AntonioSaaranen in #2605
- fix(2594): the precondition refusal names the caller's own use by @AntonioSaaranen in #2603
- docs(2538): the arming state is invisible from this repo — say so by @AntonioSaaranen in #2606
- docs(2536): the CLI README described a companion to a dashboard the agent cannot use by @AntonioSaaranen in #2607
- feat(2366): the idempotency-key spelling window on @haven_ai/mcp by @AntonioSaaranen in #2608
- docs(2366): record the owner decision that the quote/payment_required divergence stands by @AntonioSaaranen in #2609
- docs: the one-session retrospective (2026-09-06) by @AntonioSaaranen in #2610
- fix(ci): the #1777 deadlock notice names the re-run remedy that costs nothing — Closes #2599 by @PhilipEriksson in #2604
- feat(cli,backend): haven budget grant|revoke as construct-and-hand-off (Closes #2539) by @PhilipEriksson in #2611
- fix(backend): serialize the delegation build slot so one slot holds one pending offer by @AntonioSaaranen in #2614
- release: 0.1.35-alpha.0 by @d-hinders in #2624
- fix(frontend): manifest chain facts, funding path, attribution; 402 signup link parity (#2619) by @PhilipEriksson in #2626
- feat(cli): budget show --hashes, so the kill switch has a discoverable argument by @AntonioSaaranen in #2627
- chore: sync main back into dev (0.1.34-alpha.0 promotion merge) by @d-hinders in #2629
- fix(ci): request QA jobs with GET by @d-hinders in #2644
- Promote dev → main: 0.1.35-alpha.0 by @d-hinders in #2634
Full Changelog: prod-20260901-191951...prod-20260907-110404