Works Registry - the studied media as a first-class object #127
Labels
No labels
bug
duplicate
enhancement
future
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
rbrooks/TeaLeaves#127
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Feature idea (Fable ideation, rank #4) · Effort: M-L · Value: High
Pitch
A
workstable (music video / film / album: title, artist, release date, canonical URL) with anentry_worksjoin, 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_urlrecords 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 likecategoriesin040_categories.sql, same slug/soft-delete patterns) +entry_works; CRUD route followingroutes/categories.ts; bootstrap by clustering existingentries.source_urlvalues. Timeline (GET /api/entriesfilter params) gains awork_idfilter and can pivot to release date instead ofcreated_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
From the 2026-07-15 codebase audit - Fable feature-ideation pass. Companion report:
docs/.internal/report-2026-07-15.md(gitignored).Picking this up on
feat/v10-works-registry(targeting v9.2.0), after v9.1.0 shipped the Evidence Ledger.Core scope this pass:
works(project-scoped, soft-deletable: title, artist, release_date, canonical_url) +entry_worksjoin, mirroring thecategories/entry_categoriespatterns.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").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_urlhelper. Will note here when the core lands.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.