# coachpapa — changelog

Newest first. Every code change bumps `VERSION` and adds a line here; the
running version is visible at `/api/meta` and in the UI footer, which is how a
deploy is confirmed to have landed (coding.md).

## 0.6.1 — 2026-07-30

- Fix: the walkthrough's first step only ticked when the technician was
  *changed*, so anyone who already had a name selected could never complete it.
  It now reflects the actual state.

## 0.6.0 — 2026-07-30

- Demo walkthrough: a six-step checklist covering Mike's flow chart, which
  ticks a step only when the action actually happens (a transcript returns, a
  ticket is created, a part is recorded, a ticket closes, a CSV downloads).
  Not a click-through tour — finishing it means the loop was really exercised.
- Opens on first visit, then collapses to a slim bar so it never pushes the
  capture form off one phone screen. Dismissible, reopenable, resettable.
- Ends with a single closing question, deliberately narrow: "what is the ONE
  thing most wrong with it?"

## 0.5.1 — 2026-07-30

- Fix: switching technician did not update role-aware UI. `useActor` read
  localStorage during render, which is not reactive, so the planner controls
  and export buttons kept the previous person's permissions until a page
  reload. Actor identity now lives in a subscribable store consumed via
  `useSyncExternalStore`.

## 0.5.0 — 2026-07-30

- CSV exports reachable from the UI (planner only), fetched with the actor
  header and handed to the browser as a blob so authorisation still applies.
- Assignment and scheduling: new `tickets.scheduled_for` (migration 0003),
  planner controls, both recorded in the audit trail.
- Role-aware views — planners triage/schedule/assign, technicians work and
  close, per Mike's flow chart. Everyone still sees the full history.
- Parts picker shows quantity on hand and stock location.
- Asset auto-match from speech: deterministic token overlap against the seeded
  asset list, applied only as a pre-selection the technician can change.
- `scripts/seed_demo.py` generates a realistic ticket history; every generated
  ticket carries a `demo_seed` audit event so fabricated data is identifiable
  from inside the record.

## 0.4.0 — 2026-07-30

- Phone-first capture screen: the whole form fits one screen without
  scrolling. Record is now the hero action (new `xl` button size); the
  description is a compact tap-to-edit transcript card rather than a tall text
  box, with "or type it instead" as the fallback.
- Compact photo row, tighter masthead/tabs/footer, visually-hidden page title.

## 0.3.0 — 2026-07-30

- Voice memos: record in-app, transcribe to the description, keep the audio
  attached to the ticket. Gemini via a provider seam (`services/ai/`), so
  swapping model or vendor is a one-file change. Mirrors garden2's approach.
- Transcription failure is soft — the recording is attached and the report is
  saved regardless; only the auto-filled text is lost.
- `/api/transcribe/status` lets the UI hide the recorder when no provider is
  configured, instead of offering a button that fails when pressed.
- Ticket detail renders audio as an audio player rather than a broken image.
- Accept MediaRecorder MIME parameters (`audio/webm;codecs=opus`).

## 0.2.0 — 2026-07-30

- P1: spawn a follow-up ticket from a ticket being worked (flow chart step 5).
  The child records its parent, and the parent's audit trail names the child.

## 0.1.1 — 2026-07-30

- Repair mojibake in the seed extractor per character with a latin-1 fallback.
  The whole-string cp1252 encode raised on C1 codepoints (U+009D) and silently
  left 12 of 13 affected part numbers mangled. Caught by a fixture test.
- Harden the SPA catch-all with a containment check so nothing outside the
  build output can be served, whatever the request path claims.
- Configure ruff's `extend-immutable-calls` for FastAPI's `Depends`/`Query`
  idiom rather than leaving 26 false-positive B008s.

## 0.1.0 — 2026-07-30

- P0: capture to ticket. FastAPI + React 19 SPA + Postgres 17 sidecar,
  one container, Node only in the build stage.
- Permanent ticket numbering from a never-reset Postgres sequence; no delete
  route (void instead).
- Photo capture from the phone camera; media stored outside the web root and
  served only through an authorised route.
- Append-only `ticket_events` audit trail on every state change.
- Seeded with Mike's real data: 376 Britco assets, 462 parts.
- CSV exports for ticket status and item movement.
- `scripts/gate-p0.sh` asserts the P0 guarantees against the live deployment.
