bfde12cead
- D-097: chart bars top 4 dp, bottom 2 dp (M8b f0575d3); design-spec §2.9, §3.10 - D-100: no SSH from the Mac to the Pis; M2c-pi delivers infra/pi/ for the owner to run; OQ-3 answered by .env placeholders; revises D-023, keeps D-001 - D-101: kvitt-release.jks at the repository root, git-ignored; revises D-024 - M8 end-to-end test result and M8b fixes in §11.2/§11.3; OQ-5 answered; 128 px picture size not needed (§14.2.4) - HANDOFF and prompts/README rewritten for the current state and numbering Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
10 KiB
10 KiB
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
mainat09f474f(M12e follow-up:FcmMessageBodyusesfid) plus the SPEC v0.15 docs commit fromagent-docs-v015once it lands. History:5e1be38plans and prompts,c885abaM2c-dev,76ee957SPEC v0.3,fad6fc9M2b,fdf2093M2a,040bf41SPEC v0.4,503cee5M3,c28c52bM5,982451dSPEC v0.5,bd6f10aM4,23a2f1eSPEC v0.6,ab298abM9,e8ee518SPEC v0.7,6b60ef7M12a,7fb9f6fSPEC v0.8,e499107M12c,2e2ebe7M12b,d452fa6UX Kalas categories and tokens,16c4d01UX sprint U2,45eecd1SPEC v0.9,bdba9d3M12d,3080804M6,7bd0aa1SPEC v0.10,72f21b2app debug fakes bindings (temporary, deleted by M8),e6ad858app release wiring of:data(pre-M8),b9b061aM7a,6ac711dM7e,082b8dcM7d,31760f9M7b,1e42f76M7c,a54eb7cM7f,3a1bd14M6b,d504004SPEC v0.11,34a2590M7g,369e516and00a14a3M8,cf8ef45SPEC v0.12,1470a2fM12e contract pass,90505a8M12e launcher icon,03b7184SPEC v0.13,2b4e21cVico catalog entries removed (D-063),c694f78server FCM target infid(D-096),1e404ccPi image arm64 check (docs/spikes/pi-image-arm64.md),fd60170SPEC v0.14,f0575d3M8b UI fixes from the first phone test,09f474fFcmMessageBody.fidin:data(D-096 follow-up).- 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), SPEC v0.12 (cf8ef45, D-081 to D-085), M12e contract pass (1470a2f+90505a8, landed 2026-10-18; gates green: Android BUILD SUCCESSFUL, 710 actionable tasks, 906 tests; cargo 253 tests, OpenAPI equality, vectors and migration byte-identity green), SPEC v0.13 (03b7184, D-086 to D-095), Vico removal (2b4e21c), FCMfidtarget (c694f78, D-096), Pi image arm64 check (1e404cc: C stage, CA roots and an OAuth plus FCM call from the arm64 image confirmed on the Mac; running on the Pi stays M2c-pi's), SPEC v0.14 (fd60170, D-096), M8 on-phone test (2026-10-18, passed), M8b (f0575d3, D-097),FcmMessageBody.fid(09f474f). - M8 outcome (recorded in SPEC v0.12 as D-081 to D-085): both variants bind
:datathroughdi/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 inSessionRepositoryImpl.normaliseServerUrl, pinned-root config behindkvitt.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 andsync_batchtaps open Home, push in an expedited WorkManager job (D-085). - M8 end-to-end test (2026-10-18, dev server, owner's S26): pairing with the bootstrap code OK; a scripted partner joined through a second admin device paired with
kvitt-server pair-device(the CLI has no partner-invite subcommand: small ops request for a later server plan); Home showed the account; the offline expense showed the pending marker and synced after reconnect (pending 0, the server has the row); the owner's device registeredfcm_tokenandapp_version_name; a push byfidwas delivered and the notification tap worked. Still unverified on the phone: the status-bar fix (next install) and the design-spec §2.7 typeface check (the owner looked, no complaint). - M8b outcome (SPEC v0.15): invite-code field holds the raw code, hyphens as a
VisualTransformation(cursor bug fixed, unit test); quick-row selected badge drawn above the ripple clip;KvittTopAppBarpads for the status-bar inset (windowInsetsparameter),KvittScaffoldfollows; chart bars top 4, bottom 2 dp (D-097); 221 goldens re-recorded.FcmMessageBody.fidin:datafollowed (09f474f). - Owner answers 2026-10-18: "boende" keeps suggesting
travel(no change); the 128 px picture size is not needed; OQ-5 "no, hide the button" (implemented by M8c); the account page split bar stays as designed; M2c-pi becomes an owner-run bundle (D-100); the keystore lives at the repository root (D-101); the Gitea push waits for fewer goldens and a history rewrite, no LFS. - M12e outcome (recorded in SPEC v0.13 as D-086 to D-095): E-3
invite_kindandPairing, S-2 only after apartnerpairing (D-086); admin name in E-12 links via?from=, passed on by E-4, S-1 help line names the admin (D-087);SyncSummary.lastAttemptFailed(D-088);Rejection.actor(D-089);X-Kvitt-App-Version-Name, migration 0003, server schema 3, S-20 "Kvitt 1.1" (D-090);NewRecurringTemplate(D-091);UpdateCheck(D-092, revises D-073);SettleState.untouched(D-093, revises D-074); D-027 re-stamp in:data(D-094);PushEventin:core:model, six screen-hosted snackbar hosts, snackbar resource ids, adaptive vector launcher icon (D-095, revises D-071). 128 px picture size: the owner confirmed it is not needed (single 512 size, SPEC §14.2.4). - Compatibility: the M12e APK cannot pair or list devices against a pre-M12e server (DTOs without defaults, by design), so the server is rebuilt and redeployed before the new APK is installed (SPEC §14.8). Old phones on the new server work.
- In flight: M8c (goldens reduction, D-098, D-099: the licences button hidden), M8d (editor rows, D-102), M2c-pi bundle
infra/pi/(D-103 to D-106), a release-signing check,agent-docs-v015(this docs change: SPEC v0.15, D-097, D-100, D-101). - Remote:
originon Gitea exists and the SSH key works; the first push waits for the golden reduction (M8c) and a history rewrite (owner decision 2026-10-18: option "fewer goldens", no LFS). Push needs the owner's explicit ask. - Both gates exist: Android
tools/gradle-serial.sh check(fromandroid/), servercargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test(fromserver/). Both green onmainas far as reported. - The UX sprint branch
UX-sprintand its worktree~/orca/workspaces/kvitt/UX-sprintwere removed on 2026-10-18 (fully merged). - 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; rebuilt on 2026-10-18 with the M12e server and thefidtarget (a push byfidarrived in the M8 test), database at schema 3, data kept. Backupsinfra/dev/backups/kvitt-20261018T093143Z.sqlite.gz(before schema 2) andinfra/dev/backups/kvitt-20261018T130443Z.sqlite.gz(before schema 3) exist (git-ignored). On this Podman setupinfra/dev/up.shalone does not swap in a rebuilt image: runinfra/dev/up.sh --down, theninfra/dev/up.sh. The owner's phone paired with the bootstrap code on 2026-10-18; a scripted partner exists, joined through a second admin device paired withkvitt-server pair-device(tokens held by the orchestrator outside the repo). Firebase projectkvitt-1337with appsse.hagstedt.kvittandse.hagstedt.kvitt.debug; service accountkvitt-fcm;infra/secrets/fcm-service-account.jsonandinfra/secrets/google-services.jsonin the main checkout (git-ignored). - Installed on the owner's phone (SM-S942B): the debug app
se.hagstedt.kvitt.debug, paired against the dev server for the M8 test on 2026-10-18; the next install carries M8b and the M8c and M8d work.
2. Open work (one line each, with who owns it: agent or owner)
- Land
agent-docs-v015(orchestrator): SPEC v0.15, D-097, D-100, D-101, HANDOFF,prompts/README.md, design-spec §2.9 and §3.10. - Land M8c, M8d, the M2c-pi bundle and the release-signing check when they report (orchestrator), then a docs agent for v0.16 (D-098, D-099, D-102 to D-106).
- Install the next debug build and have the owner look (§3 item 1).
- First push to Gitea
originafter M8c and the history rewrite (orchestrator, on the owner's ask). - Ops request (no plan yet): a
kvitt-serversubcommand for a partner invite, so a scripted partner needs no second admin device. - Plans (SPEC §11.2 v0.15), in dependency order; prompt
prompts/<id>.md:- M1, M2a, M2b, M2c-dev, M3, M4, M5, M6, M6b, M7a to M7g, M8 (phone test passed), M8b, M9, M12a, M12b, M12c, M12d, M12e, U1, U2: landed.
- Now: M8c, M8d, M2c-pi bundle, release-signing check.
- Next: the owner runs the M2c-pi bundle on the Kvitt Pi, after the app is proven (D-100); M10 First release after M2c-pi (keystore per §10.6, D-101); 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)
- Look at the next install on the phone (yes/no each): the title bar sits below the status bar; the quick-row selected badge is whole; the invite-code field cursor stays after the last character; the expense editor rows (M8d).
- Keystore (D-101): add the four
kvitt.release.*lines toandroid/local.properties, or let the agent do it (in flight); keep a copy ofkvitt-release.jksand its password in the password manager. - Pi (D-100), after the app is proven: copy the
infra/pi/bundle to the Kvitt Pi, fill the placeholders in its.env, run the README checklist. - Look through the M6 component screenshots (
android/core/design/src/test/screenshots/); approved in advance, nothing blocks on it.
4. Owner questions (asked, unanswered)
- None. OQ-3 is answered by placeholders (D-100); OQ-5 answered (hide the button).
5. Paused (waiting on something outside the repo)
- Nothing.
6. Numbering
- Decisions: D-001 to D-097 used plus D-100 and D-101 (D-008 and D-009 unused; D-098, D-099 reserved by M8c, D-102 by M8d, D-103 to D-106 by M2c-pi). Next free: D-107.
- Spec version: v0.15 written; next v0.16 (taken by the M8c, M8d and M2c-pi outcomes).
- Server schema version 3 (migration 0003, landed with M12e); next 4. 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.