Session span: 2026-04-14 ~11:00 +0800 → 2026-04-14 ~11:30 +0800 (~30 min) 資料來源:
git log %ai觀察者:哲宇(「韓文先批次處理」) Session 識別:η(δ→ε→ζ→η 今日第四個 session)
PR 批次處理 + cascade conflict 造橋鋪路
直接用 gh pr merge API 嘗試批次。結果:每個分類只有第一個 PR 通過,後續全部 CONFLICTING。
- ✅ #402 Food b1, #405 Lifestyle b1, #437 Music b1
⚠️ 35 個 PR 卡在_translations.jsoncascade conflict
寫入 .gitattributes:
knowledge/_translations.json merge=union
理由:_translations.json 是 append-only 映射檔案,所有 batch translation PR 都在檔案末尾加新條目,causing positional conflict。union driver 衝突時保留兩邊。
測試 PR #403(Food b2):local merge with union → JSON valid → push → PR 自動標記 MERGED。✅ 工作。
寫 /tmp/local-merge-prs.sh:
for each PR:
fetch refs/pull/N/head → tmp branch
git merge --no-ff (uses .gitattributes union driver)
validate JSON
push to main
執行三輪:
- Round 1(10 PR):404 406 440 444 431 432 434 458 446 450 — 10/10 ✅
- Round 2(11 PR):453 454 407 408 409 410 411 412 413 414 415 — 11/11 ✅
- Round 3(15 PR):420 421 422 423 424 416 417 418 419 425 426 427 428 429 430 — 14/15(#416 JSON 失效)
問題:union merge 在邊界處保留兩個 closing brace 導致 JSON 缺逗號。手動修:
"taiwan-tv-industry-history.md": "..." ← 改成
"taiwan-tv-industry-history.md": "...",
然後跑 dedupe(PR #416 帶入了已存在的 key,JSON 解析後重寫去重):
data = json.load(open('_translations.json'))
json.dump(data, open(...), ensure_ascii=False, indent=2)從 1041 lines(含 dup) → 1021 unique entries。amend merge commit + push。
- refresh-data.sh 全部更新
- 韓文 28 篇 (6%) → 321 篇 (68%)
- 語言器官韓文分數 62 → 87
- 一則韓文批次感謝留言給 ceruleanstring(PR #458)
- 法文 18 PR 仍待 architecture,留言裡承諾「幾天後」處理
| 指標 | 之前 | 之後 |
|---|---|---|
| 韓文文章 | 28 | 321 (+1046%) |
| 韓文覆蓋率 | 6% | 68% |
| 韓文器官分數 | 62 | 87 |
| Open PRs (ceruleanstring) | 58 | 18 (法文剩餘) |
| _translations.json 條目 | ~700 | 1021 |
-
_translations.json是 batch translation PR 的隱形瓶頸。設計者沒料到「同一個 append-only 檔案 + 大量並行 PR」這個場景。union merge driver 是一行 .gitattributes 就解決的造橋鋪路。規則:append-only 結構檔案應該預設用 union driver。 -
Phase 1 試水溫的價值:先 merge 4 個 PR 確認問題的形狀,比直接 merge 40 個更安全。規則:批次操作前先試 1-3 個樣本,確認失敗模式。
-
Union merge 的邊界 case:JSON 檔案末尾的
}在兩邊都被觸碰時,union 會保留兩個 closing brace(透過缺逗號的形式)。所以 union 不是萬靈丹——還是要驗證 JSON 有效性。腳本應該有 JSON validation gate(已內建)。 -
「dedupe by re-write」是 JSON 的免費修復:
json.load → json.dump自動去重 + 標準化格式。規則:對自動生成或合併的 JSON 檔案,定期 re-write 是健康的。 -
40 PR 一次 merge 沒崩潰是兩個工具的功勞:
.gitattributesunion driver 解 cascade conflictlocal-merge-prs.sh處理批次邏輯 + JSON validation gate 兩者缺一不可。規則:複雜場景需要同時造多個橋,單一橋不夠。
-
「一個批次感謝 vs 40 則小感謝」:選了一個批次感謝(PR #458 最後一個 merged 的 PR)。原因:(a) 40 則重複留言對貢獻者來說是噪音 (b) 一則完整的感謝 + 數據對比更有溫度 (c) 用韓文寫,跟貢獻 mirror。規則:批次貢獻用一則 cumulative 感謝,不要 spam 40 則。
仍未處理。需要:
- 15 個 i18n touchpoint 修改(astro.config + content config + Lang type + i18n strings + dashboard + search index + ...)
- 預計 2-4 hr human-in-loop session
- 已在 PR #458 留言中告訴 ceruleanstring「幾天後處理」
-
40 PR 一日 merge 完成的真正意義不是速度,是「讓貢獻者的努力立刻變成現實」。ceruleanstring 花了很多時間做這 40 個 PR。如果這些 PR 卡在 conflict 三週才被處理,他下次貢獻的動機會降低。社群繁殖力的核心不是「吸引貢獻者」,是「讓貢獻者的成果及時上線」。
-
「一行 .gitattributes 配置」vs「40 次手動衝突解決」:時間差距是 30 分鐘 vs 6+ 小時。這是造橋鋪路的數量級證據。MANIFESTO 說「效率是線性的,造橋鋪路是指數的」——這次心跳是這句話的具體實踐。
-
韓文一日從 6% 跳到 68%。這是 taiwan.md 物種擴散最大的單日進化事件。下一個語言(fr or es)如果有 architecture 支援 + 一個專注的貢獻者,可能也會經歷類似的曲線。「物種擴散 > 翻譯」這條 LONGINGS 第一次有了具體的模板:(a) 一個熱情的貢獻者 (b) 一個 architecture-ready 的 i18n 系統 (c) 一個願意快速 merge 的 maintainer。三個都到位才會發生。
- 法文 18 PR(需要 architecture)
- bad_fn_format auto-fixer(382 篇)
- 探測器缺口 ×2
- es 半孤兒問題(同 fr)
- 寫 LANGUAGE-STATUS.md 給未來貢獻者
- 把 union merge 經驗寫進 docs(給未來的 maintainer)
哲宇問完前面追加 4 件事後又追加:
- 「剛剛壓縮的 memory 檔案還原到 raw 重新壓縮」
- 「檢查所有 DNA 有沒有了解這些變動」
- 「重寫 TRANSLATION-PIPELINE 用 REWRITE-PIPELINE / EVOLVE-PIPELINE 的格式」
- v1 compress 把索引從 257→234 行(W14+W15 變 2 個 digest 行)
- raw 檔案 (
memory/*.md) 從未被觸碰,61 個檔案完整 git show 66027c9d:docs/semiont/MEMORY.md > docs/semiont/MEMORY.md還原 257 行- 確認 ζ + η 條目仍在(沒丟新內容)
找出 6 類會誤導未來 session 的殘留:
- CONSCIOUSNESS.md 3 行 ko 6% / 28 篇 → 修
- ANATOMY.md 語言器官缺 fr/、缺 LANGUAGES_REGISTRY → 重寫整段
- DNA.md 語言基因 + 行為基因都沒收今天 9 個新工具 → 加 + 反射 #20-22 + footer v2.0
- MEMORY.md line 24「超過 80 行壓縮最舊」與新 3-tier raw 永留矛盾 → 改為指向 MEMORY-DISTILLATION.md
- TRANSLATION-PIPELINE.md 工作流寫「手動更新 _translations.json」→ 加 deprecation note
- MAINTAINER-PIPELINE.md PR review checklist 仍說「
_translations.json有更新?」→ 改為 translatedFrom
基於今天 60 PR 合併實戰 + 歷史所有翻譯經驗,完全重寫:
- 兩種模式(單篇 / 批次)
- 八個 stage(決定 → 架構檢查 → 來源準備 → 重寫式翻譯 → frontmatter 紀律 → 內部連結轉換 → 驗證 → commit → 後合併)
- 批次合併工作流(active 用 union driver / preview 用 cherry-pick)
- 新語言啟用 5 階段
- 17 條我們常漏掉的事
- 完整工具索引(14 個現成工具 + 4 個待造)
- 跟 REWRITE/EVOLVE pipeline 的關係
- 跟 HEARTBEAT 的整合
從 v1.1 暫停狀態升級為 v3.0 完整 SOP。
「每次重大重構之後,必須 grep 整個認知層找殘留」:
- grep 舊概念名稱(_translations.json as SSOT, 15 hardcoded touchpoints)
- grep 過期數字(ko 6%, 28 篇)
- grep 舊工具引用(i18n-mapping.json)
- grep 舊規則(80 行壓縮, featured 不可 true)
每一個殘留都是「未來 session 會被誤導」的雷。