Dogfooding fixes: empty-state gaps + Settings/Capture mocks the sweep missed #62

Merged
christian merged 2 commits from fix/empty-focus-and-calm-nag into main 2026-07-12 02:03:43 +00:00
Owner

Found by driving the merged app against the live repo (Playwright Electron). Five real issues the fixture-backed demo never exposed:

Empty-state gaps (the repo has no open issues after we closed the backlog):

  • Focus rendered blankscheduleFocus returns a FocusView with empty slots, not undefined, so the if (!focus) guard never fired. Now shows the Nothing to pour EmptyState.
  • Standup calm nag rendered #0 · steeping 0d · blocks chrome and was clickable (would open issue #0). Now a plain reassurance pill.

Static mocks the de-mock sweep missed (these screens didn't import fixtures.js, so they were skipped):

  • Settings was ~80% mock — fake Sync card (webhook :48731, poll fallback, 500 issues), fake dual-model router, unwired Rituals. Replaced with honest/live content: real reconcile description, the actual probed model from model.status() (google/gemma-4-26b-a4b-qat), dropped Rituals + the duplicate Forget button.
  • Settings said "Not connected" while connected — config:get returned only saved config, so a .env.local connection read null. Now falls back to the resolved connection's public view (Settings + rail host now show christian/commitea / gitea.stephenmann.io).
  • Capture braindump was pre-filled with fake example text; now starts empty.

All verified visually against live christian/commitea (Reginald on a local gemma model). desktop tsc clean.

🤖 Generated with Claude Code

Found by driving the merged app against the live repo (Playwright Electron). Five real issues the fixture-backed demo never exposed: **Empty-state gaps** (the repo has no open issues after we closed the backlog): - **Focus rendered blank** — `scheduleFocus` returns a `FocusView` with empty slots, not `undefined`, so the `if (!focus)` guard never fired. Now shows the **Nothing to pour** EmptyState. - **Standup calm nag** rendered `#0 · steeping 0d · blocks` chrome and was clickable (would open issue #0). Now a plain reassurance pill. **Static mocks the de-mock sweep missed** (these screens didn't import `fixtures.js`, so they were skipped): - **Settings was ~80% mock** — fake Sync card (webhook `:48731`, poll fallback, `500 issues`), fake dual-model router, unwired Rituals. Replaced with honest/live content: real reconcile description, the actual probed model from `model.status()` (`google/gemma-4-26b-a4b-qat`), dropped Rituals + the duplicate Forget button. - **Settings said "Not connected"** while connected — `config:get` returned only *saved* config, so a `.env.local` connection read null. Now falls back to the resolved connection's public view (Settings + rail host now show `christian/commitea` / `gitea.stephenmann.io`). - **Capture braindump was pre-filled** with fake example text; now starts empty. All verified visually against live `christian/commitea` (Reginald on a local gemma model). desktop `tsc` clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
christian added 1 commit 2026-07-10 19:57:45 +00:00
Poking at the live app (a real repo with no open issues) surfaced two empty-state gaps:

- Focus (Morning service) rendered a bare header — no cards, no empty state —
  because scheduleFocus returns a FocusView with empty now/next/later rather than
  undefined, so the `if (!focus)` guard never fired. Guard on 'no now/next/later'
  too → shows the 'Nothing to pour' EmptyState.
- Standup's calm sentinel nag (id 0) still rendered '#0 · steeping 0d · blocks'
  chrome and was a click target (would try to open issue #0). Render the calm
  case as a plain reassurance pill, no chrome, not clickable.

Both verified against the live christian/commitea repo (all issues closed → no
open work). desktop tsc clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
christian added 1 commit 2026-07-10 20:10:01 +00:00
More static mocks found by poking the live app:

- Settings was ~80% mock: a fake Sync card (webhook endpoint :48731, poll
  fallback, 'last reconcile 3.2s · 500 issues'), a fake dual-model 'router'
  (gemma-4b/qwen-72b with hardcoded URLs), and an unwired Rituals card. Replaced
  with honest/live content: the Sync card now describes the real on-demand
  reconcile + stale-cache model; the Model card shows the actual probed model
  from model.status(); dropped Rituals and the duplicate 'Forget' button.
- Settings showed 'Not connected' while the app was clearly connected: config:get
  returned only the *saved* config, so a .env.local/env connection read as null.
  It now falls back to a public view of the resolved connection — Settings and
  the rail host label reflect the real christian/commitea connection.
- Capture braindump was pre-filled with a fake example ('auth is flaky…'); now
  starts empty with just the placeholder.

Verified live: Settings shows christian/commitea connected + google/gemma-4-26b
reachable; Capture empty; a live Reginald chat turn runs the agent loop.
desktop tsc clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
christian changed title from Fix blank Focus + calm-standup nag chrome (found dogfooding) to Dogfooding fixes: empty-state gaps + Settings/Capture mocks the sweep missed 2026-07-10 20:10:22 +00:00
christian merged commit 8bed2f75c1 into main 2026-07-12 02:03:43 +00:00
Sign in to join this conversation.
No description provided.