xiaoge_distill · 實作計劃

雙線 pipeline:影片線與教材線

排序刻意按「你最可能修改的部分」在前:數據模型 → 類型接口 → 面向用戶內容。技術重構放最後、細節授權執行者。文末只有一個待決問題。

依據 2026-08-02 雙來源設計文件 狀態 待 PM 審閱 開放問題 1 個(架構級)
1

數據模型變更最可能修改

manifest、規則卡 provenance、目錄佈局

1.1 影片 manifest:加 series 欄位

單支影片入口會混入不同系列(【兆華艾綸說】已是實例)。新增單支時 --series 必填;掃播放清單自動填「哥有籌必爆」;既有 39 集一次性回填。不影響狀態機。

data/xiaoge/manifest.json
"p_Wi2Ma8Wlg": {
  "series": "兆華艾綸說",   // ★ 新增
  "title": "…", "status": "extracted", …
}

1.2 教材 manifest:獨立檔案,以「小節」為工作單位

與影片 manifest 分離:工作單位不同(小節 vs 集)、失敗語意不同、鎖競爭隔離。安裝教學頁(p3–p7)建清單時直接不收錄(已拍板)。sha256 供教材改版偵測。

data/xiaoge/doc_manifest.json(新檔)
{ "docs": { "關鍵籌碼入門.pdf": {
    "sha256": "…", "pages": 75,
    "sections": { "4-2": {
      "title": "判斷買進訊號:盤中出量個股",
      "page_start": 63, "page_end": 64,
      "status": "pending",   // pending → extracted
      "rule_cards": null, "extract_retry_count": 0 } } } } }

1.3 規則卡 provenance:雙來源 schema

影片卡加 source:"video" 與 series(既有 653 張回填)。教材卡的「時間軸」是頁碼;幻覺防線改為頁碼落在小節範圍內+頁面圖確實存在。其餘欄位兩線完全一致——這是階段 3 合併的基礎。

教材卡 provenance(新形態)
"provenance": {
  "source": "doc",
  "doc": "關鍵籌碼入門.pdf", "section": "4-2",
  "page": 63,                // 取代 timestamp
  "page_image": "data/xiaoge/doc_pages/關鍵籌碼入門/p063.png",
  "quote": "…",
  "quote_verified": false   // 誠實標示:無逐字稿可比對
}

1.4 目錄佈局

路徑用途版控
doc_manifest.json教材線狀態正本進
doc_pages/<教材>/pNNN.png渲染圖(約 61MB)gitignore(比照 frames/)
doc_rule_cards/<教材>__<小節>.json教材規則卡進
doc_notes/教材線獨立手冊(階段 3 前不合併)進
2

新的類型接口

函式簽名與 CLI——教材線比照影片線「一階段一腳本」

新增/變更的接口總覽
# 影片線:單支影片入口
# build_manifest.py --video URL --series 兆華艾綸說
def add_single_video(url: str, series: str) -> str   # 回傳 video_id

# 教材線四支新腳本
build_doc_manifest.parse_sections(pdf) -> list[Section]   # 解析 N-N. 標題
render_doc_pages.render_pages(pdf, out_dir, dpi=150) -> int
render_doc_pages.pages_complete(out_dir, expected) -> bool  # 存在且非 0 byte
extract_doc_rules.extract_for_section(section, text, images, catalog, fn)
extract_doc_rules.validate_doc_card(card, section) -> bool  # 頁碼範圍護欄
consolidate_doc_notes   # 沿用 merge/sort/render,讀寫教材線目錄

# llm_config:視覺呼叫(同一把金鑰、同一個每日 100 次額度)
def gemini_complete_vision(prompt: str, image_paths: list[Path]) -> str
3

面向用戶的內容

skill 指令、回報格式、手冊出處樣式(名稱依 PM 原話)

/YT影片線-pipeline

指令行為
/YT影片線-pipeline掃播放清單補新集數 → 五階段 → 固定格式回報
/YT影片線-pipeline <URL>新增單支(詢問系列名)→ 五階段 → 回報
/YT影片線-pipeline --status唯讀進度,不執行

金鑰偵測:GROQ_API_KEY 缺 → 只起地端 worker(不報錯中止);GOOGLE_API_KEY 缺 → 停在編織完成、明示萃取待金鑰。回報結尾固定附內容層複驗(空殼 0、空卡 0)。

/教材線-pipeline

指令行為
/教材線-pipelinedocs/教材/ 全部 PDF → 建清單 → 渲染 → 萃取 → 彙整
/教材線-pipeline <PDF>單一教材
/教材線-pipeline --status唯讀進度

額度預算:全量約 28 次呼叫(入門 ~15 小節+進階 ~13 小節),一天 100 次上限內完成。

教材手冊的出處樣式

doc_notes/*.md(示意)
### 判斷買進訊號:盤中出量個股
- 條件:週轉率高且連量放大、均價乖離% 為正…
- 出處:📄 關鍵籌碼入門 §4-2 p.63([頁面圖](../doc_pages/…/p063.png))
  ⚠ 引文未經機器驗證(教材線無逐字稿可比對),點頁面圖人工核對
4

技術重構授權執行者

只列要點,細節不佔用審閱時間

要點

實作順序:影片線 skill(改動小)→ 教材線 build+render(無 LLM、可完整測試)→ 教材線 extract+consolidate → 兩個 skill 檔。每步 TDD+守衛反向驗證。
共用邏輯不預先抽象:教材線先直接 import 影片線的 has_stock_reference/CATEGORIES,重複真的痛了再抽共用模組。
單點失敗檢查:教材線每個新迴圈過一遍「單一小節失敗會不會連坐整批」;DailyQuotaExceeded 必須攔在逐節容錯之前(影片線教訓)。
順帶收尾:lint_generated.py 詞彙表調整為本專案用語;渲染圖 gitignore。

已決事項(2026-08-03 PM 拍板)

教材線萃取的 prompt 餵入影片線既有的 rule_id 目錄(選項 A)。

定案內容:教材卡自然對齊影片卡命名,階段 3 合併幾乎免費。prompt 中明示「目錄僅供命名對齊,未涵蓋的概念應自創 rule_id」以緩解壓抑教材獨有規則的風險。依據:跨系列對齊已有實證——【兆華艾綸說】的地板股規則自動與主系列 4 集合併、提及升至 5。