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>
17 lines
2.4 KiB
Markdown
17 lines
2.4 KiB
Markdown
# Task 9 report
|
|
Status: DONE_WITH_CONCERNS. Branch task/9: 207c92b (merge task/8, docs conflicts kept both sides), 166b8ec feat(core): jobs, scheduler, plugin registry, connections.
|
|
|
|
Built: jobs.ts (enqueue with lockKey + pg advisory lock, atomic claim, worker w/ backoff 2^attempts min, 5 attempts, scheduler with tickNow()), registry.ts (loadPlugins, reload with ?v=), connections.ts (CRUD, secret split into credentials_enc, makePluginContext, syncHandler). SDK `rateLimit` field; rateLimit set on trakt 100, hardcover 50, mangabaka 150, lastfm 240, listenbrainz 60; RATE_PER_MINUTE constants removed. Echo + broken fixtures. Docs: ARCHITECTURE, DECISIONS, TODO.
|
|
|
|
Tests: tests 13 pass on SQLite, 24 on SQLite+Postgres (new files); full suite 395 pass with Postgres, 255 SQLite only. `bun run typecheck` clean.
|
|
TDD caveat: implementation was written before the tests were run, so no RED output was captured.
|
|
|
|
Deviations: createConnection/updateConnection take manifest as trailing arg; makePluginContext is async and takes manifest (then optional http). syncHandler rethrows failed runs so the worker retries. ctx.log is a no-op (TODO). Stale `running` job reaper not built (TODO). Worktree had no node_modules; ran bun install --frozen-lockfile.
|
|
|
|
## Fix round 1
|
|
All findings addressed: scheduler picks non-paused connections; syncHandler drops missing/paused connections (DropJobError) and records failed run + connection error + NonRetryableError for missing plugin/CryptoError; runJob bookkeeping wrapped and logged, stop() never rejects, hourly stale-lock reaper each tick; reload test for edited entry file (needed `delete require.cache[file]` in addition to `?v=`, since Bun ignores the query for cached .ts); ctx.log persisted to source_runs.log after the run; credentials.save/updateConnection in one transaction; signal aborted on worker stop and threaded to context; rate-limit wiring test; mangabaka orphan comment removed; docs updated. Tests added for each.
|
|
Merged feat/phase1 (839d969), docs conflicts resolved keeping both sides. Results after merge: typecheck clean; `bun test` 275 pass (SQLite); with TEST_POSTGRES_URL 434 pass, 0 fail.
|
|
|
|
## Fix round 2
|
|
reapStale now skips this worker's in-flight job ids and takes `staleMs` (option, default 1h); a heartbeat (`heartbeatMs`, default 5 min) refreshes `locked_at` while a job runs; a job aborted by stop() is re-queued with attempts and run_at untouched. Tests: slow job runs once, heartbeat refresh, abort re-queue.
|