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
@@ -19,16 +19,13 @@ async fn e7_returns_user_device_household_and_public_url() {
.insert("x-kvitt-app-version", "41".parse().unwrap());
let reply = app.send(request).await;
assert_eq!(reply.status, 200);
// `server_version` is volatile here: the example's users have 11 and 12 (schema 1, after ten seeded
// categories); since migration 0002 seeds fourteen, the harness's users have 15 and 16 (SPEC §14.1.1).
// The harness seeds the users after the fourteen category seeds, so they have `server_version` 15 and
// 16, as the example shows (D-058); the example's value is compared.
assert_like_example(
&reply.json,
"E-7-me/response.json",
&["created_at", "updated_at", "last_seen_at", "server_version"],
&["created_at", "updated_at", "last_seen_at"],
);
assert_eq!(reply.json["user"]["server_version"], 15);
assert_eq!(reply.json["household"][0]["server_version"], 15);
assert_eq!(reply.json["household"][1]["server_version"], 16);
assert_eq!(reply.json["device"]["id"], ADMIN_DEVICE_ID);
assert_eq!(reply.json["device"]["is_current"], true);
let member = app.call(Method::GET, "/me", &member_token(), None).await;