feat(core,server): log feed, titles on changes, work titles on copies

GET log (engagements and listens, keyset over at/kind/id), listChanges
title and intoTitle, listCopies workTitle, all via batched lookups.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Lucas Winther
2026-10-30 22:11:53 +01:00
co-authored by Claude Opus 5.5
parent 5fa59310f3
commit c2e8c83f86
12 changed files with 561 additions and 7 deletions
+16
View File
@@ -4,6 +4,22 @@ Append-only. Never edit or delete an entry. Supersede it with a new one that lin
One entry per decision a future maintainer would otherwise have to reverse-engineer.
No index: `grep -n '^## ' docs/DECISIONS.md` lists every entry (date, title, line number).
## 2026-10-30: Log feed, titles on Changes, work titles on copies (Task 18 API additions)
**Status:** accepted
**Context:** Task 18's Log and Changes screens had nothing to read from (controller ruling).
**Decision:**
- **`GET log?cursor=&limit=`** (any:read) → `{ items, nextCursor }` from `packages/core/src/log.ts` `listLog`: the user's
live engagements on live entries plus their listens, newest first. Each item's `at` is a listen's `listened_at`, or an
engagement's finish date, else start date, else `created_at`. Partial dates sort as strings, never through `Date`.
Keyset cursor over (`at`, `kind`, `id`) all descending, base64url JSON; default 50, max 200. Two queries (one per
kind, each `limit + 1` past the cursor) are merged in code, so no dialect-specific UNION is needed.
- **`listChanges` items carry `title`** (an entry's title with the user's override; an engagement resolves to its entry; a
list to its name; null when gone) **and, on merged events, `intoTitle`**: the title of the entry that the same
connection's `intoKey` record maps to, else null. Titles come from a fixed number of batched queries
(`packages/core/src/titles.ts`), not one per event.
- **`listCopies` items carry `workTitle`** (override-aware, null while unmatched) so Owned needs no per-row work lookups.
The export bundle is unchanged.
## 2026-10-30: Web app (Task 17): preferences, first run, optimistic edits, AA on orange, self-hosted fonts
**Status:** accepted
**Context:** Task 17 and its fix round 1 (controller rulings).