# caddie — diary

> Session-by-session log: date, what changed, what was verified. Append-only,
> newest first. This is *state*, not summaries — no generated codebase
> overviews (v8 auto-generated-context law).

## 2026-09-02 — standards alignment: the pack, the panel, 04 §3–4 (0.3.3 → 0.4.1)

**Changed.** `packs/caddie-ui/` (new: the canonical pack, from easel's copy,
+ `ThreadStarter`, `decision`, `domId`/wash, `PACK_VERSION`, README
changelog) and `packs/stamp-caddie-ui.sh` (new); `main/frontend/src/
caddie-ui/` (stamped); `App.tsx` (pack shell, `useLoc` tracks query+hash,
`useWhoami`); `Bell.tsx` (pack adapter); `Discussion.tsx` (new: the panel);
`ProjectPage.tsx` (app row, rail, count chips, deep-link re-arm, Prose);
`ProjectList.tsx` (greeting); `Reference.tsx` (Prose); `caddieApi.ts`
(`apiError` both shapes, new calls); `styles.css` (old bell/comment CSS out,
shell bits in); `main.tsx` (pack CSS); deleted `md.tsx`, `StageComments.tsx`.
Backend: `models.py` (+resolved/resolved_by/resolved_at, edited_at,
deleted_at, notifications.resolved, subject_id 80), `alembic/versions/
0003_conversation_state.py`, `services/interaction.py` (rewritten: subjects,
discussion read, resolve/edit/delete/move, KINDS), `services/profile.py`
(new), `routers/caddie_routes.py` (discussion, project comments, resolve,
move, edit, delete, attachments on any subject, breadcrumbs), `routers/
app_routes.py` (whoami + name fields), `main.py` (shell no-cache),
`version.py` 0.4.1. Tests: `test_discussion.py`, `test_shell.py` new;
`test_interaction.py`, `test_m1_gate.py` updated. Docs: 01, 02, 04, 05, 06,
07 (new), brief, agents, v8-feedback, CHANGELOG.

**Verified.** 105 passed; tsc clean; pack check green; deploy 0.4.0 then
0.4.1 confirmed at `/api/meta`; alembic `0002 → 0003` in the container log;
one bundle pair in the image; `/` answers `cache-control: no-cache`;
security audit 0 new findings. UI verified by DOM inspection in Chrome (see
handoff) — the MCP tab was hidden, so no screenshots.

**Not verified.** Pixels. Phone width.

## 2026-08-24 — attachments, dictionary UI, reference UI, the M1 gate (0.2.1 → 0.3.1)

**Changed.** `app/services/attachments.py` (generalised from punchlist:
`subject_id`, not `item_id`) + two routes; `frontend/src/md.tsx` (a
markdown-lite renderer that whitelists caddie's own attachment URLs and never
touches innerHTML); paste + paperclip in `StageComments.tsx`;
`frontend/src/Reference.tsx` (dictionary picker + inline field editing +
reference section CRUD); `PUT`/`DELETE` on reference sections; `options` and
`types` plumbed through the API; `?stage=`/`#c-` deep-link handling in
`ProjectPage`/`StageComments`.

**Verified.** 94 tests pass, including `tests/test_m1_gate.py` walking the
whole gate. Deploy confirmed by version at `/api/meta` (0.3.1). Container
write access to the mounted `data/` confirmed by probe, so uploads survive a
redeploy.

**Not verified.** The browser. Chrome tooling was unreachable this session, so
every UI claim above rests on the type-check and the API tests, not on
looking at it. The dictionary picker and the comment-scroll highlight in
particular have had no visual pass.
