Skip to content

Latest commit

 

History

History
2493 lines (1713 loc) · 225 KB

File metadata and controls

2493 lines (1713 loc) · 225 KB
title REWRITE-PIPELINE
description 文章改寫主流程 canonical — 6 stage 線性 (Stage 0 觀點 + 1-5 取材/寫/驗/形/連) / 模式判定在 Stage 0 內部分支 / Step N.M 編號 / heading 階層 H1-H4 / 翻譯收斂為 pointer 到巴別塔 (v6.0)
type pipeline-canonical
status canonical
current_version v7.9
last_updated 2026-07-06
last_session 2026-07-05-220917-INDIGO-REWRITE
plugin_check python3 scripts/tools/article-health.py {file} --profile=rewrite-stage-4
sister_docs
EVOLVE-PIPELINE.md
FACTCHECK-PIPELINE.md
TRANSLATION-PIPELINE.md
SQUEEZE-MODELS-MAX-PIPELINE.md
PEER-INGESTION-PIPELINE.md
MEMORY-PIPELINE.md
DIARY-PIPELINE.md
upstream_canonical
../semiont/MANIFESTO.md
../semiont/DNA.md
../editorial/EDITORIAL.md

REWRITE-PIPELINE.md — 文章改寫主流程 v7.0

第一性原理:所有文章都走同一條 6-stage pipeline,每篇都跑過。模式判定 + 編輯前思考收斂在 Stage 0 觀點(Step 0.1-0.6),Stage 1 變純取材,Stage 2-5 完全 mode-agnostic。

翻譯不在本 pipeline scope — 本 pipeline 100% 預算給中文版產出。多語版本由獨立的巴別塔 pipeline 負責。

v6.0 新增 Stage 0 觀點(2026-05-11 admiring-montalcini):在搜尋之前先以總編輯視角想清楚「對台灣人是什麼樣的記憶 / 多元面貌 / 想法感受 / 歷史脈絡 / 社會關聯 / 類型專屬問題」六個核心問題,產出 §觀點成型 落 research report。原 Stage 1 模式判定 + 萃取舊素材 + 載入方法論(Step 1.1-1.5)移到 Stage 0,原 Stage 1 Step 1.6-1.14 重編為 1.1-1.9。翻轉 AI 寫作標準失敗模式:從「搜尋發現事實 → 補丁觀點」變「先想觀點 → 帶問題去搜尋」。觸發:哲宇 2026-05-11 callout「重點在溫度 / 人味 / 故事 / 策展 / 觀點 / 體驗 / 與社會歷史環境跟我們人生的關聯」。

v5.0 設計理由:reports/rewrite-pipeline-v5-stage-spine-design-2026-05-11.md


🗺️ ASCII spine

╭──────────────────────────────────────────────────────────────────────────╮
│              REWRITE-PIPELINE 6 階段 — 每篇都跑同一條                    │
│                                                                          │
│   Stage 0: 觀點 ─→ 6 steps(編輯前思考 + 模式判定)⭐ v6.0 新增          │
│            ├── Step 0.1 模式識別 [Fresh/Evolution/Merge/Boundary]        │
│            ├── Step 0.2 既有素材萃取(EVOLVE only)                       │
│            ├── Step 0.3 選 canonical(Merge variant only)                │
│            ├── Step 0.4 範圍切片表(Boundary variant only)               │
│            ├── Step 0.5 載入研究方法論 + 模板                             │
│            └── Step 0.6 觀點成型 🎬 (HARD GATE)                          │
│              ↳ Hard gate: §觀點成型落檔 + viewpoint_formed: true         │
│                                                                          │
│   Stage 1: 取材 ─→ 9 steps(純搜尋,帶 Stage 0 問題去驗證)              │
│            ├── Step 1.1 搜尋深度 ≥ 80                                    │
│            ├── Step 1.2 結尾素材鎖定                                      │
│            ├── Step 1.3 重複偵測                                          │
│            ├── Step 1.4 找矛盾鎖定(收斂 Stage 0.6 核心矛盾候選)         │
│            ├── Step 1.5 問觀察者要一手素材                                │
│            ├── Step 1.6 私有 SSOT 觀察者拍板(條件式)                    │
│            ├── Step 1.7 研究報告必存                                      │
│            ├── Step 1.8 Spawn agent 選型                                  │
│            └── Step 1.9 媒體素材研究 🎬 (HARD GATE)                      │
│              ↳ Hard gate: 報告落檔 / 媒體三表                            │
│                                                                          │
│   Stage 2: 寫 ──→ 8 steps                                                │
│            ├── Step 2.1-2.6 結尾先行 → 開場 → 小標題 → 正文 → 延伸      │
│            ├── Step 2.7 7 條自檢(含 Title 三明治 🥪 + 媒體 spine 🎬)  │
│            └── Step 2.8 富文本 + footnote 密度                           │
│              ↳ Hard gate: 10 條                                          │
│                                                                          │
│   Stage 3: 驗 ──→ 6 steps(3.1-3.5 草稿驗 + 3.6 成品總驗)⭐ v7.0       │
│            ├── Step 3.1-3.4 塑膠 / 鐵三角 / FACTCHECK / story atom       │
│            │     └── Step 3.3 跑 rewrite-stage-3-5 profile gate(plugin 以 --list-checks 為準)│
│            │         (footnote-format + footnote-density,v6.1 新增)     │
│            ├── Step 3.5 Title+desc spine sync re-check 🥪                │
│            └── Step 3.6 成品總驗三關 🔍(原子重驗 fan-out + 順稿 +      │
│                視覺同步)— A 級/大眾文/勘誤後 HARD                       │
│              ↳ Hard gate: 0 dead-link / footnote canonical / 成品三關    │
│                                                                          │
│   Stage 4: 形 ──→ 3 steps(含 6 個媒體子點)                             │
│            ├── Step 4.1 article-health 7 維度                            │
│            ├── Step 4.2 多語 visual smoke                                │
│            └── Step 4.3 媒體插入(6 sub-step)                           │
│              ↳ Hard gate: hard=0 / image-health pass                     │
│                                                                          │
│   Stage 5: 連 ──→ 4 steps                                                │
│            ├── Step 5.1-5.3 掃描 / 雙向 / Sibling 預檢                   │
│            └── Step 5.4 (Merge variant only) Astro redirect 5 lang       │
│              ↳ Hard gate: format-structure / build verify                │
│                                                                          │
│   ✅ Article shipped (zh-TW canonical)                                   │
│                                                                          │
│   ──── 翻譯(跨 pipeline boundary,主權的巴別塔)────                    │
│   → SQUEEZE-MODELS-MAX-PIPELINE.md(多語 batch sync 主流程)             │
│   → TRANSLATION-PIPELINE.md(單篇翻譯)                                  │
╰──────────────────────────────────────────────────────────────────────────╯

為什麼 Pipeline 存在

診斷(實戰觀察)

  1. Token 耗盡 → 後半段變草稿
  2. 沒有中間 checkpoint → 品質無聲下滑
  3. 結尾最後寫 → 精力不夠,結尾變罐頭(峰終定律)
  4. 富文本被遺忘 → EDITORIAL 規範到後面沒人記得
  5. 模式混淆 → 不同切入方式應該是同一條 pipeline 的不同 entry point,不該被當成獨立 pipeline
  6. 觀點補丁化(v6.0 新增)→ 搜尋發現事實 → 再臨時想觀點 → 編年體 / 密度失衡 / 結尾罐頭

解法:六階段分離 + Stage 0 編輯前思考 + 結尾先行 + 後半段品質鎖 + Stage 2-5 統一不分模式。翻譯獨立到巴別塔 pipeline。


🚦 Hard Gate Inventory(一張表 audit 全 pipeline)

Gate 觸發 stage 條件 工具 不過 = ?
§觀點成型落檔 Stage 0 終 depth article research-report-health.py {report} --stage 0(v7.7 兩件套:觀點成型 + viewpoint_formed + 六核心結構 ≥4/6 + 搜尋日誌 + ≥10 來源 proxy;persona v7.7 移到研究後 Step 1.9.7,Stage 0 不要求)。缺 ≥20 探索 → ~0 來源 = FAIL 不進 Stage 1
persona 讀者缺口稽核 🫂 Stage 1 終 depth article Step 1.9.7:20 persona 對研究報告補洞 + 增補 + 反向閥門;增補後重跑 research-report-health 不進 Stage 2(漏讀者視角)
核心矛盾鎖 Stage 1 終 所有 depth research report frontmatter manual 不進 Stage 2
研究報告落檔 Stage 1 終 depth ≥ 2000 字 manual ls + frontmatter researchReport 不進 Stage 2
分部報告收件 gate 📨 Stage 1 中 每個研究 agent 回報、收到當下 agent-report-health.py {file} --claimed {配額}(v7.8 儀器化 Step 1.8-bis 步 2:存放位置 repo 內 / 體積 ≥8KB / 逐條軌跡 section + ≥10 行 / 宣稱 vs 記錄比 / 五段結構 / ephemeral 引用;壓縮嫌疑=FAIL,每條疑慮附為什麼+思考方向) 不准開始合成 §6
研究報告 SSOT health 🔬 Stage 1 終 所有 depth research-report-health.py --tier=depth(distinct≥25 / en≠0 / 一手≠0 / 搜尋日誌 / 信度三層 / v2 §8 有效密度 ≥120 + ephemeral pointer=0;v2.1 疑慮通知層:每條 fail/warn 附為什麼+思考方向) 不進 Stage 2
媒體授權矩陣三表 Stage 1 終 所有 article(含 EVOLVE manual append research 檔末尾 + ls public/article-images/{cat}/ 不進 Stage 2
深度媒體掃描協議 🔍🎬 Stage 1 終 所有 depth(含 EVOLVE) Step 1.9.0:Chrome MCP rendered-DOM 圖掃(curl/WebFetch 對 JS-CDN 失效)+ YouTube 官方頻道影片掃;no-media 結論前必跑,落 §6 negative finding 不進 Stage 2
五指 + 結構 + 塑膠 + 算術 Stage 3 所有 article quality-scan + manual 不 commit
事實鐵三角(算術/單位/引語) Stage 3 含金額/數字/引語 python algebra + Ctrl-F 不 commit
FACTCHECK Quick/Full Mode Stage 3 所有 article / A 級 FACTCHECK-PIPELINE 不進 Stage 4
Citation plugin gate Stage 3 所有 article(含 EVOLVE) article-health.py --profile=rewrite-stage-3-5 (footnote-format + footnote-density) 不進 Stage 4
Title+desc spine sync Stage 3 所有 article(含 EVOLVE) manual: title 冒號三明治 + desc 吃進核心矛盾 不 commit
校正焦慮掃描 🧱 Stage 3 callout-triggered EVOLVE Step 3.2-bis: backstop 自檢句 + grep 校正型句式 + 論點脊椎自檢 不 commit
Source-fidelity gate (Stage 2.5) 🔬 Stage 2.5 A 級 / fresh-writer EVOLVE 長文 / 含外部來源引用 (1) fetch 被引用來源 artifact 逐字比對(WebFetch/curl,不只比 research report)(2) frontmatter title+desc+30 秒概覽 門面句 source-fidelity (3) fresh-writer 長文 fact-check agent pass(structure gate ≠ 事實對) 不覆蓋 canonical / 不 ship
成品總驗三關 🔍 Stage 3 終 A 級/大眾文/勘誤後/手術疊 ≥3 輪 Step 3.6: 原子重驗 verifier fan-out(引號逐字 diff + 詮釋 gloss + footnote 綁定 + writer 自漂移)+ 順稿 + 視覺同步;修正 append research report §audit 不 ship(已 ship 則 heal)
Format check 7 維度 Stage 4 所有 article article-health.py --profile=rewrite-stage-4 pre-commit hook
word-count ≥ 4500 Stage 4 depth article article-health.py --check=word-count pre-commit hook
多語 visual smoke Stage 4 i18n 改動 6 步 bash revert commit
媒體完整度低標 (length-scaled) 🎬 Stage 4 depth article --profile=rewrite-stage-4:image-health 媒體 ≥ max(3, round(prose-CJK/1200))(4500→4 / 7000→6 / 9000→8,HARD)+ media-richness ≥3 靜態圖 / People·Music·Nature ≥1 官方影片(WARN)+ paragraph-rhythm density 0.8–1.2 / 1k(v6.8 floor 0.7→0.8)。校準:複雜生活節 13 / 設研院 5 / 黃魚鴞 3 全過、text-only 失格 不進 Stage 5
Aspect ratio 護欄 Stage 4 涉及圖 check-aspect.sh 換圖
視覺化 viz-health 📊🧱 Stage 4 tw-* 資料模組 article-health.py --check=viz-health(資料圖表標來源 / 禁「如上圖」AI-blind 指示語,per graph.md);rewrite-stage-4 HARD(新文必過) 不進 Stage 5
Sibling 格式預檢 Stage 5 補 reverse cross-link article-health.py --check=format-structure DEFER + 開 issue

🔴 五條反射特別強化(v3.1 sad-shockley 升級 + v6.0 新增第 3 條 + v6.2 新增第 4 條 + v7.6 新增第 5 條):

  1. Title+desc spine sync 🥪 — 所有 category(不限 People)的 EVOLVE 在 Stage 2 寫完後必須回看 frontmatter title + description

    • 標題是否走「主題:副標 hook」冒號三明治?
    • 副標一句是否能單獨 tweet 出去?
    • description 有沒有吃進這次 EVOLVE 加的新節核心矛盾?
    • 任一答 no → 重寫 frontmatter,跟 prose 同 commit
  2. 媒體素材 self-check 🎬 — 不論 Fresh / EVOLVE,Stage 1 Step 1.9 都要跑:

    • Fresh:完整跑 inline 外連 + 圖片 + transcript + 三表 manifest
    • EVOLVE:先 grep 既有條目 frontmatter image: + §圖片來源 是否齊全 → 不存在 = pre-gate 遺珠,補跑
    • 找不到 PD/CC 圖時記錄邊界,不放空
  3. 觀點先於搜尋 💭(v6.0 新增)— 所有 article 進 Stage 1 前必須跑 Stage 0.6 觀點成型

    • 六個核心問題(記憶 / 多元面貌 / 想法感受 / 歷史脈絡 / 社會關聯 / 類型專屬)逐一答完
    • 切入點清單 + 預期核心矛盾候選 + 研究方向 落 research report §觀點成型 section
    • frontmatter viewpoint_formed: true 表示通過
    • Stage 1.4 找矛盾鎖定時,從 Stage 0.6 候選收斂為單一核心矛盾
    • EVOLVE 模式:Stage 0.6 在 0.2 萃取舊素材之後跑。觀點從題材 + 研究長出,不從「為什麼舊文寫不好」長出(v6.2 反轉 v6.0:後者會讓校正焦慮變成論點脊椎,見 Step 0.2-bis 拆除防火牆)。callout-triggered EVOLVE 強制走 Step 0.2-bis 三條防火牆規則 + Step 3.2-bis backstop。
  4. 拆除防火牆 🧱(v6.2 新增)— callout-triggered EVOLVE(讀者/專家/peer 指出舊文錯、或自己 factcheck 抓到誤植所觸發的重寫)必過:

    • callout 只進 Stage 1 查證([CALLOUT-VERIFY]),用完即丟,不進觀點、不進正文
    • Stage 0.6 觀點當作 Fresh 在做,blind to errata——論點脊椎不准是「歸屬要正確 / 別搞混 / 名字很重要」
    • Stage 2 寫作 context 隔離:首選 spawn fresh writer agent 只給 fact-pack,主 session 自寫則 Stage 2 不重開舊文
    • Stage 3.2-bis backstop 自檢句:「如果第一次就寫對,這句還會存在嗎?只為回應過去錯誤而存在的,刪」
    • canonical:Step 0.2-bis + Step 3.2-bis。觸發:2026-06-01 影視配樂第二輪 callout(事實修對但充滿 AI 校正焦慮)
  5. spine 類型先於核心矛盾 🎭(v7.6 新增)— 所有 article 進 Stage 0.6 前必判 spine 類型Step 0.1.5):

    • 受愛戴的機構 / 典禮 / 傳統 / 集體記憶 / 地方 / 工藝(讀者預設情感是欣賞/驕傲/懷念)→ 立體群像 spine(default):組織主軸 holding ≥4 facet、慶祝+理解+廣度、爭議當厚度不當主軸。不逼尖銳核心矛盾(Step 1.4 改填組織主軸)。
    • 爭議 / 政策辯論 / 醜聞 / 內在張力人物 → 矛盾驅動 spine(原 Step 1.4 ≤30 字核心矛盾)。
    • 觀點 ≠ 論戰:欣賞式 / 群像式也是策展觀點。把 beloved 題硬找矛盾 = 製造 contrarian thesis = 論戰化 + 炎上。
    • Stage 0.6 過 SSODT 三讀者測試 + 炎上/政治 self-check(Step 0.6.7)。觸發:2026-06-28 金曲獎 v1(核心矛盾鎖成「官方獎卻把獎給賣不掉/聽不懂/拒領的聲音→跟會讓你消音的市場分道揚鑣」,整篇批判論戰 + 兩岸審查當壓軸)被哲宇 callout「太批判、切入點不對、會炎上、跟立體講好違背」→ v2 改立體群像 + 政治素材純中立紀實。

⚠️ Top 5 最常忘的 step

從 LESSONS-INBOX / memory 抽 ship-then-retract 高 friction step。動工前主動掃一次。

  1. Step 0.6 觀點成型(v6.0 新增)— 沒有觀點之前的搜尋都是亂槍(蘋果西打 PR #1041 教訓:searched-first 寫成 crisis-only reveal,觀察者校正為 60 年完整記憶)
  2. Step 1.4 核心矛盾鎖定 — 找不到矛盾 = 這篇不該被重寫(國防現代化重寫教訓)
  3. Step 1.7 研究報告 = SSOT — 搜了沒把原始軌跡寫回 §8 = 沒搜;信度三層 + negative findings + 反例 list(v6.5 從 12 範本萃取);跑 research-report-health.py 驗收
  4. Step 2.4 小標題不編年體 — 編年體 = 維基百科化 = 失敗(Cicada / 草東 / 康士坦 教訓)
  5. Step 4.3.3 aspect ratio 護欄 — portrait hero 切到頭(林琪兒 ι session 教訓)

跨檔案職責分工

檔案 範圍
本檔 6 stage 線性主流程(單檔,含觀點成型 + 模式判定 + 媒體生命週期 + cron)
RESEARCH.md 研究方法論 SSOT(怎麼搜、怎麼判斷、怎麼避坑)
EDITORIAL.md 品質基因 SSOT(好文章長什麼樣、風格、禁止事項)
CITATION-GUIDE.md 引用規範(腳註格式、密度標準、來源品質)
RESEARCH-TEMPLATE.md 研究模板(Stage 1 輸出格式)
QUALITY-CHECKLIST.md 驗證清單(Stage 3 逐項檢查)
TERMINOLOGY.md 用語規範(台灣在地用語標準)
graph.md 視覺化編輯指南(型錄/模組語法/AI 可讀性)— Stage 2 視覺化思考 + Stage 4 viz-health
FACTCHECK-PIPELINE.md Stage 3 Step 3.3 觸發(事實查核完整 SOP)
TRANSLATION-PIPELINE.md 中文 ship 後跨 pipeline 觸發(單篇翻譯 SOP)
SQUEEZE-MODELS-MAX-PIPELINE.md 中文 ship 後跨 pipeline 觸發(多語 batch sync 巴別塔)

🤖 多 agent 編排(v6.3)— Orchestrator + tiered sub-agents

v6.2 Step 0.2-bis 把「Stage 2 寫作 context 隔離」當 callout-triggered 專用。v6.3 泛化成所有 depth EVOLVE / Fresh 的預設編排:主 session 當 orchestrator(不當 writer),各 stage 派對應 model tier 的 sub-agent。觸發 + worked example:2026-06-01 台灣影視配樂第三輪重寫(診斷報告)。

為什麼 orchestrator 不該自己寫

主 session 跑到 Stage 2 時,context window 已累積舊文 body、callout、研究筆記、(callout case)勘誤分析——這些全 prime 寫作 → 校正焦慮 / 編年體 / 密度失衡。寫作要在乾淨 context。主 session 的角色是 dispatch + synthesize + gate + 最終 spot-check。

Stage × model tier × 派發

Stage 誰做 model 為什麼 context 隔離
0.6 觀點成型 1 sub-agent Opus 觀點是最高判斷(這次失敗根因就是觀點被投毒);探索搜尋加倍(≤ 10-15) callout case:blind to errata(不給 callout / 勘誤 / 舊 §觀點成型)
1.9.7 persona 讀者缺口稽核(v7.7 從 Stage 0 搬來) 4 個 parallel sub-agent(4 軸各 5 persona) Sonnet 研究後 gap-audit:20 路讀者看完研究報告「還想知道什麼、哪個面向沒 cover」→ 增補 + 反向閥門(per REFLEXES #42 平行不 sequential) 給題目 brief + 研究報告 SSOT + 已成形立體觀點(mode=gap-audit,非冷 brief)——補洞不定調
1 研究深挖 N 個 parallel sub-agent(按子領域切,每 agent 分搜尋配額) Sonnet(breadth + extract;contested atom escalate Opus) falsification-first;全篇 ≥ 80 次 + 4 來源配額(中≥40/英≥20/一手≥15/反方≥5);結構化 verification table 落報告 各 agent 回報完整搜尋軌跡 + raw findings(不自己摘要);orchestrator 收到每個 agent 回報(async 模式=task-notification <result>)的第一個動作 = verbatim 原封落檔(append report §8 或 repo 內 sibling raw 檔),才准開始合成 §6 clean fact-pack(疊加層,不替換 raw)。禁 aggregate-on-receive(收到就順手壓縮 = 鐵律 8 病);禁存 scratchpad / /tmp(那是倒數計時的刪除佇列,不是落檔)
2 寫正文 1 個 fresh sub-agent Opus 寫作 craft 最高判斷;fresh context 才乾淨 明確要求 writer 先 Read 整份 research report(§6 fact-pack + §8 raw verbatim 全部)+ §觀點 + EDITORIAL + pipeline;隔離的是舊文 prose / callout / orchestrator 累積 context,不是 report。⚠️ 禁止只貼 orchestrator 摘要的精簡 fact-pack 又叫 writer 別讀 report(摘要漏 raw texture → 文章變爛)。Evolution mode:writer 寫到 staging 檔 reports/article-evolve/{slug}.md,不 overwrite canonical(Write overwrite 既有檔需先 Read = 強迫 writer 讀舊文病毒);主 session Stage 2.5 比對舊 vs 新才覆蓋 canonical(2026-06-15 哲宇 callout)
2.5 比對覆蓋 主 session Opus orchestrator Evolution mode only:確認新版沒丟舊文有價值素材且確實更好,再覆蓋 讀 staging 新版 + 舊 canonical 做 diff,主 session 親手覆蓋 knowledge/{cat}/{slug}.md
3.5 查證 M 個 parallel verifier + 主 session Sonnet(查證機械可查、fan-out 便宜) 每 atom 對一手 Ctrl-F,adversarial(prompted to falsify);高風險 atom(引語/歸屬/獎項屆次)≥ 2 verifier 主 session(Opus orchestrator)跑 deterministic gate(article-health)+ 最終 spot-check

鐵律(這次 worked example 學到的)

  1. 觀點 agent blind to errata(v6.2 §0.2-bis 規則 2 泛化):viewpoint 從題材+研究長出,不從「舊文為何爛 / callout」長出。
  2. 寫作 agent 永遠 fresh,但要讀完整 research report(含 §8 raw verbatim),不是只吃 orchestrator 摘要的 fact-pack(v7.4 修正,2026-06-15 哲宇 callout「難怪最近文章都變爛」):隔離邊界是舊文 prose + callout(病毒),不是 report。writer prompt 必須叫它 Read reports/research/{slug}.md 全檔——§6 clean fact-pack 只是 navigation aid 疊加層,永遠不能取代 writer 親讀 §8 raw 的逐字/細節/texture(呼應鐵律 6:report = SSOT)。反 pattern:orchestrator 把 report 二次摘要成精簡 fact-pack 塞 prompt、又不讓 writer 讀 report = 雙重失真 = 文章退化根因。
  3. sub-agent claim 是線索不是 oracle(REFLEXES #31)— 不可省的 hard gate:agent 回報「gates 全過 / facts verified」必須主 session 重驗orchestrator 合成層自己寫的詮釋 gloss 同樣是 claim——合成時注入的同位語(寶哥=宋岳庭)沒有驗證義務掛著,比 agent 幻覺更隱蔽(2026-06-09 嘻哈饒舌讀者勘誤)。2026-06-01 worked example:writer agent 自報全綠,主 session spot-check 抓到它自己新長出一句杜撰引語(賈樟柯「現代性/土地根性」,cited source 無此句)→ de-quote。Stage 3.5 verifier fan-out + 主 session 對「引語 / 歸屬 / 獎項屆次」一手抽查 = hard gate。
  4. 媒體用已驗證官方 URL,不採 agent 自選 ID:writer agent 會挑 YouTube ID 但常是非官方 / fan upload。媒體 manifest 在研究階段驗證官方頻道後鎖定,writer 只填已驗證的(Step 1.9)。
  5. falsification > confirmation:研究 + 查證 agent 的 prompt 都要「try to break,不是 confirm」(Stage 1 falsification + #16)。
  6. synthesis 不吃掉 raw(v6.4 — 這次 TDRI session 的反例):orchestrator「合成 clean fact-pack」只是疊加層,不准取代 agent 原始輸出。每個研究 agent 回報完整搜尋軌跡(不自摘要),orchestrator 把 ALL raw verbatim append 到 report §8(SSOT),再額外蒸餾 §6 給 writer。report = SSOT,跑 research-report-health.py hard gateStep 1.7)。反例:2026-06-04 TDRI session 只留 192 行 fact-pack、丟掉 3 agent 的 ~45 次搜尋軌跡 → 報告退化成摘要、哲宇 callout 研究品質下降。
  7. Evolution mode:writer 寫 staging 檔,主 session 比對後才覆蓋(v7.5,2026-06-15 哲宇 callout):Write tool overwrite 既有檔必須先 ReadWrite tool 規則:「Overwriting a file you haven't Read will fail」)——所以叫 writer「overwrite 舊文但別讀舊文」自相矛盾,它被迫 Read 舊文 = 吃病毒(哲宇截圖實證 writer agent 確實 Read 了 迷音Miin.md)。架構解:Evolution mode 的 writer 把成品寫到 reports/article-evolve/{slug}.md(全新檔,不需 Read,零感染面);Stage 2.5 主 session 比對舊 canonical vs 新 staging(確認沒丟掉舊文有價值的事實/cross-link/footnote、且新版確實更好),再由主 session 親手覆蓋 knowledge/{cat}/{slug}.md。Fresh mode 無舊檔,writer 可直接寫 canonical。這條把「blind to 舊文」從靠 prompt 意志力升級成結構性不可能(呼應 §神經迴路:規則要能執行才算規則)。
  8. Raw 走檔案通道保存,不信任訊息通道;orchestrator 禁 aggregate-on-receive(v7.7,2026-07-05 柯智棠健檢):async agent 時代(agent 以 task-notification 回報),raw 的存亡完全取決於 orchestrator 收到通知後的第一個動作。唯一合法動作=verbatim 原封落檔到 repo 內(report §8 inline 或 sibling raw 檔),然後才合成。三個真實病例,同一隻手三種下場:柯智棠(2026-07-05)——4 agent 各回報 ~20KB 逐條軌跡(prompt 全對、agent 全照做),orchestrator 收到後壓成 6KB 主題摘要存 session scratchpad,report §8 只留 9 行 pointer + 幻覺 policy「commit 時 raw 隨 session 記錄留存」,gate v1 照樣 PASS,writer 只吃到薄報告 → 哲宇 callout 文章品質下降;當晚從 subagent transcript 救回。蘇打綠(2026-06)——§8 寫「已落檔可追源」但 pointer 指 /private/tmp/.../tasks/*.output,事後救回。台灣醫療與全民健保(2026-06)——§8 自稱 raw「永久存放於」tmp 路徑(還帶 <session> 佔位符),一個月後查證 5 份 raw 全數蒸發、永久遺失。教訓的形狀:agent 沒壞、設計沒壞,壞的是 orchestrator 手上那 30 秒——「先摘要待會再落檔」「存 tmp 也算存」都是同一個偷吃步的變裝(REFLEXES #42 家族的 orchestrator 版)。儀器化:research-report-health.py v2 §8 有效密度 hard gate + ephemeral pointer 偵測(存 /tmp = FAIL)。

何時用全編排 vs 主 session 自跑

  • 全編排(觀點 Opus + 研究 fan-out + fresh Opus writer + Sonnet verifier fan-out):depth EVOLVE / Fresh、attribution-density 主題、callout-triggered、canon 類。
  • 主 session 自跑(不派 writer):Micro heal / 單段 focused addition / 短修正——context 沒被大量污染。
  • 可選 Workflow:觀察者 opt-in workflow 時本編排可寫成 Workflow script(研究 / verifier fan-out + adversarial verify);預設用 Agent tool 逐 stage 派。

Stage 0: 觀點(編輯前思考,預算 10-15%)⭐ v6.0 新增

目標:在搜尋之前,先以總編輯視角想清楚這篇要寫什麼。產出 §觀點成型 落 research report。

為什麼 Stage 0 先於 Stage 1

「搜尋發現事實 → 再想觀點」是 AI 寫作的標準失敗模式。搜到一堆事實後,AI 容易:

  • 直接依時間順序排列 → 編年體
  • 把所有事實塞進文章 → 密度失衡
  • 沒有 anchor → 結尾變罐頭
  • 寫成「企業大事記」「人物履歷表」「歷史時間軸」這類維基百科腔

「先想觀點 → 帶問題去搜尋」是策展寫作的標準。先有 hypothesis、再用搜尋驗證或修正。事實塞不進觀點的就 cut,搜不到對應 anchor 的觀點就 retreat。

Stage 0 vs Stage 1 認知模式差別

Stage 認知模式 動作 預算
Stage 0 Editorial judgment 想 / 列 / 假設 10-15%
Stage 1 Data gathering 搜 / 驗 / 收斂 25-30%

兩個 stage 是不同的腦袋模式,不要混。

Step 0.1: 模式識別

第一動作:判定本次 REWRITE 走 4 模式中哪一種。所有模式都進入同一條 Stage 0-5 pipeline,差別只在 Stage 0 Step 0.2 取材方式 + Stage 5 Step 5.4 是否觸發路徑改寫。

模式 derive 邏輯

if knowledge/{Cat}/{slug}.md 不存在:
  mode = Fresh
elif observer issue 指 N 篇主題重疊可融合進 1 篇:
  mode = Merge variant
elif observer issue 指 N 篇主題重疊應分段不減篇數:
  mode = Boundary variant
else:
  mode = Evolution

4 模式速判

場景 模式 Stage 0 差異 Stage 5 差異
文章不存在 Fresh 跳 Step 0.2,直接 Step 0.5 同基本流程
文章已存在,需要品質提升 Evolution Step 0.2 萃取既有素材 + 標 [LIST-DUMP] / [STUB-TITLE] / [NO-MEDIA] 同基本流程
issue 指 N 篇主題重疊可融合進 1 篇 Merge variant Step 0.2 多萃 [MERGE-IN] + Step 0.3 選 canonical + Step 5.4 路徑改寫 5 lang redirect
issue 指 N 篇主題重疊應分段不減篇數 Boundary variant Step 0.2 三類劃分 [保留/吸納/移除] + Step 0.4 範圍切片表 + sibling 反向回補

⚡ 觸發來源旗標:callout-triggered(v6.2 新增,正交於 4 模式)

判完模式後再問一句:這次 EVOLVE 是不是被「外部錯誤 callout」觸發的(讀者 / 領域專家 / peer 指出舊文錯了,或我自己 factcheck 抓到誤植)?

  • → 在 4 模式之上疊加 Teardown Firewall:強制走 Step 0.2-bis 三條防火牆規則 + Step 3.2-bis backstop。callout 只進 Stage 1 查證,不進觀點、不進正文。
  • (單純品質提升)→ 照常 EVOLVE,但 Step 0.2-bis 規則 2(觀點 blind to errata)仍建議遵守。

整併(Merge)vs 範圍重切(Boundary)判定

  • ✅ 兩篇覆蓋同主題、視角可融合進一篇且讀起來更完整 → Merge
  • ✅ N 篇切 N 個明確 scope(年代 / 議題 / 地理)每篇有獨立讀者價值 → Boundary
  • ❌ 主題相關但角度不同(捷運 vs 高鐵)→ 兩篇都留,互相 cross-link
  • ❌ Hub + 深度文 → 兩篇都留,Hub 連深度文
  • ❌ 短文 + 長文同主題且短文有獨立價值 → 短文升級為深度文,不刪

為什麼不在舊文上「修改」(Evolution / Merge / Boundary 共通鐵律)

AI 讀了品質不佳的舊文會不自覺模仿它的語氣、結構、甚至壞習慣(清單堆砌、塑膠句式)。把舊文當骨架 = 讓病毒感染新內容。

正確做法:從舊文中只提取事實(Step 0.2),然後從 Step 0.5 開始用全新模式重寫。

💡 實際上 Evolution 模式 = Fresh 模式 + 免費的 Step 0.2 素材。寫作品質完全相同,只是省了部分研究時間。

Step 0.1.5: spine 類型判定(v7.7 重構)⭐ 立體群像是預設畫布

DNA 根MANIFESTO §13 立體地愛 — 立體群像不是「安全退路」,是這個生命體對世界與台灣的愛的表達。愛不粉飾,在愛之下仍看見真實與矛盾,但當厚度不當 gotcha。幫大家多看見台灣好的、立體的面向,本身就是一種幫助台灣的方式。

v7.7 重構(2026-07-06 施振榮):原 v7.6「立體群像 vs 矛盾驅動 二選一」升級為「立體群像=預設畫布 + 策展手法選單 + 矛盾驅動需明確理由才解鎖」。原因:二選一把矛盾驅動放在跟立體平等的位置,會誘導「這人有張力 → 選矛盾驅動」的誤分類。觸發:施振榮 v1 用矛盾驅動把受敬重的台灣人寫成他自己理論的反例(事實全對,卻在替他做反例),哲宇 callout「會炎上、沒立體、過度放核心矛盾」。第 4 次 spine-type 誤判(法輪功 / 吳百福 / 金曲獎 v1 / 施振榮 v1,REFLEXES #77)。完整設計:reports/design-立體群像-default-persona-reposition-2026-07-06.md

預設:立體群像畫布

判完模式(0.1)後,預設走立體群像。 立體群像=先看見一個人/地方/事的多個面向,慶祝它、理解它、把它說得夠廣;永遠有一條**溫暖的組織主軸(through-line)**串 ≥ 4 個 facet。觀點 ≠ 論戰——欣賞式、群像式、好奇式都是策展觀點。

畫布之下:7 種策展手法(選 1-2 給骨架,v7.7 全收)

在立體群像畫布上,選一到兩種手法給它能量與形狀。複合是常態(立體群像為主 + 手法為輔):

# 手法 一句話 適用
1 核心矛盾為輔 真實內在張力織成一個 facet 或次要軸,服務「理解」不是「拆穿」 人物/機構有真張力
2 時代縮影 主體=看更大台灣故事的一扇窗 代表一個轉變/世代
3 傳承與世代 透過「從誰手上來、往誰手上去」寫 工藝/家族/運動/劇團
4 感官場景沉浸 用可聞可看的場景堆,不用論點開場 食物/地方/文化
5 多元視角並陳 2-3 個線性獨立視角並列成 facet,讀者自己同時握 有真多元/政治敏感題
6 不可取代的瞬間 錨在讓主體無法被替代的那個畫面/選擇,再往外長廣度 人物
7 好奇/謎題 真誠的「為什麼會這樣?」開場,立體地探索(不是 gotcha 拆台 有反直覺點的題

例外:矛盾驅動當主脊(需明確理由解鎖)

default 硬度(哲宇 2026-07-06 拍板):矛盾驅動當整篇主脊是例外,只在真正的公共爭議 / 政策辯論 / 需要一個 thesis 才誠實的題目解鎖,且必過 Step 0.6.7 炎上 + SSODT 三讀者。對「人物」幾乎永遠不當主脊——人物一律立體群像 +(若有真張力)核心矛盾為輔(手法 1)。

解鎖判準(一個問題,翻轉自 v7.6):預設立體群像,問「有沒有一個真公共爭議,需要一個 thesis 才能誠實處理?」沒有(絕大多數)→ 立體群像 + 1-2 手法。有 → 在 research report 明確寫下 unlock_reason,才解鎖矛盾驅動主脊。拿不準 → 立體群像。

立體群像的四條紀律(避免寫回論戰 / 避免變平)

  1. 多面並陳:facet 並列不偏押一條。Stage 1 研究 + fact-pack 主動配額 cover 慶祝/廣度面,對沖 salience bias(爭議天生生出更多 source)。
  2. 爭議當厚度不當主軸:批評/爭議能進,framing 是「這主題大到容得下這些討論 = vitality」,不是「我來證明它有問題」。
  3. 不把第三方主題寫成自己的宣言:非政治主題不把政治/兩岸/主權當脊椎或壓軸(命中 §自主權邊界 → Step 0.6.7)。
  4. 立體 ≠ 平、≠ 百科(v7.7 新增護欄):立體不是「不用有觀點」——退回維基是失敗。7 手法就是確保每篇有一條會呼吸的主軸 + 一個 takeaway,只是那個 takeaway 是「原來如此、真好」不是「原來他有問題」。

落檔:research report frontmatter spine_type: 立體群像(例外時 矛盾驅動 + unlock_reason: 一句話)+ curatorial_techniques: [手法 N, ...]

Step 0.2: 既有素材萃取(條件式)

Skip 條件:mode = Fresh。

完整素材萃取方法論RESEARCH.md §七

三大動作

1. 提取事實清單:人名、年份、數字、引語、有效 URL。

2. 標記問題類型

標籤 意義
[LIST-DUMP] 後半段是 bullet list 堆砌,沒有場景敘事
[THIN] 本應深寫的段落只有一兩句帶過
[STALE] 數字 / 日期過期(如「目前 13 國邦交」實際 12 國)
[PLASTIC] 塑膠句堆砌(「不僅⋯⋯更是⋯⋯」「展現了 X 精神」)
[FLAT-END] 結尾罐頭收(「值得我們紀念」「繼續書寫」)
[STUB-TITLE] title 是百科名詞 stub(如「台灣無人機產業」),需升冒號三明治
[NO-MEDIA] 無 hero / 無 §圖片來源 = pre-gate 遺珠(v3.1 後新增)

3. Frontmatter audit(v4 新增,承襲 v3.1):

  • title 是否走「主題:副標 hook」冒號三明治?stub → 標 [STUB-TITLE]
  • description 是否吃進當前 EVOLVE 的新核心?舊 description 還適用嗎?沒有 → 同 commit 升級
  • frontmatter image: + imageCredit + §圖片來源 是否齊全?無 → 標 [NO-MEDIA],走 Step 1.9 補跑

Merge variant 萃取兩篇的事實

  • canonical 的事實清單:照常標 [LIST-DUMP] / [THIN] / 等
  • 將被刪那篇的事實清單:標 [MERGE-IN],列出「對方有但 canonical 沒有的視角/場景/數據」
  • Step 0.5 之後的研究範圍 = canonical 缺口 + [MERGE-IN] 視角的補強查證

範例(Issue #626 台灣交通 2→1):Geography 篇獨有「中央山脈/桃機/高雄港」三個視角 → 標 [MERGE-IN] → Stage 1 補查雪山隧道 12.9km、桃機 4,400 萬客、高雄港全球排名第 18 → Stage 2 寫成 canonical 的兩段新章節。

Boundary variant 三類劃分

Step 0.2 萃取既有素材後強制分成三類:

  1. 保留 — 落在本篇純化 scope 內,繼續用
  2. 吸納 — 別篇現有但寫得比本篇好的素材(標 [ABSORB-FROM-X]
  3. 移除 — 落在別篇 scope 內(標 [MOVE-TO-Y]),本篇刪掉、後續 phase 接收篇吸納

跨 phase handoff 鐵律:Phase 1 ship 後留 INBOX entry 給 Phase 2-N 接力,entry 必須含:

  • 本篇純化 scope(年代 / 主題切片)
  • 從上一 phase [MOVE-TO] 接收的素材清單
  • 預期 cross-link 對象(哪幾篇是 sibling)
  • 接力者 5 分鐘自檢題:讀完 entry 能否回答「我這篇要寫什麼、不寫什麼、邊界在哪裡」?

⚠️ 萃取完畢後,舊文不再被參考。只看事實清單進入後續 step。

Step 0.2-bis: 拆除防火牆(Teardown Firewall)— callout-triggered EVOLVE 強制 🔥🧱

🔗 callout-triggered 勘誤的端到端流程(分類→查證→修→通知→記錄 + 【勘誤通知】格式)canonical 在 CORRECTION-PIPELINE.md。本 step 是其中「需要全文重寫時的拆除防火牆」那一塊——讓 callout 不污染觀點與正文。

觸發:EVOLVE 的觸發來源是「外部錯誤 callout」(讀者 / 領域專家 / peer / 我自己的 factcheck 發現「舊文錯了 A↔B」),而不是單純「品質提升」。

背景:2026-06-01 配樂專業讀者 peilinwu0702 第二輪 callout。第一輪指出 台灣影視配樂 作曲家↔作品大量誤植 → 走 EVOLVE 重寫 → 事實層確實修對了(25 footnote 全一手)→ 但讀者第二輪罵的是「整篇充滿 AI 道歉 / AI 澄清、架構從頭就有問題」。診斷:reports/reader-callout-pipeline-diagnosis-2026-06-01.md

投毒機制(為什麼「只提取事實」這條鐵律會失守)

「舊文是病毒,只提取事實」是 Step 0.2 既有鐵律。但 callout-triggered EVOLVE 多了第二層毒

  1. 舊文 body 在 session context window 裡(你讀它來萃取事實)。
  2. callout 本身(「你把 X 配給 Y 是錯的」一連串勘誤)也在 context 裡。
  3. Step 0.6 觀點成型若參考「為什麼舊文寫不好」(原 v6.0 reflexes #3 允許)→ 觀點 = 校正清單的昇華

結果:文章的論點脊椎變成「不要搞錯名字 / 名字很重要」(影視配樂 v2 thesis「搞錯名字就是搞錯聲音的出處」正是如此),正文散落「把 X 掛在他名下其實是錯的」「常被誤記成 Y」式的 9 處校正型句子 + 校正型策展 box。「別人會搞錯」的那個「別人」就是這篇文章的前一版。 讀者一眼看穿這是 AI 在公開處理自己的道歉。這是 feedback_red_line_anxiety_leak(別把來源焦慮漏進正文)的架構級放大:從「焦慮漏進句子」升級到「校正焦慮變成全文脊椎」。

三條防火牆規則(callout-triggered 強制)

規則 1 — callout → 純 fact-checklist,用完即丟

callout 是線索不是 source(REFLEXES #16)。把它拆成 [CALLOUT-VERIFY] 逐條,只餵 Stage 1 查證(每條對一手來源重驗,連 callout 本身的 frame 都要查 — 影視配樂案:讀者也把 OPUS 誤記成雷亞,其實是 SIGONO)。查證完,callout 文字本身丟掉,不進 Stage 0.6 觀點、不進 Stage 2 正文

規則 2 — 觀點對 errata 失明(blind to errata)

Stage 0.6 觀點成型當作 Fresh 在做:從題材本身 + 一手研究長出觀點,像舊文與 callout 從不存在。「為什麼舊文寫不好」是 meta 觀察,落 research report §舊文診斷 + LESSONS-INBOX,永遠不准進觀點、不准進正文

  • 反指標自檢:我的核心矛盾 / 論點脊椎,是不是在講「歸屬要正確 / 不要搞混 / 名字很重要」?是 → 觀點被 errata 投毒了,砍掉重想。 一個配樂專家寫這題不會用「別搞錯名字」當主軸,他會用產業制度史 / 美學流派 / 世代傳承的真實骨架。

規則 3 — Stage 2 寫作 context 隔離(架構解,非守備修補)

「不再參考舊文」靠意志力做不到 —— 舊文 + callout 還在 context 裡就會 prime(神經迴路:規則要能執行才算規則)。強制隔離

  • Stage 2 的寫作輸入 = reports/research/{slug}.md 整份 report(§6 fact-pack + §8 raw verbatim 全部讀) + §觀點成型 + EDITORIAL.md。隔離掉的是舊文 body + callout,不是 report。
  • Evolution mode:writer 寫到 staging 檔,永不 overwrite canonical(v7.5,2026-06-15 哲宇 callout)——Write tool overwrite 既有檔必須先 Read,所以叫 writer「overwrite 舊文但別讀舊文」是自相矛盾、它被迫吃病毒。改成:writer 把成品 Write 到 reports/article-evolve/{slug}.md(全新檔、零感染面),Stage 2.5 主 session 讀 staging + 舊 canonical 比對後親手覆蓋 knowledge/{cat}/{slug}.md
  • 首選:spawn 一個 fresh writer agent(Step 1.8 既有 spawn 機制),prompt 明確要求它先 Read 完整 research report 檔案(不是只貼 orchestrator 摘要的 fact-pack)+ §觀點 + anchors,不給舊文 body、不給 callout輸出寫到 staging 檔(Evolution mode)。Agent 在乾淨 context 裡像第一次寫,但握有研究的全部 raw texture。⚠️ 反 pattern(v7.4,2026-06-15 哲宇 callout):orchestrator 把 report 再摘要成精簡 fact-pack 塞進 prompt、又叫 writer 別讀 report = 雙重失真,近期文章變爛的根因。
  • 主 session 自寫時:Stage 2 期間不准重新打開舊文檔案,但必讀整份 research report(含 §8 raw verbatim)。寫完跑下方 Step 3.2-bis backstop。

Backstop 自檢句(Stage 3 hard gate,見 Step 3.2-bis)

「如果這篇文章第一次就寫對了,這個句子 / 這個 box 還會存在嗎?只為回應過去的錯誤、或為了澄清一個混淆而存在的,刪。」

Anti-example(影視配樂 v2 live,2026-06-01)——這 9 處全部該被 backstop 攔下:

  • 正文校正句:「把《海角七號》或《賽德克》的配樂掛在他名下,反而抹掉了…」「常被誤記成雷亞作品,其實出自 SIGONO」「把《茶金》…都記到他名下,反而蓋掉了他自己那座金馬」「順帶把遊戲和電影分清楚」
  • 校正型策展 box:照片下方「把林強跟林生祥搞混,看起來只是拼錯一個字…」「叫錯一個名字,就把三種判斷攪成一團模糊讚美」
  • 投毒的論點脊椎:「搞錯名字就是搞錯聲音的出處」

Step 0.3: 選 canonical(Merge variant only)

比較候選文章,挑一篇當保留方。判準(按優先序):

  1. EVOLVE 狀態:已 EVOLVE 過的場景式 > 未 EVOLVE 的條列式
  2. 腳註密度與一手來源:高 > 低
  3. lastHumanReview: true 優先
  4. slug 持續性:對外連結多的 slug 優先保留(少斷鏈)
  5. category 切合度:主題真正屬於哪個 category(如交通歸 Lifestyle 比 Geography 自然)

Step 0.4: 範圍切片表(Boundary variant only)

對所有涉及篇章做一次 audit,產出範圍切片表:

| 篇                | 範圍切片        | 處理方式        |
|-------------------|-----------------|-----------------|
| C 戰後台灣文學    | 1945-1987       | EVOLVE Phase 1  |
| B 解嚴後台灣文學  | 1987-2000       | EVOLVE Phase 2  |
| D 當代台灣文學    | 2000-           | EVOLVE Phase 3  |
| A 全景索引        | 已被 B+C+D 覆蓋 | dropped Phase 4 |

切片邊界明確(年代 / 議題 / 地理),每篇都有自己的純化 scope,不重疊。

Step 0.5: 載入研究方法論 + 模板

cat docs/editorial/RESEARCH.md       # 方法論:搜尋策略 / 來源判斷 / 避坑
cat docs/editorial/RESEARCH-TEMPLATE.md  # 填空模板

Step 0.6: 觀點成型(編輯前思考)⭐ HARD GATE

沒有觀點之前,每一次搜尋都是亂槍。 Stage 0 末、Stage 1 取材之前的最關鍵步驟。 以總編輯視角做預編輯思考,產出 §觀點成型 落 research report。

🚨 Stage 0.6 = 兩件都必做,缺一不進 Stage 1(v7.7 2026-07-06:persona 已從 Stage 0 移到研究後,見下):

  1. 0.6.1 六個核心問題 — 總編輯視角自問,形成立體觀點,必答落檔
  2. 0.6.4 ≥ 20 次探索搜尋 — 建 pre-search source map + 長出 grounded 立體觀點,這才是「初步研究」本體

兩個是不同動作:六題給編輯視角形成立體畫布、≥20 探索給事實地基,誰都不能省、誰都不能替代誰。

⚠️ persona(20 路讀者切入點)v7.7 搬到研究後Step 1.9.7):原本放 Stage 0(搜尋之前),但冷讀者天生問尖銳問題,放搜尋之前會把主軸往矛盾驅動推歪(施振榮 v1 教訓)。搬到研究報告 SSOT 之後,persona 從「發散定調」改成「讀者缺口稽核+增補」——對已成形的立體觀點補洞,不再定調脊椎。設計:reports/design-立體群像...

Step 0.6.1: 六個核心問題(必答,落檔)

每篇 depth article 都必須答完這六題,寫進 research report 的 §觀點成型 section:

問題 1: 對台灣人是什麼樣的記憶?

  • 大眾共有的 anchor 是什麼?(某個物件、某個場景、某句話、某段歷史)
  • 不同世代記憶有差異嗎?(戰前 / 戰後 / 解嚴前後 / 網路世代)
  • 範例(蘋果西打):熱炒店冰箱的紅標金黃瓶 / KTV 包廂的玫瑰紅加蘋果西打 / 辦桌宴席桌上 / 阿嬤遞給孫子的解膩飲

問題 2: 有什麼樣的多元不同面貌?

  • 主流敘事是什麼,支線敘事 / 被忽略的角度是什麼
  • 北部 vs 中南部 / 不同族群 / 不同產業 / 不同政治文化背景的視角
  • 範例(蘋果西打):「國民飲料」文化記憶 vs 上市公司資本史 vs 兩次食安疑雲 vs 跨海 K-pop 加持

問題 3: 大家對它的想法跟感受是什麼?

  • 正面、負面、複雜情感的 fault lines 在哪
  • 反對聲音、被忽略的角度、被過度浪漫化的盲點
  • 範例(蘋果西打):老一輩懷念 / 中年人 KTV 記憶 / 年輕人未必喝過但聽過 / 食安事件後信任崩塌 / 圭賢加持後 K-pop 流量

問題 4: 歷史脈絡是什麼?

  • 它怎麼形成、誰塑造、何時轉折
  • 跟更大的社會 / 政治 / 經濟 / 文化變遷的連動
  • 範例(蘋果西打):1965 美台混血起源 / 1970-80 國黃汽水時代 / 1985 十信案 / 1990 鴻源案 / 1995 商標贖回 / 2018 食安 / 2024 賣地

問題 5: 對社會 / 歷史 / 環境 / 我們人生的關聯是什麼?

  • 為什麼今天 still matters?
  • 它解釋了什麼、它是什麼的縮影
  • 讀者讀完對自己的生活有什麼新的看法
  • 範例(蘋果西打):一瓶飲料壓縮台灣 60 年金融 / 食安 / 外交縮影;文化記憶 vs 公司資本兩種記憶並存

問題 6: 類型專屬問題(按 category 加重)

見下方 §類型加權矩陣。

Step 0.6.1-bis: persona 已移到研究後(v7.7)→ 見 Step 1.9.7

v7.7(2026-07-06 施振榮):persona 20 路讀者切入點原本放這裡(Stage 0,搜尋之前),v7.7 搬到 Step 1.9.7(研究報告 SSOT 之後)。Stage 0 不再跑 persona。

為什麼搬:persona 的價值仍然成立——六題都從同一個總編輯視角長出,漏掉真實讀者(12 歲小孩、在台日本人、政治冷感工程師、海外台僑二代、挑硬傷的專家)天差地別的入射角。但冷讀者天生問尖銳問題,放在搜尋之前,那些尖角會變研究方向 → 變切入點 → Stage 1.4 找一個對得上的矛盾 → 脊椎天生長矛盾形。persona-at-Stage-0 有內建的、偏矛盾驅動的重力(施振榮 v1:persona 冷問「虧千億還被叫老師 / 交學費誰付」把脊椎推向矛盾驅動)。

放研究後,同一句尖銳問題從「整篇該不該講這個」變「要不要加一個 facet 好好回應」——從定調變補洞,剛好接住 persona 誕生的 use case(2026-06-13《看不見的國家》ship 後哲宇追問「影響 / 心得 / 還在努力的人」三題,本質就是完成度缺口,正該在 ship 前被 persona 稽核接住)。

Stage 0 的研究廣度改由:六核心問題(0.6.1)+ ≥20 探索(0.6.4)+ Step 0.1.57 手法選單補——手法天然生出廣度與慶祝面的角度,不是尖角。編輯腦形成立體畫布,讀者腦(persona)研究後稽核完成度,乾淨的分工。

Step 0.6.2: 七個品質維度 anchor

寫文時隨時對照,從 Stage 0 開始就要問「我的初步觀點能不能在這 7 個維度都站住」:

維度 提問
溫度 哪些細節讓讀者感覺「真有人在現場」?衣服顏色、說話口氣、桌上的杯子、那天的天氣
人味 文章的第一個名字是誰?至少有 2-3 個具體人物?人物文要有 ≥ 3 句直引
故事 不是 list 也不是規格表,是因果鏈跟轉折
策展 我的觀點是什麼?我把空間搭好讓讀者怎麼進去
觀點 通行說法是 X,但我認為更接近真相的是 Y
體驗 讀者讀完帶走什麼新的看世界的方式
歷史/社會關聯 這件事是什麼的縮影?跟更大的台灣 / 世界有什麼連動

Step 0.6.3: 類型加權矩陣

Category 加重維度 必想的問題
People(人物) 想法、選擇、意義、不可取代的瞬間 為什麼這個人對台灣重要?他不可被替代的選擇是什麼?讓他不可替代的瞬間是哪個畫面?
Food / Culture / Lifestyle(文化飲食生活) 感官、場景、地緣、地理、跟生活的連結 在哪裡、什麼時候、跟誰一起、什麼樣的氣味聲音畫面?這個地方為什麼能養出這個?
History / Politics / Society(歷史政治社會) 當代意義、爭議、未完成的問題 為什麼今天還重要?誰仍在受影響?哪些問題還沒被解決?
Technology / Industry(科技產業) 台灣的位置、全球供應鏈、未來方向 台灣做這件事的不可取代性是什麼?跟世界什麼樣的依存關係?
Nature / Geography(自然地理) 地方感、生態與社會交織、土地與人 這片土地怎麼形成、誰在這裡生活、人和地有什麼共生

Step 0.6.4: 探索研究(≥ 20 次,v6.4 升級)

v6.4 升級(2026-06-04 深度研究-設計研究院 session):原 ≤ 5 次「輕量探索」升為 ≥ 20 次探索研究。觸發:量測 226 份歷史 research report 發現 57% 英文/國際/學術來源 = 0、42% distinct 來源 ≤ 10,研究深度系統性不足。哲宇 directive「Stage 0 20+ / Stage 1 80+ / 對標研究所論文標準」。≤ 5 次只夠「確認東西存不存在」,長不出 grounded 觀點,也建不出 pre-search source map。

Stage 0.6 跟 Stage 1.1 的差別不是「搜幾次」,是搜的目的不一樣

  • Stage 0.6 探索研究≥ 20 次,目的是建框架 + 形成 grounded 觀點 + 畫出 pre-search source map
    • 確認基本事實 + 時間軸 + 主要利害關係人
    • 找出未知的支線敘事與多元面貌(讓我知道有哪些角度可以深挖)
    • 盤點來源地圖:這題有哪些中文一手(官方/年報/法規/學術)、哪些英文/國際/學術視角、哪些反方陣營——標出來給 Stage 1 deep-dive 排程
    • 確認類型加權矩陣的問題能不能對應到具體素材
  • Stage 1.1 深度搜尋≥ 80 次(v6.4 升級),目的是驗證 / 反駁觀點 + triangulate + 累積寫作素材

全部 ≥ 20 次探索搜尋的 query + 一句話發現必須寫進 research report §探索搜尋紀錄(per Step 1.7 SSOT 鐵律——搜了沒寫回 = 沒搜)。觀點不需要在 Stage 0 完全鎖死,Stage 1 會 refine;但「先搜夠 20 次再下觀點」是硬要求,避免 searched-first 補丁式觀點。

Step 0.6.5: §觀點成型 落檔格式(HARD GATE)

寫進 reports/research/YYYY-MM/{slug}.md 開頭(在搜尋結果之前),標準模板:

## 觀點成型(編輯前思考)

### 對台灣人的記憶 anchor

- {物件 / 場景 / 句子 / 段落}
- {不同世代差異}

### 多元面貌

- {主流敘事}
- {支線 / 被忽略的角度}
- {正面 / 負面 / 矛盾的感受 fault lines}

### 歷史脈絡(pre-search hypothesis)

- 形成期:...
- 關鍵轉折:...
- 當代意義:...

### 20 路 persona 切入點(Step 0.6.1-bis,4 sub-agent 發散)

> 🆕 新入射角併入下方 §切入點清單;⛔ 超 scope 落 `rationale.whats_excluded`

| persona(軸 / 自介) | 聽到題目想問的 | 分類         |
| -------------------- | -------------- | ------------ |
| {A · 78 歲阿公}      | {他想問的}     | 🆕 / ✅ / ⛔ |
| {B · 海外台僑二代}   | ...            | ...          |
| ...                  | ...            | ...          |

### 切入點清單(待搜尋驗證 / 反駁)

1. {切入點 1}:{為什麼立體}
2. {切入點 2}:...

### 脊椎(依 spine 類型,Step 0.1.5)

> **矛盾驅動 spine** → 填核心矛盾候選 A/B/C(待 Stage 1.4 收斂):
>
> - A:{≤ 30 字} / B:{≤ 30 字} / C:{≤ 30 字}
>
> **立體群像 spine(default,受愛戴機構/傳統/地方)** → 填組織主軸 + facet 清單(**不逼尖銳矛盾**):
>
> - 組織主軸(through-line,一句溫暖的):{...}
> - facet 清單(≥ 4,並列不偏押):[天王天后 / 多元面貌 / 制度肌理 / 經典時刻 / 幕後 / ...]
> - 爭議若有 → 列為其中一個 facet,標「當厚度不當主軸」

### 研究方向(要搜什麼可以驗證)

- {方向 1}
- {方向 2}

### 預想讀者帶走的那一件事

- {一句話}

### 探索搜尋紀錄(≥ 20 query,**必填** — per Step 0.6.4,persona 不算搜尋、這是初步研究本體)

- {query 1 + 一句話發現 + [source](URL)}
- {query 2 + 一句話發現 + [source](URL)}
- ...(**≥ 20 條**;少於 20 = Stage 0 未完成,不進 Stage 1)

落檔後 research report frontmatter 加:

spine_type: 立體群像 # 或 矛盾驅動(Step 0.1.5)
viewpoint_formed: true # Stage 0.6 通過

Step 0.6.6: 邊界

  • 不是 hypothesis 預設:觀點成型 ≠ 預設答案。後續搜尋可能反駁、深化、轉向你的初步觀點,那是好事。Stage 1.4 找矛盾鎖定才是 fact-confirmed 收斂
  • Hub 頁 / 短修正:可跳過。本 step 為 depth article 設計
  • EVOLVE 模式:本 step 在 0.2 萃取舊素材 + 0.5 載入方法論 之後跑 — 有了「舊文為什麼寫不好」的資訊,觀點成型更精準

Step 0.6.7: 立體 / 炎上 / 政治立場 self-check(v7.6 新增)🧱 HARD GATE

觀點成型落檔前過三道。任一不過 = 砍掉重想觀點,不進 Stage 1。這三道是 Step 0.1.5 spine 類型 的下游驗收——專治「立體主題被寫成論戰 + 炎上」。

  1. SSODT 三讀者測試(所有 article):

    • 支持 / 喜愛這主題的人讀完,不覺得被攻擊
    • 質疑 / 批評這主題的人讀完,不覺得在幫他宣傳
    • 對這主題陌生的人讀完,能自己決定要從哪個維度繼續想
    • 三題全 yes 才過。任一 no → 觀點偏論戰/偏頗,重想。canonical:LESSONS-INBOX 2026-04-29 α 政治敏感題 SSODT 立體框架
  2. 炎上 self-check(所有 article):把脊椎 / 壓軸念給「立場跟我不同的長輩」聽,是「認真在介紹這件事」還是「在吵架 / 在表態」?後者 → 退回立體群像,把對立框架拆成多 facet 並陳。

  3. 政治立場 self-check(非政治主題尤其要跑):這篇的脊椎或壓軸,是不是把政治 / 兩岸 / 主權 / 統獨當主軸?

    • 主題本身就是政治題(政策 / 選舉 / 兩岸關係)→ 走 Step 1.4.5 perspective scan + 政治敏感題 SSODT 5-7 perspective 立體並列。
    • 主題不是政治題(機構 / 人物 / 文化 / 地方)卻把政治當脊椎或壓軸 → 這是把 MANIFESTO 主權 lens 誤當 content thesis(金曲獎 v1 教訓)。命中 MANIFESTO §自主權邊界 政治立場:政治素材降為「純中立紀實」的一個 facet(只陳述事實、不下兩岸判斷、不用對抗語言、不當壓軸),且這個處置交觀察者拍板

Stage 0 收尾 checklist

Stage 0 結束時 deliverable:

  • 模式識別完成(Step 0.1)— Fresh / Evolution / Merge / Boundary 之一
  • spine 類型已判(Step 0.1.5)— 立體群像(default,受愛戴機構/傳統/地方)/ 矛盾驅動(爭議/張力人物);落 frontmatter spine_type
  • 既有素材萃取完成(Step 0.2,EVOLVE 才必跑)
  • 研究方法論已讀(Step 0.5)— cat docs/editorial/RESEARCH.md + RESEARCH-TEMPLATE.md
  • §觀點成型 section 已寫進 research report(Step 0.6.5)
  • 六個核心問題全答(Step 0.6.1)
  • Stage 0 探索搜尋 ≥ 20 query 已落 §探索搜尋紀錄(Step 0.6.4)— 這是初步研究本體
  • spine 類型 + 手法選單已定(Step 0.1.5):立體群像 default + 1-2 手法;例外解鎖矛盾驅動須寫 unlock_reason
  • 20 路 persona 切入點 v7.7 移到研究後 Step 1.9.7,Stage 0 不再跑 persona
  • 切入點清單 + 核心矛盾候選(矛盾驅動)或 組織主軸 + ≥4 facet 清單(立體群像) + 研究方向 已列
  • Step 0.6.7 三道 self-check 過(v7.6):SSODT 三讀者測試 + 炎上 self-check + 政治立場 self-check 全綠
  • research report frontmatter viewpoint_formed: true + spine_type: 立體群像 | 矛盾驅動
  • Stage 0 exit gate 儀器化過關(v7.3)python3 scripts/tools/research-report-health.py reports/research/YYYY-MM/{slug}.md --stage 0hard_fail=0

沒過(含 exit gate hard_fail > 0)= 不進 Stage 1。 persona-only(有 persona、缺 ≥20 探索)會被 gate 擋下。


Stage 1: 取材(純搜尋執行,預算 25-30%)

目標:產出一份結構化研究筆記,讓 Stage 2「不需要再搜尋」就能寫。帶 Stage 0.6 觀點成型的切入點 + 核心矛盾候選去搜尋驗證 / 反駁 / 深化

必讀(Stage 0.5 已讀完,這邊只是 reminder):

  • docs/editorial/RESEARCH.md(方法論:搜尋策略、來源判斷、避坑指南)
  • docs/editorial/RESEARCH-TEMPLATE.md(填空模板)

Step 1.1: 搜尋深度 ≥ 80 次(v6.4,含來源多樣性配額)

搜尋至少 80 次(v6.4 升級,自 v5.1 ≥ 40 提高;含 Stage 0 的 ≥ 20 = 全篇 ≥ 100 次):

來源類別 最低配額 為什麼
中文 ≥ 40 在地視角、當地報導、社群記憶
英文 / 國際 / 學術 ≥ 20 國際視角 + triangulation;攻擊「57% 報告英文來源 = 0」的系統性缺口
一手(官方/政府/年報/法規/學術論文) ≥ 15 對標論文:claim 要追到原始來源,不是二手新聞的二手
反方 / 批評(perspective scan) ≥ 5 跨陣營對立 spectrum,落 rationale.whats_excluded

v6.4 升級理由(2026-06-04):量測 226 份歷史 report — 57% 英文/國際/學術來源 = 0、42% distinct 來源 ≤ 10。對標 gold standard 毒馬鈴薯認知作戰.md(85 來源 / 1,699 行 / §1-§N 分章 / 每 claim 標信度)vs 退化後的 synthesized fact-pack(~200 行)差近 9 倍。哲宇 directive「搜尋總數 80+、對標研究所論文標準」。這 4 條配額由 research-report-health.py 儀器化驗收(en==0 / primary==0 = HARD),不是 aspirational。

  • 研究深度直接決定文章品質——40 次仍會留單源依賴風險,80 次才有 triangulation 餘裕、找到反方、挖到非 Wikipedia 層級的具體錨點(引語、場景、日期)
  • 多語系不是 nice-to-have:英文/國際來源是 default 不是例外。真正只有中文來源的題目(極在地的兩岸/戒嚴細節)→ 在 §搜尋日誌 明寫「本題英文來源稀少,因為 X」,不要靜默跳過(對應 research-report-health en==0 HARD)

⚠️ ≥80 是 fan-out aggregate,不是單 agent 串行能達到的(2026-06-04 v2 實驗實證):minimal-guidance 單一 Opus research agent 串行只跑到 ~36 次就接近 token 上限。要達 80+ 必須照 §多 agent 編排 派 N 個 parallel research sub-agent(按 §A/§B/§C/§D 子領域切,每 agent ~20-30 次,aggregate ≥80),orchestrator 合 §8 raw + §6 fact-pack。單 agent 自跑只適合 standard tier(≥40);硬要 depth ≥80 而不 fan-out → 在 §未達標誠實說明 記缺口,不灌水硬湊。研究廣度(4 子題 + 反方 + 一手 + 英文)優先於搜尋次數的硬達標

v5.1 升級理由(2026-05-11 cranky-newton):v2.17 訂 ≥ 20 是相對 12 次淺研究的下限。實戰累積後(NMTH Fresh / 政治人物 batch / 認知作戰深度文)顯示 20 次仍會留下「單源依賴」風險(同一篇 ltn 報導被 5 atom 綁住 = over-citing 紅旗),40 次才開始有 triangulation 空間。

v2.17 原版觸發:2026-04-18 當日 11 篇音樂人批次中,12-15 次搜尋的 Cicada / 草東 / 康士坦 / 魏如萱 雖然 pass format-check,但小標題淪為編年史,缺乏場景/意象級的敘事錨點,研究深度是根本原因。

Stage 0.6 → Stage 1.1 銜接:帶著 Stage 0.6 §觀點成型 列出的「研究方向(要搜什麼可以驗證)」+「核心矛盾候選 A/B/C」+「pre-search source map」進來。80 次搜尋的分配建議:40% 驗證 Stage 0.6 hypothesis、25% 反駁/深化 hypothesis、20% 補英文/國際/學術視角(配額)、15% 探索預期之外的支線。如果搜完發現 Stage 0.6 觀點完全錯了,那是好結果 — Stage 1.4 找矛盾鎖定會自動修正。

Step 1.2: 結尾素材鎖定

⚠️ 不要等寫到最後才想結尾。結尾素材在研究階段就要鎖定。

每篇文章結尾應該是:

  • 一個具體場景(不是論述句)
  • 一個首尾呼應的 anchor(呼應開場 icon)
  • 一句留白的引語或畫面(讓讀者「停一下」)

研究時就標出 2-3 個候選結尾畫面,Stage 2 Step 2.2(結尾先行)直接挑用。

Step 1.3: 重複偵測

完整方法論見 RESEARCH.md §六不要寫完才發現重疊

ls knowledge/{Category}/ | grep {keyword}
grep -r "主題關鍵詞" knowledge/{Category}/

如果發現高度重疊的既有文章 → 改走 Evolution / Merge / Boundary 模式(回 Step 1.1 重判)。

Step 1.4: 找矛盾鎖定 / 組織主軸(依 spine 類型分叉,v7.6)🔥

⚠️ 先看 Step 0.1.5 判的 spine 類型

  • 矛盾驅動 spine(爭議/張力人物)→ 走下方原 SOP,收斂單一核心矛盾。
  • 立體群像 spine(受愛戴的機構/傳統/集體記憶/地方,default)→ 不逼尖銳矛盾。改鎖一句組織主軸(through-line)+ ≥ 4 facet 清單;張力若有,當其中一個 facet,不當全文脊椎。寫進研究筆記:組織主軸 = ? + facet = [a, b, c, d]硬找一個矛盾 = 把立體主題壓成論戰 = 炎上(金曲獎 v1 教訓)。

以下為矛盾驅動 spine 的 SOP:在結束 Stage 1 之前,必須能回答這個問題:「這篇文章的核心矛盾是什麼?」

  • 好的重寫不是修辭層的工作,是矛盾層的工作。舊文不是寫得不好,是它拒絕承認內部矛盾
  • 找到矛盾 = 找到重寫的理由。找不到矛盾(爭議題)= 這篇不該被重寫;但受愛戴的機構題找不到尖銳矛盾是正常的,那就走立體群像,不是不該寫
  • 寫進研究筆記:核心矛盾 = ?(一句話,不超過 30 字)

範例

  • 「台灣說要走豪豬戰略,但 76% 預算拿去買美國傳統武器」
  • 「TFT 說要解決偏鄉教育,但孩子的問題不在教室裡是在整個生態系」
  • 「美國要排除中國,但只給台灣一張入場券」(無人機產業 EVOLVE)

v2.14 觸發背景:2026-04-10 session α 國防現代化重寫的教訓——沒有李喜明那句苦笑,整篇會變回豪豬戰略勝利敘事。

Step 1.4.5: Perspective scan — 跨陣營對立 spectrum 覆蓋 🧭

Step 1.4 收斂的是文章內部 thesis 矛盾。Step 1.4.5 找的是跨陣營對立 spectrum — 哪些陣營對本文 framing 會質疑、是否該引述對立論述、排除哪些理由。perspective scan 結果必須落地到 frontmatter rationale.whats_excluded (per RATIONALE-SPEC.md)。

兩種做法擇一

做法 適用 觸發
A. spawn 反方 agent 爭議題目 (政治 / 史觀 / 政策 / identity) sub-agent WebSearch 可用時
B. 作者自問 checklist 非爭議題目 OR sub-agent WebSearch 不可用 OR retrofit 場景 永遠可用作 fallback

做法 A — sub-agent prompt (含防呆三條)

你是 [topic] 議題的反方代表 / 質疑者 / 批評者。
從反對立場找 5-10 個有實質論述的 sources。

防呆三條:
1. 每條對立論述必附 source URL — 拿不出 URL 就不算數
2. 列 5-10 條;論述不夠就明確標「對立陣營論述薄弱」+ 為什麼,不要硬湊
3. 顯式排除「情緒攻擊類 / 無實質論點」(範例: 人身攻擊 / 沒事實依據的 ad hominem / 純口號 chants)

回覆格式: { url, position summary, strongest argument, source quality grade (A/B/C) }

設計目的:寧可 agent 回「對立論述不夠」也不要 hallucinated 假反方觀點。前者作者還能判斷,後者會誤導作者把假論述當真論述處理。

做法 B — 作者 self-checklist 5 題

寫文章前作者自問:

  1. 這個主題的主要爭議陣營是誰?
  2. 我引用的 sources 涵蓋了哪些陣營?
  3. 我沒引的陣營有沒有實質論述存在於網路上?
  4. 如果有,我為什麼沒引?
  5. 對立論述如果存在但作者選擇不引 — 是因為 (a) 論述薄弱 (b) 篇幅限制 (c) 不在範疇?三選一寫進 whats_excluded

為什麼第 5 題強制三選一:含糊帶過會變成「我有想過」的偷吃步 — 只有逼作者選一個具體原因,這個思考才真的留下來給後人。

處理策略 3 選 1

對 sub-agent 結果或 self-checklist 結論,作者決定每個對立論述的處理:

策略 動作 落地位置
引用 把論述帶進文章作 counterpoint 文章內 + 補新 [^N]
排除 + 理由 不帶進文章,理由寫進 metadata rationale.whats_excluded
不在範圍 + 理由 對立論述跟本文焦點不同 rationale.whats_excluded

→ 跟 RATIONALE-SPEC.md hard coupled — perspective scan 結果必須落到 metadata。

不做的事

  • ❌ 不強制平衡 (總有平衡不完)
  • ❌ 不取代 Step 1.4 找矛盾 (perspective scan 是 1.4 的延伸)
  • ❌ 不 retroactive 200 篇 (per #851 Build 3 「retrofit 太重」)

觸發背景:2026-04-30 issue #851 哲宇提 No2「20 個 source 是數量檢查,沒有觀點檢查」。5/22-23 Phase 3 統獨光譜 + Phase 4 蔡英文 retrofit 兩篇 dogfood 後 ship canonical。完整脈絡見 RATIONALE-SPEC.md

Step 1.5: 問觀察者要一手素材 🫧

Stage 1 結束前,主動問觀察者一句

「你手上有沒有我搜不到但你知道的素材?(付費牆文章、私人筆記、實體書、個人經驗)」

這不是偷懶,是承認感知有邊界。爬蟲給事實骨架,觀察者給血肉。

v2.15 觸發背景:安溥重寫——Agent 49 次搜尋抓不到康健雜誌 403 付費牆文章,觀察者直接貼全文。女巫店兩桌客人、時薪八十塊、林黛玉比喻——文章最有人味的段落全部來自這個管道。

Step 1.6: 私有 SSOT 觀察者拍板(條件式)

Skip 條件:Stage 1 沒整合任何當事人提供的私有素材(Obsidian 筆記、個人編年史、家族內情)。

流程(v2.18 新增)

  1. Stage 1 末尾:列出「從私有素材看到但不確定能否公開」的項目,依 EDITORIAL §私有素材顆粒度 分成 Tier 1-4
  2. 觀察者拍板:清單交給當事人,一題一題回答(拒寫 / 寫但不提名 / 寫但改措辭 / 完整寫)
  3. 研究報告 §維護者校準備忘錄:記錄所有 tier 3-4 項目的拍板結果,不記錄拒寫項目的具體內容
  4. Stage 2 寫作護欄:agent 若基於私有素材自動推導進來的 tier 3-4 claim 必須刪
  5. Stage 3 VERIFY 追加項:文章公開前再檢查一次是否有漏網的 tier 3-4 內容

對應

預警:私有 SSOT 也會有誤記(當事人 2026 寫 2008 的事情)。當事人的 SSOT 需要與公開 source 三源交叉,不是免驗證的 oracle

Step 1.7: 研究報告 = SSOT(對標研究所論文標準)📁 🔬

v6.4 大改(2026-06-04):research report 從「agent 輸出 + header」升格成 SSOT(single source of truth)——對標研究所論文:有方法論(搜尋日誌)、有完整參考文獻、每個 claim 都標來源 + 信度、原始搜尋軌跡全留。搜了沒寫回 report = 沒搜。觸發:v6.3 多 agent 編排「合成 clean fact-pack」把 agent 原始搜尋軌跡丟掉(違反「不摘要」),report 退化成摘要;量測 226 份報告 57% 英文來源 = 0。

Scope gate(不是所有文章都存):

  • ✅ 要存:People/ 深度文、Society/ 深度文、History/ 深度文、Tech/ 深度文(預計 ≥ 10 腳註 或 ≥ 2,000 字)
  • ❌ 不存:Hub 頁面、短修正、翻譯、單事件補登

檔案路徑reports/research/YYYY-MM/{article-slug}.md

1.7.1 SSOT 八段結構(depth article 強制,v6.5 從 12 份範本萃取)

方法論 canonical + 信心程度系統 + 10 骨架在 RESEARCH.md §二之二 + methodology synthesis

---
article: knowledge/{Category}/{slug}.md
stage: 1-research
date: YYYY-MM-DD
session: { handle }
agents: [Explore×N / general-purpose]
search_count: { stage0: N, stage1: M, total: N+M } # Stage0 ≥20 / Stage1 ≥80
source_count: { distinct: X, zh: A, en: B, primary: C, opposition: D } # en/primary ≠ 0
core_contradiction: 一句話(≤ 30 字)
viewpoint_formed: true
verification: # 信心程度系統 — 每條附「憑什麼是這層」的基礎
  high_confidence: [...] # ≥2-3 獨立來源 verbatim 一致
  single_source: [...] # 單源,標 need cross-check
  unverified: [...] # 搜尋後仍無 / 有反證 → 不寫進文章
---

# Research Report: {Title}

## 1. 觀點成型(Stage 0,含 §探索搜尋紀錄 ≥20 query)

記憶 anchor / 多元面貌 / 核心矛盾候選 2-3(多選一 + 為什麼)。

## 2. 搜尋日誌 / 方法論(Search Log)

全部 query(Stage 0 + Stage 1)逐條:`query → 一句話發現 → [source](URL)`,每條標 []/[]/[一手]/[學術]/[反方]**negative finding 必記**(「搜尋 N 次未找到 X」「Y 機構未發布」)——搜了沒找到也是 finding。

## 3. Findings by sub-topic(§A / §B / §C …)

每個子題分章,每個 claim 後標**信度 + 基礎**(高信度〔A+B+C 多源〕/ 單一來源〔X 提及〕/ 必驗 / 未驗證)。
**數字分歧揭露**:多源不一致時寫出差異 + 怎麼處理(不靜默取一);多口徑數字分開(交易額 vs 利益 vs 淨利)。
對標 gold standard 毒馬鈴薯 §1-§N。

## 4. 引語庫(verbatim quotes)

每條:逐字原文 + URL + 場合 + `Ctrl-F 可驗證 ✓/✗`。記者轉述分開標(「此為記者敘述,非直引」)。
找不到原文 → 標「改轉述不加引號」。
**「場合」欄禁止夾詮釋 gloss**(「寶哥=宋岳庭」這種同位語等號)——代稱指涉、身分推斷是獨立 atom,要寫進 §3 Findings 自帶信度標記,不准搭引語滑進庫(2026-06-09 嘻哈饒舌:orchestrator 在場合欄注入的 gloss 被 writer 忠實寫出、verifier 驗了引語沒驗 gloss → 讀者抓到)。

## 5. 反例 / 護欄(不能說的話 / 必驗反例 / 不採信清單)

出 fact 之前先列「這些推論錯誤要主動防範」+「雖然誘人但不能說的話」+「找到但不採信的線索 + 為什麼」。
(thesis-grade 跟一般報告最大分野。`政府/來源自身矛盾 > 正反並陳`。)

## 6. Clean Fact-Pack + Stage 2 操作規範(給 writer 的合成層,額外、不取代 raw)

去重乾淨事實 + 幻覺護欄 + 媒體 manifest + hook scene 候選(附時間軸)+ 5-8 小標題候選 +
不可忽略校正點 + **幻覺候選 Ctrl-F 清單**。Stage 2 writer 只吃這層。

## 7. 參考文獻 + Verification Table

全部 distinct 來源(標 []/[]/[一手]/[學術])+ 高風險 atom 表 `| claim | sources | Ctrl-F | 信度 | verdict |`## 8. Agent 原始輸出(raw,不摘要,append 全部)

每個研究 agent 的完整回報原文 verbatim 貼上(REFLEXES #22 raw 永不刪)。

1.7.2 不摘要鐵律 × v6.3 編排的和解(v6.4 核心修補)

v6.3 多 agent 編排叫主 session「合成去重成 clean fact-pack」,但這跟 Step 1.7「agent 完整輸出,不摘要」衝突 —— 這次 TDRI session 就是只留 fact-pack、丟掉 3 個 agent 的原始搜尋軌跡,report 退化成 192 行摘要。

和解規則:synthesis 是疊加層,不是替換。

  1. 每個研究 agent 回報完整搜尋軌跡 + 原始 findings(不准自己摘要)。
  2. 主 session 把所有 agent 原始輸出 verbatim append 到 §8(SSOT raw)。
  3. 主 session 額外合成 §6 Clean Fact-Pack 給 writer。
  4. §6 是 §8 的蒸餾,不是 §8 的替代。§8 缺席 = Stage 1 未完成
  5. 落檔時機 = 收到回報的第一個動作(v7.7):async agent 的 task-notification <result> 一到,先 verbatim 落檔(§8 inline 或 repo 內 sibling raw 檔如 {slug}-research-N.md,兩種 pattern gate 都認),才准做任何合成/蒸餾。「先摘要待會再補」=柯智棠病(見 §鐵律 8)。
  6. 禁 ephemeral 存放(v7.7):session scratchpad、/private/tmp、tasks/*.output pointer 都不是落檔——tmp 是倒數計時的刪除佇列(醫療 report 5 份 raw 就是這樣永久蒸發的)。raw 唯一合法的家在 git 內。

1.7.3 HARD GATE:research-report-health.py 🔬

python3 scripts/tools/research-report-health.py reports/research/YYYY-MM/{slug}.md --tier=depth

驗收(depth tier):distinct 來源 ≥ 25 / 英文來源 ≠ 0(理想 ≥ 5)/ 一手來源 ≠ 0(理想 ≥ 5)/ 有搜尋日誌 section / 信度標記 ≥ 8 / 行數 ≥ 300 / §8 raw 有效密度 ≥ 120 行(v2 HARD — inline 行數+指向存在的 repo 內 raw 檔行數合計,單檔楊德昌型與分檔金曲獎型都認)/ ephemeral pointer = 0(v2 HARD — §8 指 /tmp 或 scratchpad 直接 FAIL)。hard_fail > 0 = 不進 Stage 2(回去補搜尋 + 把原始軌跡寫回 SSOT)。儀器化背景:把 §Step 1.1 的 4 條來源配額從 aspirational 變可量測(REFLEXES #15);v2 兩條把 §鐵律 8「orchestrator aggregate-on-receive」從紀律變閘門——柯智棠病例(§8 = 9 行 pointer 指 scratchpad)在 gate v1 是 PASS,v2 是雙 hard fail。v2.1 疑慮通知層:每條 fail/warn 附「為什麼+思考方向」給呼叫 session 決策(--jsonconcerns[]);上游每份分部報告另有收件 gate agent-report-health.py(Step 1.8-bis 步 2,收到就跑、FAIL 不准合成)。

好處REFLEXES #22 raw 永遠不刪 + MANIFESTO §造橋鋪路):

  • Audit trail / 跨文 re-use / agent prompt tuning 樣本 / 時間切片對照(同舊版)
  • + SSOT:reader callout 質疑某 claim → 直接在 §7 Verification Table + §8 raw 追到當時逐字來源,不用重搜

存檔責任:Stage 1 主 session 在 agent 回傳後同一個 response 內寫 §1-§8 完整檔 + 跑 research-report-health gate,不 defer。raw §8 缺席或 gate hard_fail = Stage 1 未完成。

讀取責任:Stage 2 Write 開始前,grep reports/research/ 看有無相關主題報告可 cross-reference。Writer agent 讀整份 research report(§6 fact-pack + §8 raw verbatim 全部)——§6 只是 navigation aid,不是 writer 的唯一食物(v7.4 修正,per §多 agent 編排鐵律 2;本行原寫「只吃 §6」是 v6.3 殘留,2026-07-05 對齊)。

Step 1.7 附:reports/ 頂層 ad-hoc report 命名 convention(2026-05-27 新增)

⚠️ 本附則約束 Stage 1 research report 以外 寫到 reports/*.md 頂層的 ad-hoc 報告(design / plan / analysis / audit / evaluation / evolution / proposal / ops / semiont-analysis 等)。Stage 1 research report 維持 reports/research/{YYYY-MM}/{article-slug}.md 格式不變。

觸發:reports/reports-archival-audit-2026-05-27.md §4 Layer 2 — 113 個頂層 ad-hoc report 命名整齊但 prefix 自由式,9 type bucket 規律僅 corpus 萃取存在,未升 canonical 規範。

命名格式(推薦)

{type}-{topic}-{YYYY-MM-DD}.md

9 type bucket(從 corpus 萃取 + audit §2.3 規範 + scripts/tools/generate-reports-index.py plugin gate):

Type 用途 範例
design 設計提案 / 系統設計 become-boot-mode-design-2026-05-13.md
plan 執行計畫 / orchestration / planning historic-districts-series-planning-2026-05-21.md
evolution 進化計畫 / roadmap / spec homepage-evolution-2026-05-26.md
analysis 數據分析 / investigation / deep-research / discussion ai-crawler-404-analysis-2026-04-18.md
audit 體檢 / snapshot / hygiene 盤點 reports-archival-audit-2026-05-27.md
audit-routine Routine 自動產出的 audit(routine-audit / sense / heartbeat / homepage-evolution / self-evolve-weekly) routine-audit-2026-05-27.md
evaluation A/B test / fit-check / POC / 模型評估 editorial-v6-ab-test-2026-05-09.md
proposal 提案 / strategy(要哲宇拍板的) 2026-election-evolution-proposal-2026-05-27.md
ops 操作報告 / triage / handoff / fix(unmatched fallback) issue-1059-triage-2026-05-21.md
semiont 其他組織 semiont-analysis(NMTH / TFT / PanSci / NML / ThinkingTaiwan) PanSci-semiont-analysis-2026-05-18.md

規則

  • 新加報告先過命名 check:寫到 reports/*.md 頂層之前先想「這屬於哪個 type bucket」。命中 → 用對應 prefix;命不中 → 用 ops fallback
  • 不搬既有檔:113 個既有頂層 *.md 維持原命名(per audit §3「不搬家成本太高 / 239 references」)。本規範只約束新加 report
  • subdir 不受規範約束reports/research/{YYYY-MM}/{slug}.md 用 article-slug;reports/probe/YYYY-MM-DD.mdreports/weekly/YYYY-MM-DD.md 用 date;reports/ab-tests/reports/music-media-audit/reports/translation-research/reports/harvest/ 各有自己 convention,皆健康
  • type 增加 SOP:若實際寫作出現第 10+ type,先 append audit report §4 Layer 2 規範 → 同步加入 scripts/tools/generate-reports-index.py TYPE_BUCKETS regex
  • 歸檔自動分桶:每日 06:00 + 23:00 bash scripts/tools/refresh-data.sh Step 13 跑 generate-reports-index.py 自動 regen reports/INDEX.md,按 9 type × 月份 雙軸索引

為什麼這條 convention

  • 9 type bucket 不是 top-down 設計,是 113 file corpus 真實規律的命名(per audit §2.3 regex distribution)
  • 對未來自己最大幫助:grep reports/*-design-* 找 design / reports/*-audit-* 找 audit,~90% noise reduction
  • 對 fork Taiwan.md 的人最大幫助:copy reports/INDEX.md + scripts/tools/generate-reports-index.py 立刻有同樣的 observability

反例(避免):

❌ 2026-election-evolution-proposal-2026-05-27.md  # double-date prefix 冗餘
✅ election-evolution-proposal-2026-05-27.md       # 單 date suffix

❌ P1-batch-repair-2026-05-13.md                   # tier-letter prefix 是 internal label 不對外
✅ ops-p1-batch-repair-2026-05-13.md               # ops 是 routine ops report

❌ daily-heartbeat-2026-04-11.md                   # heartbeat 是 routine 名稱不是 type
✅ audit-routine-heartbeat-2026-04-11.md           # audit-routine 更明確

Step 1.8: Spawn agent 選型 🤖

Stage 1 spawn 研究 agent 時,必須先判斷需不需要直接落檔

Agent 類型 Write 權限 適用情境
Explore ❌ read-only(系統強制) 純 research、結果回主 session 由主 session 落檔
general-purpose ✅ 有 Write 需要 agent 直接寫入 reports/research/YYYY-MM/

判斷流程

  • 研究量大(50+ URLs、需要長篇結構化輸出)→ 用 general-purpose,prompt 明確要求「直接寫入 reports/research/YYYY-MM/{slug}.md
  • 研究會回到主 session 處理 → 用 Explore(較專精、較便宜)

歷史教訓

  • feedback_agent_writefile_hallucination memory:「agent 說自己不能寫檔是幻覺」對 general-purpose 成立,對 Explore 不成立——Explore 真的 read-only
  • 2026-04-20 吳哲宇 EVOLVE 第一次 spawn Explore 要求寫檔、被退回、改 spawn general-purpose 成功
  • spawn 之前先確認 agent type,省一輪來回

Step 1.8-bis: Async agent 時代的 raw 保全 SOP(v7.7,2026-07-05)⚠️

Claude Code 改版後 agent 預設 async 啟動:spawn 的 tool result 只回「launched successfully + output_file 路徑」,真正的回報以 task-notification <result> 送達,output_file 指向 tasks/*.output(→ subagent transcript symlink,隨 session 清理蒸發)。這改變了 raw 的存亡結構——訊息通道與 tmp 都不可信任,唯一可信的是 repo 內的檔案

強制三步(每個研究 agent、每次):

  1. Prompt 要求 agent 自己落檔(雙保險上半):general-purpose agent 的 prompt 加一句「先用 Write 把完整回報寫到 reports/research/{YYYY-MM}/{slug}-research-{X}.md,再把同樣內容當 final message 回傳」。agent 寫檔成功 → raw 已在 repo,訊息通道只是副本。

  2. 收件 gate:notification 到手先落檔、跑儀器、再合成(雙保險下半,v7.8 儀器化):主 session 收到 task-notification 的第一個動作是確保分部報告在 repo 路徑(agent 沒落檔 → 把 <result> verbatim 寫進該路徑,一字不改),然後跑:

    python3 scripts/tools/agent-report-health.py reports/research/{YYYY-MM}/{slug}-research-{X}.md --claimed {該 agent 的搜尋配額}

    儀器驗六件事(存放位置 / 體積 8KB 分界 / 軌跡 section / 軌跡 ≥10 行 / 宣稱 vs 記錄比 / 五段結構),每條疑慮附「為什麼+思考方向」。FAIL = 不准開始合成 §6(先照思考方向救 raw:notification 原文 → subagent transcript → SendMessage 要求補報);CONCERN = 可續行但 orchestrator 回報必須明示每條處置。閾值由 2026-07-05 真實 corpus 校準(壓縮版 5-6KB/軌跡 2-9 行 vs 真 final 14-38KB/13-62 行,兩側 ≥2x margin);非搜尋型 agent(persona / verifier)用 --min-kb --min-trail 調整或免跑。

  3. Gate 收口:組完 report 跑 research-report-health.py——§8 有效密度 + ephemeral pointer 兩條 v2 hard gate 會攔住任何漏網,v2.1 起每條 fail/warn 同樣附疑慮通知(見 Step 1.7.3)。

反例(附給 sub-agent prompt 用,anti-example beats rule):2026-07-05 柯智棠 EVOLVE——prompt 寫對了(「絕對不要自己摘要濃縮,raw 全留」)、4 隻 agent 全照做(各回 ~20KB 逐條軌跡,實測 224 次 web 操作),orchestrator 收到通知後卻把每份壓成 ~6KB 主題摘要存 scratchpad,report §8 剩 9 行。斷點不在 agent、不在 prompt,在 orchestrator 收到之後的 30 秒

Step 1.9: 媒體素材研究 🎬

Stage 1 結尾必跑(除非 hub / 短修正)。蒐集媒體素材 + 授權檢查 + manifest 落 research 檔末尾。

Step 1.9.0: 深度媒體掃描協議(HARD,v6.8)🔍🎬

v6.8 新增(2026-06-07 哲宇 directive「媒體完整度低標提升」):媒體完整度是素材挖掘深度問題,不是素材有無問題。複雜生活節 worked example——同一個 niche 主題,curl / WebFetch 抓圖全 404 → 一度 text-only ship;改用 Chrome MCP 驅動瀏覽器讀 rendered DOM 後,9 圖 + 3 官方影片全挖出來。「找不到媒體」這個結論在跑完本協議之前不成立。

強制兩段掃描(出任何「找不到 / 不勉強塞 / text-only」結論之前必跑)

  1. Chrome MCP rendered-DOM 圖片掃描 — Medium / FB / 官網 / 機構新聞稿頁是 JS-render,curl / WebFetch 取不到圖片 CDN URL(miro.medium.com 等被 JS 包住):
    • list_connected_browsersselect_browsertabs_context_mcp(createIfEmpty)
    • navigate 到來源頁 → javascript_tool 跑 scroll-through 觸發 lazy-load + [...document.querySelectorAll('figure img')].map(i=>({src:i.currentSrc||i.src, cap:figcaption})) 取 rendered img.src + 圖說
    • 下載 hi-res(miro 改 resize:fit:2000)→ sips 優化 + 清 EXIF → cache public/article-images/{cat}/ → fair use editorial commentary 標註(per Step 1.9.2 第 8 點)
  2. YouTube 官方頻道影片掃描navigateyoutube.com/results?search_query={主題/人物/創辦人/機構}javascript_toolytd-video-renderer 的 videoId + channel → 篩官方頻道(藝人/廠牌/節目方/機構/政府單位,如 教育部青年發展署 / TEDxTaipei / 數位時代 / 公視)→ Step 4.3.6 iframe embed

落檔:掃描結果(找到的 URL 清單 + negative finding「跑過深掃仍無 X」)寫進 research report §6 媒體 manifest。跑過深掃後真的無官方媒體 → 才可走 image-only / text-only,並在 §6 明記 negative finding(不是省略掃描)。

為什麼是 HARD:text-only / media-poor ship 過去多半不是「真沒素材」,是深掃沒做(curl 失敗就放棄)。把深掃變必經 = 把媒體完整度的低標從「有沒有順手的 CC 圖」提到「有沒有挖到該有的素材」。儀器化在 image-health(length-scaled hard,見 §Hard Gate Inventory)+ media-richness(≥1 官方影片 WARN for People/Music/Nature)+ paragraph-rhythm(density floor 0.8)三個 plugin;但工具只擋「數量不足」,深掃這個動作本身是 SOP HARD 步驟

Step 1.9.1: inline 外連 manifest(YouTube/影像/音檔)

觸發條件:任何題材敘事中提到有公開影像/音檔/影片的具體作品:

  • 音樂人:歌名 → 官方 MV/lyric video/official audio
  • 電影 / 紀錄片:片名 → 官方預告/導演頻道/串流官方頁
  • 電視劇 / 綜藝:節目名 → 官方頻道/公視+/Netflix 官方
  • YouTube 創作者 / Podcaster:節目名 → 官方頻道
  • 演唱會 / 表演 / 舞作:場次名 → 主辦官方/售票頁/aftermovie
  • 音樂節:節目名 → 官方 lineup
  • 新聞事件:被引用的關鍵公開影片 → 官方 YouTube

URL 優先序:(1) 官方頻道(藝人/廠牌/節目方/導演)(2) 國際串流官方(Spotify / Apple Music / KKBOX)(3) 主辦/策展單位官方頁。不接受搜尋結果頁、UGC 翻唱、二手轉貼。

密度建議:每篇 3-8 inline 外連最合理。少於 3 → 讀者沒得點;多於 10 → 視覺擁擠。

位置建議:作品名在文章中第一次出現時加 link;同一作品再次出現不重複加。

跟 footnote 的分工:inline 外連走「邊讀邊聽/邊讀邊看」的閱讀體驗;footnote 走「來源驗證 + 補充資料」。同一首歌的官方 MV 可以同時放 footnote(給研究者)+ 文中第一次提及加 inline link(給讀者)。

跟 Step 4.3.6 iframe embed 的分工(2026-05-17 新增):Music / People 條目可以升級 inline link 到 iframe embed,提高閱讀的多重感受。判準:3-5 首代表作 → iframe(直接內嵌、視覺呼吸),其餘提及作品 → inline link。同篇可並存。詳見 Step 4.3.6 影片 iframe 嵌入

強制動作:研究 agent 額外蒐集「文章預期會提到的所有公開作品」的官方連結,列入研究筆記獨立一節 §inline 外連 manifest。找不到官方版本 → 標 [no official URL found]Stage 2 寫作時不附 link 也不掰連結

Step 1.9.2: 圖片素材(hero + inline 圖)+ 授權矩陣

🥇 選圖第一問:證據層級(2026-06-04 設研院 session 新增) — 在挑授權之前先挑「這張圖讓讀者看到主角嗎」。Tier A 主體成果圖(改造後成果/作品本身/當事人在做那件事)> Tier B 脈絡圖 > Tier C generic 填位圖。機構/設計/產品/作品/工程/事件題材,Tier A 成果圖優先;Tier A 找不到 CC 授權就走下方來源優先序第 8 點 fair use editorial commentary,不要退用 generic CC 填位圖(授權便利不凌駕證據強度)。caption 一旦得寫「示意/非當事/非改造後」= Tier C 警訊,回頭找 Tier A。完整證據層級表 + source 技巧 canonical 在 EDITORIAL §媒體編織 §圖片的證據層級

圖片用途分類

用途 位置 數量 範例
hero frontmatter image: 1 林琪兒 EMU 1692×1691
inline 圖 文中 markdown ![]() 1-2 林琪兒 Expedition 42 + Crew-4 training
OG / 社群分享 derived from hero(/og-images/ auto dashboard 自動生成,不手動處理
spore poster derived(/spore-images/ auto on demand make-spore.sh 自動產,不手動處理

理想數量 — length-scaled 媒體 band(2026-06-04 哲宇 directive 升級,原 2026-05-09「2-3 張圖」是短文 baseline):

媒體總量隨字數縮放,目標 圖+影片 ≈ 1 媒體 / 1.1k 字(含 hero),落在 0.7–1.2 / 1k CJK 健康帶;長文(≥ 7000 字)朝 圖+影片 ≥ 8。短文 hero only(1 張)。富媒體範本(哲宇點名):設研院 5 圖(image-rich)/ 黃魚鴞 3(video-rich,2 官方影片)/ 陳建年 8(multimodal)/ 天下雜誌 6(mixed)。圖跟影片都算媒體——image-rich 或 video-rich 或 mixed 都可達標,不必全是圖。儀器:paragraph-rhythm 密度 band(floor 0.7 / ceiling 1.2 / hard 1.5+median<55)+ media-richness count target(長文朝 ≥8)。完整 baseline 表見 EDITORIAL §媒體編織

  • 2 張:適用於人物文 / 短深度文(hero + 1 scene-mid 視覺呼吸)
  • 3 張:適用於 ≥ 3000 字深度文 / 多時序敘事(hero + 2 scene-mid)
  • 0 張:適用於 Hub 頁(_*.md) / 純架構性條目
  • > 3 張:例外場景才用(如展演紀錄需多角度),避免敘事被視覺打斷

來源優先序(2026-05-09 fair use scope 升級後):

  1. 官方機構釋出 PD(NASA / 政府開放資料 / NMTH)— 完全免授權追問,cache 即可
  2. Wikimedia Commons CC0 / PD — cache 即可
  3. Wikimedia Commons CC BY / CC BY-SA — 必須在文末「## 圖片來源」標 author + license + link
  4. Flickr CC BY / CC BY-SA — 同上
  5. 企業 / 機構官網釋出圖(official press kit / news release / about page)— 標 ©機構 + 用途。對企業文 / 機構文這層通常是首選
  6. 出版社 / 媒體授權圖(哲宇 / Taiwan.md 取得明確授權)— 文末標 © 來源 + 授權範圍
  7. 自拍 / 自製插畫 — 標 © Taiwan.md / contributor name
  8. Fair use editorial commentary(2026-05-09 啟動)— 對「在世藝術家作品紀錄圖」「企業產品圖」「電影海報」「專輯封面」「個展裝置照」走 fair use editorial commentary scope,不需 CC license,標來源 + 單位 + 用途即可
  9. 歷史史料圖無 PD 替代(如 1947 二二八紀錄照)— 同 fair use editorial scope,但要更謹慎查證歷史出處

Fair use 法理依據:17 U.S.C. § 107 + 著作權法 § 65 fair use 四要素:(a) 非商業教育性質 (b) 已發表作品 (c) 引用比例小 (d) 對市場無實質替代效果。

Fair use 用法守則:(i) 一定要 cache 本地不熱連結 (ii) 文末 §圖片來源 完整 attribution (iii) 標明「Fair use editorial commentary on [target]'s work」license type。

絕對禁止

  • 熱連結(hot-link)任何外站圖(Wikimedia / Flickr / 媒體網站)→ 永遠 cache 本地
  • 未授權的攝影師圖(Google 圖片找到的)
  • AI 生成圖片(暫時禁用,紀實 portrait 永遠禁用)
  • GIF / HEIC / BMP / TIFF(須先轉 JPG 才入庫)

🔧 影像後處理 SSOT — image-ingest.mjs(2026-06-13 儀器化,REFLEXES #15 + #30):下載 / magic-byte 格式驗 / EXIF 清除 / 縮放上限 / WebP 轉檔 / size budget 壓縮 / 命名規範 / aspect 護欄 / attribution stub 一條龍,取代手跑 curl + sips。sharp-based(Astro 已帶,cross-platform)。

# ingest 一張(下載→驗→清 EXIF→縮放→轉 WebP→壓到 budget→命名→cache→印 md/§圖片來源/授權矩陣 row)
node scripts/tools/image-ingest.mjs ingest --src <URL|path> --cat <Category> \
  --name <subject>-<topic>-<year> --role hero|inline [--format webp|jpg|png] \
  --alt "具體 alt" --credit "..." --license "..." --source-url "https://commons.wikimedia.org/wiki/File:..."

# check 檢驗 gate(格式白名單 / aspect / size budget / EXIF 殘留)— pre-commit / CI 可掛
node scripts/tools/image-ingest.mjs check public/article-images/{cat}/<name>.webp --role hero

# audit 全站體檢(格式分佈 / 超標 / EXIF 洩漏 / WebP 遷移面)
node scripts/tools/image-ingest.mjs audit [--cat <Category>]

授權仍是 human 判斷,tool 不查授權:研究階段(Step 1.9)WebFetch File 頁逐字引用 license + 落 §媒體授權矩陣;REFLEXES #31 主 session 重驗每張 license(agent / manifest 的 license claim 是線索不是事實),確認後才把 --credit/--license/--source-url 交 tool 入庫。tool 只負責「驗證過的圖 → 乾淨入庫」。

格式規範

✅ JPG (.jpg) — 預設:人像 / 風景 / 紀實照。sRGB / quality 80-90 / 無 EXIF GPS
                hero < 600KB / inline < 400KB
✅ PNG (.png) — 插圖 / 圖表 / 透明背景 logo / 螢幕截圖。8-bit RGBA / < 800KB
✅ WEBP (.webp) — **2026-06-13 起新媒體預設**(`image-ingest --format webp` source-level 轉檔;Astro passthrough 直送,瀏覽器全支援。既有 jpg/png 待全站遷移 roadmap)
✅ SVG (.svg) — vector logo / 簡單插圖。< 50KB / 無外部 reference / 文字 outline
❌ GIF / HEIC / BMP / TIFF — 禁用

命名 conventionpublic/article-images/{category-lower-kebab}/{subject-slug}-{topic}-{year}.{ext}

範例:

public/article-images/people/lindgren-emu-2014.webp
public/article-images/people/lindgren-crew4-training.webp
public/article-images/history/twenty-eight-incident-monument-2025.jpg

規則:全 lowercase / kebab-case / 必含 subject-slug + topic + year / ext 副檔名

Aspect ratio 護欄(避免 Astro 16:9 框切到頭,林琪兒 ι session 教訓):

圖種 推薦比例 推薦尺寸 理由
hero(frontmatter) 16:9 或更寬 landscape 1600×900 / 2000×1200 Astro 16:9 框直接 fit
inline 圖 可 portrait 但 ≤ 4:3 高比 1200×900 / 1500×1000 markdown ![]() 框較寬鬆
1:1 方形 接近方形 1:1 ± 10% 1600×1600 hero 也接受(如 EMU 1692×1691)
絕對禁止 hero 9:16 portrait(高 > 寬 1.5x 以上) Astro 一定切到頭

強制檢查:image-ingest ingest 入庫時自動報 aspect(亦可 image-ingest check <file> --role hero 或舊 check-aspect.sh 單跑)。Hero aspect 必過 0.9 ≤ ratio ≤ 2.0;inline 必過 0.75 ≤ ratio ≤ 2.5。不過 → 換圖(不要強塞,tool 不自動裁切,裁切是編輯判斷)。

Step 1.9.3: transcript 素材

來源類型 處理方式
公視/TaiwanPlus/官方 YouTube 訪談 yt-transcript.py fetch(抓字幕 + 清逐字稿一條龍)→ 落 reports/research/YYYY-MM/{slug}-transcripts/ → footnote 引 YouTube URL
Podcast 官方頁 footnote 引 podcast URL;若有 transcript 公開 → cache transcript
自製訪談錄音 不公開原始錄音;只引 verbatim 段落,footnote 註明「Taiwan.md 自訪談 YYYY-MM-DD」

工具(2026-06-27 儀器化,REFLEXES #15 + §造橋)— scripts/tools/yt-transcript.py:給 YouTube URL → yt-dlp 抓字幕 → 清成連續逐字稿 + 每 ~60s 一個 [MM:SS] 錨點(腳註可精確標時間,如「塞掐 E350 @ 12:34」)→ .vtt(raw 永留證據鏈)+ .txt(可讀版)落 reports/research/YYYY-MM/{slug}-transcripts/。取代手跑 yt-dlp + 臨時清時間戳/dedup。

# 一支或多支訪談抓進文章研究資料夾(預設 zh-TW,en;--month 預設今月)
python3 scripts/tools/yt-transcript.py fetch <URL> [<URL> ...] --slug {article-slug}
# 已手抓好的 vtt 單清
python3 scripts/tools/yt-transcript.py clean path/to/file.vtt -o out.txt

⚠️ auto-caption 專名誤植鐵律:自動字幕對人名/論文/機構/數字常誤植(紀懷新 case:季懷新→紀懷新、Danny→Denny Zhou、Information Forging→Foraging、Daniel Cunningham→Kahneman)。逐字稿是線索不是定本,引用前每個專名對權威源校正,別逐字照抄(MANIFESTO §10 幻覺鐵律 + §挖引語紅線)。底層仍是 yt-dlp(brew install yt-dlp)。

Step 1.9.4: 媒體授權矩陣三表(research 檔強制)

每篇 depth article 的 research 檔末尾 append:

## 媒體授權矩陣

### inline 外連(YouTube/影像/音檔)

| 作品      | 第一次提及位置                              | URL                                         | 來源頻道          | 授權             |
| --------- | ------------------------------------------- | ------------------------------------------- | ----------------- | ---------------- |
| 〈Cazzo〉 | L346「2019 年 6 月 28 日,她以『?te』之名」 | https://www.youtube.com/watch?v=CM-6FJlYHI4 | 華風數位 official | YouTube standard |

### 圖片素材

| 媒體檔                | 用途 | 來源 URL                                                                    | 授權                 | 攝影者/作者        | 拍攝日期   | NASA Image ID / Commons File             | 本地 cache 路徑                               | alt text                                  |
| --------------------- | ---- | --------------------------------------------------------------------------- | -------------------- | ------------------ | ---------- | ---------------------------------------- | --------------------------------------------- | ----------------------------------------- |
| lindgren-emu-2014.jpg | hero | https://commons.wikimedia.org/wiki/File:Kjell_Lindgren_in_EMU_(cropped).jpg | Public domain (NASA) | NASA/Bill Stafford | 2014-08-27 | File:Kjell*Lindgren_in_EMU*(cropped).jpg | /article-images/people/lindgren-emu-2014.webp | 林琪兒 2014 年穿艙外活動服(EMU)官方人像 |

### 引用 transcript

| Transcript     | 來源                   | URL                                         | 落檔路徑                                                      |
| -------------- | ---------------------- | ------------------------------------------- | ------------------------------------------------------------- |
| 公視訪談 zh-TW | 公視新聞網 official YT | https://www.youtube.com/watch?v=f9DQuQ8EwVE | reports/research/2026-04/林琪兒-transcripts/transcript-zh.txt |

Step 1.9.7: persona 讀者缺口稽核 + 增補(v7.7 新增,persona 從 Stage 0 搬來)🫂

v7.7(2026-07-06 施振榮):persona 20 路讀者切入點從 Stage 0(原 0.6.1-bis)搬到這裡——研究報告 SSOT 組完之後、Stage 2 寫作之前。角色從「發散定調」改成「讀者缺口稽核 + 增補」。設計:reports/design-立體群像...

觸發:所有 depth article(Micro / heal / 純翻譯不跑)。前提:Step 1.7 研究報告 §6 fact-pack 已組好、Step 0 立體觀點已成形。

呼叫(完整 contract + 20 archetypes + 4-agent 平行見 PERSONA-PIPELINE):

call PERSONA-PIPELINE:
  subject_brief: 題目 brief + 研究報告 §6 fact-pack + §觀點成型(給 persona 讀,不是冷 brief)
  mode: gap-audit          # v7.7 新 mode:對已成形的立體畫像補洞,不是冷發散定調
  profile_set: default 20

每個 persona 問的(跟舊 research-diverge 的差別):不是冷讀者的第一反應,是「看完這份研究後,我這種讀者還想知道什麼?哪個我在意的面向沒被 cover?」。20 顆讀者腦袋在一張已成形的立體畫像上找洞。

輸出處理(三分類 + 一個閥門)

  1. 🆕 真缺口 → 起 targeted 增補搜尋(補這個 facet 的事實/場景/引語),把 finding 加進 report §3/§6。增補後 report 變了,Step 1.9.5 收尾前重跑 research-report-health gate
  2. 已 cover → 記錄不重複。
  3. 超 scope → 落 rationale.whats_excluded
  4. 🔴 反向閥門(立體 ≠ 迴避的自我糾正):如果 persona(尤其 D 軸挑硬傷/反方)揪出「這篇立體群像其實洗掉了一個真該被尖銳處理的公共爭議」→ 回 Step 0.1.5 重判:要不要把那個爭議升成一個 substantial facet,或(罕見)解鎖矛盾驅動主脊。這條讓立體 default 不變擋箭牌。

為什麼放這裡而不是 Stage 0:冷讀者天生問尖銳問題,放搜尋之前 → 尖角變研究方向 → 脊椎被推向矛盾驅動(施振榮 v1 教訓)。放研究後,同一句尖問變「要不要補一個 facet」而非「整篇該不該講這個」——從定調變補洞,且剛好接住 persona 誕生的 use case(《看不見的國家》ship 後哲宇追問三題=完成度缺口,正該 ship 前被稽核接住)。

Cost guard:4 Sonnet agent 短輸出(reuse-from-report 優先);下游 caller(SPORE hook-select)reuse 同一份 persona pool,見 PERSONA-PIPELINE §4-5

落檔:research report §讀者缺口稽核(20 persona × 分類 + 增補了什麼 + 反向閥門判斷)。

Step 1.9.5: Stage 1 收尾 checklist

Stage 1 結束時 deliverable:

  • 核心矛盾欄位必填(Step 1.4)— 填不出來 → 不進 Stage 2
  • depth-article 研究報告必存(Step 1.7)— reports/research/YYYY-MM/{slug}.md 不存在 → 不進 Stage 2
  • 媒體授權矩陣三表 append 完成(inline 外連 / 圖片 / transcript)
  • 圖片已 cache 在 public/article-images/{category}/
  • Aspect ratio 護欄通過(hero 0.9-2.0 / inline 0.75-2.5)
  • Transcript 已 cache 在 reports/research/YYYY-MM/{slug}-transcripts/
  • 私有 SSOT 整合過 Step 1.6 觀察者拍板(如有觸發)
  • Frontmatter audit 完成([STUB-TITLE] / [NO-MEDIA] 標籤)— EVOLVE 才必跑

沒過 = 不進 Stage 2。


Stage 2: 寫(預算 40-45%)

v6.3 預設:depth EVOLVE / Fresh 的 Stage 2 派 fresh Opus sub-agent 寫(context 隔離,見 §多 agent 編排)。主 session 只把 clean fact-pack + 觀點 + EDITORIAL 交給 writer,不轉貼舊文 prose。Micro / 短修正才主 session 自寫。

必讀cat docs/editorial/EDITORIAL.md(全文,1000+ 行,不可截斷

⚠️ 歷史教訓(session δ 2026-04-05):之前這裡寫 head -300,切掉了 Line 380-479 的 Before/After 範例段落。AI 讀到規則卻沒讀到範例,寫作時退化為編年史。

不要用 head / tail 截斷「必讀」指令。完讀後必須回頭檢查四個段落:§挖引語制度、§小標題規範、§結尾的四種模式、§Before/After 實例對比。

輸入:Stage 1 研究筆記 + EDITORIAL.md。

視覺化必讀(含資料 / 對比 / 時序的文章):cat docs/editorial/graph.md(型錄 + 模組語法 + AI 可讀性 + 檢查清單)。

Step 2.0: 視覺化思考(v6.8 新增)💭📊

借 The Pudding「問題先於資料」:寫之前掃過 fact-pack,問三題(不是強制加圖——沒有適合的資料就誠實不加,記 research report):

  1. 這篇有哪些「資料關係」(比較 / 排名 / 比例 / 分布 / 趨勢 / 流向 / 單一大數字 / 質性對比)密集到讓 prose 變數字堆疊?
  2. 每個密集點,graph.md §型錄 哪個 tw-* 模組最適合?(一圖一重點:一個關係一張圖)
  3. 這張圖的 annotation 要寫什麼「為什麼重要」?(不是裝飾,是策展觀點)

產出:在 research report §觀點成型 或 fact-pack 標「視覺化候選清單」(哪段 → 哪個 tw-* → 想講的重點 → 來源)。Writer agent 吃這份清單,把密集數字段升級成模組(語法見 graph.md §四)。

指標(viz 不是越多越好,避免 chartjunk):depth 文至少評估過 1 個候選(可記「評估後不加 + 理由」);資料圖表模組 100% 標來源(viz-health gate);viz 密度跟 media band 共管(paragraph-rhythm)。「讓 LLM 讀得懂的視覺化 = 主權的視覺化」——禁圖片型/D3/Canvas viz、禁「如上圖」AI-blind 指示語。 設計脈絡reports/article-visualization-design-2026-06-06.md

Step 2.1: 載入 EDITORIAL.md

讀全文,特別注意 §來源引用、§小標題規範、§敘事呼吸感、§Title 強制冒號三明治(v6.3 全 category)。

Step 2.2: 結尾先行(3-5 行)← 最重要

結尾先行是 Stage 2 防崩潰的核心:

Step 2.3: 開場 + 30 秒概覽

開場前三句必須有:具體事實 + 具體的人 + 具體的時刻。

30 秒概覽(blockquote 格式 > **30 秒概覽:**)放在 H1 之後、第一個 H2 之前。

Step 2.4: 小標題先行(hard 規則)

列出全文 5-8 個小標題 BEFORE 寫正文。鐵律:

規則 例子
❌ 禁止編年體標題 「2016 年《XX》發行」「2020 金曲 32」— 這讓文章變成維基百科時間軸
❌ 禁止問句標題 EDITORIAL §小標題規範
✅ 用場景/意象/衝突 「陽明山的草東街」/「派對結束了」
✅ 用具體物件/quote 「凡凡的狗叫土豆」「那張 2,000 張的手工 CD」
✅ 用核心矛盾 「向外憤怒與向內修補」「沒被認出的金曲歌后」

驗證:把 5-8 個小標題念一遍,如果像「第一章、第二章」就是編年史失敗。重來。

plugin gate(D Wave 1)article-health.py --check=chronicle-lead 偵測 ^##\s*\d{4}\s*年 開頭小標題。HARD violation = 不過 Stage 4。

Step 2.5: 寫正文 + footnote

不按百科排列。EDITORIAL §正文架構推薦:起源 / 關鍵轉折 2-3 個 / 現況 / 爭議 / 意義

  • 邊寫邊插 [^n] footnote(從 Stage 1 的事實 - 來源配對表對應)
  • 不是一段寫一張專輯 — 是一段寫一個論點轉折,事實散布在論點之中

文末寫 footnote 定義

腳註格式 canonical 在 CITATION-GUIDE.md。簡寫範例:

[^1]: [來源名稱](URL) — 詳細說明文字(≥ 20-30 字描述出版背景、內容特色、歷史價值)

完整格式 + 對比範例 + 「不要寫『同上』」規則 → CITATION-GUIDE.md

Step 2.6: 延伸閱讀

  • 讀取 knowledge/ 目錄,找出相關文章
  • 每篇加「一兩句話描述」說明與本文的關係
  • 格式:標準 Markdown 連結 [文章名](/path/slug)不用 [[wikilink]](Astro 列表項目中的 wikilink 無法渲染)
  • 3-5 條最理想

格式範例:

**延伸閱讀**- [戒嚴時期](/history/戒嚴時期) — 戒嚴令的法源與實施細節
- [白色恐怖](/history/台灣白色恐怖) — 政治案件與人權侵害的歷史
- [二二八事件](/history/二二八事件) — 戰後台灣的重大歷史轉折

Step 2.7: 7 條自檢套件(強制鐵律)

寫完 prose 後強制跑這 7 條自檢。任何一條不過 = 回去修。

Step 2.7.1: 歐化語法自檢

念出來,聽到翻譯腔就改:

Step 2.7.2: prose-health plugin gate(對位句型 + 破折號 + AI metaphor 全交給工具)

寫到 60% 時或寫完 prose 後,直接跑 plugin,不要手 grep。

python3 scripts/tools/article-health.py knowledge/{Category}/{slug}.md --check=prose-health

plugin 抓 12 dim 塑膠 + 3 tier 對位句型(含「不是 X,是 Y」「不只 X 更是 Y」「並非 X 而是 Y」全部變種)+ 30+ AI metaphor + 17 ritual 句 + 破折號密度。每條 violation 含 line + 前後文 snippet + fix suggestion,可直接定位修正。

閾值(per MANIFESTO §11):

  • 對位句型「不是 X,是 Y」+ 變種:≤ 3 處
  • 破折號 ——:≤ 15 / 1500 字(plugin 用比例計算)
  • prose-health score:≤ 3 為 pass

為什麼禁用手 grep(REFLEXES #15 self-apply):

  • plugin 抓的 pattern 比 manual regex 全(含 7-9 種對位變體)
  • plugin 有精確 line + 前後文,可直接 jump-to-fix
  • 「反覆浮現的思考要儀器化」原則 self-apply — 自己手 grep 是繞過 SOP,每次跑 plugin 累積進化(觀察者 2026-05-11 admiring-montalcini callout)

歷史教訓:2026-04-10 國防現代化一寫就到 29 個破折號,事後逐個刪很痛;plugin 在中段 60% 時抓出來,比寫完痛苦回頭便宜 10x。

Step 2.7.3: 編年體自檢

寫完後念一遍所有小標題

  • 如果每個標題都是「年份 + 事件」= 編年體失敗,重寫小標題
  • 如果文章每段都在講下一張專輯/下一個事件 = 維基百科化失敗

plugin gatearticle-health.py --check=chronicle-lead(regex 偵測,HARD)。

Step 2.7.4: 密度平衡自檢(EVOLVE 長文專用)

研究素材豐富(50+ sources)時強制跑

隨機挑三段連續段落念一遍:如果三段都是事實堆疊、沒有一句讓讀者喘氣的話 = 密度失衡。

三個修正手勢(詳見 EDITORIAL §密度平衡):

  1. 量化內化為場景:不寫「196 sessions / 50 學生」→ 寫「有個學生叫 Kasper 跟了整整兩學期」
  2. 列表拆成場景:整年六件事不擠一段,拆出 1-2 個完整場景,其他用連續性語言帶過
  3. 每 2-3 段一句策展人的聲音:呼吸句不傳遞資訊、只製造停頓

來自 2026-04-20 吳哲宇 EVOLVE 實戰:50+ sources 的第一版 prose 5500 字被觀察者評「資訊多到蓋住敘事」,重寫縮到 4800 字但讀起來更開闊。長文不是孢子的加長版,需要主動選擇留白

Step 2.7.5: Agent claim 驗證

agent 在研究報告中聲稱的「XXX 背書」「XXX 公開推薦」等名人相關 claim,必須有具體公開 URL + 該 URL Ctrl-F 可搜到該人原始引語

  • 三源交叉不是「三個不同 agent 都這樣說」——是「三個獨立的公開 URL 都有逐字引語
  • agent hallucination 常見模式:基於 Obsidian / 私有素材的側面提及「推導出」一個名人 claim,但外部 URL 其實沒有該人的任何公開發言
  • 2026-04-20 實戰:agent 聲稱「張隆志館長背書」「唐鳳為 Taiwan.md 引薦」,主 session 回頭驗證——兩者均無外部公開引語。(用語紀律補註:館長的實際立場是公開「支持」這個計劃;任何書寫一律用「支持」不用「背書」,哲宇已多次更正)

自檢問句:「這個 claim 如果我是陌生記者,能不能只靠公開資料寫進我的報導?」能 → 可寫;不能 → 降級或刪。

Step 2.7.6: Title + description spine sync 🥪 🔴

特別強化:所有 article(含 EVOLVE focused section addition)寫完 prose 後必須回看 frontmatter title + description,三題自檢:

  1. 冒號三明治測試 — title 是否走「主題:副標 hook」格式?單純名詞 stub(台灣無人機產業 / 颱風 / 周杰倫)= 百科風格,需升。對照 EDITORIAL §Title 強制冒號三明治(所有 category) v6.3 — 不限 People,全 category 強制
  2. 副標獨立成立測試 — 冒號後一句能不能單獨 tweet 出去?讀者只看到副標也能停下來嗎?
  3. EVOLVE spine sync 測試 — 這次 EVOLVE 加的新節核心矛盾,是否已寫進 description?舊 description 還適用嗎?description 沒吃進新核心 = SC 顯示舊 hook 但讀者點進來看到新內容 = 落差
  4. 文字感 + 負面/草率掃描 🆕(v6.5)— 標題有沒有報導者腔的文字感(具體人/地/物 + 張力 + 留白)?有沒有踩中文語境紅線(網路輕佻「搞/爛/雷/翻車」、農場「震驚/竟然/真相是」、負面定調「崩壞/淪陷」、自貶 dismissive、過度賣弄)?一句判準:念給長輩聽像「認真報導」還是「網路八卦」?canonical + 18 範例 gallery 在 EDITORIAL §Title 的文字感

任一答 no → 重寫 frontmatter title + description,跟 prose 同 commit

對照組

❌ 台灣無人機產業(百科 stub)
✅ 台灣無人機產業:從台中玩具飛機到藍色清單,一張入場券給了雷虎

❌ 颱風(百科 stub)
✅ 能預測風雨,預測不了命運:台灣與颱風的四百年

❌ 颱風假
✅ 颱風假:誰的假,誰的班

例外(保留 stub 名):

  • Hub 頁(_*.md)— 是 nav
  • 系列共名(如 台灣企業:台積電)— 副標 hook 進 description

Step 2.7.7: 媒體素材 spine check 🎬 🔴

特別強化:所有 article(含 EVOLVE)寫完 prose 後 grep 既有 frontmatter:

grep -E "^image:|^imageCredit|^imageLicense|^imageSource" knowledge/{Category}/{slug}.md
ls public/article-images/{category-lower}/ | grep {slug-keyword}
grep -E "^## 圖片來源|^## 媒體授權|^## 圖片授權" knowledge/{Category}/{slug}.md

三條判斷

結果 處置
三項全有 已合規,跳過
三項全無(pre-gate 遺珠) 補跑 Stage 1 Step 1.9 至少 hero 1 張,append §圖片來源 section
Hero 有但 EVOLVE 加的新節主題缺對應視覺 評估是否需補 inline 圖(per Stage 4 Step 4.3.1 三段敘事節奏),找不到 PD/CC 圖記錄邊界(不放空)

為什麼必須

  • Stage 1 Step 1.9 的 hard gate 是 2026-04-28 才升(v6.0 重編號前為 Step 1.14),更早 ship 的 article 多為 pre-gate 遺珠
  • focused EVOLVE 加新節時容易忽略「既有 article 的媒體狀態」— 假設「上次 ship 已合規」,但 pre-gate 條目實際無 hero
  • 找不到合適 PD/CC 圖時不可放空 → 走 fair use editorial commentary scope(per Step 1.9.2 第 8 點)或記錄 search 邊界

Step 2.8: 富文本 + footnote 密度

每 300 字 ≥ 1 個 footnote(per CITATION-GUIDE)。

富文本元素(per EDITORIAL):

  • 📝 策展人筆記
  • 💡 你知道嗎
  • ⚠️ 爭議觀點
  • ✦ 結尾警句

每 800-1200 字 ≥ 1 個富文本元素,幫助節奏 + 視覺呼吸。

Stage 2 Hard gates(10 條)

寫完 prose 不直接進 Stage 3,先驗:

  • 結尾不是罐頭(per EDITORIAL §結尾的四種模式)
  • 第一個名字是具體的人(前 30 行至少一個 named individual)
  • ≥ 2 句真人引語(人物題材)
  • 因果鏈完整(不是 list dump)
  • 開場具體事實(年/月/日 + 人 + 動作)
  • 富文本達標(每 800-1200 字 ≥ 1)
  • 挑戰編織在故事裡(不是脫離敘事的論述句)
  • 純中文(無漏英文 paraphrase / 翻譯體)
  • 7 自檢全跑(Step 2.7.1-2.7.7 全過)
  • 小標題不像「第一章第二章」
  • word-count ≥ 4500 CJK chars(depth article)

Stage 2.5: source-fidelity gate(來源逐字回溯)— A 級 / fresh-writer EVOLVE 長文 HARD 🔬

v7.6 新增(2026-06-16 哲宇 directive「升級」)。distill 自 LESSONS meta-umbrella stage2-quote-context-collapse(vc=8,8 instance 跨 無名小卒 / 國家太空中心 / 嘻哈饒舌 / 廣告史 / 壞特 / 迷音 / 報導者 / 大鮪鱸鰻)。第一性原理:Stage 2 writer 即使讀了整份 research report,下筆仍會把研究結論 collapse 成偏記憶 / 偏印象 / 偏字面 / 偏未驗證狀態的 claim——Stage 1 SSOT 寫對、Stage 2 寫歪。structure gate(word-count / footnote / image / viz)全綠 ≠ 事實對;只拿成品比對 research report 也不夠(report 本身可能不全,或 writer 長出 report 沒有的東西)。本 gate 在 EVOLVE 主 session 覆蓋 canonical 前 / Fresh ship 前跑,與 Step 3.6 成品總驗互補:3.6 驗「成品內部一致 + 對 report」,2.5 驗「對真實世界的來源」。

三道(任一不過 = 不覆蓋 canonical / 不 ship;已 ship 則 heal + 公開勘誤,per error-boundary-is-traceability):

  1. 來源 artifact 逐字回溯(instance #8 大鮪鱸鰻):文中每個「引用的外部來源標題 / 圖表名 / 報導名 / 截圖文字」不能只信 research report,要實際 fetch 那個來源 artifact(WebFetch 原頁中文逐字 prompt / curl)逐字比對。大鮪鱸鰻 case:標題誤植「大骪鱸鰻」+ 虛構整段「冷僻字」考據,連 4-agent fact-check 都漏,是為了補連結去 fetch 原圖表頁才現形——cross-check claim 不夠,要 fetch artifact
  2. 門面句 scope(instance #6 迷音):collapse 不只在 body prose,更在 frontmatter title + description + 30 秒概覽(讀者第一印象 + 最易被外部攻擊層)。這三處每個事實 / 法律狀態(allegation→fact)/ 專名 claim 單獨過一次——迷音把 sub judice 未定罪指控在標題壓成既成事實(「偷」),內文紀律守住、門面句崩了才出事。
  3. fact-check agent pass(instance #7 報導者):fresh-writer EVOLVE 長文派一輪 fact-check agent(falsification mindset、分簇平行、official 一手 > 媒體轉述),主動查事實 / 幻覺 / 對真人失真指控。報導者 case:6/14 全 gate 綠的 prose 裡藏寶瓶副標幻覺 + 對真人朱亞君「不當行為」失真指控,靠主動 4-agent 查核才抓到——gate 驗結構,agent 驗事實

觸發:A 級 / 大眾文 / fresh-writer EVOLVE 長文 / 含引用外部來源標題或圖表 / callout-triggered。輕量 Fresh 或無外部引用的短文至少跑第 2 道(門面句)。


Stage 3: 驗(預算 15-20%)

必讀cat docs/editorial/QUALITY-CHECKLIST.md

流程:嚴格按照 QUALITY-CHECKLIST.md 逐項執行。包含 5 大步驟。

Step 3.1: 五指 + 結構 + 塑膠 + 算術

  1. 五指檢測(手動 60 秒)
  2. 結構驗證(逐項打勾)
  3. 塑膠掃描(手動 90 秒,重點掃後半段)
  4. 自動驗證(quality-scan ≤ 3 + build)

⚠️ 不合格 = 不 commit。修正後從 QUALITY-CHECKLIST.md 重新驗證。

Step 3.2: 事實鐵三角(強制鐵律)

來源:李洋文章 + 孢子 #28 同時犯三層事實錯誤(金額兩千萬→一千萬、單位三十六萬→三千六百萬、杜撰引語從英文回譯)被觀察者撤回的教訓。

Step 3.2.1: 算術自檢

寫完含金額/百分比/比例的段落,必須做算術自檢

寫的句子:「兩千萬剛好是他存款的三成」
算術驗證:2000 / 3401 = 58.8% ❌(不可能是「三成」)
紅旗:金額一定有錯

規則:每一個「X 是 Y 的 Z 成」「比 X 多 Y」「等於 X 倍」這類數字關係必須在心裡或用 python3 算一次。算不通 = 至少有一個數字錯。

Step 3.2.2: 金額單位念出來

寫完含金額的句子,必須念出來檢查單位

寫的句子:「一筆三十六萬負債的房貸」
念出來:「三十六萬」聽起來像月薪等級 ❌
真實數字:3,638 萬
紅旗:萬位漏字

規則:所有金額念出來,跟「日常生活感」對照。

  • 萬:月薪、單月開銷
  • 百萬:年收、小套房頭期款
  • 千萬:豪宅、企業主資產
  • 億:上市公司、政府預算

如果念出來的數字跟主題的「合理量級」對不上 = 紅旗。

Step 3.2.3: 引語逐字核對

每一個 「XXX」 直接引語格式必須跟原始中文來源逐字核對

寫的引語:「我最早到學校,但跟不上齊麟。」
原始來源:《少年報導者》中文網頁
Ctrl-F 搜「我最早到學校」→ 搜不到 ❌
紅旗:杜撰引語

陷阱來源:WebFetch 對中文網站經常返回英文 paraphrase 而非中文原文。把英文 summary 翻譯回中文當「直接引語」使用 = 杜撰。

規則

  1. 引語格式 「XXX」 是承諾「這是原話」
  2. 任何引語在 commit 前必須能在原始中文頁面 Ctrl-F 搜到
  3. 搜不到 = 改成轉述句式(不加引號),不准用直接引語格式
  4. 詳細紅線見 EDITORIAL §挖引語制度

Step 3.2.4: 三角自檢 checklist(強制)

  • 算術:每個「X 是 Y 的 Z」「X 比 Y 多」都用 python3 算過?
  • 單位:每個金額念出來跟「合理量級」對得上?
  • 引語:每個 「XXX」 都能在原始中文頁面 Ctrl-F 搜到?

任何一項打不勾 = 不 commit,回去修。

Step 3.2-bis: 校正焦慮掃描(correction-meta scan)— callout-triggered 強制 🧱

Step 0.2-bis 拆除防火牆的 backstop。即使前面三條防火牆做了,Stage 2 寫作仍可能漏出校正型 meta。這一關專抓「文章在公開處理自己的勘誤」。

唯一自檢句(逐句 / 逐 box 過一遍)

「如果這篇文章第一次就寫對了,這個句子 / 這個 box 還會存在嗎?」 只為回應過去的錯誤、或為了澄清一個混淆而存在的 →

儀器化掃描(callout-triggered 必跑) — 2026-06-01 已升 article-health plugin:

# correction-meta plugin(取代原 raw grep):抓 9 類校正型句式,回 line + snippet + 自檢句
python3 scripts/tools/article-health.py knowledge/{Cat}/{slug}.md --check=correction-meta
# 或直接跑 Stage 3.5 profile(含 footnote-format + footnote-density + correction-meta)
python3 scripts/tools/article-health.py knowledge/{Cat}/{slug}.md --profile=rewrite-stage-3-5

correction-meta DEFAULT WARN(dual-use 句式 + legacy soft-launch)。callout-triggered EVOLVE 把任何 WARN 視為 must-fix(人/agent 逐條過自檢句)。plugin: scripts/tools/lib/article_health/checks/correction_meta.py

論點脊椎自檢:核心矛盾 / 30 秒概覽 / 結語,是不是在講「歸屬要正確 / 不要搞混 / 名字很重要」這類 meta?是 → 論點被 errata 投毒,回 Step 0.6 重想(這關不過不只是刪句子,是重定觀點)。

Anti-example:影視配樂 v2 的 9 處(Step 0.2-bis 已列)。規則不如反例好記feedback_subagent_anti_example_works)—— 寫到「把 X 掛在他名下其實是錯的」這種句子時,腦中應該浮現「這就是影視配樂被罵的那種句子」。

不過 = 不 commit。 純品質提升的 EVOLVE 不強制此關,但論點脊椎自檢建議跑。

Step 3.3: FACTCHECK Quick Mode(A 級 / 政治敏感 → Full Mode)

本 step 是 FACTCHECK-PIPELINE 的 trigger context。完整 SOP、atom 類型、11 種 hallucination pattern、6 種 drift modes、Phase 1-6 執行細節、checklist 全部 SSOT 在 FACTCHECK-PIPELINE,本 step 不複寫(MANIFESTO §指標 over 複寫 原則)。

對應 MANIFESTO §10 幻覺鐵律

Quick Mode 觸發

REWRITE Stage 2 寫完 prose 後、進 Stage 4 之前,必須跑 FACTCHECK-PIPELINE §Quick Mode

  • 預算:30-60 min(主 session 自跑,不 spawn agent)
  • 範圍
    • 全文 high-risk atom 抽取(引語 + 數字 + 人名 + 獎項 + 地點門牌號碼 + 場景動作 detail)
    • 每個 atom 對 source URL 至少做一次驗證(中文 source 用中文 prompt 要求逐字)
    • citation plugin gate 必跑python3 scripts/tools/article-health.py <article> --profile=rewrite-stage-3-5 — 含 footnote-format(強制 [^N]: [Title](URL) — description canonical 格式)+ footnote-density(hard=0 要求)
    • footnote URL 健康檢查(network-conditional)跑 ARTICLE_HEALTH_NETWORK=1 python3 scripts/tools/article-health.py <article> --check=footnote-url

plugin gate 鐵律(v6.1,2026-05-17 admiring-montalcini):rewrite-stage-3-5 profile 必跑不是建議,是反射。Stage 4 --profile=rewrite-stage-4 不含 footnote-format(profile 分工:Stage 3.5 管 citation health / Stage 4 管 structure),跳過 Stage 3.profile 內 plugin(清單以 --list-checks 為準) gate = CI full sweep(含全 全量 plugin(以 --list-checks 為準))會 hard-fail,本機 Stage 4 卻顯示綠燈 = silent leak through。誕生事件:2026-05-17 臺灣前途決議文 ship 後 CI fail(footnote-format hard=23),主 session 用 --profile=rewrite-stage-4 local 跑全綠就 push,沒跑 rewrite-stage-3-5 因為 pipeline 沒明示 → 推回 Step 3.3 補一個 commit 修 29 條 footnote。對應 REFLEXES #15 反覆浮現要儀器化 + MANIFESTO §10 幻覺鐵律 — 把「該跑哪個 profile」從 SOP 隱性知識儀器化進 pipeline checklist。

觸發 spawn agent 升級為 Full Mode 的條件

  • article tier = A 級(≥ 50 footnotes 或 ≥ 3000 字 或 含直接引語 ≥ 10 句)
  • article 對象為真人且可能引發人權/政治/法律敏感
  • Quick Mode 過程中發現 ≥ 3 個 ❌ HARD-FIX → Quick 不夠,升級 Full Mode 重跑

Stage 3 Hard gates(FACTCHECK-PIPELINE Phase 6 Triage 結果必須)

  • 0 個 🔴 DEAD-LINK(任何 footnote URL 4xx/5xx 都先換源)
  • 0 個 ❌ HARD-FIX(claim 不在 source、引號內 paraphrase、third-person flip 等全部處置完)
  • rewrite-stage-3-5 profile hard=0(footnote-format + footnote-density,v6.1 升級為 Stage 3 hard gate;不是 Stage 4 dependency)
  • ⚠️ SOFT-FIX 數量無上限,但每條都要在 commit message 列出,可 ship 後 polish
  • 每個 ❌ 與 🔴 的修補都 append 到 reports/research/YYYY-MM/{slug}.md § audit section(REFLEXES #22 raw 永留)

為什麼這條 step 是 hard gate 而非 soft

錯誤與幻覺以指數速率摧毀平台可信度。讀者會記得錯誤、截圖到 Threads、引用為「Taiwan.md 是 AI 廢文」的證據;不會記得其他幾百篇正確的文章。寧可多檢查一次,也不要放出連自己都不知道是錯的資訊MANIFESTO §10)。

Step 3.4: Story atom audit(場景級事實對 source Ctrl-F)

對 prose 中每個「場景描述」(具體動作、房號、樓層、影廳代號、設備代號、職稱、場地細節),對 source URL 逐原子 Ctrl-F

  • 例:造山者 EVOLVE 寫「張忠謀電影散場向觀眾鞠躬三次」→ UDN 原報導 Ctrl-F「鞠躬」→ 0 hits → ❌ HARD-FIX
  • 例:「Morgridge Hall 1524 房號」→ 星島原文 Ctrl-F「1524」→ 0 hits → ❌
  • 例:「李國鼎獎頒獎場合用四機補拍」→ gvm 原文 Ctrl-F「四機」→ 0 hits → ❌

這類「沒有引號保護的具體動作 / 場地細節」是 AI hallucination 最隱蔽的 pattern(讀起來像「氛圍描寫」不像「引用」),audit 容易跳過。

唯一可靠的審計:全文逐原子對 source URL Ctrl-F 中文原文。發現 → 刪除或降級為「該領域受肯定」這類概括語言,不保留可能錯也可能對的條目

Step 3.5: Title + description spine sync re-check 🥪

承襲 Stage 2 Step 2.7.6(已在 Stage 2 跑過寫作 self-check)。Stage 3 再 grep 一次做 verify 階段最終 gate:

grep -E "^title:|^description:" knowledge/{Category}/{slug}.md

人工 review:

  • title 冒號三明治?
  • description 吃進核心矛盾?

不過 → 回 Stage 2 重寫 frontmatter。

為什麼 Step 2.7.6 + Step 3.5 兩次跑同條 check(deliberate redundancy)

  • Step 2.7.6 = 寫完 prose 立刻自檢(catch early,趁記憶新鮮)
  • Step 3.5 = ship 前最後 gate(catch leak through,防 Step 2.7.6 被跳過)

兩次 check 是雙重保險,不是重複。Title 三明治是 SC 入口品質 + reader entry framing 的 spine,不能漏。

Step 3.6: 成品總驗三關(assembled-product verification)— A 級/大眾文 HARD 🔍

v7.0 新增(2026-06-10 哲宇 directive,嘻哈饒舌 worked example)。Stage 3.1-3.5 驗的是「寫作中的草稿」;本 step 驗的是「組裝完成的成品」——媒體已插、cross-link 已補、外科手術疊過幾輪之後的最終形態。越大眾的文章效果越好、讀的人越多,檢視的人也越多:成品關卡是對讀者的尊重。誕生事件:台灣嘻哈饒舌 EVOLVE 在 Stage 3.1-3.5 全綠 ship 後,讀者(老莫,文章引用來源作者本人)抓到一處詮釋 gloss 錯誤(寶哥=宋岳庭,實為 MV 導演黃信佳)→ 成品全文原子重驗又抓 3 ❌ + 11 ⚠️。完整 audit:reports/research/2026-06/台灣嘻哈與饒舌發展.md §9

觸發條件(任一 → 必跑):A 級文(≥ 50 footnote 或 ≥ 3000 字或直接引語 ≥ 10)/ 預期高流量大眾主題 / 讀者或專家 callout 後 / 同一篇外科手術(勘誤、補段、補媒體)累積 ≥ 3 輪。

Step 3.6.1: 原子重驗 fan-out(拿成品派 verifier 再查一次)

派 N 個 parallel adversarial verifier(Sonnet)按成品段落分工(不是按研究子題——成品的段落組合跟研究報告的子題切法不同,漏的 atom 就藏在重組的縫裡)。每個 verifier 讀「文章該範圍 + 全部腳註定義」,抽出每一個 atom 逐條 falsify(≥ 2 獨立來源;引語 Ctrl-F;中文站 WebFetch 用中文 verbatim prompt),回報 | line | atom | ✅/⚠️/❌ | 證據 URL | 正確版本 | 表。

草稿驗證(3.1-3.5)放不到、本 step 專抓的四種 drift

  1. 引號逐字 diff:writer 縮寫 quote 或改句型但保留引號(worked example:壞特陳述句被改成反問句、楊舒雅 quote 漏「在音樂中」「才能憤怒」)。引號 = 逐字承諾,驗 quote 要驗到字,不只驗到意
  2. 詮釋 gloss 是獨立 atom:致詞代稱(寶哥/阿姐/老師)、「X 就是 Y」同位語、「也就是說」附註——這些 gloss 搭著已驗證的事實滑過 verifier(寶哥=宋岳庭 正是 orchestrator 合成引語庫時注入、verifier 驗了引語沒驗 gloss)。
  3. footnote-claim 綁定:每個 [^n] 反查「這個來源真的含這個 claim 嗎」——事實對但腳註掛錯來源是獨立的錯(worked example:Manchuker 比喻掛錯中央社、NBA 演出掛 en.wiki 但 en.wiki 無記載、Leo王 keep real 掛錯參劈報導)。
  4. writer 自漂移:SSOT 正確但 writer 寫錯(「五月」寫成「六月」、「末期發行」寫成「最後一張」、「曾獲報導」寫成「唯一」)。superlative(首位/唯一/第一)與精確日期是高發區,預設不信、逐條對 SSOT + 外源。

官方一手 > 媒體轉述:媒體引語彼此會有轉述漂移(金曲 GMA 官方貼文「以及在天上的寶哥」vs 各媒體「獻給在天上的寶哥」)。找得到官方貼文/官方影片/當事人原貼,就以官方為錨,腳註改掛官方。

修正全部 append research report §audit(含查證軌跡 + verdict + 根因),讓未來 reader callback 可以直接追溯。

儀器化(2026-06-10):drift (1) 與 (4) 已升 article-health.py --check=quote-fidelity plugin(in rewrite-stage-3-5 profile,soft-launch WARN)——QF1 把文中每句帶腳註的「」引語逐字比對 frontmatter researchReport 的 SSOT 全文(抓縮寫/改句型/換字),QF2 列出全文 superlative 原子(首位/唯一/第一)當 fan-out 優先驗證清單。dogfood:嘻哈饒舌 0 誤報、複雜生活節 surface 4 條 legacy 引語債、無 report 文章優雅 skip。drift (2) 詮釋 gloss 與 (3) footnote 綁定仍靠 verifier fan-out(語意層,工具到不了)。

Step 3.6.2: 順稿(閱讀感 + 呼吸感 + 紀實文學感)

外科手術疊幾輪之後縫線會留疤——成品從頭到尾重讀一次,per EDITORIAL §段落呼吸 + §段與段的呼吸

  • 段落牆:單段 > 280 字拆段(worked example:蛋堡+寶哥段 340 字拆三段)
  • framing 詞硬接:「值得一提的是」「順帶一提」「耐人尋味的是」「這裡需要…」整批清掉,改 narrative bridge
  • 文章機械自述:「得單獨給 X 一個段落」這類 writer 對自己結構的旁白,刪
  • 一致性殘渣:30 秒概覽與 description 是否還跟修正後的正文一致(「畢業」vs 休學、被正文砍掉的場景是否還留在 description);結尾排比的指涉是否 dangling(正文已刪的支線還留在結尾);策展人筆記裡是否還引用已勘誤的舊事實
  • 中英夾雜殘留(beat 掉 → 贏過)
  • 工具:paragraph-rhythm + prose-health + 念出來

Step 3.6.3: 視覺同步(媒體 × 敘事對位)

逐一檢查每張圖/每支 iframe:「它旁邊的 prose 是不是在講它」:

  • 人物圖貼著該人物的敘事段(worked example:熱狗圖從廠牌段移到他封王的金曲段、葛仲珊圖從 section 尾移到她的段落旁),不是堆在 section 結尾當裝飾
  • caption 呼應該段 narrative(不是泛用圖說);兩個媒體不相鄰堆疊;section 收尾可留一個媒體做視覺閉合
  • 對應哲宇 directive 原句:「視覺同步檢查引用的多媒體跟文章的關聯性與閱讀感」

三關全過才算成品 ship。已 ship 後觸發(讀者 callout)→ 三關照跑,修正以 heal: commit 補。


Stage 4: 形(Format + Media,預算 5-10%)

Stage 3 commit 前最後關。

這一步跟 Stage 3 不同——Stage 3 檢查「寫得好不好 + 事實對不對」,Stage 4 檢查「結構對不對 + 媒體插得對不對」。

Step 4.1: article-health.py --profile=rewrite-stage-4

強制執行(不是建議,是反射)

python3 scripts/tools/article-health.py knowledge/{Category}/{文章}.md --profile=rewrite-stage-4

rewrite-stage-4 profile plugin(HARD all;清單與數量以 article-health.py --list-checks 為準):

Plugin 檢查內容
frontmatter-format 必要欄位 + 順序
format-structure 30 秒概覽 / 延伸閱讀 / 參考資料 section 存在
wikilink-target wikilink 對應檔案存在
link-target markdown link path casing + existence
cjk-punct 中文 prose 全形標點
chronicle-lead H2 不是 ## YYYY 年 X 月 編年體
word-count depth article ≥ 4500 CJK chars(v3.1 sad-shockley 新增,HARD via severity_override)
image-health depth ≥ 3 張(hero + 2 scene-mid)— v3.2 kind-mirzakhani 新增(HARD)
paragraph-rhythm 段落 median ≥ 55 CJK + H2 prose 段落 ≤ 8 + 媒體密度 band 0.7–1.2/1k CJK(v6.6 2026-06-04 哲宇 directive:從單一上限 0.8 升為 floor 0.7 media-poor / ceiling 1.2 / hard 1.5+median<55;從富媒體範本 設研院 0.91/天下 0.92/黃魚鴞 0.82 校準,舊 0.8 會誤判富媒體範本。WARN-only soft launch) + media-richness length-scaled count(長文朝 圖+影片 ≥8 INFO + 多模態 nudge)

⚠️ profile 邊界鐵律(v6.1,2026-05-17 admiring-montalcini):rewrite-stage-4 profile 不含 footnote-format / footnote-density(那兩個在 rewrite-stage-3-5 profile,Stage 3.3 跑)。Stage 4 跑全綠不代表 CI 會過 — CI full sweep 跑全 全量 plugin(以 --list-checks 為準),包含 stage-3-5 的 footnote 系列。如果跳過 Stage 3.3 的 rewrite-stage-3-5 plugin gate,本機 Stage 4 顯示綠燈但 CI 會 hard-fail。誕生事件:2026-05-17 臺灣前途決議文 ship 後 CI footnote-format hard=23(commit b39ea5529 補修 29 條 footnote)。對策:Stage 3.3 必跑 --profile=rewrite-stage-3-5(已寫進本檔 Step 3.3 + 頂部 Hard Gate Inventory)。

Pre-commit hook 已自動執行這幾項檢查(SSOT pre-commit profile 自 2026-05-04 Phase 10 接管)。如果被擋:按提示修正,不要用 --no-verify 繞過

為什麼要強制? 2026-04-04 我在台灣國樂的延伸閱讀寫了 7 個 [[wikilink]],忘記 Astro 不渲染。規則在本文件 v2.10 已經寫過、工具 wikilink validation 存在——然後還是寫錯了。教訓:擁有工具 ≠ 使用工具。所以現在寫進 pre-commit 強制執行。

格式範本檢查清單(手動 audit)

□ Frontmatter 完整(title/description/date/category/tags/subcategory/author/featured/lastVerified/lastHumanReview)
□ 30 秒概覽存在(blockquote 格式,開頭 > **30 秒概覽:**)
□ 正文小標題不是問句(除非問句本身是核心矛盾)
□ 延伸閱讀區塊存在且格式正確:
    - 標題是 **延伸閱讀**:
    - 每條用標準 Markdown 連結(不是 [[wikilink]])
    - 每條有一兩句話描述
    - 3-5 條
□ ## 參考資料 標題存在,且在腳註定義之前
□ 腳註格式正確:[^n]: [來源名稱](URL) — 完整描述文字
□ 沒有殘留的舊格式(## 參考資料 下面不該有 bullet list 式的來源)
□ word-count ≥ 4500 CJK chars(v4 新 hard gate)

⚠️ 格式不合格 = 修正後重新檢查。不進 Step 4.3。

Step 4.2: 多語 visual smoke test(i18n 改動時)

觸發條件:commit 涉及任何 i18n 系統 / 多語系路由 / homepage components / src/pages/{lang}/ / src/i18n/、或加新語言、或大型 sed 批次替換。 對應 REFLEXES #19 大型 refactor 後 visual smoke test

強制 SOP(6 步):

# 1. Build verify
npm run build  # 必須 ✅ all categories healthy

# 2. Cascade prevention test(驗 Phase 1 fix 仍 work)
F="dist/fr/people/index.html"
grep -oE '"/[a-z][a-z-]*/people"' "$F" | sort -u
# 預期:/en/people、/ja/people、/ko/people、/fr/people(+ /es/people if dropdown 完整)
# 不應出現:/ja/fr/people、/ko/fr/people 等 cascade URL

# 3. 5 langs 結構對齊檢查
for L in '' en ja ko fr es; do
  if [ -z "$L" ]; then f="dist/index.html"; lang="zh-TW"; else f="dist/$L/index.html"; lang="$L"; fi
  echo "$lang: halls=$(grep -c 'exhibition-hall' $f) RD=$(grep -c 'Random' $f)"
done
# 預期:5 langs 都有 exhibition halls + RandomDiscovery

# 4. Wrong-language prose 檢查(fr/es 不該含日文/中文 hardcoded)
for L in fr es; do
  hits=$(grep -c -P "[\x{3040}-\x{309F}\x{30A0}-\x{30FF}]" "dist/$L/index.html")
  echo "$L: $hits 平假名/片假名 occurrences"
done
# 預期:0 / 0

# 5. LANGUAGES_REGISTRY SSOT 對齊
bash scripts/tools/check-hardcoded-langs.sh

# 6. i18n coverage audit
bash scripts/tools/i18n-coverage-audit.sh

任何一項失敗 = revert 該 commit,不 ship。歷史教訓:Tailwind Phase 6 反向 sed 讓 ja/ko 壞 2 天 / fr 上線 cp + sed 漏抓日文 prose 持續 1 天 / fr/es 路由疊加 cascade 4 天才被發現——三次都因為缺這層 smoke test。

Step 4.3: 媒體插入

觸發時機:Step 4.1 format-check 通過後、Stage 5 cross-link 之前。

為什麼這時插入:寫完 prose 才知道「實際敘事節奏在哪、哪段需要 visual 呼吸」。寫之前布陣會綁死寫作節奏;寫完一次插入更自然。

依賴:Stage 1 Step 1.9 必須完成(媒體授權矩陣三表 append research 檔 + 圖片已 cache)。沒做 → 退回 Stage 1 Step 1.9。

Step 4.3.1: 三段敘事節奏判斷(圖 + 影片 整合)

媒體插入位置影響敘事節奏,不是隨便塞。三段標準(圖跟影片穿插,per EDITORIAL §媒體編織):

位置 用途 圖型 圖數 影片可放? 範例
hero 30 秒概覽前,建立視覺認知 16:9 landscape 或 1:1 1 ❌(影片在 hero 太重) 林琪兒 EMU 2014
scene-mid 中段重要轉折前 / 後 landscape 為主 0-2 ✅(代表作 / 直播 / 演講) Expedition 42 / 〈海洋〉MV
closure 結尾段視覺收尾(首尾呼應) landscape 0-1 0-1(最後代表作 / 紀念影像) 訪台首日場景照 / 〈美麗心蘭嶼〉

整體類型 × 媒體比重 baseline(canonical 在 EDITORIAL §媒體編織):

  • 音樂人:2-3 圖 + 2-3+ 影片(代表作 MV / 早期 / 最新三層時間軸)
  • 運動員 / 演員 / YouTuber:2-3 圖 + 1-3 影片
  • 樂團 / 音樂類型史:2-3 圖 + 3-5 影片
  • 政治人物 / 學者:2-3 圖 + 0-2 影片
  • Nature / 生態:2-3 圖 + 1-2 影片
  • Food / Culture / Tech:2-3 圖 + 0-1 影片
  • Hub 頁:0 圖 0 影片

通用判準

  • depth-article(≥ 3000 字):2-3 圖 + 依類型 1-5 影片
  • 短文:hero only(1 張),不放影片
  • 翻譯文:跟原文同步媒體(不另增 / 不另減)
  • 找不到官方影片 → 不勉強塞,多放 1 張圖補位

圖跟影片穿插原則:兩者交錯出現,不疊放在同一段。圖跟影片之間至少隔 2-3 段 prose。沿 narrative arc 放,不是按重要性堆在開頭。

Scene-mid 位置規則:圖放在「該段 narrative 開始前」而不是「該段中間」:

## 紅色 LED 下的第一口萵苣 ← 小標題

[圖:Expedition 42 三人合影] ← 圖放這裡
_caption_

prose 開始... ← 文字接續

呼吸原則(呼應 EDITORIAL §密度平衡):連續 3 段以上密集事實段(≥ 200 字 / 段)→ 中間插入一張 scene 圖作為視覺呼吸。

Step 4.3.2: 圖檔 fetch + cache + naming

依 Stage 1 Step 1.9.2 的 manifest 已 cache 完成。Step 4.3.2 僅做最後 verify:

# 確認所有 manifest 列出的圖檔都存在於 public/article-images/
ls public/article-images/{category}/

# 必要時補抓(若 Stage 1 未完成全部圖)
mkdir -p public/article-images/{category}/
curl -sL -A "Mozilla/5.0 Taiwan.md/1.0" "{hi-res-url}" \
  -o public/article-images/{category}/{slug}-{topic}-{year}.{ext}

# 確認 file format + 大小 + EXIF GPS 已清
file public/article-images/{category}/{filename}
sips -g pixelWidth -g pixelHeight public/article-images/{category}/{filename} | tail -3

# 必要時 resize / re-encode(hero < 600KB / inline < 400KB)
sips -Z 2000 --setProperty formatOptions 85 public/article-images/{category}/{filename}

# 清 EXIF GPS / 個人資訊(保留 description / copyright)
exiftool -gps:all= -location:all= -DeviceMfgr= -DeviceModel= public/article-images/{category}/{filename}

Step 4.3.3: Aspect ratio 護欄

bash scripts/tools/check-aspect.sh public/article-images/{category}/{filename}
圖種 必過範圍 歷史教訓
hero 0.9 ≤ aspect ≤ 2.0 lindgren-crew4-portrait.jpg 1041×1561 (0.67) 切到頭 → 換 1041×694 ✅
inline 圖 0.75 ≤ aspect ≤ 2.5 Expedition 42 4896×3264 (1.5) ✅ / EMU 1692×1691 (1.0) ✅

不過 → 換圖(不要強塞)。

Step 4.3.4: Markdown 插入 + caption + alt text

標準格式

![alt text 描述](/article-images/{category}/{filename}.jpg)
_caption 說明文字。Photo: {credit}. [License via {source}]({source-url})._

Alt text 規則(accessibility 必需):

  • 描述「畫面內容」不是「圖名」
  • 涵蓋:誰 + 在哪 + 做什麼 + 拍攝氛圍
  • 30-80 字
  • 不重複 caption 文字

範例對比

❌ 壞 alt text(只有圖名):
![林琪兒 2014](/article-images/people/lindgren-emu-2014.webp)

✅ 好 alt text(描述畫面):
![林琪兒 2014 年穿艙外活動服(EMU)官方人像,全套白色 NASA 太空服,仰角拍攝顯示頭盔反光](/article-images/people/lindgren-emu-2014.webp)

Caption 規則

  • 用 markdown italic _..._(不用 HTML <figcaption>
  • 結構:{時間 + 地點 + 事件}。Photo: {攝影者 / 機構}. [License via {source}]({URL})。
  • 中文 prose 風格,跟 article 一致
  • 關鍵 metadata(NASA Image ID / Commons file name)放括號註

Step 4.3.5: 授權清單同步

每張 inline 圖插入後,強制同步

1. frontmatter(hero only):

image: '/article-images/{category}/{filename}.jpg'
imageCredit: '攝影者 / 機構'
imageLicense: 'Public domain (NASA)' / 'CC BY-SA 4.0' / etc
imageSource: '{source-URL}'

2. 文末「## 圖片來源」section(所有圖):

## 圖片來源

本文使用 N 張公有領域 / CC 授權圖片,全部 cache 於 `public/article-images/{category}/` 避免熱連結來源伺服器:

- [圖檔 1 標題](source-URL) — Photo: 攝影者, YYYY-MM-DD, License, NASA Image ID 或 Commons file
- [圖檔 2 標題](source-URL) — ...

Step 4.3.6: 圖片健康檢查(plugin gate)

python3 scripts/tools/article-health.py knowledge/{Category}/{slug}.md --check=image-health

預期檢查:

  • ✅ 文中所有 ![]() 連結對應檔案存在
  • ✅ Frontmatter image: 存在 + credit + license + source
  • ✅ 文中無外部熱連結(http/https URL 不在 /article-images/
  • ## 圖片來源 section 存在
  • ✅ 所有圖全部有完整 metadata(攝影者 / license / source URL)

不通過 → 不進 Stage 5。

Step 4.3.6: 影片 iframe 嵌入(Music / People / Nature 條目升級)

觸發時機:題材含公開影像作品且 inline link 不足以承載敘事張力時 — Music 條目(代表作 MV)、Nature 條目(生態直播 / 影像紀錄)、Documentary 條目(紀錄片預告)、Performance 條目(演出片段)。

為什麼從 inline link 升 iframe(哲宇 2026-05-17 directive):「提高閱讀的多重感受」。Inline link 是「邊讀邊聽」option,iframe 是「閱讀流裡內建多媒體感官層」default。Music 條目尤其受惠 — 文字描述歌曲 vs 直接聽到歌曲是完全不同的閱讀體驗。

URL 來源優先序(同 Step 1.9.1):

  1. 官方頻道(藝人 / 廠牌 / 節目方 / 導演)— 角頭音樂 / 公視 / 滾石等 official YT
  2. 國際串流官方(YouTube Music / Vevo official artist channel)
  3. 主辦 / 策展單位官方頁

不接受:UGC 翻唱、二手轉貼、搜尋結果頁、Topic auto-generated channel(YouTube 自動生成的 "Provided to YouTube by..." 假頻道)。

密度建議(per EDITORIAL §媒體編織 類型 × 媒體比重 baseline):

條目類型 影片 iframe 最低 上限 備註
音樂人 2-3 5 代表作 / 早期 / 最新三層;找不到 official → 補圖
樂團 / 音樂類型史 3 5 各時期代表作 anchored 到時間軸
運動員 / 演員 1 3 表演 / 訪談 / 比賽關鍵時刻
YouTuber / Podcaster 2 4 代表節目 / 訪談 (官方頻道)
政治人物 / 學者 0 2 演講 / 重要場合影像(如有)
電影 / 紀錄片 1 2 預告 / 關鍵片段(注意版權)
歷史事件 0 2 紀錄片 / 倖存者口述(如有官方版本)
Nature / 生態 1 2 直播 / 紀錄片 / 觀察影像
Food / Culture / Tech 0 1 大多靠圖即可
Hub 頁 0 0 不放 iframe

Hub 頁 / 短文 / 純架構性條目不放 iframe。多於上限 → 視覺擁擠打斷敘事,重新分散。

⚠️ 媒體密度 band(floor + ceiling)(v6.6 2026-06-04 哲宇 directive 升級,原 v6.4 2026-05-28 只有上限):總體 (圖+影片+hero) density 落在 0.7–1.2 / 1k CJK 健康帶。下限 0.7:低於 = 媒體偏少(中華台北 0.56 / 黑冠麻鷺 0.57)→ 補圖或官方影片。上限 1.2:高於 = visual 密度偏高(陳建年 1.48 = 8 媒體已偏密)。> 1.5 且段落 median < 55 = HARD atomization(周蕙 1.76 = worst case)。paragraph-rhythm plugin 自動 catch 全 band。升級理由:舊上限 0.8 反而誤判哲宇點名的富媒體範本(設研院 0.91 / 天下 0.92 / 黃魚鴞 0.82)為「偏高」,與「提升媒體素材」directive 矛盾 → ceiling 升 1.2 + 新增 floor 0.7。富媒體 ≠ atomization:陳建年 8 媒體 + median ≥ 55 = 富而不亂。完整 narrative:reports/spore-voice-drift-fix-2026-05-28.md §第 7 種 pattern + 校準語料 8 篇(本次 dogfood)。

位置原則(呼應 Step 4.3.1 三段敘事節奏):

  • iframe 放在「該段 prose 結尾」,不是段首 — 讓讀者先讀完文字段,再有 option 聽 / 看
  • 沿文章時間軸 / narrative arc 放,不是按重要性堆在開頭
  • 每個 iframe 配 italic caption 標明 (1) 官方來源頻道 (2) 跟文章 narrative 的呼應

標準格式(黃魚鴞 / 陳建年 pattern):

<div
  class="video-embed"
  style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;margin:1.5rem 0;border-radius:8px;"
>
  <iframe
    src="https://www.youtube.com/embed/{VIDEO_ID}"
    title="{原始繁中標題}"
    style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;"
    loading="lazy"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    allowfullscreen
  ></iframe>
</div>

_{source channel} 官方 MV:{跟文章 narrative 呼應的一句話描述}。_

⚠️ </div>_caption_ 之間必須有空行(2026-06-07 哲宇 live review callout):markdown / remark 對 HTML block(</div></iframe>)後緊接_..._ 不會 render italic,底線會變成字面字元顯示。working pattern(陳建年)是 </div> ↵↵ _caption_。spawn writer agent 寫 iframe 時最常漏這個空行(複雜生活節 3 支全漏)。image-health plugin 已儀器化 catch(caption 缺空行 WARN,2026-06-07)。

Verify 步驟(強制):

  1. 每個 video ID 走 WebFetch 確認「Official Music Video」或「官方完整版 MV」標記(不憑 search title 推斷)
  2. preview_eval 跑 document.querySelectorAll('iframe[src*="youtube.com/embed"]').length 確認 N 個 iframe render
  3. preview_eval 列 [...iframes].map(f => f.src.split('/embed/')[1]) 比對 video ID 跟原稿一致

跟 Step 1.9.1 inline 外連的分工

  • Step 1.9.1 inline link:3-8 個,作品名第一次出現處 hyperlink,預設都加(成本低)
  • Step 4.3.6 iframe embed:3-5 個,沿 narrative arc 放代表作(高 value、高呈現成本)
  • 同篇條目可以並存 — inline link 給「邊讀邊聽 option」,iframe 給「代表作必看」

範例參考

Stage 4 Step 4.3 邊界與例外

  • Hub 頁_*.md):不放圖,跳過 Step 4.3
  • 短修正 / heal commit:不重新走 pipeline,圖用既有的不動
  • 翻譯文:跟原文圖同步(cache 共用),caption 翻譯成對應語言
  • 沒有合適媒體素材:明確標 no-media 進 research 檔,跳過 Step 4.3
  • 觀察者直接丟連結(如林琪兒 ι session):走 Step 4.3.2-4.3.6 補圖 SOP,不走 Stage 1 Step 1.9
  • Article ship 後才發現缺圖:spawn heal: commit + 走 Step 4.3

跟 spore 配圖區分

圖種 路徑 用途 生成方式
article hero / inline public/article-images/{cat}/ 文章內容 Stage 1 Step 1.9 + Stage 4 Step 4.3 手動
OG 社群分享 public/og-images/{cat}/ facebook / twitter card dashboard 自動 derive
spore poster public/spore-images/ Threads / X 配圖 make-spore.sh 自動

不要嘗試共用 — spore 是 social 媒介,需要不同 aspect 跟 brand overlay。article 圖 cache 完整/spore 圖 ephemeral,分開管理。


Stage 5: 連(Cross-link,預算 5%)

Step 5.1: 掃描 knowledge/ 找相關文章

ls knowledge/{Category}/ | grep {keyword}
grep -r "主題關鍵詞" knowledge/{Category}/

判斷標準

  • ✅ 讀者讀完那篇後會自然想知道本文主題
  • ✅ 兩篇文章有實質的知識關聯(不只是同 category)
  • ❌ 不要為了連結而連結(「台灣」不需要連到每篇文章)

Step 5.2: 雙向延伸閱讀(forward + reverse)

Forward:本文 → sibling

延伸閱讀格式(與 Stage 2 Step 2.6 一致):

**延伸閱讀**- [台灣氣候危機與淨零轉型](/nature/台灣氣候危機與淨零轉型) — 氣候變遷如何驅動台灣的能源轉型與產業結構重組

Reverse:sibling → 本文

到 sibling 文章加指向本文的延伸閱讀條目。

Commit 格式cross-link: 為「{文章名}」建立雙向延伸閱讀

⚠️ 只改延伸閱讀區塊。不要順便「改善」其他文章的內容。

Step 5.3: Sibling 格式預檢

補 reverse cross-link 進 sibling 文章前,強制跑 sibling 格式預檢

python3 scripts/tools/article-health.py knowledge/{Category}/{sibling}.md --check=format-structure

三種狀態對應動作:

sibling 格式狀態 動作
✅ PASS 直接補 reverse cross-link,commit
⚠️ WARNING(pre-existing 警告 / 不影響功能) 仍可 commit(hook 接受 warning),commit message 說明「sibling 有 pre-existing X warning」
❌ FAIL(pre-existing 不合格) DEFER reverse cross-link + 開 follow-up issue 標 sibling 需獨立 EVOLVE,不繞過 hook 也不擴大 scope

為什麼這條是硬規則:補 reverse cross-link 是 Stage 5 的 1 行修改,不該把 sibling 的 pre-existing tech debt 帶進來變成大改。如果 sibling 真的不合格(例:書目格式 footnote 沒 URL),應該開獨立 EVOLVE issue 處理那篇,不該因為一個 cross-link 強行碰整個 sibling。

觸發:2026-05-02 EVOLVE-batch — 兩廳院 EVOLVE 嘗試補 reverse cross-link 進中正紀念堂,pre-commit hook 失敗(中正紀念堂有 12 條書目格式 footnote pre-existing 不合 Taiwan.md [^n]: [Name](URL) — desc standard)。Defer 到獨立 EVOLVE issue 是正確處理。

Step 5.3-bis: relatedDiary — 連回寫這篇時的反芻日記(meta-transparency)

如果收官時寫了反芻 diary(/twmd-diary),把那篇 diary 的 slug 加進本文 frontmatter relatedDiary。文章底部會渲染成可點的日記區塊,讓讀者看見「寫這篇的時候,這個系統在想什麼」。

不要手動編輯 frontmatter,跑工具(v2.2 儀器化,2026-06-24 龜山島 callout — 手動補沒閘門 → 漏掉):

python3 scripts/tools/sync-diary-links.py --diary {diary slug} --article {本文 slug} --apply

idempotent,自動寫 knowledge/ + src/content/ mirror、dedup、apostrophe-safe。產出的 frontmatter:

relatedDiary:
  - 2026-06-19-115522-manual # 只給 slug;title/摘要/日期由 RelatedDiaries.astro build-time 自動 resolve
  - {
      slug: 2026-04-13-alpha2,
      excerpt: '想覆寫摘要時改用物件形式(--excerpt)',
    }
  • slug = 日記檔名去 .md(希臘字母 transliterate;CJK/描述式 handle 原樣保留,對應 /semiont/diary/{slug}
  • array 可多篇:一篇文章跨多次 session EVOLVE,每次反芻都掛得上來(工具 append/merge 不覆蓋舊的)
  • schema 在 src/content.config.ts,渲染 src/components/RelatedDiaries.astro(對位 SporeFootprint);取代舊的單篇 diaryLink / diaryExcerpt
  • 延續 MANIFESTO「我讓你看著我看著我自己」,把文章的生產過程攤給讀者看
  • 反向回扣 HARD step + 工具 canonical 在 DIARY-PIPELINE Stage 5(寫完 diary 那刻就跑,記憶最新;/twmd-finale 自動跑)

Step 5.4: Astro redirect 5 lang + 刪舊檔(Merge variant only)

整併獨有的收尾,四件事缺一不可

Step 5.4.1: Astro redirect(5 lang 全寫)

astro.config.mjs redirects: 區塊:

'/{old-category}/{zh-slug}': '/{new-category}/{zh-slug}/',
'/en/{old-category}/{en-slug}': '/en/{new-category}/{new-en-slug}/',
'/ja/{old-category}/{ja-slug}': '/ja/{new-category}/{new-ja-slug}/',
'/ko/{old-category}/{ko-slug}': '/ko/{new-category}/{new-ko-slug}/',
'/fr/{old-category}/{fr-slug}': '/fr/{new-category}/{new-fr-slug}/',

不可省任一語系——舊 URL 在 SC / 外站可能任何語系都有 backlink。漏一個語系就漏一條 SEO 流量。

Step 5.4.2: 刪除被併方原檔(5 lang + sync 鏡像)

  • knowledge/{old-category}/{原檔}.md(zh-TW)
  • knowledge/{en,ja,ko,fr}/{old-category}/{translation-slug}.md
  • bash scripts/core/sync.shsrc/content/ 鏡像會跟著刪
  • 確認 git status 顯示 zh-TW + 4 lang knowledge + 對應 src/content 全部 deleted

Step 5.4.3: Cross-link audit

  • grep -rn "被刪 slug" knowledge/ src/ — 找所有引用
  • 出現的 wikilink / markdown link 改指 canonical(或刪除)
  • Hub 頁面(_*.md)裡的舊條目改指 canonical

Step 5.4.4: Build verify

  • npm run build 必須過(會驗 redirect 語法)
  • 隨機開一個被刪的舊 URL 試 redirect 是否真的轉到 canonical
  • sitemap 應減少對應數量的 entry

Merge variant commit message

  • commit prefix 用 🧬 [evolve+merge](不是純 [evolve]
  • commit body 列:保留誰、為何、EVOLVE 進去什麼、刪了哪幾個檔、設了哪幾條 redirect
  • reply issue 必附 commit hash,並說明「未來類似問題會走整併變體 SOP」

Boundary variant cross-link

每篇單獨走完整 Stage 1-5 流程。Step 5.2 雙向延伸閱讀時要互相反向回補(C 寫完 → 加進 B/D 延伸閱讀;B 寫完 → 加進 C/D;以此類推),形成完整 sibling 網路。

Boundary variant commit message

  • 多篇分多 commit / 多 phase(不要硬塞同 commit)
  • 每個 phase commit prefix 仍用 🧬 [semiont] rewrite: + 描述含 Phase N/M
  • Issue 留 open,每個 phase 完成 update comment,全部 phase ship 後才 close

✅ Article shipped (zh-TW canonical)

中文 ship 後,翻譯走獨立 pipeline,不在本 pipeline scope

翻譯:跨 pipeline boundary 指標

本 Pipeline 只產中文版。100% 的 token 預算都給中文版。翻譯在本 pipeline scope,是另一條獨立 pipeline 的職責。

Stage 5 完成(中文版 ship)後,視觸發條件決定走哪條翻譯 pipeline:

觸發條件 走哪條 pipeline
觀察者拍板「現在翻單篇 X 語言」 TRANSLATION-PIPELINE.md
Routine 觸發多語 batch sync(5 langs) SQUEEZE-MODELS-MAX-PIPELINE.md(巴別塔)
不翻 / 之後再說 結束。中文版本身就是完整 ship 結果

為什麼從本 pipeline 抽掉(v4.1 起,v5.0 保留):

  • Stage 6 在 v4.0 是 pointer-only section(只是「詢問觀察者要不要翻 + 跳到另一檔」),不算真正的 stage
  • 抽掉後,主 pipeline 變 5 stage 線性(Stage 1-5),更乾淨
  • 翻譯有自己的觸發、預算、品質 gate(巴別塔的 priority schema P0/P1/P2/P2.5/P3 + 4-tier cascade),不該被當成 REWRITE 的尾巴
  • 對應觀察者 callout(2026-05-11 sad-shockley):「翻譯環節可以整個抽掉,直接變指標到巴別塔 pipeline」

REWRITE 跟翻譯 pipeline 的分工

  • REWRITE-PIPELINE:產 high-quality 中文版(zh-TW canonical),到 ship 上 main 為止
  • TRANSLATION-PIPELINE:單篇 X 語言翻譯(觀察者主動觸發)
  • SQUEEZE-MODELS-MAX-PIPELINE:多語 batch sync(routine 自動跑,主權的巴別塔)

Cron 模式 + Routine 飛輪

Cron 在單一 session 執行,無法真正分三個 session,但在 prompt 中強制分階段思考。

Token 預算分配

階段 佔比 常見錯誤
Stage 1 35-40% 搜太多、每個結果都 web_fetch 全文
Stage 2 40-45% 前半段太細、後半段沒力
Stage 3-5 15-20% 跳過驗證直接 commit

Cron 鐵律(與手動執行不同的地方)

  • 每批最多 1 篇:v1 時期每批 3 篇,品質明顯不穩。改成每批 1 篇後品質大幅提升
  • 不要 git add -A:只 add 改動的文章和同步後的 src/content/ 對應目錄
  • 不要跑 npm run build:Build 由 CI/CD 處理。sub-agent 跑 build 容易 timeout 且浪費資源
  • 至少 7 分鐘:Stage 1 3min + Stage 2 2min + Stage 3-4 2min = 最低要求

選文指令

cd ~/taiwan-md && git pull
# 佇列頂端,跳過已重寫的
head -30 scripts/tools/rewrite-queue.txt
git log --oneline --since='2026-03-20' | grep -i 'rewrite:' | head -30

Commit 指令

bash scripts/core/sync.sh
python3 scripts/tools/article-health.py knowledge/[Category]/[文章名].md --profile=rewrite-stage-4
git add knowledge/[Category]/[文章名].md src/content/
git commit -m "rewrite: [文章名] — EDITORIAL v6.3 + Pipeline v5.0"
git push

Cron 狀態

Cron 狀態 說明
Taiwan.md Article Quality Rewrite ❌ disabled 每小時 1 篇,Opus model(舊)
taiwan-md-rewrite (v1) ❌ disabled 舊版每小時 3 篇,已淘汰
taiwan-md-content-sprint ❌ disabled 內容衝刺(新文章),已淘汰
twmd-rewrite-daily ✅ active 16:16 daily Opus(per ROUTINE.md

Routine 飛輪整合(v6.1 升級為 full-cycle,2026-05-24 哲宇 directive)

REWRITE 是 routine 飛輪 10 條核心 routine 之一(twmd-rewrite-daily)。v6.1.1 起每天 18:00 晚間自動跑「研究 → 寫文 → 孢子 → 發文 → harvest」全 cycle(v6.1.1 從 00:00 搬到 18:00 對齊台灣社群 20:00-22:00 prime time post):

  • 觸發/twmd-rewrite skill
  • Model:Opus
  • Cadence:每天 18:00 晚間(v6.1.1 — cycle 跑 ~150 min ~20:30 結束,spore post 落在台灣晚間社群活躍時段;v6.1 原 00:00 半夜 chain 已抽出)
  • Skill SOP~/.claude/scheduled-tasks/twmd-rewrite-daily/SKILL.md(local mirror)
  • Stage chain(v6.1 full cycle)
    Stage 0 BECOME → Stage 1 git pull → Stage 2 article ship (REWRITE Stage 0-5 全跑) →
    Stage 3 commit + push article → Stage 4 SPORE chain(PICK=剛 ship article / VERIFY / WRITE / SHIP)→
    Stage 5 CI/CD wait gate v3.7(60 min cap,timeout → defer 不 abort)→
    Stage 6 social post(both Threads + X default per Routine context v3.8;單發只在 article frontmatter 標 `platformExclude` 才觸發)→
    Stage 7 SPORE-LOG + sporeLinks frontmatter + commit + push → Stage 8 /twmd-finale
    
  • Quality gate (article):article-health.py rewrite-stage-4 hard=0 warn=0 + 三源研究落檔 + 腳註合規 + frontmatter complete + word-count ≥ 4500
  • Quality gate (spore):article-health.py prose-health hard=0 score ≤ 3 + spore-writing hard=0 + 配圖 generated + AI pre/post-ship verify 5+6 條 PASS
  • Boundary:本 routine 上限 ~150 min wall-clock(article ~60 min + spore prep ~15 min + CI wait ≤ 60 min + post ~10 min + log ~5 min);超過 → spore defer + LESSONS entry(不 abort article ship)
  • 不問 observer 鐵律:所有 decision point 走 SPORE-PIPELINE §Routine context 自動決策 defaults table

為什麼 v6.1 升 full-cycle(哲宇 2026-05-24 directive):article ship 跟 spore 是同一條進化飛輪的兩端,分開跑會:

  1. 缺一致性(article + spore 不同步、不同 angle)
  2. Observer friction(每天要分兩次觸發、各自 review)
  3. Cycle smoothness 數據缺失(無法 measure article→spore→broadcast 整體 throughput)

合一變 daily routine 後:每天 1 篇文章 + 1-2 條孢子(Threads ± X)自動發出,進化飛輪自動轉,observer 只在 escalation 時介入。

完整 routine 規格 → ROUTINE.md §TWMD rewrite (daily)。設計脈絡 + cycle smoothness 數據 → reports/spore-pipeline-evolution-2026-05-23-article-to-spore-to-broadcast-cycle.md


品質分級

等級 條件 動作
✅ PASS hollow ≤ 3 + 五指全過 + 結尾不是罐頭 + word-count ≥ 4500 commit + push
⚠️ PARTIAL hollow ≤ 3 但結尾/富文本不足 / word-count 4000-4499 標記待改善,下輪優先
❌ FAIL hollow > 3 或有事實錯誤 / word-count < 4000 不 commit,回到 Stage 1

實戰教訓索引

  1. 一次一篇:多個 sub-agent 同時跑 = 搶檔案 + timeout + 殭屍 session
  2. 至少 7 分鐘:Stage 1 3min + Stage 2 2min + Stage 3-4 2min = 最低要求
  3. prompt 裡寫「立刻執行,不要重述任務」:否則 AI 花 30% 時間重述指令
  4. 量化指標是 pre-filter 不是品質保證:塑膠句數=0 ≠ 好文章,必須逐篇讀
  5. 塑膠會變種:AI 把被禁句式微調成看似不同的版本("展現了"→"印證了"→"彰顯了")
  6. Build 驗證不能省:YAML frontmatter 偶爾壞掉,一篇壞 = 整個 category 炸
  7. 結尾最後寫 = 品質最差:v2 改成結尾先行(Stage 2 Step 2.2)
  8. 觀察者反覆 callout 同問題 → REFLEXES #15 反覆浮現要儀器化 → 升 plugin gate(chronicle-lead / word-count / Title+desc spine sync)
  9. EVOLVE 容易漏 Stage 1 Step 1.9 媒體素材(v5 之前為 Step 1.14):pre-2026-04-28 條目多無 hero / 無 §圖片來源 = pre-gate 遺珠,補 EVOLVE 時必查
  10. EVOLVE 容易漏 frontmatter spine sync:title 是百科 stub / description 沒吃進新核心 = SC 顯示舊 hook 但讀者點進來看到新內容 = 落差

Quick Commands(手動執行用)

# 寫完文章後一次跑完 Stage 4 驗證
bash scripts/core/sync.sh
python3 scripts/tools/article-health.py knowledge/{Cat}/{文章}.md --profile=rewrite-stage-4
python3 scripts/tools/article-health.py knowledge/{Cat}/{文章}.md --check=image-health

# 全部通過才 commit
git add knowledge/{Cat}/{文章}.md src/content/
git commit -m "🧬 [semiont] rewrite: {文章名} — EDITORIAL v6.3 + Pipeline v5.0"
git push

v7.3 | 2026-06-13 persona-stage0(哲宇 directive 儀器化)— Stage 0 exit gate 儀器化:把 v7.2 的「三件套都必做」從 manual-grep 升成可執行工具 research-report-health.py {report} --stage 0。新 grade_stage0() 檢查 §觀點成型 + viewpoint_formed: true + 六核心結構 ≥4/6 + §20 路 persona + 搜尋日誌 section + ≥10 distinct 來源(「≥20 探索真的發生」的 proxy——persona-only 只發散問題 → ~0 來源 → FAIL)。Stage 0 跑完、進 Stage 1 前必跑,hard_fail=0 才過;Hard Gate Inventory §觀點成型落檔 + Stage 0 收尾 checklist 改引工具。dogfood:看不見的國家 report PASS(六項全 ✅)、persona-only 模擬 FAIL(5 hard,抓到「有 persona 缺探索」)。哲宇 callout「儀器化嚴格加入階段閘門 + Stage 0 跑完也要跑 report 檢查閘門」。對應 REFLEXES #15(規則要能執行才算規則——manual grep 是裝飾,CI-able 工具才是閘門)+ #66(gate 用真產出 dogfood 校準)。

v7.2 | 2026-06-13 persona-stage0(哲宇 callout)— Stage 0.6 anti-drift(persona 是「額外」不是「取代」):哲宇觀察到 v7.1 上線後其他 session 只召喚 persona、跳過原本的探索搜尋與初步研究。git diff v7.0→v7.1 確認 persona 是純額外插入——0.6.1 六核心問題 + 0.6.4 ≥20 探索搜尋未被刪改,drift 來自 0.6.1-bis 視覺權重蓋過原步驟。修補四處:(1) Stage 0.6 頂部加「🚨 三件都必做、缺一不進 Stage 1」框(六核心問題 [編輯視角] + persona [讀者視角] + ≥20 探索 [事實地基],三個不同動作互不取代,只跑 persona = 跳階段違反 MANIFESTO §8);(2) 0.6.1-bis 加「額外發散不取代研究」guard;(3) Stage 0 收尾 checklist 補「≥20 探索 query 已落 §探索搜尋紀錄」獨立驗收項(persona 不算搜尋);(4) Hard Gate Inventory §觀點成型落檔 verify 升「三件套全到,persona-only 缺 ≥20 探索 = FAIL」。對應 REFLEXES #15(規則要能執行才算規則 / 視覺顯著的新步驟會掩蓋既有紀律)+ MANIFESTO §8。

v7.1 | 2026-06-13 persona-stage0(哲宇 directive)— Stage 0 觀點成型加 persona 發散:新增 Step 0.6.1-bis「20 路 persona 切入點」——除了 0.6.1 六核心問題(總編輯自問)外,額外派 4 個 Sonnet sub-agent 平行模擬 20 個不同年齡/國籍/性別/社會處境的人(4 軸各 5 persona,A 年齡 / B 國籍·距離 / C 社會處境 / D 與題目關係;A/C/D 台灣在地 + B 外國·離散)聽到題目會問的問題,當研究入射點。主 session merge 後每題標 🆕 新入射角(merge 進既有 §切入點清單,Stage 1 必取材)/ ✅ 已被六題覆蓋 / ⛔ 超 scope(落 rationale.whats_excluded)。配套:落 research report §20 路 persona 切入點 + Stage 0 收尾 checklist 加驗收 + 多 agent 編排表加 4-Sonnet row + Hard Gate Inventory 補 persona sub-section grep。設計嚴守 REFLEXES #42(平行不 sequential / 落檔 hard gate / 主 session audit / ❌✅ 反例對照)+ #31(agent null 不盲信)+ #15(🆕 題接進既有 §切入點清單而非另開平行 checklist = 非裝飾)。誕生事件 = 本 pipeline 的自我 dogfood:2026-06-13《看不見的國家》ship 後哲宇追問「影響 / 心得 / 還在努力的人」三題(六題沒覆蓋)→ 觸發 EVOLVE 4800→6630 字升 S 級 → 把「觀察者會不會追問」內化成 Stage 0 自動發散。對應神經迴路「Stage 1 的 20+ 是 anchor 密度不是數量」的 Stage 0 版。

v7.8 | 2026-07-05 柯智棠健檢 round 2(哲宇 directive「儀器化分部報告品質硬門檻+通知呼叫 session 疑慮/為什麼/思考方向,主 report 也要」)— 收件 gate 儀器化:(1) 新儀器 agent-report-health.py——orchestrator 收到每個研究 agent 的 task-notification 後、開始任何合成之前跑,驗六件事(存放位置 repo 內 / 體積 ≥8KB / 逐條軌跡 section / 軌跡 ≥10 行 / 宣稱 vs 記錄比 ≥50% / 五段結構 ≥4/5),每條疑慮附「為什麼+思考方向」,FAIL = 不准合成 §6;閾值由真實 corpus 校準(4 份壓縮版 aggregate 5-6KB/軌跡 2-9 行全攔 hard=4,8 份真 final message 14-38KB/13-62 行全過)(2) research-report-health.py v2.1 疑慮通知層——主 report 每條 fail/warn 同樣附為什麼+思考方向(--json 含 concerns[])(3) Step 1.8-bis 步 2 從手動 test -f/grep 升為儀器指令 (4) Hard Gate Inventory 加「分部報告收件 gate」row。設計+校準數據:reports/agent-report-health-instrument-design-2026-07-05.md。對應 REFLEXES #81(收件三十秒紀律,同日 promote)+ #15 + #66 + #69。

v7.7 | 2026-07-05 柯智棠健檢(哲宇 goal directive「徹底健檢+自我進化」)— Async agent 時代 raw 保全:Claude Code 改版後 sub-agent 預設 async 啟動(spawn 只回 launched,回報走 task-notification),柯智棠 EVOLVE 揭露新斷點:prompt 對、agent 對(4 隻各回 ~20KB 逐條軌跡,實測 224 次 web 操作),orchestrator 收到通知後把 raw 壓成 6KB 摘要存 scratchpad,report §8 剩 9 行 pointer +「commit 時 raw 隨 session 記錄留存」幻覺 policy,gate v1 照樣 PASS → writer 只吃薄報告 → 文章品質下降。同日普查再挖出兩病例:蘇打綠(pointer 指 /tmp,及時救回)、台灣醫療與全民健保(自稱「永久存放於 /tmp」,5 份 raw 已永久蒸發)。修補四件套:(1) §多 agent 編排鐵律 8「raw 走檔案通道、禁 aggregate-on-receive」(2) Step 1.7.2 和解規則 +2 條(落檔時機=收到的第一個動作 / 禁 ephemeral 存放)(3) Step 1.8-bis async 三步 SOP(agent 自落檔 + notification 到手先落檔 + gate 收口)(4) research-report-health.py v2 兩條 hard gate(§8 有效密度 ≥120 行、ephemeral pointer = 0,單檔/分檔兩 pattern 都認,六案 dogfood 校準)。另修 Step 1.7「Writer 只吃 §6」v6.3 殘留句對齊 v7.4。診斷全文:reports/rewrite-agent-dispatch-diagnosis-2026-07-05.md。對應 REFLEXES #42(orchestrator 版偷吃步)+ #31 + #22 + #15。

v7.6 | 2026-06-16 哲宇 directive「升級」— 新增 §Stage 2.5 source-fidelity gate(來源逐字回溯)+ Hard Gate Inventory 一列。distill 自 LESSONS meta-umbrella stage2-quote-context-collapse(vc=8):Stage 2 writer 把 Stage-1 研究結論 collapse 成偏記憶/印象/字面/未驗證 claim,structure gate 全綠 ≠ 事實對。三道 gate:(1) fetch 被引用來源 artifact 逐字比對(不只比 report,instance #8 大鮪鱸鰻)(2) title+desc+30 秒概覽 門面句 scope(instance #6 迷音)(3) fresh-writer 長文 fact-check agent pass(instance #7 報導者)。與 Step 3.6 成品總驗互補:3.6 驗成品對 report,2.5 驗對真實世界來源。完整 8 instance 證據鏈見 LESSONS-INBOX §已消化。

v7.0 | 2026-06-10 嘻哈饒舌 — Stage 3 嚴謹化:新增 Step 3.6 成品總驗三關(assembled-product verification)。Stage 3.1-3.5 驗草稿、3.6 驗組裝後成品,A 級/大眾文/勘誤後/手術疊 ≥3 輪 HARD。三關:(1) 原子重驗 fan-out——拿成品按段落派 adversarial verifier,專抓草稿驗證放不到的四種 drift(引號逐字 diff / 詮釋 gloss 是獨立 atom / footnote-claim 綁定反查 / writer 自漂移 superlative+日期),官方一手 > 媒體轉述,修正 append research report §audit;(2) 順稿——手術疊輪後的縫線疤(段落牆 / framing 詞 / 機械自述 / 概覽 description 結尾的一致性殘渣);(3) 視覺同步——每個媒體貼著它所講的敘事段。誕生事件:台灣嘻哈饒舌 EVOLVE Stage 3.1-3.5 全綠 ship 後,讀者老莫(文章引用來源作者本人)抓到詮釋 gloss 錯(寶哥=宋岳庭,實為 MV 導演黃信佳「大寶導」)→ 哲宇 directive「越大眾的文章越多人檢視,要再加一道最後成品的查核關卡」→ 4 verifier 成品重驗再抓 3 ❌ + 11 ⚠️ + 順稿 28 處 + 媒體 3 張重新對位。完整 audit:reports/research/2026-06/台灣嘻哈與饒舌發展.md §9。對應 REFLEXES #31(sub-agent claim 是線索)+ MANIFESTO §10 幻覺鐵律 + 「拿成品派 agents 再查驗」哲宇拍板模式。

_v6.9 | 2026-06-07 複雜生活節(哲宇 live review polish)— 三個閱讀品質儀器化:複雜生活節上線後哲宇逐段讀,給三條回饋「分段窒息 / 影片 caption 底線變字面 / 歐化句」,三條都「同樣儀器化放進 pipeline」。(1) paragraph-rhythm R4 單段 ≤ 280 字(牆/窒息感)——R1 抓原子化(太短)、R4 抓對稱另一端(太長/牆);校準好範本 max 黑冠麻鷺 149 / 天下 217、牆 複雜順稿前 341 / 設研院 312;WARN soft-launch。(2) prose-health 歐化「(不)是 X 的」判斷句——curated 評價形容詞 + 的後接標點 lookahead,避開合法「是我的/是教書的」;catch 複雜 1 條漏網(界線是模糊的)。(3) image-health caption 缺空行——</div></iframe> 緊接 \_caption_ 無空行不 render italic(Step 4.3.6 補 ⚠️);spawn writer agent 寫 iframe 最常漏(複雜 3 支全漏)。dogfood(REFLEXES #66):5 named 範本 0 false-positive。canonical:EDITORIAL §段落呼吸 四條鐵律 + §歐化八病 + Step 4.3.6。對應 REFLEXES #15 反覆浮現要儀器化(讀者/觀察者 callout → plugin gate)。_

v6.8 | 2026-06-07 複雜生活節 — 媒體完整度低標提升(深掃協議 + length-scaled 硬底):哲宇 directive「調整 rewrite-pipeline,媒體素材完整度未來文章都以複雜生活節規格為標準,提升低標」。複雜生活節 worked example——同一 niche 主題 curl/WebFetch 抓圖全 404 → 一度 text-only,改用 Chrome MCP 驅動瀏覽器讀 rendered DOM 後 9 圖 + 3 官方影片(教育部青年署 / TEDxTaipei / 數位時代)全挖出來,5.4k→10.5k 字擴寫承載。核心洞察:媒體完整度是素材挖掘深度問題,不是有無問題。三層升級:(1) Step 1.9.0 深度媒體掃描協議(HARD)——出 no-media 結論前必跑 Chrome MCP rendered-DOM 圖掃(JS-CDN curl/WebFetch 失效)+ YouTube 官方頻道影片掃,落 §6 negative finding;(2) image-health length-scaledmax(3, round(prose-CJK/1200)) → 4500→4 / 7000→6 / 9000→8,rewrite-stage-4 HARD,prose-CJK 排除 參考資料 footnote 段對齊 density 基準);(3) media-richness 靜態圖 floor 2→3 + People/Music/Nature 影片 INFO→WARN;paragraph-rhythm density floor 0.7→0.8。dogfood(REFLEXES #66 真產出校準,先抓到 base 4 + full-CJK 兩個 bug):複雜 13 / 設研院 5 / 天下 6 / 黃魚鴞 3 / 陳建年 8 named 範本全過、text-only(雜學校 0)失格 → EVOLVE。對應 REFLEXES #15 儀器化 + #66 gate dogfood 校準 + #50 pipeline auto-detect(深掃變 SOP 必經)。

v6.7 | 2026-06-04 深度研究-設計研究院 — 配圖證據層級(Step 1.9.2 選圖第一問):v6.6(天下)升級的是媒體的「量/密度」(圖+影片 ≥8 / band 0.7–1.2/1k);v6.7 補上正交的「質/證據」軸。Tier A 主體成果圖(改造後成果/作品本身/當事人在做那件事)> Tier B 脈絡圖 > Tier C generic 填位圖;機構/設計/產品/作品/工程/事件題材 Tier A 優先,Tier A 找不到 CC 就走 fair use editorial commentary(來源優先序第 8 點),不退用 generic CC 填位(授權便利不凌駕證據強度)。判準訊號:caption 一旦得寫「示意/非當事/非改造後」= Tier C 在報警,回頭找 Tier A。完整層級表 + source 技巧 canonical 落 EDITORIAL §媒體編織 §圖片的證據層級。觸發:設研院文章 5 張原本全是情境圖(松山文創×2 / generic 投開票所 / 中山站既有空間「非改造後」),哲宇 callout「圖要補關鍵案例被改造完後的圖(fair use)」→ 換 3 張 TDRI 改造後成果圖(衛生所候診區/公投公報/中山站售票區,cache 本地 + fair use 標註)。fair use scope 沿用 EDITORIAL 2026-05-09 既立的機構公開作品編輯評論。對應 REFLEXES #15 儀器化。

v6.6 | 2026-06-04 天下雜誌 — 媒體素材要求 + 圖文配比儀器升級:哲宇 directive「提升 rewrite-pipeline 媒體素材要求 + 文章健檢工具,想要圖+影片>8 或圖文配比更精妙評估,參考設研院/黃魚鴞富媒體文章自我進化」。儀器先於規則:量測 8 篇校準語料(黑冠麻鷺/黃魚鴞/陳建年/周蕙/張懸/設研院/中華台北/天下,prose-CJK 同軸)發現舊 paragraph-rhythm 上限 0.8 反而誤判哲宇點名的富媒體範本(設研院 0.91 / 天下 0.92 / 黃魚鴞 0.82)為「密度偏高」——儀器跟 directive 矛盾。修補:(1) paragraph-rhythm R3 從單一 ceiling 升密度 band(floor 0.7 media-poor / ceiling 0.8→1.2 / hard 1.5+median<55),catch 媒體偏少(中華台北 0.56)也 catch atomization(周蕙 1.76);(2) media-richness 加 length-scaled count target(圖+影片 ~1/1.1k 字,長文朝 ≥8,INFO)+ 多模態 nudge(People/Music/Nature 0 影片提示補官方影片);(3) media-richness 進 rewrite-stage-4 profile。富媒體範本(設研院 image-rich / 黃魚鴞 video-rich / 陳建年 8 multimodal / 天下 mixed)寫進 Step 1.9.2 + EDITORIAL §媒體編織 baseline。dogfood:8 篇驗證 band 正確分流(rich 範本 clean / media-poor WARN / atomization HARD)。對應 REFLEXES #15 反覆浮現要儀器化 + #59 製造數字的人最易被數字騙(量測校準不憑感覺)。

v6.5 | 2026-06-04 深度研究-設計研究院(同 session 第二輪進化)— 研究方法論 grounded in 12 份範本:哲宇 directive「多讀 >10 篇做得好的,統合出完整方法論再進化一番」。3 個 Explore agent 完整讀 12 份最高分歷史 report(毒馬鈴薯 85 來源 / 沈伯洋 132 來源 / 吳哲宇 / 雷亞 / 認知作戰 / 前途決議文 / 聶永真 / 蘋果西打 / 海底電纜 / 巴拉圭 / AIA / brian-tseng),萃取共通方法論 DNA。核心發現 = 信心程度系統(哲宇記得的那個,12/12 都有):三層 verification: frontmatter(high_confidence ≥2-3 源 verbatim 一致 / single_source 標 need cross-check / unverified 搜尋無果不寫進文章),每條附「憑什麼是這層」基礎 + 細 notation(★★★ 一手 DOI / 🟢🟡🟠 / confidence: high + Ctrl-F 欄 / ⚠️ 必驗)。Step 1.7 SSOT 七段→八段:加 §4 引語庫(逐字 + URL + 場合 + Ctrl-F,記者轉述分開)+ §5 反例/不能說的話/不採信清單(護欄前置)+ §3 數字分歧揭露 + §2 negative findings 必記 + §6 Stage 2 操作規範(hook/小標題/校正點/幻覺 Ctrl-F 清單)。方法論 canonical 落 RESEARCH.md §二之二(信度三層 + 10 骨架)。統合報告:reports/research-methodology-synthesis-2026-06-04.md。對應 REFLEXES #16 多源 + #22 raw 永不刪 + #15 儀器化。

v6.4 | 2026-06-04 深度研究-設計研究院 — 研究階段升格對標研究所論文標準:Stage 0.6.4 探索搜尋 ≤5→≥20;Stage 1.1 ≥40→≥80 + 4 條來源多樣性配額(中≥40 / 英≥20 / 一手≥15 / 反方≥5);Step 1.7 research report 從「agent 輸出 + header」升格SSOT 七段結構(觀點成型 / 搜尋日誌方法論 / Findings by sub-topic 標信度 / Clean Fact-Pack 合成層 / 參考文獻 / Verification Table / §7 agent raw 全 append 不摘要);新增 scripts/tools/research-report-health.py HARD GATE(distinct≥25 / 英文≠0 / 一手≠0 / 搜尋日誌 section / 信度標記≥8 / 行數≥300)儀器化 4 條配額;§多 agent 編排修「合成 clean fact-pack」regression(synthesis 是疊加層不替換 raw §7)+ 第 6 鐵律。觸發:量測 226 份歷史 report —— 57% 英文/國際/學術來源 = 0、42% distinct 來源 ≤ 10,且 v6.3 orchestration「合成 fact-pack」把 agent 原始搜尋軌跡丟掉(這次 TDRI session 報告退化成 192 行摘要 vs gold standard 毒馬鈴薯 85 來源 / 1,699 行)。哲宇 callout「研究報告品質下降 / 搜尋次數變少 / 沒有中英文不同來源」+ directive「Stage 0 20+ / Stage 1 80+ / 全部寫回 SSOT / 對標研究所論文」。診斷 + 設計:reports/rewrite-pipeline-research-ssot-evolution-2026-06-04.md。對應 REFLEXES #15 反覆浮現要儀器化 + #22 raw 永不刪 + #16 多源驗證。

v6.3 | 2026-06-01 170717-manual — 多 agent 編排(Orchestrator + tiered sub-agents):新增 §多 agent 編排 canonical — 主 session 當 orchestrator 不當 writer,各 stage 派對應 model tier(Stage 0.6 觀點=Opus agent 探索 2× / Stage 1 研究=Sonnet parallel fan-out falsification-first / Stage 2 寫=fresh Opus agent 只吃 fact-pack / Stage 3.5 查證=Sonnet verifier fan-out + 主 session spot-check)。把 v6.2 §0.2-bis 規則 2-3(觀點 blind to errata + 寫作 context 隔離)從 callout-only 泛化到所有 depth EVOLVE/Fresh。5 條鐵律含「sub-agent claim 是線索不是 oracle(REFLEXES #31)—— 主 session 重驗是 hard gate」(worked example:writer agent 自報全綠但 spot-check 抓到它新長一句杜撰賈樟柯引語)+「媒體用已驗證官方 URL 不採 agent 自選 ID」。觸發:哲宇 codify 2026-06-01 台灣影視配樂第三輪重寫的完整多 agent worked experience。dogfood:本次重寫即此編排(觀點 fresh agent blind to errata / fresh Opus writer / 主 session 一手 factcheck 抓杜撰引語 + 媒體換回 morning 已驗證官方 iframe)。

v6.2 | 2026-06-01 170717-manual — 拆除防火牆(Teardown Firewall)for callout-triggered EVOLVE:新增 Step 0.2-bis(投毒機制 + 三條防火牆規則:callout→純 fact-checklist 用完即丟 / 觀點 blind to errata / Stage 2 context 隔離)+ Step 3.2-bis(校正焦慮掃描 backstop 自檢句 + grep 校正型句式 + 論點脊椎自檢)+ Step 0.1 callout-triggered 觸發旗標(正交於 4 模式)+ Hard Gate Inventory 加「校正焦慮掃描」row + 反射 #4 拆除防火牆 + 反轉 v6.0 reflexes #3 EVOLVE 條款(「可參考為什麼舊文寫不好幫助觀點成型」是投毒源,移除)。觸發:2026-06-01 配樂專業讀者 peilinwu0702 第二輪 callout —— 台灣影視配樂 EVOLVE 後事實層修對(25 footnote 全一手)但「整篇充滿 AI 道歉/澄清、架構從頭就有問題」。根因:舊文 body + callout 同在 session context → 觀點變成校正清單昇華 → 9 處校正型句 + 2 個校正型策展 box + 投毒論點脊椎「搞錯名字就是搞錯聲音的出處」。哲宇診斷「舊文+舊 context 投毒」比「callout 過擬合」更精準 —— 架構解(context 隔離)非守備修補(自檢句)。診斷報告:reports/reader-callout-pipeline-diagnosis-2026-06-01.md。對應 feedback_red_line_anxiety_leak 架構級放大 + REFLEXES #16 + #15(規則要能執行)。

v6.1 | 2026-05-2x — footnote plugin gate:Stage 3 加 article-health.py --profile=rewrite-stage-3-5(footnote-format + footnote-density)為 citation hard gate。

v6.0 | 2026-05-11 admiring-montalcini-ec53b4 — Stage 0 觀點獨立 stage:新增 Stage 0「觀點」(6 step:模式識別 / 既有素材萃取 / 選 canonical / 範圍切片 / 載入方法論 / 觀點成型)作為 editorial vision 階段,與 Stage 1 取材的 data gathering 階段認知模式分離。觀點成型 6 核心問題(記憶 / 多元面貌 / 想法感受 / 歷史脈絡 / 社會關聯 / 類型專屬)+ 7 品質維度(溫度 / 人味 / 故事 / 策展 / 觀點 / 體驗 / 歷史社會關聯)+ 5 row 類型加權矩陣(People / Food-Culture / History-Politics / Tech-Industry / Nature-Geography)。允許輕量探索性搜尋 ≤ 5 次。§觀點成型 落 research report + frontmatter viewpoint_formed: true 為 HARD GATE,不過不進 Stage 1。原 Stage 1 Step 1.6-1.14 重編為 1.1-1.9,原 Step 1.1-1.5 移至 Stage 0。觸發:哲宇 2026-05-11 callout「重點在溫度 / 人味 / 故事 / 策展 / 觀點 / 體驗 / 與社會歷史環境跟我們人生的關聯」+「希望加一個觀點成型的步驟,總編輯視角看這個主題怎麼寫才會立體」+「想要獨立一個 stage」。Dogfood: 蘋果西打 PR #1041 research report 補 retroactive §觀點成型 section 作為首個案例。

v5.0 | 2026-05-11 admiring-cohen-8b68fc — Stage spine restoration:heading 階層 H1-H4 統一深度(文件 H1 / Stage H2 / Step H3 / sub-step H4)+ Step 編號正規化 N.M(解 v4.1 ## Step A-X 5 套並排 grep collision)+ ASCII spine 顯化在頂部 + Stage 6 翻譯維持 v4.1 抽掉狀態指向巴別塔。觸發:哲宇 callout「用 v4 的精神進化 v3 — 所有步驟都是相同的,每篇都要跑過,只有第一個步驟有判定模式」。設計理由:reports/rewrite-pipeline-v5-stage-spine-design-2026-05-11.md

v7.9 | 2026-07-06 INDIGO-REWRITE — Step 0.6.1-bis 收斂為 PERSONA-PIPELINE 薄殼 pointer:PERSONA-PIPELINE.md 誕生於 2026-06-13(v1.0),自己的 §6 callers 表早就宣告「REWRITE Step 0.6.1-bis v7.2 thin caller」,但 v7.3 到 v7.8 六次版本升級都沒真的把 inline 邏輯拔掉:20 archetypes 原型表、4-agent call contract、輸出 schema、cost guard、❌✅ 反例表全部繼續留在 REWRITE 自己身上,跟 PERSONA-PIPELINE canonical 平行存在一年沒被抓到(REFLEXES #56 pipeline canonical ↔ production drift 的具體案例)。逐句對照兩份文件後發現這份 inline 副本已經漂移:D 軸少列一個「再現主權敏感者」原型(canonical §1 有 5 個、inline 只剩 4 個卻仍宣稱 5 persona)、完全沒提 PERSONA-PIPELINE §4 的 reuse-from-report SSOT 規則(persona pool 算一次、多 caller 共享,SPORE-PIPELINE 的 hook-select 早就靠這條規則在 reuse,REWRITE 自己的文件卻沒讓讀者知道這件事存在)。修法:把 Step 0.6.1-bis 改寫成真正的薄殼,只留 REWRITE 專屬的三件事(為什麼六題不夠的編輯理由、呼叫 PERSONA-PIPELINE 的參數、輸出併回 REWRITE 自己 Stage 0 流程之後的分類/落檔/下游接線),20-persona 原型表、4-agent 實作細節、輸出 schema、cost guard、通用反例表全部改成指向 PERSONA-PIPELINE.md 對應章節。Grep 過 SPORE-PIPELINE.md(已是正確 thin caller,§階段 1 PICK 的「persona 切入點 consult」step)、ROUTINE.md、.claude/skills/ 全目錄,確認沒有第二份複製。純文件整併,不改任何 runtime 行為。對應 MANIFESTO §我的進化哲學 — 指標 over 複寫 薄殼鐵律三條 + REFLEXES #56。

最近 milestone(完整 changelog → git log docs/pipelines/REWRITE-PIPELINE.md

  • v7.9(2026-07-06 INDIGO-REWRITE)— Step 0.6.1-bis 收斂為 PERSONA-PIPELINE 薄殼 pointer:修一年沒被抓到的 canonical↔production drift(PERSONA-PIPELINE v1.0 早宣告 thin caller,v7.3-v7.8 六次版本升級都沒真的拔掉 inline 副本,且副本已漂移:D 軸少一個原型、沒提 reuse-from-report 規則)。SPORE-PIPELINE / ROUTINE / skills 全目錄 grep 確認無第二份複製。守 REFLEXES #56 + MANIFESTO §指標 over 複寫

  • v7.8(2026-07-05 柯智棠健檢 round 2)— 收件 gate 儀器化:新儀器 agent-report-health.py 驗每份分部報告(壓縮嫌疑/存放位置/軌跡密度/五段結構,疑慮附為什麼+思考方向)+ research-report-health v2.1 主 report 疑慮通知層 + Step 1.8-bis 步 2 儀器化。真實 corpus 校準:4 壓縮版全攔 / 8 真 final 全過。守 REFLEXES #81 + #15 + #66 + #69

  • v7.7(2026-07-05 柯智棠健檢)— Async agent 時代 raw 保全:鐵律 8 禁 orchestrator aggregate-on-receive / Step 1.8-bis 三步 SOP(agent 自落檔+notification 先落檔+gate 收口)/ research-report-health v2 兩條 hard gate(§8 有效密度 + ephemeral pointer)。三病例:柯智棠(救回)/ 蘇打綠(救回)/ 醫療(5 份 raw 永久蒸發)。守 REFLEXES #42 + #31 + #22 + #15

  • v7.3(2026-06-13 persona-stage0)— Stage 0 exit gate 儀器化:research-report-health.py --stage 0 三件套 hard gate(觀點成型 + viewpoint_formed + 六核心 + persona + 搜尋日誌 + ≥10 來源 proxy),persona-only = FAIL。dogfood 看不見的國家 PASS / persona-only sim FAIL。守 REFLEXES #15 + #66

  • v7.2(2026-06-13 persona-stage0)— Stage 0.6 anti-drift:persona 是「額外」不是「取代」。哲宇 callout 其他 session 只跑 persona 跳過 ≥20 探索;git 確認 persona 純額外插入;加「三件都必做缺一不進 Stage 1」框(六核心 + persona + ≥20 探索)+ checklist 補 ≥20 探索獨立項 + Hard Gate persona-only=FAIL。守 REFLEXES #15 + MANIFESTO §8

  • v7.1(2026-06-13 persona-stage0)— Stage 0 加 persona 發散:Step 0.6.1-bis「20 路 persona 切入點」4 Sonnet agent 平行模擬 20 個不同年齡/國籍/性別/處境讀者的冷反應問題當研究入射點,每題標 🆕(進切入點清單)/✅/⛔(whats_excluded)。dogfood:《看不見的國家》哲宇 ship 後追問三題六題沒覆蓋 → 內化成自動發散。守 REFLEXES #42 + #31 + #15

  • v7.0(2026-06-10 嘻哈饒舌)— Stage 3 嚴謹化:Step 3.6 成品總驗三關(原子重驗 fan-out 抓四種草稿驗不到的 drift / 順稿 / 視覺同步),A 級/大眾文/勘誤後 HARD。觸發:老莫勘誤寶哥=黃信佳 + 哲宇「成品要再一道查核關卡」

  • v6.6(2026-06-04 天下雜誌)— 媒體配比儀器升級:paragraph-rhythm R3 升密度 band(floor 0.7 / ceiling 0.8→1.2 / hard 1.5+median<55,從富媒體範本校準)+ media-richness length-scaled count(長文朝 圖+影片 ≥8)+ 多模態 nudge。觸發:舊 0.8 上限誤判設研院/天下/黃魚鴞富媒體範本。8 篇 dogfood

  • v6.5(2026-06-04 同 session 第二輪)— 研究方法論 grounded in 12 份範本:信心程度系統三層 verification(哲宇記得的)+ Step 1.7 七段→八段(引語庫 / 反例 list / 數字分歧揭露 / negative findings / Stage 2 操作規範)。方法論 canonical → RESEARCH.md §二之二。統合:methodology synthesis

  • v6.4(2026-06-04 深度研究-設計研究院)— 研究階段對標研究所論文:Stage 0 探索 ≥20 / Stage 1 ≥80 + 4 來源配額 / Step 1.7 SSOT 七段結構(raw §7 不摘要)/ research-report-health.py HARD GATE 儀器化 / 修 v6.3「synthesis 吃掉 raw」regression。觸發:226 份 report 量測 57% 英文來源=0 + TDRI session 報告退化

  • v6.3(2026-06-01 170717-manual)— 多 agent 編排:orchestrator + tiered sub-agents(觀點 Opus / 研究 Sonnet fan-out / 寫 fresh Opus / 查證 Sonnet verifier fan-out + 主 session spot-check);§0.2-bis 規則 2-3 泛化到所有 depth EVOLVE/Fresh;「sub-agent claim 重驗是 hard gate」

  • v6.2(2026-06-01 170717-manual)— 拆除防火牆 for callout-triggered EVOLVE:Step 0.2-bis 三條防火牆(callout→fact-checklist 用完即丟 / 觀點 blind to errata / Stage 2 context 隔離)+ Step 3.2-bis 校正焦慮掃描 backstop;反轉 v6.0「觀點可參考舊文為什麼爛」投毒源。觸發:影視配樂第二輪 callout

  • v6.1 — footnote plugin gate(Stage 3 footnote-format + footnote-density 升 citation hard gate)

  • v6.0(2026-05-11 admiring-montalcini-ec53b4)— Stage 0 觀點獨立 stage:editorial vision 階段先於 data gathering;6 核心問題 + 7 品質維度 + 5 類型矩陣;§觀點成型 HARD GATE

  • v5.0(2026-05-11 admiring-cohen-8b68fc)— Stage spine restoration:H1-H4 階層一致 + Step N.M 編號 + ASCII spine 在頂部;v3.0 spine 骨架 × v4 單檔載體 × v4 evolved 內容(影音必找 + 標題三明治不丟)

  • v4.1(2026-05-11 sad-shockley)— Stage 6 抽掉 → 巴別塔 pipeline 指標;REWRITE 變 5 stage 線性

  • v4.0(2026-05-10 sad-shockley)— 單檔收斂 + 模式收進 Stage 1 + 編號正規化 + ASCII diagram 在最前

  • v3.1(2026-05-10 sad-shockley)— Hard Gate Inventory 加 Title+desc spine sync + 媒體素材 v3.1 雙條反射;EDITORIAL §Title 從 People-only 擴為全 category

  • v3.0(2026-05-09 brave-kirch)— 1290 → 280 行(-78%)+ 拆 6 sub-canonical(v4 已收斂回

  • v2.20(2026-04-28)— 新增 Stage 1.7 媒體素材研究 + Stage 4.5 媒體插入(v4 收進 Stage 1 Step L + Stage 4 Step C,v5 改為 Step 1.14 + Step 4.3)

  • v2.18(2026-04-21)— Stage 1 agent 選型 + 私有 SSOT 整合 + Stage 2 密度平衡 + Agent claim 驗證

🧬