Files
solelog/docs/sessions/2026-07-22-per-domain-test-safety-net.md
Bas van Rossem 472fcf82b8
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m48s
docs: finalize domain-test-checklist + session log + roadmap (test safety net, 100% coverage)
2026-07-23 15:40:49 +02:00

82 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Session: 2026-07-22 — Per-domain test safety net
## Goal
Give every domain across `apps/api`, `apps/worker`, and `apps/admin` a measured, near-100%
test safety net (coverage tooling + gap-fill + one lifecycle test per domain), and shake out
bugs in the process. Spec: `docs/superpowers/specs/2026-07-22-per-domain-test-safety-net-design.md`;
plan: `docs/superpowers/plans/2026-07-22-per-domain-test-safety-net.md`. Tracked as Plane epic **SL-70**.
## Approach
Brainstorm → spec → plan → execution. Decisions: full safety net (tooling + gap-fill + lifecycle
tests + a living behaviors checklist), all three layers equal depth, bugs logged to Plane with
trivial fixes inline. Coverage target: near-100% per domain, no silent gaps (`/* c8 ignore */`
with a reason for genuinely unreachable/defensive lines).
- **Phase A (inline):** coverage tooling (`@vitest/coverage-v8` + `test:coverage` in all three
workspaces, `all: true`, text + json-summary), a `resetDb()` helper for per-test DB isolation
(fixes the accumulate-and-scope fragility; proved on the sessions suite), the Plane epic, and
the checklist-doc skeleton with the baseline. Commits `3c79e51`, `f872daf`, `0564fab`.
- **Phase B (Workflow, background):** 18 domains, strictly sequential — one focused
`general-purpose` agent per domain following the Domain Procedure (measure coverage → fill
gaps → add the domain's lifecycle test → near-100% → oxfmt/oxlint → append checklist section →
commit). Sequential because all agents share one working tree, one SQLite test DB, and one git
index — parallel test-runs/commits would corrupt each other.
- **Phase C (inline):** independent verification + synthesis (this session's author, not the
agents' self-reports).
## Execution — what actually happened
The Workflow hit two **transient network outages** (not test failures):
1. First run: A0–A6 (the first 7 API domains) completed and committed; then a sustained
`SSL certificate hostname mismatch` connection error killed A7 and every agent after it (12
failures). The ticktick MCP dropped at the same time — a network blip, not a code problem.
2. Resumed via `Workflow({resumeFromRunId})`: A0–A6 replayed from cache, A7 + all clients ran
live. 18/19 completed; **W2 (Stopwatch)** dropped with `Connection closed mid-response`.
The tree was left clean (no partial commit).
3. W2 finished by a single focused fallback `Agent` (avoids the resume re-running the
already-committed suffix). Commit `a30441b`.
Phase C then found one file that had fallen **between** the admin D-domains — `apps/admin/src/lib/api.ts`
(the base fetch/`ApiError` wrapper, 34% covered; the D-tasks covered the per-resource `api/*.ts`
but not the shared helper). Closed inline mirroring the worker's `api.test.ts`. Commit
`test(admin): cover lib/api fetch wrapper`.
## Outcome
**All three workspaces at 100% statements / branches / functions / lines.**
| Workspace | Stmts | Branch | Funcs | Tests (before → after) |
| --------- | ----- | ------ | ----- | ---------------------- |
| api | 100 | 100 | 100 | 103 → 175 |
| worker | 100 | 100 | 100 | 30 → 79 |
| admin | 100 | 100 | 100 | 50 → 129 |
- **383 tests total** (was 183), all green. Typechecks clean in all three; `npx oxlint` clean.
- **One lifecycle/integration test per domain** where the plan called for it (API integration
tests live in `apps/api/test/integration/`).
- **Zero bugs found.** Every added test locks in already-correct behavior — a good signal for a
greenfield build that had been TDD'd from the start. Genuinely unreachable lines
(`?? 0` guards behind `NOT NULL DEFAULT 0` columns, CLI direct-run blocks, disabled-control
early returns) are `/* c8 ignore */`'d with reasons, not left silent.
- **Harness improvement:** `resetDb()` gives per-test isolation; new API domain suites use
`beforeEach(resetDb)` so they assert exact counts without dodging other suites' rows.
- Living **`docs/reference/domain-test-checklist.md`** records the guaranteed behaviors per domain
— the definition-of-done future work checks against.
## Verification (independent of the agents' self-reports)
- `yarn workspace @solelog/{api,worker,admin} test:coverage` → 175 / 79 / 129 tests, all green,
100% (api, worker) and 100% (admin after the Phase C gap-closure).
- Three typechecks clean; `npx oxlint` exit 0; `git status` clean.
## Tracking / next
- Plane epic **SL-70** → Done. No bug tickets filed (none found).
- `main` is well ahead of origin — the maintainer pushes from their terminal (`git push origin main`).
- Next per the roadmap: **Phase 5 — Polish & deploy** (hosting already handled on the maintainer's
machine), or the Plane backlog (the "data not visible after reopening browser / relogin" bug looks
highest-value).