d9dd5848fe
- 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
5.0 KiB
5.0 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
mainatbd6f10a(M4) plus the SPEC v0.6 docs commit fromagent-spec6once it lands. History:5e1be38plans and prompts,c885abaM2c-dev,76ee957SPEC v0.3,fad6fc9M2b,fdf2093M2a,040bf41SPEC v0.4,503cee5M3,c28c52bM5,982451dSPEC v0.5,bd6f10aM4.- Landed: M0 spec, M1 contracts and vectors (
c6df2ab), M2a server skeleton andkvitt-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). Withagent-spec6: SPEC v0.6 with M4's D-035 to D-039. - Both gates exist: Android
tools/gradle-serial.sh check(fromandroid/), servercargo fmt --check && cargo clippy -- -D warnings && cargo test(fromserver/). - 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-sprinton branchUX-sprint; it commits only underdocs/ux/and rebases onmainbefore landing. U1 is committed onUX-sprintat210ab5c(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/healthfrom 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 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.debugbuilt frommainatc28c52b, as of 2026-10-18 (M2b'sinstallDebugcheck 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:dataagent): on the first sync attempt after aclock_skewrejection the phone re-stampsupdated_atof each such pending row to its current clock before pushing. Not in:dataatc28c52b. - Picture size (M6, if needed):
:dataalways fetches E-11 at 512; a size parameter for the 128 variant is a contract request on:core:modeland: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/onUX-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.