Works Registry - the studied media as a first-class object #127

Closed
opened 2026-07-15 20:35:37 +00:00 by claude-bot · 2 comments
Contributor

Feature idea (Fable ideation, rank #4) · Effort: M-L · Value: High

Pitch
A works table (music video / film / album: title, artist, release date, canonical URL) with an entry_works join, so entries can be about a work rather than just from a source.

Why it matters
The stated purpose is "themes across music videos" - yet the schema has no entity for a music video. entries.source/source_url records where the note came from (twitter/bluesky/web/manual), conflating provenance with subject. Without works she cannot ask the questions her research is literally about: "every observation on this video," "how does this motif evolve across this artist's videography in release order," "which videos does this motif appear in?"

How it fits
Migration adding works (project-scoped like categories in 040_categories.sql, same slug/soft-delete patterns) + entry_works; CRUD route following routes/categories.ts; bootstrap by clustering existing entries.source_url values. Timeline (GET /api/entries filter params) gains a work_id filter and can pivot to release date instead of created_at - genuine longitudinal analysis the current timeline can't do (it only knows when the note was written). Works render as sections in Markdown export (routes/export.ts) and on public motif pages.

Why it was likely missed
The data model grew out of importing posts (Phase 3): the unit was the tweet, so "source" meant the platform. The subject of the observation never got promoted from a URL string to an entity.

Acceptance criteria

  • Entries can be associated with one or more works; works are project-scoped and soft-deletable.
  • Timeline/analytics can group/filter by work and pivot on release date.
  • Works appear as sections in Markdown export and public motif rendering.

From the 2026-07-15 codebase audit - Fable feature-ideation pass. Companion report: docs/.internal/report-2026-07-15.md (gitignored).

**Feature idea** (Fable ideation, rank #4) · **Effort:** M-L · **Value:** High **Pitch** A `works` table (music video / film / album: title, artist, release date, canonical URL) with an `entry_works` join, so entries can be *about* a work rather than just *from* a source. **Why it matters** The stated purpose is "themes **across music videos**" - yet the schema has no entity for a music video. `entries.source`/`source_url` records where the *note* came from (twitter/bluesky/web/manual), conflating provenance with subject. Without works she cannot ask the questions her research is literally about: "every observation on *this* video," "how does this motif evolve across this artist's videography *in release order*," "which videos does this motif appear in?" **How it fits** Migration adding `works` (project-scoped like `categories` in `040_categories.sql`, same slug/soft-delete patterns) + `entry_works`; CRUD route following `routes/categories.ts`; bootstrap by clustering existing `entries.source_url` values. Timeline (`GET /api/entries` filter params) gains a `work_id` filter and can pivot to *release date* instead of `created_at` - genuine longitudinal analysis the current timeline can't do (it only knows when the note was written). Works render as sections in Markdown export (`routes/export.ts`) and on public motif pages. **Why it was likely missed** The data model grew out of importing posts (Phase 3): the unit was the tweet, so "source" meant the platform. The subject of the observation never got promoted from a URL string to an entity. **Acceptance criteria** - [ ] Entries can be associated with one or more works; works are project-scoped and soft-deletable. - [ ] Timeline/analytics can group/filter by work and pivot on release date. - [ ] Works appear as sections in Markdown export and public motif rendering. --- _From the 2026-07-15 codebase audit - Fable feature-ideation pass. Companion report: `docs/.internal/report-2026-07-15.md` (gitignored)._
Author
Contributor

Picking this up on feat/v10-works-registry (targeting v9.2.0), after v9.1.0 shipped the Evidence Ledger.

Core scope this pass:

  • Migration 054: works (project-scoped, soft-deletable: title, artist, release_date, canonical_url) + entry_works join, mirroring the categories/entry_categories patterns.
  • routes/works.ts: CRUD (list with entry counts, create, patch, soft-delete) + assign/unassign entries; work detail with its entries.
  • GET /api/entries?work_id= filter ("every observation on this video").
  • Frontend: Works management + assign-to-entry UI + the work filter.

Deferred as noted follow-ups (kept out of the first pass to keep it shippable): the release-date pivot on Timeline/analytics, works-as-sections in Markdown export + public motif pages, and the bootstrap-by-clustering source_url helper. Will note here when the core lands.

Picking this up on `feat/v10-works-registry` (targeting v9.2.0), after v9.1.0 shipped the Evidence Ledger. Core scope this pass: - Migration 054: `works` (project-scoped, soft-deletable: title, artist, release_date, canonical_url) + `entry_works` join, mirroring the `categories`/`entry_categories` patterns. - `routes/works.ts`: CRUD (list with entry counts, create, patch, soft-delete) + assign/unassign entries; work detail with its entries. - `GET /api/entries?work_id=` filter ("every observation on this video"). - Frontend: Works management + assign-to-entry UI + the work filter. Deferred as noted follow-ups (kept out of the first pass to keep it shippable): the **release-date pivot** on Timeline/analytics, works-as-sections in **Markdown export + public motif pages**, and the **bootstrap-by-clustering `source_url`** helper. Will note here when the core lands.
Author
Contributor

Done — shipped in v9.2.0 (PR #141, merge dad048a).

Delivered: migration 054 (works + entry_works, project-scoped + soft-deletable), routes/works.ts (CRUD + entry assign/unassign + detail), GET /api/entries?work_id= filter, works surfaced on entry detail; frontend Settings → Works management, inline assign on entry detail, work filter on Entries + Timeline. 6 new integration tests (works.test.ts).

Acceptance: entries↔works association, project-scoped + soft-deletable · Timeline/Entries filter by work. Deferred (not blocking close — captured for a follow-up): release-date pivot on Timeline/analytics, works-as-sections in Markdown export + public motif pages, and the source-URL clustering bootstrap. Worth a small follow-up issue if those stay wanted.

Done — shipped in **v9.2.0** (PR #141, merge `dad048a`). Delivered: migration 054 (`works` + `entry_works`, project-scoped + soft-deletable), `routes/works.ts` (CRUD + entry assign/unassign + detail), `GET /api/entries?work_id=` filter, works surfaced on entry detail; frontend Settings → Works management, inline assign on entry detail, work filter on Entries + Timeline. 6 new integration tests (`works.test.ts`). **Acceptance:** ✅ entries↔works association, project-scoped + soft-deletable · ✅ Timeline/Entries filter by work. **Deferred** (not blocking close — captured for a follow-up): release-date *pivot* on Timeline/analytics, works-as-sections in Markdown export + public motif pages, and the source-URL clustering bootstrap. Worth a small follow-up issue if those stay wanted.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/TeaLeaves#127
No description provided.