Public: anyone can read this; the crew can change it.
test/snapshot-destination.test.ts passes: a failed test-connection is one sentence and the backups page shows a snapshot in progress without a refresh #11065
Check · Review · Land · Live done — Landed and live in production.
Both tests that were failing in `test/snapshot-destination.test.ts` now pass.
shipped production is serving it deploy a985b29
Both tests that were failing in test/snapshot-destination.test.ts now pass.
- Test-connection message:
scrubReasoninsrc/snapshot/destination.tsnow collapses runs of whitespace to one space and trims the result before cutting it to 200 characters. It builds the reason for the "Could not list …" sentence, so that sentence no longer ends in a newline. The doubled space inlist failedis gone too. It came from an empty prefix in the store's retry message. The other callers ofscrubReason(the bucket check and the MCP backups tool) get the same clean line. - Snapshot in progress on /settings/backups: the "A snapshot is being taken" paragraph is now a live region (
role="status" aria-live="polite"). The page was already refreshed throughdata-live-src="/settings/backups/live"and had no meta refresh. The test now checks the words, the live region and that live source, and checks thathttp-equiv="refresh"is absent. - Test fix: this test had a race. Polling stopped at the first page showing the words, which could still say "0 objects" before the first slow write finished, so the
[1-9]\d* objectsassertion failed. That assertion was never reached before, because the refresh check failed first. Polling now waits until an object has landed. The other change to the test follows the issue, which asked for meta refresh to be removed.
scripts/gate.ts is unchanged. bun test test/snapshot-destination.test.ts passed three runs in a row (7/7). The 26 test files covering backups, snapshots and scrubReason pass (190 tests). bun x tsc --noEmit, bun scripts/gate.ts and bun scripts/design-lint.ts are clean. scripts/fast.ts named 1530 files for this diff, far too many to run here, so I chose those 26 by hand. In this sandbox the connection to 127.0.0.1:1 is blocked by the network allowlist rather than refused. The message reads differently, but the same test covers both.
The keep_plan tool was not available in this run, so the issue has no plan posted.
To try it: open /settings/backups and run Test connection against an unreachable endpoint; the answer is one line. Then take a snapshot now: the Running line updates without reloading the page.
🤖 Generated with Claude Code
Small, single-purpose, matches the issue. scrubReason now yields one clean line at the place it is built; the progress paragraph is a polite status region; the page already live-updates via data-live-src and has no meta refresh; the test race is fixed and asserts words, region and live source. gate.ts untouched, no new dependency, README untouched, no new UI so no new component. The preview answers 303 to the bearer (sign-in redirect), so I could not see the backups page signed in. Next: (1) a live region injected together with its content is often not announced; keep an empty role=status container always present in #backups-live and swap its text. (2) Add a unit test of scrubReason directly (trailing newline, doubled space, secret replaced) so the other callers, the bucket check and MCP tool, are covered without the network.
Both tests that were failing in
test/snapshot-destination.test.tsnow pass.scrubReasoninsrc/snapshot/destination.tsnow collapses runs of whitespace to one space and trims the result before cutting it to 200 characters. It builds the reason for the "Could not list …" sentence, so that sentence no longer ends in a newline. The doubled space inlist failedis gone too. It came from an empty prefix in the store's retry message. The other callers ofscrubReason(the bucket check and the MCP backups tool) get the same clean line.role="status" aria-live="polite"). The page was already refreshed throughdata-live-src="/settings/backups/live"and had no meta refresh. The test now checks the words, the live region and that live source, and checks thathttp-equiv="refresh"is absent.[1-9]\d* objectsassertion failed. That assertion was never reached before, because the refresh check failed first. Polling now waits until an object has landed. The other change to the test follows the issue, which asked for meta refresh to be removed.scripts/gate.tsis unchanged.bun test test/snapshot-destination.test.tspassed three runs in a row (7/7). The 26 test files covering backups, snapshots andscrubReasonpass (190 tests).bun x tsc --noEmit,bun scripts/gate.tsandbun scripts/design-lint.tsare clean.scripts/fast.tsnamed 1530 files for this diff, far too many to run here, so I chose those 26 by hand. In this sandbox the connection to127.0.0.1:1is blocked by the network allowlist rather than refused. The message reads differently, but the same test covers both.The
keep_plantool was not available in this run, so the issue has no plan posted.To try it: open /settings/backups and run Test connection against an unreachable endpoint; the answer is one line. Then take a snapshot now: the Running line updates without reloading the page.
🤖 Generated with Claude Code
Closes #11050