Skip to content

fix: phase 7 verification, the defects it found - #47

Merged
AmrMsCLL merged 5 commits into
mainfrom
fix/verification
Nov 7, 2026
Merged

AmrMsCLL merged 5 commits into
mainfrom
fix/verification

Conversation

@AmrMsCLL

@AmrMsCLL AmrMsCLL commented Nov 7, 2026

Copy link
Copy Markdown
Member

What

Phase 7 of the hub plan: every route at 1440 and 390 in Chromium and Firefox, a keyboard-only pass on both editors, a reduced-motion pass, a load test of / and /live at 200 tabs and 50 events a second, a Redis-loss test and the backup cycle. The defects it found, fixed in four commits:

  1. Reduced motion. Six state pulses (reconnecting dot, armed confirm, saving indicator, stage live dot, editor connection dot) looped regardless of prefers-reduced-motion. They now sit in one no-preference block beside the keyframes. With the preference set, document.getAnimations() reports nothing running on any public route in either browser.
  2. Post editor from the keyboard. The formatting toolbar is one tab stop with Arrow, Home and End inside it instead of 22 stops; the cover upload is a button (the <label> around a hidden input was never focusable); the tags field keeps the typed text so a comma can be entered; the post page's heading list no longer picks up Tailwind's outline utility.
  3. Serving through a Redis outage. A member's request answered 500 while Redis was down; it is now served as a visitor with the cookie kept. /health/ready stays 200 while SQLite and the snapshot work (the production healthcheck feeds Traefik) and says when the bus is down. Failed jobs back off 1, 2, 4… minutes up to an hour and give up after eight attempts instead of exhausting five attempts within a millisecond; a job that cancels its own row while running keeps the row. Publishing refuses while the bus is unreachable, so a scheduled post due during an outage is retried whole instead of being published without its event and its subscriber emails; the emails are queued before the event is recorded.
  4. Redis command timeout of two seconds, so a page during an outage is served in about two seconds rather than 10 to 15.

Verified

  • Firefox and Chromium, both widths, 24 public routes on the production build plus the signed-in routes in dev: every route 200, no overflow, no console errors.
  • Load, production build locally: 200 streams open in 389 ms; 1,420 events published in 30 s, every tab received every event, 0 stream errors; GET / under the storm with eight concurrent loops p50 348 ms, p95 511 ms, p99 670 ms, 0 errors; RSS 389 MB with the streams open.
  • Redis loss: pages serve as visitor and member, /health/ready 200, the scheduled post is published on the first retry after Redis returns, the subscriber email arrives, /blog lists it.
  • Backup: a production run through the service, archive and inner checksums match, integrity_check ok, imported locally with members, profiles, projects and settings intact (production has no posts yet; posts were exercised on top of the import).
  • npm run typecheck, npx eslint ., npx prettier --check ., npm run build, npm run size (largest page 136.9 KB). Specs run: server/jobs.test.ts, server/posts.test.ts, server/auth.test.ts.

A separate PR on platform fixes the backup service crashing on a malformed request. The full plan and results: .claude/.Plans/as2026-11-07-graphite-hub-phase-7.md.

The reconnecting dot, an armed confirm button, the saving indicator, the stage's live dot and the editor's connection dot looped state-pulse regardless of the user's motion preference. The pulses now live in one no-preference block beside the keyframes; the colour still shows the state.
The formatting toolbar is one tab stop with arrow, Home and End keys moving between its controls. The cover upload is a button, so it is reachable without a pointer. The tags field keeps the text being typed, so a comma can be entered; it used to re-render without it on every keystroke. The post page's heading list no longer carries Tailwind's outline utility by accident.
…work

A member's request no longer fails with 500 while the session store is unreachable; it is served as a visitor and the cookie is kept. /health/ready stays 200 while SQLite and the snapshot work and says when the live bus is down, so the edge keeps routing. A failed job backs off for 1, 2, 4... minutes up to an hour and gives up after eight attempts instead of exhausting five attempts within a millisecond; a job that cancels its own row while running keeps the row so the outcome is recorded. Publishing checks the bus first and refuses while it is down, so a scheduled post is retried whole instead of being published without its event or its emails; the emails are queued before the event is recorded.
While Redis is down every request that touches it waited for the reconnect backoff, 10 to 15 seconds a page. A command now times out after two seconds, so a page is served as a visitor within about two seconds of the outage.
@github-actions github-actions Bot added the size/l 201-600 changed lines, excluding lockfiles label Nov 7, 2026
The full name wrapped the panel title onto two lines beside its link, as the 'follow' panel already avoids.
@AmrMsCLL
AmrMsCLL merged commit 70048fc into main Nov 7, 2026
11 checks passed
@AmrMsCLL
AmrMsCLL deleted the fix/verification branch November 7, 2026 01:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/l 201-600 changed lines, excluding lockfiles

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant