All checks were successful
Build and Push Docker Image / build (push) Successful in 1m48s
82 lines
4.8 KiB
Markdown
82 lines
4.8 KiB
Markdown
# 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).
|