root and Claude Fable 5.1
7ba712ea55
feat(domain): pure business logic for parsing, identity, slots, acquisition, paths, organize, download state (W1-2)
...
- release-parser: title/file/dir parsing with MP parity + deviations (airDate/issue,
cut, release group suffix fallback, dir+file merge, safe episode offset)
- identity: title normalization (NFKC, trad->simp map, season suffix) and
evidence-level candidate ranking (year tolerance ±1, no probabilities)
- slot: hard/soft/upgrade evaluation (missing vs unmet fields), state machine,
movie/unit completion (season pack must be covered by actual file list)
- acquisition: new_title/catch_up/upgrade modes, priority order, budget,
cache volume hard threshold with resume watermark (no double counting)
- path: immutable path bindings, restricted naming templates, sanitize,
conflict detection, downloader<->host path mapping
- organize: planOrganize with sidecar pairing, sample exclusion, existing
target policy, crossDevice marking, H&R -> conflict for move
- download-state: qB state mapping, completion, no-progress evidence
230 tests, ~97% statement coverage.
Co-Authored-By: Claude Fable 5.1 <[email protected] >
2026-09-27 18:11:29 +08:00
root and Claude Fable 5.1
a6d049db81
feat(adapters): RSS and PT site adapters ported from MoviePilot v3 + mocks (W1-3b)
...
- rss: port of MP RssHelper._parse_impl/get_rss_link semantics with safe
XML (entities off, DTD/ENTITY rejected, size/item caps), ETag/Last-Modified,
backoff + Retry-After, circuit breaker with manual reset, passkey redaction,
overlap-window GUID+digest dedupe
- sites/spider: TS port of MP SiteSpider (indexer schema, search URL builder,
field DSL, filters, Jinja templates via nunjucks, login-page detection);
audiences definition hand-written as JSON; raw category id preserved;
shared per-site token bucket
- sites/mteam: port of MP MTorrentSpider (params, result mapping, promo
factors, genDlToken flow) without embedding the API key in enclosures;
business code/message checks
- testkit: mock RSS server, mock NexusPHP site, mock M-Team API
- docs: W1-3b migration mapping appended to porting ledger
Co-Authored-By: Claude Fable 5.1 <[email protected] >
2026-09-27 18:10:34 +08:00
root and Claude Fable 5.1
ef2e504a94
feat(adapters): qBittorrent, filesystem, TMDB and Emby adapters with testkit mocks (W1-3a)
...
- qbittorrent: WebUI API v2 client (cookie/API-key auth, add/info/files/filePrio,
pause/resume with 5.x stop/start fallback, tags, delete with explicit deleteFiles,
maindata), error classes, idempotent submit with local infohash (own bencode)
and post-timeout hash/probe-tag lookup; state mapping per MoviePilot
- fs: copyWithVerify (tmp + fsync + size/sha256/sample + no-clobber commit),
moveSafe (EXDEV surfaced), resumable crossDeviceMove, statSafe/checkRoot with
root sentinel, budgeted incremental scan with cursor, ffprobe, statfs usage
- tmdb: multi-language search/details/seasons, LRU+TTL cache with coalescing,
rate-limit backoff, MoviePilot match chain (name normalization, year +-1)
- emby: Emby/Jellyfin items/seasons/episodes/MediaSources, failures -> unknown
- testkit: mock qB / TMDB / Emby servers, torrent builder, temp-tree fixtures
- docs: W1-3a porting table appended to downloader-and-sites ledger
Co-Authored-By: Claude Fable 5.1 <[email protected] >
2026-09-27 18:07:48 +08:00
root and Claude Fable 5.1
9c881e737f
feat(agent): capability registry, Pi AgentRuntimePort, fake model provider and redaction guard (W1-5)
...
- CapabilityRegistry: descriptor(id/version/schema/scope/risk/idempotent/preview/replay),
invoke = scope limit -> input schema -> server-side authorize -> idempotency key -> handler
-> output schema -> audit; capability id <-> tool name mapping (download.submit <-> download__submit)
- PiAgentRuntime (pi-agent-core AgentHarness 0.87.1): whitelist tools + before_tool re-check,
redacted event stream, JSONL session at sessionDir/<runId>.jsonl, resume/abort/compact,
tool-call/duration/token/cost budgets -> abort + run_failed(budget)
- AgentSettings -> pi-ai createProvider (anthropic / openai-compatible), compaction mapping
- FakeModelProvider + createFakeRuntime (scripted, transcript-derived, survives crash/resume)
- buildSystemPrompt, redactForModel; 27 tests incl. SIGKILL + resume
Co-Authored-By: Claude Fable 5.1 <[email protected] >
2026-09-27 17:55:28 +08:00
root and Claude Fable 5.1
1262340856
feat(tasks): OpenWorkflow-backed TaskEngine, task registry, outbox relay and op-ledger fencing (W1-4)
...
- TaskEngine port + OpenWorkflowEngine ([email protected] .1, schema openworkflow):
enqueue/signal/cancel/get/list/startWorker/stop
- defineTask registry with zod input schema; 9 stub task definitions (§3.1-8)
- TaskContext: step.run/sleep/waitForFact, redacting logger, traceId,
attemptToken, abortSignal driven by PG cancel flag
- signal persists fact to tasks_fact first; waitForFact checks DB before waiting
- OutboxRelay: FOR UPDATE SKIP LOCKED, idempotencyKey outbox:<id>
- withAttemptToken fencing on tasks_op_ledger (own migration, merged in W2)
- tests: kill -9 crash recovery (child worker), cancel, idempotency,
concurrent relays, early fact, lease-loss fencing
Co-Authored-By: Claude Fable 5.1 <[email protected] >
2026-09-27 17:51:21 +08:00
root and Claude Fable 5.1
ec023a8405
docs(spikes): OpenWorkflow and Pi SDK compatibility spikes + ADR-002/003 (W0-B)
...
Co-Authored-By: Claude Fable 5.1 <[email protected] >
2026-09-27 17:39:35 +08:00
root and Claude Fable 5.1
8b90d396b2
docs(porting): MoviePilot/MovieClaw porting ledger (W0-C)
...
Co-Authored-By: Claude Fable 5.1 <[email protected] >
2026-09-27 17:37:14 +08:00
umt and Claude Fable 5.1
b22c440139
chore: scaffold monorepo and migrate uhd_web design system (W0-A)
...
- pnpm workspace: apps/{web,server}, packages/{contracts,db,domain,adapters,tasks,agent,testkit}
- server: Hono + zod-openapi, API Key auth with scopes, redacting pino logger, SSE event bus with replay, worker heartbeat
- db: Kysely + pg, file migrator, 0001_init (settings/api_key/audit_event/outbox_event)
- web: React Router 7 SPA console shell with 12 workspace placeholders, uhd_web tokens/ui/guard scripts
- docs: ADR-001 (Node over Deno), dev runbook, design system rules
Co-Authored-By: Claude Fable 5.1 <[email protected] >
2026-09-27 17:36:26 +08:00