Skip to content

doc↔code 同步守門的覆蓋缺口:非 hint 字串與數值常數仍會靜默漂移 #885

Description

@s123104

摘要

PR #880 建立了 doc↔code 同步守門(引述綁定逐字比對 + hint 近似網),有效消滅了「文件抄寫關卡 hint 但實作已改」這類漂移。但覆蓋範圍僅限 LevelSpec.hint(9 條)與 4 處 opt-in 綁定的引述,其餘引述 src 常數的文件內容仍會靜默漂移。

背景與證據

這道守門的起因是一次真實漏網:04-levels-world.md 的 §60 L8 hint 主句寫著「地面長按吸入鍵 0.6 秒星化變身」,但 levels.ts:613 的實際值早已改為 SP 鍵。它沒有帶任何取代標註,所以既不在人工 sweep 的搜尋範圍(找 已由/已於/已被),也不被守門的行內標註規則涵蓋——是純粹的無標記過期抄寫。

複審席的故障注入證實缺口仍在:

注入:未綁定的錯誤 toast「星力結晶!長按 B 鍵引爆」
結果:verify:docs exit 0(漏)

影響

GAME_DESIGN 系列設計文件是接手者的 SSOT。無標記的過期抄寫比有標記的更危險——讀者沒有任何線索知道該去查證。目前只有 hint 這一類受保護,toast、技能浮字、UI 標籤、數值常數(HP、telegraph 時長、難度門檻)都在覆蓋範圍外。

範圍

分兩類,成本與作法不同:

A. 字串類(toast、技能浮字、UI 標籤) — 成本較低。複審席建議的方向是把「長引述強制綁定」寫成慣例並由守門執行,而非對短標籤做全面 exact-match(後者會誤傷「世界地圖」這類通用詞彙造成大量偽陽性)。需先盤點有多少處值得納管。

B. 數值常數(HP、telegraph、難度門檻) — 成本高一個量級。這類值不是「」引述而是散在敘述句裡,機械化需解析 TS 物件字面值並建立「值 ↔ 欄位路徑」對映。原作者評估後決定不做,理由是數值漂移通常伴隨鄰近上下文一起變、人眼較容易發現。此判斷需要在本卡重新評估是否成立。

待修的既有小瑕疵

scripts/verify-design-docs.mjs:30-31 的校準敘述寫「211 筆」,與現況計數(約 204 非廢止/218 含廢止)不符;「其餘 ≤0.20」也略大於實測的未綁定集合。門檻 0.5 的分離帶結論不受影響(實測 bound 0.412 vs stale 0.558),但註解數字應更新為實測值或改為「約 N」。

驗收標準

  1. 決定 A 類的納管範圍與機制,實作後以故障注入證明能擋(至少涵蓋複審席用的錯誤 toast 樣態)
  2. 重新評估 B 類是否值得做,結論寫進文件(做或不做都要有依據)
  3. 慣例(哪些內容必須綁定、綁定格式)寫進 99-superseded.md 或貢獻指引,不能只存在於守門程式碼裡
  4. 修正 verify-design-docs.mjs:30-31 的校準計數註解

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions