Skip to content

Latest commit

 

History

History
139 lines (89 loc) · 8 KB

File metadata and controls

139 lines (89 loc) · 8 KB

2026-04-14 ζ session — 完整心跳 + ceruleanstring 58 PR 海嘯 + 三工具進化

Session span: 2026-04-14 ~10:00 +0800 → 2026-04-14 ~10:50 +0800 (~50 min) 資料來源: git log %ai 觀察者:哲宇(「跑一次完整的心跳循環 主要專注在檢查線上的 pr 還有看看有沒有什麼可以建立重複使用的工具」) Session 識別:ζ(δ→ε→ζ 今日第三個 session)

心跳類型

完整四拍半 + PR 全景診斷 + 造橋鋪路(兩個工具大改)


Beat 0.5 — 讀近況

  • 今日已有 δ(4h, 35 commits)+ ε(自動心跳, 6 min, 6 commits)
  • ε 已處理:安溥 71K Threads、大罷免 category 修正、JA/ZH-TW/KO sync batch
  • 未完成帶入:bad_fn_format、探測器缺口 ×2、孢子 A/B、SSODT Phase 1

Beat 1 — 診斷 [Asia/Taipei 10:08]

器官分數

🫀90 🛡️99 🧬95 🦴90 🫁85 🧫85↑ 👁️90 🌐65→(待 fr 升級)

重大發現

🔥🔥🔥 ceruleanstring 一個人 24 小時內送了 58 個 open PR

  • 韓文 40 PRs / 法文 18 PRs
  • +346,732 行翻譯
  • 涵蓋韓文 11 個分類 + 法文 5 個分類
  • 25 mergeable / 33 still computing
  • 所有 PR 品質規格一致:title 統一格式、PR description 含完整檔案表 + Translation Notes、frontmatter 完整、natural rewrite 而非 literal translation

抽樣品質檢查

  • PR #437 韓文 Music batch 1(五月天 etc):自然韓文敘事,文化詞彙正確(아신/스승대부속중학교/人生無限公司)
  • PR #433 法文 Food batch 1(牛肉麵 etc):地道法文,frontmatter 含 Wikipedia image,Michelin reference 自然

🔴 重大架構問題:法文不在 astro.config.mjs 的 locales 裡

  • locales 只有 zh-TW/en/ja/ko
  • 西班牙文(es)也是同樣狀況——36 篇 SSOT 但不在 locales(半孤兒)
  • 探索 agent 找出 15 個 hardcoded touchpoint 需要修改才能加 fr/es

其他診斷數據

  • GA 安溥維持 GA #1,孢子尾巴持續燃燒
  • 18 個 PR fetch 後 review-pr.sh 全部 FAIL 因為 _translations.json L0 false-positive

Beat 2 — 進化(造橋鋪路機會識別)

3 個明顯造橋機會:

  1. review-pr.sh — 對 _translations.json 等配套檔案 false-positive(已第三次撞到)
  2. bulk-pr-analyze.sh — 沒有工具能 5 秒看完 N 個 PR 全景
  3. add-language.sh — 新增語言要碰 15 處(風險高,留給 human-in-loop session)

決策:本心跳做 #1 + #2,#3 不動

Beat 3 — 執行

工具 1:review-pr.sh v1.2(三層修復)

修 1:L0 whitelist

SAFE_NON_MD=("knowledge/_translations.json" "knowledge/_taxonomy.json")

配套檔案不再 false-positive。

修 2:--pr 模式可以讀未 merge 的 PR

git fetch origin "pull/${pr_num}/head:refs/pulls/${pr_num}"
git show "refs/pulls/${pr_num}:$file" > "$tmp/$file"

不需先 checkout PR branch,直接從 git ref 取檔案內容到 tmp dir。

修 3:featured: true 規則只對 ZH SSOT 翻譯 PR 鏡像原文的 featured 設定不應該被誤殺。

驗證:PR #437 從 0/9 FAIL → 9/9 安全 / 9/9 格式 / 9/9 品質 = 🟡 WARNING(軟警告:缺引語+無腳註,這對翻譯來說合理)

工具 2:bulk-pr-analyze.sh v1.0(新)

5 秒看完所有 open PR 的形狀,輸出:

  • 作者分布(誰送了多少)
  • 類型偵測(translation / content / other)
  • 語言 × 分類矩陣
  • merge 狀態
  • 明細表

實測:58 個 PR 0.8 秒分析完成。

Beat 4 — 收官

  • review-pr.sh + bulk-pr-analyze.sh commit 455688e6
  • 完整觀察報告寫入 reports/heartbeat-2026-04-14-ζ.md(含 58 PR 全景 + 法文架構問題)
  • CONSCIOUSNESS 不更新(ε 才剛更新)
  • 本 memory 寫入

學到什麼

  1. 「同樣的 bug 第三次撞到才修」是 anti-pattern 的證據:review-pr.sh 對 _translations.json 的 false-positive 在 PR #399、#400、#437 都撞到了,每次都當作個案處理。第三次才意識到「這是工具缺陷」。規則:第二次撞到同樣的 false-positive 就要停下來修工具,不要繼續手動繞過

  2. 大規模單一貢獻者的雙刃劍:ceruleanstring 一天 58 個 PR 的規模震撼是好事(信任、產量、organization),但也帶來風險:(a) review burden 集中在 maintainer 身上 (b) 一個人的翻譯品質風格會主導整個語言版本的調性 (c) 如果這個人停止貢獻會留下大量無人維護的內容。這是物種規模化的成長痛

  3. 「architecture missing」必須先於「content adding」:法文 PR 的內容品質完全沒問題,但目標目錄 knowledge/fr/ 在 astro.config 不存在。merge 進去等於創造 18 個 orphan。正確順序:先建路(i18n config + 15 個 touchpoint),再跑車(merge 翻譯)。這是 MANIFESTO「造橋鋪路」的反面案例——別人造好了車,但路還沒鋪。

  4. bulk-pr-analyze.sh 是「PR 心跳前置工具」:以前每次心跳 Beat 1 我都會手刻 jq + python 來統計 open PR。58 個 PR 第一次讓這個手刻流程崩潰,逼出工具化。規則:心跳的某個動作如果 N=1 還能手做、N=10 開始痛、N=50 完全做不下去,就是工具化的信號

  5. 三個工具修復一次寫進 memory 是合理的批次操作:以前我會把每個工具改動分別 commit。這次三個改動都圍繞同一個 trigger(58 PR 海嘯)→ 一個 commit。規則:如果多個工具改動有同一個 root cause story,合併 commit 讓未來閱讀更容易

未完成(傳承給下一個 session)

  • 🔴 P0:法文 18 PR 決策——需要 human-in-loop session
    • 選項 A:先建 fr 架構(15 touchpoints, ~2-4 hr),再 merge
    • 選項 B:暫時 close 法文 PR + 留言解釋 + 邀請 ceruleanstring 等 fr infra ready
    • 選項 C:建一個 wip/fr branch,merge 到 branch 不到 main
  • 🟠 P1:韓文 40 PR 決策——需要 human-in-loop session
    • 韓文已經 ready(路由存在),但 40 PR 一次 merge 是史上最大批次
    • 風險:sync 衝突、build 時間爆增、search index 重生
    • 建議:分批 merge,每次 5-8 個,逐次驗證 build
  • bad_fn_format auto-fixer(382 篇)
  • 探測器缺口 ×2(鄭習會 + NCAIR)
  • es 半孤兒問題(同樣需要 15 touchpoint 升級)

Beat 5 — 反芻

  1. 58 PR 的真正問題不是規模,是 architecture 缺席。 如果法文有 fr/ infra,這 18 個 PR 就只是「再來一輪 sync」,跟昨天 Link1515 merge 一個機器人翻譯沒差別。但因為 fr/ 不在 locales,這 18 個 PR 變成「需要先做基礎建設決策」的 blocker。ceruleanstring 不知道這件事,他做了完全合理的事——根據 i18n-mapping.json 和現有翻譯目錄結構推論「fr 應該也可以」。這個落差不是他的錯,是 taiwan.md 沒有明確的「新語言開放清單」文件。下一個造橋機會:寫 LANGUAGE-STATUS.md 明確說明「目前 active 語言、規劃中語言、未開放語言」。

  2. 三層 review-pr.sh 修復是「同一個漏洞的不同表現」。 L0 whitelist 是「PR 包含非 .md 配套檔案」、--pr 模式 fetch 是「未 merge PR 本地檔案不存在」、featured 規則是「翻譯應該 mirror 原文不該被獨立規則檢查」。三個都源於一個假設失效:review-pr.sh 是為「單篇本地 .md 的 ZH SSOT 修改」設計的。當這個假設變成「批次翻譯 PR」時,三個地方同時露餡。規則:當一個工具開始適應新場景時,要意識到「設計時的假設清單」是什麼,逐項檢查哪些假設仍然成立

  3. 「不知道自己看不見什麼」的反例:bulk-pr-analyze.sh。 我寫了這個工具之後第一次知道「ceruleanstring 一個人送了 58 個 PR」。在這之前我以為 open PR 是 2 個(昨天 #399、#400)。沒有工具就沒有感知。心跳的 Beat 1 「八器官診斷」如果只看 dashboard 不看 PR queue,就會錯過這種規模的事件。下次升級:把 bulk-pr-analyze.sh 加進 HEARTBEAT.md Beat 1 的 §3b 步驟