Files
kvitt/docs/HANDOFF.md
T
jacobh2 d9dd5848fe SPEC v0.6: M4 decisions (D-035 to D-039), HANDOFF rewritten
- D-035 unusable mutation_id/entity_type/entity.id fails the whole push with 400; other shape errors per mutation.
- D-036 0 mutations is batch_too_large ("outside 1 to 100").
- D-037 never-synced delete runs full step-8 validation; current on every rejection; created_at kept; canonical ids.
- D-038 FCM retries: one send plus three retries (1/5/25 s), 401 drops the token, other 4xx not retried.
- D-039 pruning strictly older than 90 days; tasks::start returns AppState with the push queue, SqlAuditWriter default.
- Clarifications: step 8 order, negative since, pull read transaction, FCM JWT kid and cache, token clearing only if
  unchanged, unusable credentials, scheduler clock jumps, rotate-epoch exit codes, /i/ empty code, image build needs
  a C toolchain and CA roots (dev image rebuilt 2026-10-18).
- PLAN-M4 pruning wording, prompts/README status, HANDOFF at bd6f10a.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
2026-10-18 07:33:46 +02:00

5.0 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 bd6f10a (M4) plus the SPEC v0.6 docs commit from agent-spec6 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.
  • Landed: M0 spec, M1 contracts and vectors (c6df2ab), M2a server skeleton and kvitt-domain (fdf2093), M2b Android skeleton and :domain (fad6fc9), M2c-dev infra for development (c885aba), M3 server core API (503cee5), M5 Android data layer (c28c52b), SPEC v0.5 (982451d), M4 server sync, audit, push, scheduler (bd6f10a). With agent-spec6: SPEC v0.6 with M4's D-035 to D-039.
  • Both gates exist: Android tools/gradle-serial.sh check (from android/), server cargo fmt --check && cargo clippy -- -D warnings && cargo test (from server/).
  • Worktrees in flight under .claude/worktrees/: agent-m9 (M9 Splitwise importer; decisions D-044 to D-049 reserved for it), agent-spec6 (this docs change: SPEC v0.6).
  • The owner runs the UX sprint in a separate Claude session in ~/orca/workspaces/kvitt/UX-sprint on branch UX-sprint; it commits only under docs/ux/ and rebases on main before landing. U1 is committed on UX-sprint at 210ab5c (docs/ux/: directions, ia, screens, flows, components, tokens, strings.csv); the owner has not yet picked a direction.
  • Development stack (M2c-dev): running on the Mac with the M4 image, reachable at http://192.168.1.210:8080; the owner confirmed /health from the phone on the home Wi-Fi on 2026-10-17. The dev image was rebuilt with M4's new crates (reqwest on rustls/aws-lc-rs, jsonwebtoken) on 2026-10-18 and built cleanly. 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 main at c28c52b, as of 2026-10-18 (M2b's installDebug check is done).

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

  • Land agent-spec6 (orchestrator): SPEC v0.6, decisions D-035 to D-039, PLAN-M4 pruning wording, prompts/README status.
  • 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.
  • D-027 re-stamp (orchestrator assigns: M8 as a contract request on :data, or a small :data agent): on the first sync attempt after a clock_skew rejection the phone re-stamps updated_at of each such pending row to its current clock before pushing. Not in :data at c28c52b.
  • Picture size (M6, if needed): :data always fetches E-11 at 512; a size parameter for the 128 variant is a contract request on :core:model and :data.
  • Plans (SPEC §11.2 v0.6), in dependency order; prompt prompts/<id>.md:
    • M1, M2a, M2b, M2c-dev, M3, M4, M5: landed.
    • U1 UX directions: committed on UX-sprint (210ab5c); waiting for the owner's pick.
    • U2 UX design spec: owner's session, after the pick; owner approves; then the §9.7 colour change goes into the spec (docs agent) before M6.
    • M9 Splitwise importer: agent in flight (agent-m9).
    • Next waves: M6 Design system after U2 approved and the §9.7 colour change; M7a to M7f Features after M6, in parallel; M8 App integration after M7 (and M3, M4, M5).
    • M2c-pi Infra on the Pi: after M8, before M10 (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, M3, M4, M8 (owner: keystore per §10.6, D-024).
    • M11 Import history: after M9 and M10.

3. HUMAN steps pending (relay in chat)

  • UX direction pick from U1's directions in docs/ux/ on UX-sprint, with comments (owner's UX-sprint session).

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. The only open question (OQ-1, OQ-2, OQ-4 answered: D-001, D-003, §10.9).

5. Paused (waiting on something outside the repo)

  • Nothing.

6. Numbering

  • Decisions: D-001 to D-043 used (D-008 and D-009 unused). Reserved: D-044 to D-049 for M9 (in flight). Next free for anything else: D-050.
  • Spec version: v0.6 written; next v0.7.
  • Server schema version 1; next 2. Room schema version 1 (android/data/schemas/se.hagstedt.kvitt.data.db.KvittDatabase/1.json); next 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.