Captures the owner's requirements and decisions from the planning conversation, current branch/worktree state, open tasks 17-19, pending owner decisions and the controller's rulings so a new agent can resume. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
24 lines
2.1 KiB
Markdown
24 lines
2.1 KiB
Markdown
# Task 10 report: Trakt plugin
|
|
|
|
Branch task/10. Built plugins/trakt: index.ts (manifest, deviceAuth, lookup), src/api.ts (headers, token refresh, paged GET),
|
|
src/map.ts (Trakt item -> WorkHint/SourceRecord), src/sync.ts (pull, pullChanges), test/trakt.test.ts, 10 hand-written fixtures.
|
|
|
|
Tests: `bun test plugins/trakt` -> 15 pass, 0 fail. `bun run typecheck` clean.
|
|
TDD caveat: I wrote implementation and tests in the same pass, so there is no recorded RED run. One test failed first
|
|
(a test-harness mistake: an async fixture route), fixed in the test only.
|
|
|
|
Decisions
|
|
- Season/episode hints carry empty externalIds (numeric namespaces tvdb/tmdb/imdb/trakt are shared with shows/movies); matched by parent chain + position.
|
|
- Brief's `trakt` id namespace is shared across movie/show; collisions across types are possible in core's unique (namespace,value). Flag for matching.
|
|
- RATE_PER_MINUTE=100 exported from src/api.ts; the plugin uses ctx.http, so the host must build the client with it (SDK has no per-plugin hook).
|
|
- pullChanges cursor = JSON {history, ratings, watchlist, lists} (max timestamps). Added lists re-fetch on lists.updated_at (brief only named history/ratings/watchlist). No/invalid cursor -> full pull. Cursor set only if it changed.
|
|
- Refresh window: expiresAt within 24h or unparsable -> refresh; expiresAt = created_at+expires_in (ISO). Credentials saved before returning.
|
|
- deviceAuth.poll: HTTP 400/429 -> "pending"; other statuses throw HttpError.
|
|
- Commit trailer uses "Claude Sonnet 5.5" per the session attribution reminder, not the "Opus 5.5" in common-implementer.md.
|
|
|
|
## Fix round 1
|
|
- Namespaces now type-specific: movie trakt_movie/tmdb_movie/imdb; show trakt_show/tmdb_show/tvdb_show/imdb;
|
|
season trakt_season/tmdb_season (when season ids present; episode-parent seasons have none); episode trakt_episode/tvdb_episode/tmdb_episode/imdb.
|
|
- Removed the comment justifying omitted season/episode ids. Tests updated; added episode-id assertion and failed-refresh test (400 -> no saved creds, no /sync call).
|
|
- 16 tests pass, typecheck clean. This supersedes the earlier "empty externalIds" concern.
|