Files
kvitt/docs/HANDOFF.md
T

7.7 KiB
Raw Blame History

Handoff: state of the work

Living document, rewritten in place (never a second copy). A new orchestrator session reads CLAUDE.md, then this.

1. Where things stand

  • main at 00a14a3 (M8 app integration, second commit) plus the SPEC v0.12 docs commit from agent-docs-v012 once it lands. History: 5e1be38 plans and prompts, c885aba M2c-dev, 76ee957 SPEC v0.3, fad6fc9 M2b, fdf2093 M2a, 040bf41 SPEC v0.4, 503cee5 M3, c28c52b M5, 982451d SPEC v0.5, bd6f10a M4, 23a2f1e SPEC v0.6, ab298ab M9, e8ee518 SPEC v0.7, 6b60ef7 M12a, 7fb9f6f SPEC v0.8, e499107 M12c, 2e2ebe7 M12b, d452fa6 UX Kalas categories and tokens, 16c4d01 UX sprint U2, 45eecd1 SPEC v0.9, bdba9d3 M12d, 3080804 M6, 7bd0aa1 SPEC v0.10, 72f21b2 app debug fakes bindings (temporary, deleted by M8), e6ad858 app release wiring of :data (pre-M8), b9b061a M7a, 6ac711d M7e, 082b8dc M7d, 31760f9 M7b, 1e42f76 M7c, a54eb7c M7f, 3a1bd14 M6b, d504004 SPEC v0.11, 34a2590 M7g, 369e516 and 00a14a3 M8.
  • Landed: M0 spec, M1 contracts and vectors (c6df2ab), M2a (fdf2093), M2b (fad6fc9), M2c-dev (c885aba), M3 (503cee5), M4 (bd6f10a), M5 (c28c52b), M9 (ab298ab), M12a (6b60ef7), M12b (2e2ebe7), M12c (e499107), U1 and U2 (16c4d01, owner approved), M12d (bdba9d3), M6 (3080804), M7a to M7f, M6b (3a1bd14), SPEC v0.11 (d504004, D-069 to D-080), M7g feature cleanups (34a2590), M8 app integration (369e516 + 00a14a3, landed 2026-10-18, gate green: BUILD SUCCESSFUL, 710 actionable tasks).
  • M8 outcome (recorded in SPEC v0.12 as D-081 to D-085): both variants bind :data through di/AppDataModule.kt, debug fakes module gone (D-081, revises D-041); debug network security config allows cleartext everywhere, the AC-2.8 limit is enforced in SessionRepositoryImpl.normaliseServerUrl, pinned-root config behind kvitt.tls.pinnedRoot (D-082); FCM registration by Firebase Installation ID, firebase-messaging 26.0.0, no server change (D-083); invite links ignored while paired (D-084); generic-notification, deletion and sync_batch taps open Home, push in an expedited WorkManager job (D-085). Not yet run: the end-to-end pairing, offline and push test on the phone and the design-spec §2.7 typeface check (phone was not attached; §3 item 1).
  • In flight: M12e contract pass (started 2026-10-18; SPEC §11.3 list; proposes D-086 onwards; spec v0.13 next). agent-docs-v012 (this docs change: SPEC v0.12).
  • Both gates exist: Android tools/gradle-serial.sh check (from android/), server cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test (from server/). Both green on main as far as reported.
  • The UX sprint (owner's session in ~/orca/workspaces/kvitt/UX-sprint, branch UX-sprint) has landed; nothing is in flight there.
  • Importer: the dry run of 2026-10-18 with M12b's mapping reconciled on both real files (Vardag 1746 rows, 0 unmapped; Hemma 37 rows, 0 unmapped). The CSV files stay in export/ (git-ignored).
  • Development stack (M2c-dev): running on the Mac, reachable at http://192.168.1.210:8080; database at schema 2 since 2026-10-18 (migrated after a backup). Backup infra/dev/backups/kvitt-20261018T093143Z.sqlite.gz exists (git-ignored). Its bootstrap pairing code is held by the orchestrator outside the repo and expires 2026-10-21T12:28Z. No scripted partner device exists yet (it needs the admin token, available only after the owner pairs). Firebase project kvitt-1337 with apps se.hagstedt.kvitt and se.hagstedt.kvitt.debug; service account kvitt-fcm; infra/secrets/fcm-service-account.json and infra/secrets/google-services.json in the main checkout (git-ignored).
  • Installed on the owner's phone (SM-S942B): the debug app se.hagstedt.kvitt.debug built from c28c52b, as of the last report; the M8 build is not installed yet (phone not attached).

2. Open work (one line each, with who owns it: agent or owner)

  • Land agent-docs-v012 (orchestrator): SPEC v0.12, D-081 to D-085, HANDOFF, prompts/README.md.
  • M8 on-phone test (orchestrator with the owner, §3 item 1): install the M8 debug build, pair against the dev server, script a partner device with the admin token, run the offline and push checks; then the design-spec §2.7 typeface check (One UI font styles on the S26).
  • M12e contract pass (in flight): the SPEC §11.3 list, including M8's additions (PushEvent to :core:model, S-22 licences (OQ-5), detail-screen snackbar hosts, S-7/S-8 snackbar strings as resource ids, launcher icon, the fid field on the server).
  • Image build for the Pi (M2c-pi or M10): since M4 the arm64 server image needs a C toolchain in the build stage (aws-lc-rs) and CA roots in the distroless image (§10.3); confirm both and one FCM send from the shipped image.
  • Later cleanup (any Android plan that owns android/gradle/**): remove the unused Vico entries from libs.versions.toml (D-063).
  • Plans (SPEC §11.2 v0.12), in dependency order; prompt prompts/<id>.md:
    • M1, M2a, M2b, M2c-dev, M3, M4, M5, M6, M6b, M7a to M7g, M8, M9, M12a, M12b, M12c, M12d, U1, U2: landed.
    • Now: M12e contract pass.
    • Next: M2c-pi Infra on the Pi (blocked on OQ-3; owner: answer OQ-3, grant the Pi, Home Assistant Pi, Gitea and Drive allowances at the start, D-023); M10 First release after M2c-pi (owner: keystore per §10.6, D-024); M11 Import history after M9 and M10 (procedure §10.8 "Production run", D-025; each run must reconcile, D-045).

3. HUMAN steps pending (relay in chat)

  1. M8 pairing, offline and push test on the phone (the owner does it with the orchestrator; dev server at http://192.168.1.210:8080; the orchestrator holds the bootstrap code, valid until 2026-10-21T12:28Z):
    1. Connect the phone to home Wi-Fi, plug it in over USB, open Kvitt (debug).
    2. On "Para ihop", open "Serveradress" and enter http://192.168.1.210:8080.
    3. Enter the code, enter "Ditt namn", tap "Para ihop".
    4. Land on "Väntar på din partner"; an agent pairs a scripted partner and creates an account. Yes/no: does Home show the account?
    5. If Android asks to allow notifications, tap Allow.
    6. Airplane mode on. Tap "Lägg till utgift", amount, description, "Spara". Yes/no: does the row show "Väntar på synk"?
    7. Airplane mode off, wait about 10 seconds. Yes/no: marker gone?
    8. Agent posts an expense as the partner. Yes/no: did a notification appear?
  2. Look through the M6 component screenshots (android/core/design/src/test/screenshots/); approved in advance, nothing blocks on it.
  3. Answer OQ-3 for M2c-pi (§4).
  4. Release keystore per SPEC §10.6 for M10, or allow an agent to generate one.
  5. Yes/no: the keyword "boende" maps to travel. Yes/no: is the 128 px picture size needed? Yes/no: is an open-source licences screen wanted in v1 (OQ-5, default no)?

4. Owner questions (asked, unanswered)

  • OQ-3 LAN addresses and SSH users of the Kvitt Pi and the Home Assistant Pi; SSH port of the HA Pi; certificate directory there; which SSH add-on (SPEC §12). Needed by M2c-pi only.
  • OQ-5 open-source licences screen on S-22 in v1 (SPEC §12; default not in v1).
  • "boende" keyword → travel (yes/no); 128 px picture size needed (yes/no) (§3 item 5).

5. Paused (waiting on something outside the repo)

  • M2c-pi: OQ-3.

6. Numbering

  • Decisions: D-001 to D-085 used (D-008 and D-009 unused). Next free: D-086 (M12e reserved D-086 to D-095).
  • Spec version: v0.12 written; next v0.13 (M12e).
  • Server schema version 2 (migration 0002, landed with M12b); next 3. Room schema version 1 (android/data/schemas/se.hagstedt.kvitt.data.db.KvittDatabase/1.json); M12e may propose 2.
  • Sync protocol 1, push payload 1.

7. How the work is run

See CLAUDE.md › Orchestration. HUMAN steps in reports are relayed in chat by the orchestrator; the owner does not read them in files.