- classify enrich sources: encyclopedia, platform pages (hongguo, kuaikaw, video
platforms), douban (search snippet only) and other sites' search snippets
(snippet mode, pages never opened); one extractor per source, fields carry
source kind and confidence, merged by noisy-OR across hosts
- new cast field (applied as MediaCredit with placeholder ids)
- robots.txt check (cached per host 1 day) and login-wall/captcha give-up
- per-enrichment source attempts + GET /identity/enrich-stats, 30-day hit-rate
table under settings -> metadata -> identity
- setting identity.enrichSnippetAllSites (default on); default domains add
baike.com and kuaikaw.cn
- replay fixtures from the real run on the 4 user-library short dramas
(sanitized Brave responses, hongguo page, robots.txt)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- adapters: overviewLanguages() limits overview/tagline chain to Chinese
variants (zh-CN→zh-SG→zh-TW→zh-HK); titles keep full chain; season
supplement fetch skips languages useless for overview
- setting metadata.overviewNonChineseFallback (default off) + UI switch
- media detail shows "暂无简介" for empty entity/episode overview
- scripts/overview-recompute.ts: recompute stored non-Chinese overviews
from kv_cache only (no TMDB requests), dry-run by default, --apply
- tests: chain unit tests, Heart Signal (103147) fixture, server
recompute test, MP differential for episode overview
- runbook + CHANGELOG
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Drop "site rate limit counted per process; cross-process token bucket in
progress on c2a": migration 0041 shipped the PG token bucket (61f585a).
- "原站视图是 1.5 秒截图轮询,没有在真实 camofox 上核验": desktop mode (WT-1)
exists and was verified on real camofox (v0.2.4 notes); keep only the
"HTTP failure does not fall back to the browser" part, still true.
- HHClub was checked against the real site in VER-3 / HH-2; keep 观众、馒头、CHD.
- Other entries re-checked against 11-requirements-coverage and code: still hold.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Waiting plans (approval / disk space / automation off / queued) are
active-segment rows on /download-tasks/board, merged by created_at,
counted, with approve / cancel actions; ?plan= deep links and legacy
/downloads/plans routes redirect to the panel
- Download detail shows "why this download" (source, purpose, replaced
version, reasons); raw evaluation in tech info
- Failed / cancelled / expired plans appear in the entity download
history; rejected / revoked / expired approvals close draft plans
- New GET /acquisition-plans/{id}/why, POST /acquisition-plans/{id}/cancel
- User-facing copy no longer says 下载计划; glossary updated
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Glossary: site types, acquisition modes, the 获取 group name
(ACQUIRE_GROUP_TITLE). Runbook sites.md, CHANGELOG [Unreleased], plan
status.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- GET /system/health splits processes into current instances (hosts with
a beat in the last 10 min, newest per host+kind, not stopped) and
retiredProcesses[]; 45s stale and level only consider current ones
- heartbeat writer marks stopped_at on graceful exit (migration 0043),
upsert clears it; pure api role now stops its writer on SIGTERM
- scheduled job system.heartbeat_cleanup (maintain, 1h) deletes rows
without a beat for 24h and samples older than 7 days
- status page: per-role alarms ("io worker 45 秒没有心跳"), collapsible
retired instances; glossary/runbook updated
- bump all members to 0.2.2, CHANGELOG [0.2.2]
Co-Authored-By: Claude Opus 5.5 <[email protected]>