Files
STTracker/docs/TODO.md
T
Lucas WintherandClaude Opus 5.5 1975e971f9 feat(core): sync engine and changes inbox
runSync snapshots and diffs source records, applies new records and
never-edited fields, files pending changed/conflict/removed/merged
events, de-duplicates plays across sources and ingests listens.
listChanges/resolveChange drive the Changes inbox.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 20:26:03 +01:00

2.9 KiB

TODO

Durable backlog. Agents append here instead of leaving TODO comments in source. Small, specific, independently actionable. Remove only when actually done.

Now

  • Choose a linter/formatter (e.g. Biome), then add lint to package.json, AGENTS.md and docs/PERMISSIONS.md.
  • Add CI on Gitea Actions: install, typecheck, and test on SQLite and Postgres. Add a guard that fails if AGENTS.md is over 150 lines.

Next

  • Phase 2 and Phase 3 plans (spec §12).
  • Generate image thumbnails for attachments (Phase 1 sizes images with CSS).

Someday

Recurring

  • Maintain AGENTS.md:
    • Add a rule only in response to a real failure. When an agent repeatedly gets something wrong, that is a gap; add one line, ideally with a code example. Do not pre-empt hypothetical mistakes.
    • Update in the same PR as the convention change. A stale rules file is worse than none, because it actively misleads.
    • Prune quarterly. Delete rules whose convention has changed or whose mistake no longer occurs.
    • Optional, cheap validation: run the same task twice in clean sessions, with and without the file, and compare steps and token use.

Known issues

  • Sync: list records are snapshotted but not applied to lists (Trakt/Hardcover emit them). Decide the mapping (one list per record, items by matched work) and apply it through the change engine.
  • Sync: accepting a removed event on an engagement de-duplicated across sources soft-deletes it even if another connection still reports it; consider detaching that connection's engagement_sources row instead.
  • Sync: pending changed/conflict events for a value the source has since moved past stay pending; consider superseding them when a newer value for the same field arrives.
  • Sync: two concurrent runs of the same connection can both insert a new source_records row for one key (one fails on the unique key and is logged as a record error). The job worker should lock per connection.
  • Sync: ingestListens does one lookup and one insert per listen; batch it for large backfills.
  • Admin merge does not merge colliding children recursively; colliding children stay under the tombstoned parent.
  • Matching: a shared parent resolved without external IDs or position (title/year reuse in packages/core/src/matching.ts) has no unique key, so concurrent matches can create it twice.
  • Library search (q) and the title sort use the work's title, not the user's overrides.title (overrides are a JSON text column). The tag filter matches the JSON text with LIKE.
  • Library hierarchy rollup and orphan detection look three levels deep; deeper trees are not rolled up.
  • Undoing a per-user move does not move copies or list items back, nor restore aliases that the move re-pointed.
  • bun run typecheck fails with TS18003 until source files exist under apps/, packages/ or plugins/.