SPEC v0.9: M12b and M12c outcomes (D-055 to D-058), U2 values, UX-9 (D-059, M12d)

- D-055 build-time copy of the keyword table, D-056 parseCategoryKeywords,
  D-057 enum declaration orders, D-058 E-7 example shows server_version
  15 and 16 and its test compares them again.
- D-051 fulfilled: §9.7 hex values from docs/ux/design-spec.md §2.3;
  design-spec.md binding, strings.csv the source of string resources.
- D-059: ExpenseEditorOptions.frequentCategoryIds and
  CategoryRepository.deletable; new milestone M12d with PLAN-M12d and
  prompts/M12d.md; M7a-f depend on M6 and M12d.
- suggestCategory readings (null when other is archived), §11.2 landed
  marks and the 2026-10-18 dry run, dev stack on schema 2, PLAN-M12b
  SQLite 3.51.x, design-spec §6 notes in PLAN-M6/M7c/M7f; HANDOFF rewritten.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
This commit is contained in:
2026-10-18 08:34:45 +02:00
parent 6da6b1b023
commit e6768121d6
13 changed files with 203 additions and 90 deletions
+24
View File
@@ -0,0 +1,24 @@
# Start prompt: M12d UI contract additions (UX-9)
You are an Opus implementation agent on Kvitt (repository `/Users/jhag/projects/kvitt`), milestone M12d: UI contract additions (UX-9). You have no context other than this prompt and the files it names.
Read PLAN-M12d.md and follow it; CLAUDE.md rules apply. SPEC.md wins over both.
Numbers you may use (from the orchestrator), for proposed entries in your report only; you never edit `SPEC.md` or `docs/decisions.md` (CLAUDE.md › Orchestration):
- Next free decision id: {{NEXT_DECISION}}
- Spec version a proposed spec change would get: {{SPEC_VERSION}}
- Schema version for any schema change: {{SCHEMA_VERSION}}
If a value is still a `{{…}}` placeholder, write `TODO(spec)` wherever the number would go and say so in the report.
Orchestrator notes for this run:
(To fill: Confirm SPEC v0.9 has landed. M6 runs in parallel in `android/core/design/**`; Gradle builds are serialised by `tools/gradle-serial.sh`. No phone is needed.)
{{ORCHESTRATOR_NOTES}}
Essentials (the plan has the detail):
- First step: from the main checkout, `git worktree add .claude/worktrees/agent-m12d -b agent-m12d main`; work only there, on branch `agent-m12d`; then copy the git-ignored files the plan names.
- Edit only the Android paths of PLAN-M12d §4 (`:core:model`, `:data`, `:core:fakes` outside the `fakes/<feature>/` folders); anything else is a contract request to the orchestrator.
- Gate: `PATH=/opt/homebrew/opt/openjdk@25/bin:$PATH ../tools/gradle-serial.sh check` in `android/`. Report only results you ran in this session.
- Stop and ask when the plan says so, when a step could touch the owner's real data, or when the spec is ambiguous in a way that changes a decision.
- Commit on your branch when the gate is green, `git rebase main`, rerun the gate. Never merge, push or remove the worktree.
Report: end with the report described in PLAN-M12d.md §10: branch, head commit hash, gate result lines, versions chosen with sources, numbering used, how the orchestrator notes were applied, HUMAN steps outstanding (worded for relay), contract requests, open questions and spec gaps with section numbers.
+15 -14
View File
@@ -2,7 +2,7 @@
One ready-to-paste start prompt per plan (`PLAN-<id>.md` at the repository root), plus `ORCHESTRATOR-prompt.md`. Before pasting, the orchestrator fills `{{NEXT_DECISION}}`, `{{SPEC_VERSION}}`, `{{SCHEMA_VERSION}}` (disjoint ranges for agents that run in parallel, CLAUDE.md › Numbering) and `{{ORCHESTRATOR_NOTES}}` (answers to the plan's open points, phone assignment, overrides). `U2.md` also takes `{{OWNER_PICK_AND_COMMENTS}}`. U1 and U2 run in the owner's own Claude session in `~/orca/workspaces/kvitt/UX-sprint` on branch `UX-sprint`. The numbers are for proposed entries in agents' reports: implementation agents never edit `SPEC.md` or `docs/decisions.md`; a docs agent records what the orchestrator accepts (CLAUDE.md › Orchestration).
Dependencies follow SPEC §11.1 and §11.2 (v0.8). Status as of 2026-10-18: M0 done, M1 landed (`c6df2ab`), M2c-dev landed (`c885aba`), M2a landed (`fdf2093`), M2b landed (`fad6fc9`), M3 landed (`503cee5`), M5 landed (`c28c52b`), M4 landed (`bd6f10a`), M9 landed (`ab298ab`); SPEC v0.7 landed (`e8ee518`); M12a landed (`6b60ef7`); U1 done on `UX-sprint`, direction 3 "Kalas" muted picked (D-047), U2 in progress there. The plans' open points are resolved in SPEC v0.3 and recorded in each plan's §4; v0.4 records the M2a and M2b decisions (D-005 to D-014); v0.5 the M3 and M5 decisions (D-026 to D-034, D-040 to D-043); v0.6 the M4 decisions (D-035 to D-039); v0.7 the M9 decisions (D-044 to D-046); v0.8 the owner's UX-session decisions (D-047 to D-054) and the milestone group M12.
Dependencies follow SPEC §11.1 and §11.2 (v0.9). Status as of 2026-10-18: M0 done, M1 landed (`c6df2ab`), M2c-dev landed (`c885aba`), M2a landed (`fdf2093`), M2b landed (`fad6fc9`), M3 landed (`503cee5`), M5 landed (`c28c52b`), M4 landed (`bd6f10a`), M9 landed (`ab298ab`); SPEC v0.7 landed (`e8ee518`); M12a landed (`6b60ef7`); SPEC v0.8 landed (`7fb9f6f`); M12c landed (`e499107`); M12b landed (`2e2ebe7`); U1 and U2 landed (`16c4d01`, owner approved); M6 and M12d started 2026-10-18; SPEC v0.9 records the M12b and M12c outcomes (D-055 to D-058), the §9.7 values and UX-9 (D-059). The plans' open points are resolved in SPEC v0.3 and recorded in each plan's §4; v0.4 records the M2a and M2b decisions (D-005 to D-014); v0.5 the M3 and M5 decisions (D-026 to D-034, D-040 to D-043); v0.6 the M4 decisions (D-035 to D-039); v0.7 the M9 decisions (D-044 to D-046); v0.8 the owner's UX-session decisions (D-047 to D-054) and the milestone group M12; v0.9 D-055 to D-059 and M12d.
## Dependency order and waves
@@ -11,24 +11,25 @@ Plans in the same wave can run in parallel (they own disjoint paths, SPEC §14.7
| Wave | Plan | Prompt | Depends on | Parallel with |
|---|---|---|---|---|
| 0 | M1 Contracts and vectors | `M1.md` | M0 | done (`c6df2ab`) |
| 0 | U1 UX directions | `U1.md` | M0 | everything in waves 0 to 2 (owner's session) |
| 0 | U1 UX directions | `U1.md` | M0 | done (`16c4d01`) |
| 1 | M2a Server skeleton and `kvitt-domain` | `M2a.md` | M1 | done (`fdf2093`) |
| 1 | M2b Android skeleton and `:domain` | `M2b.md` | M1 | done (`fad6fc9`); `installDebug` on the phone outstanding |
| 1 | M2c-dev Infra for development | `M2c-dev.md` | M0 (its health check needs M2a's image) | done (`c885aba`) |
| 1 | U2 UX design spec | `U2.md` | U1 and the owner's pick | M2a, M2b, M2c-dev, wave 2 |
| 1 | U2 UX design spec | `U2.md` | U1 and the owner's pick | done (`16c4d01`) |
| 2 | M3 Server core API | `M3.md` | M2a | done (`503cee5`) |
| 2 | M4 Server sync, audit, push, scheduler | `M4.md` | M2a; lands after M3 (D-015) | done (`bd6f10a`) |
| 2 | M5 Android data layer | `M5.md` | M1, M2b | done (`c28c52b`) |
| 2 | M12a Category contract v2: contracts | `M12a.md` | M1, SPEC v0.8 | done (`6b60ef7`) |
| 2 | M12b Category contract v2: server | `M12b.md` | M12a (M3, M4, M9 landed) | M12c, U2 |
| 2 | M12c Category contract v2: Android | `M12c.md` | M12a (M2b, M5 landed) | M12b, U2 |
| 2 | M6 Design system | `M6.md` | U2 approved, M2b, M12c, the §9.7 colour spec change | M12b |
| 3 | M7a Feature onboarding | `M7a.md` | M6 | M7b to M7f, M9 |
| 3 | M7b Feature home and account | `M7b.md` | M6 | M7a, M7c to M7f, M9 |
| 3 | M7c Feature expense | `M7c.md` | M6, M12c | M7a, M7b, M7d to M7f, M9 |
| 3 | M7d Feature settle | `M7d.md` | M6 | M7a to M7c, M7e, M7f, M9 |
| 3 | M7e Feature analytics | `M7e.md` | M6 | M7a to M7d, M7f, M9 |
| 3 | M7f Feature settings | `M7f.md` | M6 | M7a to M7e, M9 |
| 2 | M12b Category contract v2: server | `M12b.md` | M12a (M3, M4, M9 landed) | done (`2e2ebe7`) |
| 2 | M12c Category contract v2: Android | `M12c.md` | M12a (M2b, M5 landed) | done (`e499107`) |
| 2 | M12d UI contract additions (UX-9) | `M12d.md` | M12c, SPEC v0.9 | M6 |
| 2 | M6 Design system | `M6.md` | U2 approved, M2b, M12c, the §9.7 colour spec change (v0.9) | M12d |
| 3 | M7a Feature onboarding | `M7a.md` | M6, M12d | M7b to M7f, M9 |
| 3 | M7b Feature home and account | `M7b.md` | M6, M12d | M7a, M7c to M7f, M9 |
| 3 | M7c Feature expense | `M7c.md` | M6, M12c, M12d | M7a, M7b, M7d to M7f, M9 |
| 3 | M7d Feature settle | `M7d.md` | M6, M12d | M7a to M7c, M7e, M7f, M9 |
| 3 | M7e Feature analytics | `M7e.md` | M6, M12d | M7a to M7d, M7f, M9 |
| 3 | M7f Feature settings | `M7f.md` | M6, M12d | M7a to M7e, M9 |
| 3 | M9 Splitwise importer | `M9.md` | M2a, M4 | M5, M6, M7a to M7f |
| 4 | M8 App integration | `M8.md` | M3, M4, M5, M7a to M7f, M2c-dev | M9 if still running |
| 5 | M2c-pi Infra on the Pi | `M2c-pi.md` | M2c-dev, M8; OQ-3 answered | none needed |
@@ -40,7 +41,7 @@ Plans in the same wave can run in parallel (they own disjoint paths, SPEC §14.7
- **M3 and M4** (D-015): M2a provides `next_occurrence_date`, the `AuditWriter`/`PushQueue` traits with no-op implementations and `tasks::start`; M3 writes the recurring generation function and calls the traits; M4 replaces the implementations, its scheduler calls M3's function, and M4 lands after M3.
- **M2a and M2b** create shell files and modules in later milestones' paths (D-004); ownership passes on when they land.
- **M7a to M7f** follow the feature convention of SPEC §6.2 (D-017) and take the ledger rows and expense editor fields from M6's `:core:design` (D-019).
- **M6** starts only after the §9.7 colour change from U2's proposal (the muted Kalas values, `slate` and `amber` included, D-051) has landed in SPEC and M12c has landed (§11.1).
- **M12** (D-054): SPEC v0.8 changes the §10.8 table that the importer test `category_table_matches_the_spec` parses, so the server gate on `main` is red from SPEC v0.8 until M12b lands; land M12b soon after (or land SPEC v0.8 together with it).
- **M6** started 2026-10-18 after the §9.7 values landed (SPEC v0.9, D-051) and M12c landed; it builds from `docs/ux/design-spec.md` §2 and §3 and `strings.csv`.
- **M12** (D-054): done; the importer test `category_table_matches_the_spec` is green again since M12b (`2e2ebe7`). M12d (D-059) runs beside M6 in disjoint paths; M7a to M7f wait for both.
- **Phone:** M2b (one `installDebug`), M5 (only if instrumented tests), M8 and M10 use the phone; only one at a time, named in the notes.
- **Outside the repository:** M2c-dev (D-022, done), M2c-pi (the Kvitt Pi, the Home Assistant Pi, Gitea, Drive: allowances requested at the start of that sprint, D-023), M8 (dev server on the Mac), M10 and M11 (production) need the owner's allowance in the notes.