유대선
프로젝트로
·트러블슈팅·2

Ongoing issue: AI-driven regressions — now tracked weekly (baseline: 5/5 slipped to the user)

Adding features kept silently breaking working ones — a structural property of fast AI-driven development, not bad luck. Instead of pretending it's fixed, it's now a permanent, tracked issue: every regression is logged with a date and 'caught by whom,' and a script reports the count per ISO week. Baseline week 2026-W24: 5 regressions, all 5 slipped to the user. Goal: trend down, user-caught → 0.

The standing problem (not a one-off)

All day on 2026-06-08, adding one thing silently broke another: a new "verification footer" displaced the always-on summary card; a layout revert made saved sessions look like orphans; a keybinding leaked a control char into the terminal; a copy fix landed on the wrong code path three times. None were caught by a test or a check — all five slipped to the user.

This is structural, not carelessness: an AI implementer sees the files in front of it, optimizes the immediate task, moves fast, and forgets distant invariants across turns and sessions. Without a safety net, regressions are inevitable as the project grows. (Full analysis: ADR-013.)

So it's tracked, not hand-waved

Baseline — 2026-W24

ISO week    | total | slipped-to-user | trend
2026-W24    |   5   |   5  (100%)     |  —

Everything slipped to the user this week. That is the honest starting line.

The actual fix (in order, honest status)

  1. Automated tests encoding invariants — the real teeth. BUILT 2026-06-09: Vitest, 39 tests across 5 suites locking this week's regressions (layout pane-dedup, copy box-char rules, the RULE #10 chord contract, dk-summary stream capture, the honesty hook incl. fail-open), and wired INTO pnpm build — which is tauri's beforeBuildCommand — so a red test blocks every release. Proven by a deliberately failing test: exit 1, no bundle. Each future regression gets a test here the day it's found.
  2. docs/INVARIANTS.md — the always-true list (the system memory the AI lacks). ✅ exists, but it's a soft doc.
  3. Stop-hooks for the enforceable invariants. ✅ honesty hook is global; ✅ dk-summary-presence gate added 2026-06-09 (Talkak panes only, keyed off DALKKAK_PANE_ID; >200-char replies without the block are sent back) — the card-vanished class is now machine-enforced, test-locked (4 cases).
  4. Re-check the INVARIANTS rows for the area you touched, every change. Discipline.

Win condition: weeks with 0 user-caught regressions — and we'll be able to see it on the chart, not just claim it.