跳至主要内容

ADR-019: 驗證結論與進度一致性:證據失效的分級處置

ADR 編號: 019 狀態: 已採納 (Accepted) 提案日期: 2026-10-02 決策日期: 2026-10-03 最後修訂: 2026-10-03 決策者: 團隊 peer review:設計方向三輪通過;P0 成果六輪、P1 四輪、P2 三輪、P3 四輪通過 範圍: /uat-script 來源比對、/uat 驗收帳本、/progress 與 /work 的證據閘門、/domain-model 遷移、方法論機制升級的相容責任 關係: 部分修訂 ADR-016(見「對 ADR-016 的修訂」)

摘要​

ADR-016 讓「指南是否正確」與「先前通過是否成立」分開判定,大幅減少誤報;但偵測結果仍直接決定處置:一旦判為 stale,就必須重生指南、重新人工驗收,/work 上其後各步一併失效。遷移、搬檔、證據格式升級、樣式調整這類不改變驗收命題的變更,因此照樣讓證據失效、讓進度停擺。

本提案把機制分成兩層:偵測(什麼變了)與處置(所以要做什麼)。處置採非對稱的舉證責任:自動化驗證除非證明不需要,否則重跑;人工驗收除非證明需要,否則不重驗。通過紀錄依驗收命題延續,不依指南文字或證據格式。進度與待補驗事項分開記錄;AI 可以建議回退,但回退必須經人類複核,分歧在驗證層解決。

審閱結論​

2026-10-02 經三輪 peer review 通過設計方向。第 1 輪 5 條意見(4 major、1 minor;原 blocking 經討論撤回改為 minor)、第 2 輪 5 條意見(1 major、1 minor、3 question)皆已修訂處置,無不採納項目;各輪修訂內容見「變更歷史」。待決點 Q1–Q6 的裁決見「審閱裁決」節。

通過範圍僅限本 ADR 與文件站索引。 本次通過不解鎖任何規則、skill 或工具的修改,也不解鎖 /methodology publish:P0–P3 各階段實作須另行送審;ADR 狀態維持 Proposed,全部階段通過後才改為 Accepted。審閱時未跑 Docusaurus 完整建置、未獨立重跑下游證據盤點;背景中的 florae-g1 數據為作者於 2026-10-02 以方法論 91db2361 唯讀盤點的結果。

採納(2026-10-03):P0–P3 成果審閱全部通過,狀態改為 Accepted;P0–P3 一併 /methodology publish。設計方向在實作中的修訂分別記於「P0 實作裁決」至「P3 實作裁決」。

背景​

觸發案例與實測盤點​

2026-10-02 準備遷移下游 florae-g1 的 Domain Model(specs/domain-model/ → design/domain-model/,ADR-018 P0)。遷移只改 65 個檔的引用路徑並搬移一個檔案,不改任何需求,原先估計會讓 28 份已驗收的 P.UAT 指南失效。

以現行 verifier 對 florae-g1 全部 46 份 UAT 結果唯讀執行 verify-result(遷移前、方法論 91db2361)後發現:遷移之前就只有 1 份能通過驗證。阻擋證據的不是遷移,而是同類的既有問題。

現況數量原因
通過驗證1schema 6 帳本(US-502)
工具不支援7來源 schema 2(3 份)、schema 4(4 份);verifier 只讀 schema 5/6。其中 5 份為通過、2 份已撤銷
schema 5 整檔 stale33幾乎全部同時列出 design language、package.json、lock 檔、E2E spec 變更
schema 6 review-needed4框架版本、翻譯、design language 等脈絡來源
schema 6 stale1宣告的脈絡來源變更或消失

以結果狀態分:

結果狀態數量說明
通過且未撤銷(舊 schema)20只因工具限制或整檔指紋被擋;result schema 1/3/5
已撤銷1613 份為介面調整(例如 9 份同為「Detail page alignment」、商品 Finder 列高、共用操作列);2 份為需求變更(結算方式);1 份為重生指南
未完成4尚未驗收
schema 6 帳本6含上述 1 份通過驗證

撤銷的 16 份中,只有 2 份來自需求變更;其餘 13 份是介面調整,提出者在變更當下都已實際操作,E2E 也已通過(例如「29 項 E2E 通過,新版人工體驗待確認」)。

同類問題​

誤判來源位置觸發情境
片段身分綁定路徑source_fragments.py compare_fragments:鍵為 (kind, path, selector),removed 一律 stale遷移、搬檔、改名
整檔指紋schema 5 current_source_manifest任何位元改變(含修錯字、格式化、依賴升級)
verifier 支援範圍SUPPORTED_SOURCE_SCHEMA_VERSIONS 只含 5/6schema 2/4 的通過紀錄無法讀取
verifier 自身升級evidence.py MIN_GENERATOR_VERSIONS 與 legacy stale方法論提高最低 generator 版本,全 fleet 指南一起失效
證據格式升級schema 5 結果不帶入 schema 6 帳本(ADR-016「相容與遷移」)每次升 schema 整批重驗
結果綁定指南文字ADR-016 D4:結果綁定場景區塊與共用前言摘要重排段落、改寫說明、更新路徑都讓通過失效
介面調整一律撤銷invalidate-result 的使用慣例提出者已操作確認的樣式調整仍要求重新人工驗收

後四項是方法論自身的限制或演進,成本卻轉嫁給使用者的驗收證據。

真正的成本在處置,不在偵測​

偵測結果現行處置判斷空間
stale硬性阻擋:重生指南、重新驗收;/uat 明文「不得以人工判斷略過」;/work 該步與其後各步失效無
review-needed真人逐場景 keep/reverify/stale有,但只限脈絡來源
進度回退/progress --rollback 依原因(規格變更/缺陷/誤判)處置證據有,但由人主動發起

偵測再精準,只要「stale ⇒ 重做並連鎖失效」不變,誤判一次就要付全額成本。

回退分歧發生在驗證層​

AI 建議回退、人類不同意時,雙方爭的不是進度本身,而是「這次驗證還算不算通過」。若只在進度層讓人覆寫,就會出現「進度說通過、證據說 stale」的不一致:下一次 /progress、/work merge 或推進 ✅ 時,閘門會再次擋下,同一個爭議反覆出現。

決策​

D1:偵測與處置分層​

層回答負責產出
偵測什麼變了工具(機械、可重現)變更清單:每筆片段的變更類別(D2)與受影響的驗收命題
處置所以要做什麼AI 依 D3 判定;人工驗收與回退由人確認帳本中的處置紀錄

偵測結果不再直接等於處置。ADR-016 的三態(fresh/review-needed/stale)保留為偵測結果的摘要,但「stale ⇒ 必須重生並重新驗收」改由 D3 取代。

重生指南與重新驗收分開判斷:指南需要重生是文件問題;先前通過是否成立是產品問題。重生指南不構成重新驗收的理由,通過紀錄依 D6 延續。

D2:偵測區分四種變更類別​

類別定義範例
等價能機械證明命題未變檔案搬移且內容摘要相同;只有經登記的引用改寫;證據格式升級且內容可對應
脈絡脈絡來源改變(ADR-016 D2)框架版本、design language、E2E spec 本體、翻譯
語意該場景驗收命題的依據改變US 被引用段落、UAT-only SBE、Coverage 分類
來源待修復宣告的來源找不到,或新舊來源的對應尚未釐清錨點改名、檔案搬移但未留紀錄、檔案刪除

等價的證明方式:

  1. 內容身分:片段以內容摘要為主身分、路徑為輔。舊路徑消失、新路徑出現且摘要相同,視為改名。
  2. 等價轉換紀錄:執行機械轉換的工具(如 /domain-model 遷移、未來的格式化或升級工具)在轉換當下寫一份紀錄,逐檔記下轉換前後的摘要、轉換類型與路徑對照,並由工具核對差異完全落在宣告的轉換內。verifier 遇到「儲存摘要 = 轉換前摘要、目前摘要 = 轉換後摘要」時視為等價,可以串接多份紀錄。紀錄隨轉換 commit 保存,只能由工具產生。

等價只能由機械證明成立,不能由 AI 判讀成立。 等價證明不成立時,依實際差異分類,不一律列為待修復:

情況類別
來源仍存在,差異落在場景宣告的語意來源(驗收要求確實改變)語意
來源仍存在,差異只落在脈絡來源脈絡
來源找不到,或新舊來源的對應尚未釐清來源待修復

「沒有等價證明」本身不代表驗收失效;對應未知期間保留既有結論(D3)。

D3:非對稱的舉證責任​

兩種驗證的差別在舉證責任的方向:

驗證策略預設推翻預設須證明
自動化(E2E、UI 合約)保守重跑證明不需要重跑
人工(UAT)積極不重驗證明需要重驗
處置成本誰決定
保留並留紀錄0工具或 AI(等價、脈絡變更、未證明需要重驗)
重跑自動化驗證低AI 自行執行(未證明不需要時)
修正指南或來源對應低AI 執行;不涉及重新驗收
局部人工驗證中有具體依據時 AI 提議、真人確認,只驗實際改變的命題
階段回退高AI 只能建議,真人複核(D4)

自動化驗證:除非證明不需要重跑,否則重跑。 可以不重跑的證明只有兩種:

  1. 變更全部屬於 D2 的等價類別;
  2. 變更全部落在該 E2E 不讀取的來源之外,且依賴範圍由工具機械判定(例如只改了文件站頁面)。

無法證明時一律重跑,AI 不詢問,也不以「看起來無關」略過。重跑失敗即代表真實問題,進入 D4。

人工驗收:除非證明需要重驗,否則不重驗。 UAT 只驗 E2E 證明不了的命題,重點在介面外觀與操作體驗;提出介面變更的人在變更當下就已考量並實際操作過。足以證明需要人工驗證的依據只有:

  1. 驗收命題的依據改變(D2 的語意類別):只驗證實際改變的命題。
  2. 相關自動化驗證失敗後經修正:產品行為在該處確實改變過。
  3. 已公告、且確認影響本應用驗收命題的契約變更:例如框架 CHANGELOG 或升級指引公告的元件行為變更、API 契約或錯誤契約變更。AI 依公告內容核對本應用實際使用範圍、受影響的驗收命題與能否自動化;能自動化者交給自動化驗證,只有具體受影響、且無法自動驗證的部分才提議人工驗證。
  4. 真人明示要求,並留下理由。

「可能受影響」不構成依據。框架版本改變本身、一般性的「可能有未預期的 bug」,都不是人工重驗的理由。不符合上列依據的變更,場景保留:工具寫入保留紀錄,載明變更清單、差異摘要與判定理由,供事後追溯,不阻擋驗收與進度。

此原則同樣適用於 API 消費者旅程(S.UAT):依據來自 API Spec、錯誤契約或已公告的契約變更,而不是 server 實作有變動。

來源待修復:宣告的來源找不到時,先修復對應(補等價轉換紀錄、更新宣告)或查明原因。尚未修復、原因未明期間,保留既有驗收結論,並標示「來源待修復」。查明後依實際影響判定:等價或脈絡則保留;語意改變則只對改變的命題依上列第 1 項處理。不能僅因缺乏等價轉換紀錄就要求人工重驗。

D4:進度由驗證結論推導,回退須經人類複核​

  • 一致性不變量:已越過的每個階段,其驗證結論只能是「有效」或「待補驗」(D5),不能是「已失效且未處置」。進度不能被單獨覆寫;要改變進度,必須先改變驗證結論。
  • AI 不自行回退:AI 判斷驗證結論已不成立(自動化驗證失敗、人工驗證未通過、需求改變)時,只能建議回退,附上變更清單、受影響命題與理由,由真人複核。
  • 分歧在驗證層解決:人類不同意回退時,以驗證層的紀錄表達,例如在帳本記下「保留」及理由,或重跑自動化驗證取得通過結果;進度隨之維持。不允許「進度維持、證據仍失效」的狀態存在。
  • 回退原因沿用既有模型:回退只由需求改變、實作缺陷或驗收誤判觸發(ADR-016 D7)。證據維護事件(遷移、搬檔、格式化、來源待修復、證據格式或 generator 升級)與已由提出者操作確認的介面調整本身不構成回退理由。

D5:目前階段與待補驗事項分開記錄​

項目定義
目前階段(effectiveStage)已取得驗證結論的最遠階段。前面某階段出現待補驗事項時,目前階段不後退
待補驗事項某階段中需要補驗證的命題清單,每筆記下階段、場景或命題、原因與依據(D3)
來源待修復事項D3 的來源待修復清單
下一步資格不依賴待補驗命題的後續開發與驗證可以繼續;依賴者等待。依賴由 AI 依該步驗證所涵蓋的命題判定,真人可改判
整合閘門submit、merge 與推進 ✅ 等待待補驗事項與來源待修復事項全部完成
正式進度呈現Sprint、/work status、/next 同時顯示目前階段與未完成事項,例如「S.E2E(P.UAT 待補驗 2 項)」

例:P.UAT 有 2 個場景待補驗、S.E2E 證據仍有效時,目前階段維持 S.E2E;不依賴這 2 個命題的 server 開發與 S.UAT 可以繼續;補驗通過即清除,不需重走後續步驟。補驗未通過時才依 D4 建議回退。

後續步驟只在它自己的證據所依賴的來源改變時失效,不因前一步出現待補驗事項而連鎖失效。

D6:通過紀錄依驗收命題延續,機制升級自帶相容責任​

通過紀錄綁定驗收命題,不綁定指南文字。 指南中的每個場景明列其驗收命題,以及每個命題的依據(US 錨點、SBE、契約)。通過紀錄綁定命題與依據的摘要:

  • 重排段落、改善說明、更新路徑、調整前言等文字差異,本身不構成重驗理由。
  • AI 重生指南時,新增或變動的驗收命題必須有需求或契約依據;沒有依據的差異視為生成錯誤,修正指南,不轉嫁為人工重驗。
  • 有依據的命題變更,只驗證實際改變的命題;其餘命題的通過延續。

證據格式(schema)或 generator 升級是方法論自己的演進,不得以「舊證據失效」作為預設遷移方式:

  • 任何仍存在於 fleet 的舊 schema(含 schema 2、4、result schema 1、3),都須提供相容處理。verifier 目前不支援的版本,是工具限制,不是要求重驗的理由。
  • 能從舊指南與結果辨認驗收命題與通過結果者,建立對應、轉換格式並保留通過,記下轉換依據。
  • 資料不足者,列明缺少哪些項目,先從舊指南、結果、sidecar 與 Git 歷史補足;仍無法補足的命題,才依 D3 判斷是否需要人工驗證,並向人說明缺項。
  • 提高 MIN_GENERATOR_VERSIONS 前,須先提供上述相容處理;舊版產物改走「待升級」:可繼續驗證,於下次重生時轉換。
  • 舊指南轉換為驗收命題時,能機械確定對應者(場景 ID 一致、命題與依據可直接對應)自動處理並記下依據;有歧義者(場景合併或拆分、依據對不上、一個場景含多種解讀)才列出請真人確認。
  • 已撤銷的結果不自動恢復。真人可以逐份檢視撤銷原因,以帳本紀錄「撤回撤銷」並留下理由與依據;這是新的決定,紀錄撤回者、時間與理由,不刪除原撤銷紀錄。撤回只適用於撤銷原因不構成 D3 人工依據的情況(例如已由提出者操作確認的介面調整);原因是需求變更、實作缺陷或驗收誤判者,仍須以新的 UAT 驗收取代。

對 ADR-016 的修訂​

ADR-016 條目修訂
D1「stale:重生指南,受影響場景重驗」重生指南與重新驗收分開判斷;重驗只依 D3 的依據,只驗實際改變的命題
D4「結果綁定場景區塊、共用前言摘要」改綁定驗收命題與其依據(D6);文字差異不使通過失效
D5「保留只能由真人做出」、review-needed 阻擋脈絡變更改為保留並留紀錄(D3);真人可隨時要求重驗
P1 裁決「宣告來源消失一律 stale」改為「來源待修復」:先以 D2 對應或查明原因,期間保留結論(D3)
D7「撤銷紀錄永久有效,只能以新的 /uat 驗收取代」撤銷仍不因摘要吻合而自動恢復;但允許真人以帳本紀錄「撤回撤銷」,限撤銷原因不構成 D3 人工依據者(D6)
「相容與遷移」不提供 migrate、schema 5 結果不帶入改為 D6 的相容責任:所有仍存在的舊 schema 依命題轉換並保留通過;資料不足者列明缺項
/work 失效連鎖(progression.md)改依 D5:目前階段不後退,待補驗事項阻擋整合閘門

ADR-016 的其餘決策(三層來源、逐場景帳本、撤銷不因摘要吻合而自動恢復、回退原因的分類)不變。

考量的方案​

方案內容不採用或保留的理由
A. 只補遷移對照為 /domain-model 遷移加路徑對照,verifier 還原後比對只解決一種情境;實測顯示遷移前證據已大量被擋
B. 只提高偵測精準度內容身分+等價證明,處置不變減少誤判,但真實的局部變更仍觸發整份重生與連鎖失效
C. 允許人類直接覆寫進度人不同意回退時,直接保留階段造成進度與證據不一致,閘門在下一個節點再次阻擋
D. 對自動與人工採同一策略一律保守或一律積極一律保守:人工重驗成本最高;一律積極:自動化可低成本確認的問題被放過
E. 以最長連續有效前綴計算目前階段前一步待補驗時,目前階段退回該步讓不相關的後續成果一起停擺,重現連鎖回退
F. 只相容 verifier 支援的 schemaschema 2/4 要求重驗以工具限制縮小保留目標,成本轉嫁給使用者
G. 偵測/處置分層+非對稱舉證+命題延續+階段與待補驗分開(本案)見 D1–D6採用

影響範圍​

類別項目
工具uat/scripts/source_fragments.py(內容身分、等價轉換紀錄、來源待修復)、evidence.py(舊 schema 相容轉換、命題綁定、處置判定)、scenario_ledger.py(命題綁定、保留紀錄、待補驗、撤回撤銷)及其測試
Skillsuat-script/SKILL.md(場景明列驗收命題與依據、重生時命題差異須有依據)、uat/SKILL.md(舉證責任、契約變更核對、移除「不得以人工判斷略過」的一律規定)、progress/SKILL.md(回退建議與人類複核、待補驗呈現)、domain-model/SKILL.md(遷移產生等價轉換紀錄)、e2e/SKILL.md(保守重跑)、next/SKILL.md(呈現待補驗事項)
/workwork/references/progression.md、integration-revalidation.md(D5)
Rulesm-change-management.md(處置分級、證據維護事件不構成回退)、m-work.md(目前階段與待補驗)、m-methodology.md
發布同屬 methodology 命名空間,同批 /methodology publish

分階段實施​

階段內容驗收案例
P0D2:內容身分、等價轉換紀錄、來源待修復;/domain-model 遷移產生紀錄florae-g1 遷移後,schema 6 指南不因搬檔而 stale
P1D6:命題綁定;所有仍存在的舊 schema 相容轉換依 florae-g1 實際盤點:20 份未撤銷的通過紀錄逐份判定可轉換、需補資料或缺項,並列出結果;不在盤點前保證全部可帶入
P2D3:舉證責任、契約變更核對、保留紀錄、自動化保守重跑框架升級時:E2E 除非工具證明其讀取的來源未變,否則一律重跑;人工驗證只對公告且確認影響本應用、無法自動驗證的命題提議,其餘人工場景保留且不阻擋
P3D4、D5:階段與待補驗分開、回退建議與人類複核、/work 不連鎖;rules 對齊;fleet publishP.UAT 待補驗時目前階段維持、整合閘門等待補驗;人類不同意回退時帳本與進度一致

驗收條件​

  • 只改引用路徑、搬移檔案的遷移,不讓任何通過紀錄失效,也不需人工重驗。
  • 等價轉換紀錄中有任何差異超出宣告的轉換時,該檔不成立等價,改依實際差異分為語意、脈絡或來源待修復;只有來源找不到或對應未釐清才列待修復,期間保留既有結論。
  • 指南重排、改寫說明、更新路徑不使通過失效;重生指南出現無依據的新命題時,修正指南而不要求重驗。
  • schema 2、4、5 的通過紀錄依命題轉換保留;資料不足者列明缺項,不因版本過舊被要求重驗。
  • 未能證明 E2E 不需重跑時,AI 一律重跑,不詢問也不略過。
  • 人工驗證只在 D3 的四種依據成立時提議,且只驗實際改變的命題;框架版本改變本身不構成依據。
  • AI 不會自行回退進度;人類不同意回退時,帳本留有對應紀錄,進度與證據一致,後續閘門不再因同一變更阻擋。
  • 遷移、格式化、來源待修復、證據格式升級、已操作確認的介面調整不會被列為回退原因。
  • 前一階段有待補驗事項或來源待修復事項時,目前階段不後退,不依賴的後續工作可繼續;submit、merge、✅ 等待這些事項完成。
  • 舊指南轉換時,能機械確定對應的命題自動轉換,只有歧義者請真人確認。
  • 已撤銷結果不會自動恢復;真人撤回撤銷時,帳本保留原撤銷與撤回紀錄,需求變更、實作缺陷或驗收誤判造成的撤銷不能撤回。

審閱裁決​

第 3 輪審閱者明示確認以下裁決(Q2、Q4、Q6 由作者裁決後經審閱者確認;Q1、Q3、Q5 採作者建議):

編號問題裁決
Q1等價轉換紀錄放在哪裡docs 模組 docs/testing/uat-results/equivalence/,與差異快照同層、隨 Git 追蹤
Q2「來源待修復」是否阻擋整合閘門阻擋 submit、merge、✅,但不撤銷結論、不後退階段;避免來源實際被刪除(需求移除)卻未查明就整合。已反映於 D5 整合閘門
Q3保留紀錄的粒度每次變更一筆,逐場景列出差異摘要與判定理由
Q4驗收命題的宣告形式與舊指南轉換的確認沿 ADR-016 P1 的 HTML 註解,每個場景宣告命題 ID 與依據;舊指南可機械確定對應者自動處理,有歧義者才請真人確認;邊界見 D6
Q5接受推翻 ADR-016 D5 嗎接受:脈絡變更保留並留紀錄,真人隨時可要求重驗
Q6已撤銷的結果如何處理允許真人以帳本紀錄「撤回撤銷」,明列為修訂 ADR-016 D7;不自動恢復,限撤銷原因不構成 D3 人工依據者。本裁決不授權恢復任何既有結果,實際撤回須逐份由真人執行

P0 實作裁決​

P0(D2 偵測:內容身分、等價轉換紀錄、來源待修復)於 2026-10-02 經六輪 peer review 通過(共 11 條:2 blocking、9 major,皆修正,無不採納);Q1–Q4 採作者建議,Q4 依審閱修正。權威操作說明見 uat/SKILL.md Step 2.2 與 domain-model/SKILL.md 遷移步驟 4。

裁決內容理由
紀錄不能自證每個檔案條目記錄轉換前後的 Git blob;載入時核對 base commit 中轉換前路徑的實際 blob,並核對轉換完成狀態(引入紀錄的 commit,未 commit 時為工作樹)中轉換後路徑的 blob;搬移的舊路徑在該狀態須已不存在。改寫由實際內容重新推導,必須與宣告一致審閱以虛構搬移、假摘要、真實 blob 搭配虛構目的地等方式,讓命題變更通過驗證
只接受改指實際搬移檔案的引用依引用方解析的相對路徑須是搬移檔案的舊→新位置;其他寫法須是同一搬移檔案舊/新路徑的同長度後綴;查詢字串與錨點不可改只憑搬移目錄的子字串替換,會接受外部端點與其他命名空間的改寫
以完整引用為單位切分只在空白與定界符處斷開,?/# 後綴延伸到空白;另以「以空白分隔的整個單字」為第二道防線:含 // 即視為 URL、整段不參與;被改寫的 token 須位於單字邊界或引用包圍符號內;路徑含非 ASCII 不算依字元類別切 token 時,中文、括號、方括號會把查詢字串或外部 URL 切成看似本地的片段
驗證不做反向替換目前片段須與轉換後 blob 依同一規則重算的片段完全相同,才以轉換前 blob 重算的片段為上一個狀態;轉換後再修改即停止追溯對目前內容反向替換,會把轉換後才出現的同名字串一起還原,掩蓋後續變更
對應整組處理、目標唯一多個舊片段對應同一目前片段,或目標與其他舊片段同鍵時,皆不換算;sidecar 與帳本綁定共用同一邏輯逐筆換算時,後一筆會覆蓋前一筆,命題差異消失
部分無法證明不影響其餘紀錄產生時反覆推導至穩定:搬移檔本身無法證明時,指向它的改寫一併列 unexplained,其餘照常記錄無法證明等價不是錯誤,不應使整筆紀錄失敗
pending-repair 暫判 stale(Q1)P0 只做分類;待修復期間保留結論屬 D3,於 P2 實作偵測與處置分階段
內容身分不需紀錄(Q2)同類、同選擇器、只換路徑且摘要相同即視為搬移;多個候選時不對應內容未變即無命題差異
紀錄不清理(Q3)比照差異快照永久保留,依檔名時間串接舊驗收證據可能仍依賴早期紀錄
自家文件站的絕對 URL 不視為等價含網域的引用(如產品文件站 https://…/specs/…)一律列 unexplained無法可靠區分自家站與外部站;florae-g1 實測僅 1 檔受影響,且屬 P1 範圍

實測:florae-g1 副本模擬 Domain Model 遷移,57 檔記錄、1 檔 unexplained;唯一 verified 的 schema 6 指南(US-502)在紀錄 commit 前後皆維持 verified,其餘 schema 6 指南的變更清單與遷移前相同。

P1 實作裁決​

P1(D6:依驗收命題延續通過、舊版結果轉換)於 2026-10-03 經四輪 peer review 通過(共 6 條 major,皆修正,無不採納);待決點 Q1–Q4 採作者建議。權威操作說明見 uat-script/SKILL.md「驗收命題」節與 uat/SKILL.md Step 2.4。

裁決內容理由
命題以標記段落辨識場景區塊中 **✅ 驗收**: 開頭的段落即命題;舊指南另認 ✅ 開頭的粗體標籤與「人工判準」「人工判斷」。比對只看標籤後的內文;步驟、說明文字不算命題。其他寫法的場景退回區塊比對,轉換時列為「無法辨認命題」交人處理(Q2)命題是真人判斷的對象;標記可機械辨識,不靠 AI 猜測
驗證單位維持場景帳本綁定新增命題摘要;有命題時只比對命題與語意來源,區塊與前言只供紀錄「只驗改變的命題」屬 D3 處置,留給 P2
依 generator 版本切換規則(Q4)6.1.0 起要求每個場景至少一個命題,測試資料段落逐標題拆成 seed-part;6.0.0 的 schema 6 指南維持原判定不因表示法改變而使既有證據全部失效
測試資料段落只新增子段落不算改變新增的子段落不屬於任何既有片段;既有內容被修改或刪除仍算改變(Q3:florae-g1 有 7 份因既有列被改寫而無法轉換,留給 P2)。不適用 US 段落共用的測試資料段落常被其他 US 補充;US 新增驗收標準屬需求變更
新建帳本時自動轉換(Q1)initialize-result 遇到舊版 passed 結果先轉換,逐場景回報;convert-result --plan 可預覽先前以空帳本覆蓋,舊通過紀錄無聲消失
可證明才帶入命題與驗收當時相同、適用的語意來源可證明未變(含 P0 等價紀錄)才帶入;脈絡來源改變依 D3 保留並記於轉換紀錄人工積極、但不放過語意改變
驗收當時的來源依 sha 取回依舊 sidecar 的 SHA-256 取回(工作樹 → 快照區 → Git 歷史),路徑依等價紀錄的舊路徑、唯一角色、相同內容對應;sidecar 未記錄者,只有在記錄通過結果的 commit 與已記錄檔案全部吻合時才採用該 commit;sidecar 取不回時不核對 commit,逐場景列為取不回審閱重現:只用目前路徑查詢會讓純更名無法轉換;空清單曾被當成已核對
轉換可以繼續舊結果原文與驗收當時取回的內容存進快照區,帳本 convertedFrom.legacyResult 保留完整舊結果,兩者隨帳本 commit;修正指南或補齊證據後,convert-result 只轉換尚無紀錄的場景審閱重現:部分轉換後舊結果被覆蓋,未 commit 時無法復原
續轉不恢復撤銷帳本中已撤銷(個別或全部)且尚無新紀錄的場景不轉換審閱重現:續轉追加的通過晚於撤銷,等同自動恢復
SBE 只對應目錄、保留場景 ID驗收當時與目前的 SBE 各在單一目錄時,以原檔名寫到目前目錄再比對;不依內容或檔名跨檔配對審閱重現:依內容配對把場景更名誤判為純搬移;檔名即場景 ID,更名屬 SBE 集合改變

實測:florae-g1 盤點 20 份未撤銷通過,驗收當時的指南 20/20 取回、命題 20/20 相同,來源 716/717 取回。US-107 於副本補 schema 6 宣告、以 6.1.0 stamp 後自動轉換並 verified;之後新增測試資料子段落仍 verified,修改既有測試資料列或引用的 US 段落則 stale。

P2 實作裁決​

P2(D3:變更後的分級處置、契約變更核對、E2E 保守重跑)於 2026-10-03 經三輪 peer review 通過(共 4 條 major,皆修正,無不採納);待決點 Q1–Q4 採作者建議。權威操作說明見 uat/SKILL.md Step 2.2a「變更後處置」與 e2e/SKILL.md 重跑判定。

裁決內容理由
脈絡變更由工具保留retain-context 寫入保留紀錄(每次變更一筆,逐場景列出來源、差異行數與理由),判定時與 ADR-016 的複核同樣更新脈絡基準;真人可以 request-reverify 要求重驗依 D3 與審閱裁決 Q3、Q5:脈絡變更不構成人工依據
語意依據改變、命題未變:AI 提議、真人確認disposition-status 列出依據的前後內容與 diff(舊內容查快照區,再依同一規則從 Git 歷史重算並核對摘要);record-disposition 須附 --by,並以 token 綁定呈現的差異與帳本序號。保留或重驗都以確認當下的依據為新基準,之後的新變更另行判定;舊內容取不回時不能保留舉證責任在「需要重驗」一方,但保留須有真人看過實際差異
來源待修復保留結論(Q1)指南狀態 pending-repair,不判 stale;verify-result 回 verified 並列出清單;依賴缺失來源的場景不能記錄新通過,含已從目前來源集合消失(整檔刪除)的依據;待修復只計入最新紀錄為通過的場景;可經處置解除。submit、merge、✅ 的工具阻擋屬 P3,期間由 /uat、/progress 文件規定審閱重現:整檔刪除時片段從集合消失,只檢查「目前宣告但找不到」會漏掉
重驗範圍合併同一場景的所有理由(重驗要求、處置或複核決定、命題改變、語意變更、撤銷、上次未通過)合併判定:命題序號取聯集,任一項須整場景重驗即不列序號;依合併範圍驗完並記錄通過,即履行全部理由審閱重現:只回報第一筆要求,依回報範圍驗完後其他要求被新通過抵銷
命題依原文對應重驗要求與處置記下指定命題的原文,判定時對應到目前序號;任一條找不到即整場景重驗審閱重現:指南插入命題後,舊序號指向別的命題,原命題漏驗
續轉不抵銷重驗要求舊結果續轉時,有未履行重驗要求的場景與撤銷同樣不轉換審閱重現:續轉追加的通過晚於要求,等同自動抵銷
人工重驗依據限三類request-reverify 的依據為 automation-fixed(由 /e2e 提議)、contract-change(由 /upgrade-appfuse-* 的契約變更核對提議)、human-request;可指定命題D3 依據 2–4;依據 1(語意改變)走處置
撤回撤銷withdraw-revocation 另記撤回、保留原撤銷,限 rollback/other 類別,可撤回部分場景審閱裁決 Q6
確認者身分靠流程保證(Q2)工具無法證明 --by 是真人,比照 ADR-016 複核留痕工具層無可靠身分來源
E2E 重跑範圍偏保守(Q3)e2e-scope 比對 base 以來的 Git 差異與未追蹤檔:目標模組讀取;web 目標另含所有 server 與 web-host 模組;docs 類模組、範圍外的已知應用模組與 .claude/ 視為不讀取;工作區根層、未登記或未知型別的模組一律視為讀取「無法證明不讀取即重跑」;多重跑的成本低於漏跑
取代 ADR-016 D6 的部分重驗預設(Q4)uat-ui-dependency 受影響時不再預設建議部分重驗,改為脈絡保留、真人可要求重驗依 D3 與審閱裁決 Q5
錨點改名不自動判定等價改走處置流程段落內容含標題列,改名後摘要必定不同,「同類同檔同摘要」規則實際不會成立;標題文字也可能帶有意義
轉換新增「待處置」命題相同、取回內容齊全、只有語意依據自驗收後改變的場景,照驗收當時的依據記下通過(awaitingDisposition),場景為 needs-uat,經處置確認後才有效沒有通過紀錄就無從處置;P1 的 7 份因既有測試資料列被改寫而無法轉換者由此接續

實測:florae-g1 副本 US-019 補 schema 6 宣告並以 6.1.0 stamp 後,轉換列為待處置;兩筆依據變更(測試資料「員工帳號」段落、US「Dashboard 外殼」段落)的舊內容皆從 Git 取回並顯示 diff,模擬真人確認保留後 verified。模擬框架升級:review-needed → retain-context → verified。e2e-scope:只改 docs 時判定不需重跑,改目標模組 package.json 則需重跑。

P3 實作裁決​

P3(D4:進度由驗證結論推導、回退須人類複核;D5:目前階段與待補驗事項分開記錄)於 2026-10-03 經四輪 peer review 通過(共 3 條 major,皆修正,無不採納);待決點 Q1–Q4 採作者建議。權威操作說明見 progress/SKILL.md(總覽、回退、✅ 整合閘門)、uat/SKILL.md Step 2.1 補驗模式與 work/references/progression.md 第 5 點。

裁決內容理由
待補驗由驗證推導,不另存evidence.py stage-status --us --through {stage} 依 US 軌道列出已越過的 UAT 階段,逐階段分類為有效、待補驗(附場景、原因、命題序號,最新紀錄未通過者標失敗)、指南 stale/review-needed、未驗證,並列來源待修復;--require-clear 非 clear 時 exit 2。Sprint 只記目前階段;/progress 總覽、/next、/work status 讀取時呈現另存清單會與帳本分歧,又成為可任意改寫的宣稱
主線 E2E 不由工具推導(Q1)不新增 E2E 帳本:/work 分支以 progress.md 的來源紀錄判定;主線由 /e2e 與 e2e-scope 在推進與整合時保守重跑依 D3,E2E 未證明不需要即重跑,重跑成本低於另建帳本
舊版或缺少的 UAT 證據視為未完成(Q2)✅ 閘門與 stage-status 將缺結果、不支援的舊 schema 列為 unverified✅ 須有可驗證的證據;舊版依 D6 轉換後即可通過
✅ 閘門由工具強制progress/scripts/update.py 推進 UAT 階段只驗該階段(帶來源待修復仍可推進);推進 ✅ 驗該軌全部 UAT,任一未 verified 或帶來源待修復即拒絕,所有階段的 inventory 納入 inventoryHash依審閱裁決 Q2:來源待修復不撤銷結論、不後退階段,但阻擋整合
指南狀態不遮蔽場景結論指南 stale/review-needed 時保留指南狀態,同時回傳場景結論與待修復來源審閱重現:只回報指南狀態,漏掉同時存在的失敗與 2 個待修復來源
以 stamp 當時的原文判定指南文字改動、尚未重新 stamp 時,依 sidecar 的 guideSha256 取回原文(工作樹 → 快照區 → Git 歷史),場景內容與場景清單皆取自同一份已核對摘要的原文審閱重現:hash 不符提前返回漏報失敗;取回原文後仍用修改後的場景清單,刪除場景標記即漏報
無法判定時明示未知原文取不回、或目前指南/sidecar 無法載入時,只列帳本可確認的結論(最新紀錄未通過、有效撤銷、未履行的重驗要求),並標「待修復未知」;沒有帳本的階段不標未知不以 0 表示已無待修復;閘門仍阻擋
/work 不連鎖每步依自己的證據分類為有效、待補驗、來源待修復、失敗、已失效;effectiveStage 為紀錄鏈中未失效的最後一步。補驗以帶 reverifies 的紀錄追加,不重走後續步驟;submit 以 stage-status --require-clear 核對;整合重驗的 progressSteps 只在每步都有效時開始D5:前段補驗不使後續停擺,整合閘門等待清空
回退只建議,不同意在驗證層處理驗證失敗時 Agent 附變更清單、受影響命題與理由建議回退;/progress --rollback 確認選項為確認/不同意回退/取消,不同意時以修正後重跑、處置紀錄或撤回撤銷讓結論回到有效。不新增「回退建議」紀錄類型;證據維護事件與已由提出者操作確認的介面調整不構成回退理由D4;既有驗證層紀錄已足以表達人類的不同意
下一步資格不由工具判定後續工作是否依賴待補驗命題,由 Agent 依該步驗證涵蓋的命題判定並說明理由,真人可改判依賴關係無法由來源機械推導
既有測試失敗另案(Q3)migrate-agent-config 既有 11 項失敗(test_uat_evidence 7 項、test_workflow_contracts 4 項,多為寫死的舊 SKILL 版號)於乾淨基線重現相同,不在 P3 處理,記為 FU-124非本階段引入
發布順序(Q4)P3 通過後本 ADR 改為 Accepted,P0–P3 一併 /methodology publish四階段互相依賴,分批發布會讓下游處於半套狀態

實測:florae-g1 副本 US-502 stage-status --through ✅:P.UAT verified,S.UAT、I.UAT 無證據列為 unverified,整體 pending,✅ 被擋;US-107 --through S.E2E:P.UAT 為 guide-stale(design language 變更)。試跑後副本工作樹無任何寫入。

既有通過承接的補充​

本節與工具修正於 2026-10-03 經兩輪 peer review 通過,補充 D3 的真人補驗改判與 D6 的舊命題綁定相容責任。

D3:真人改判補驗要求​

命題未變、真人確認既有驗收已涵蓋差異時,允許撤回先前的補驗要求。這是 D3「語意依據改變、命題未變者真人可保留」的改判,不沿用 Q6 的撤回撤銷授權。

  • 可撤回 review 中指定場景的 reverify 決定,以及 human-request 重驗要求。必須明列原紀錄 sequence、場景、理由與確認者;追加撤回紀錄,保留原處置與原驗收。
  • 不可撤回 automation-fixed 或 contract-change:前者已有自動化證明原實作不符,後者已有公告且影響本應用命題的契約變更,仍須依 D3 完成驗證。
  • 撤回只解除指定要求,沿用原處置確認的來源基準。新的語意/命題差異、其他重驗要求、失敗及撤銷仍各自判定,不新增通過,也不撤回 stale 決定或缺陷撤銷。

D6:舊 schema 6 的命題綁定相容​

舊紀錄未綁命題時,以目前場景區塊的 SHA-256 完全等於原通過紀錄的區塊摘要,證明可補上目前 writer 會產生的命題綁定。追加升級事件,保留原紀錄與語意/脈絡來源基準;之後依 D6 以命題延續,區塊及前言只供紀錄,其文字差異不再單獨構成重驗理由。

工具條件與作用
withdraw-reverify真人明確改判指定 review reverify 或 human-request;只解除指定補驗要求
upgrade-bindings指南 fresh、最新結果 passed、可抽取命題且區塊摘要相同時補綁;最新結果未通過者略過並列於 skipped,保留待驗;已通過場景的區塊無法證明時整批拒收、不寫入

維持 result schema 6。舊讀者忽略新事件會保守顯示 pending/needs-uat;升 schema 反而使舊讀者拒讀整份帳本。正式下行須先發布框架工具,再以同一應用 commit 提交帳本、指南、sidecar 與來源快照,避免新帳本先於對應工具抵達其他 clone。

同 US 的 docs 脈絡路徑證明(UAT 6.16.0)​

本組實作於 2026-10-23 通過審閱並結案(revision r2-93adc40be8b21f55);不代表已 fleet 發布。

context source-correspondence schema 3 沿原管線補同 US 的 docs us-rest:保存並重驗 source/copy inventories、指南/US Git 原件、historical guide,以及 publication 原件。 引用段落的錨點與場景適用範圍須完全相同且可取回,以原生餘文投影核對 before/after 摘要; 不以整份 US 代替 us-rest,不讓同檔 semantic 片段取得能力。

exact beforeDigest 與完整 surface 邊界保持,D2/D3 及人工舉證責任不變。 framework 有效摘要等於目前內容時省略 scoped binding,沿原內容身分;不改 alias 判定, 歷史多摘要/basis sequence 能力另案。來源對應本身不是等價、人工接受或階段推進, 後續正常 stamp/retain-context、公開 gate 與 retention 仍各自驗證。 新增原件共用既有固定上限;整組實作審閱與正式 fleet 發布分開,不自動下行。

隔離演練發現並經使用者確認納入的實作修正:context 基準保留接受時/完整處置綁定的合法換算; 未換算 key 先摺疊既有保留,再換算最終摘要,避免初始舊摘要殘留假 pending。 實作審閱另發現全數延後換算會使既有 scoped binding 退化,因此保留原有合法換算順序; 舊 key 的後續不同摘要仍須通過 exact beforeDigest,不沿用既有 grant,新路徑合法保留更新已換算基準。 semantic 流程、其他場景、未處置摘要、撤銷與補驗要求仍適用原閘門;不增授任何 grant 或人工接受。

宣告與有效脈絡基準、原件回復(UAT 6.17.0,2026-10-23)​

本節記錄 UAT 6.17.0 的實作契約(2026-10-23);正式 fleet 發布另依發布流程。 既有 schema 2/3 的能力與 exact beforeDigest 保持,schema 4 沿同一 correspondence owner/loader 增加精確 UI、翻譯來源、未引用 seed-file 與 docs extra/reference,以及事件身分限定的有效 context 基準證明。

source/copy/publication 與歷史角色保存 inventory、指南、共同及專案 registry 的存在或缺席、 完整宣告來源原件;共享原生擷取器重算 kind/tier/selector/scenarios。 proposition 仍是 semantic;seed 有引用段落時不得降為整檔 context,JSON 翻譯的 key 宣告也不得冒充非 JSON 檔案。 us-rest 沿用既有非空引用集合、同 US 與 docs 複製關係約束。

不同於 before sidecar 的有效 context 摘要,須從發布前原帳本快照及原事件摺疊推導: 場景、key、digest、sequence、事件類型與事件原文 SHA 皆一致,且以可達 Git parent 鏈及同 commit 原生宣告重現摘要。 consumer 重驗帳本的 exact prefix;只有評估該場景、該形成基準事件時才可換算路徑並保留原摘要。 被後續處置取代的基準、其他場景/key/摘要、一般 alias/sidecar/semantic 查詢都不取得此能力。 正常 stamp/retain-context 與全部原生出口照常執行,不新增通過、人工接受、撤銷或進度事件。

來源搬移仍為 prepared 時拒絕原件回復,保留其精確前綴與恢復能力。 restore-evidence-snapshots 另只補原生已引用 exact-SHA 的歷史原件:請求限 owner/JSON pointer, 由原帳本及來源 SHA 圖推導引用,不收任意本文、路徑或摘要。 原生 snapshot、所選指南/sidecar、可達的保存指南、固定 copy Git 與來源 Git 歷史依序定位, 每個原件及投影皆須完全吻合;plan/write 使用原生鎖、完整輸入 CAS 與固定資源上限。 先保存易變 native 輸入及 owner/ledger 前綴,再保存 proof、不可變物件與原件, 最後追加 source-evidence-restoration 維護收據,接受與來源綁定保持原樣。 原件已存在時零寫入且不要求外部來源;中斷後沿同一 native proof SHA 重新計畫, 只按固定 OID 補讀尚缺的不可變物件。retention 重驗收據與 proof 並保留完整依據; 未收據 proof 列保存根且明示 incomplete,未知 reader 保全並回報 unsupported。 詳細欄位與交易契約由 UAT 的 context-source-correspondence、evidence-restoration references 及 docs-retention §12 承接。

原接受區塊與 sidecar 保存(UAT 6.18.0,2026-10-23)​

原接受區塊的命題取回​

預設 upgrade-bindings 仍要求目前區塊與原接受摘要相同。另以明示的 --from-accepted-snapshots 模式處理宣告/敘述維護後的舊綁定:原件必須是原帳本 binding.block 指定的原生 exact-SHA 快照,受既有大小限制,不掃任意文件或從目前指南補造。 先以唯讀計畫展示原事件/區塊/命題與目前命題,真人確認對應後,才以同一 token 與明示真人 by 追加補綁。

確認者 by 可採具名帳號,或可追溯到實際真人答覆的角色識別。角色識別須連同日期、處置版次及持久確認紀錄使用;該紀錄列出完整確認問題、原答覆、適用 surface/場景與原生事件或 token。單獨「使用者」不足以追溯;AI 不得冒填姓名或以自己的判斷代替真人確認。工具保存此識別字串,不宣稱已驗證個人身分;既有事件不因補足說明而改寫。此識別形式同樣適用 D3 review 的 reviewer。

舊的明確 **人工驗收** 段落只在此模式列為 legacy-bold-acceptance,須由人確認; 一般敘述、fence 內文字與混合標籤不能被自動升為命題。這不新增全域 parser alias。 計畫 token 綁完整 surface、sidecar、整本帳本、原事件/區塊、目前命題與 runtime;任何變動須重新展示計畫。 新事件仍為 binding-upgrade,acceptedBlock 指向原件,補綁的是歷史命題,原 passed、原事件及語意/脈絡基準保持。

此流程不宣稱目前命題通過。命題改變、語意依據改變、缺件、撤銷及重驗要求仍由既有 verifier 各自處理; 對原命題對應的確認與 D3 的 semantic keep/局部重驗確認分開記錄,可在一份具體處置表合併展示。 缺少原件時維持明示缺件,不以今天的新通過填作舊原件。retention 沿原 acceptedBlock 邊保存 exact 原件, 並保留原生回復收據;不因補綁就宣稱全池歷史閉包完整。

指紋 sidecar 替換前的保存​

帳本的既有 sourceFingerprintSha256 可能指向尚未提交的指南中間版本。正常 stamp 在替換 sidecar 前保存其完整原 bytes,以原生 exact-SHA 快照取回;內容相同時不增加快照,同名檔內容不同則拒絕替換,不覆寫損壞證據。 保存沿用現有來源快照角色及 retention 邊,不新增帳本事件、人工通過或 schema。只回復歷史接受與片段而遺漏本輪新指紋原件,仍是本輪保存缺口;不能歸類成既有歷史欠帳。

相關文檔​

變更歷史​

日期內容
2026-10-03既有通過承接補充與工具修正經兩輪 peer review 通過:D3 補驗要求的真人改判與 D6 舊 schema 6 命題綁定;保留原驗收與來源基準,維持 result schema 6
2026-10-03P3 實作經四輪 peer review 通過:新增「P3 實作裁決」節;狀態改為 Accepted
2026-10-03P2 實作經三輪 peer review 通過:新增「P2 實作裁決」節;狀態仍為 Proposed,未發布
2026-10-03P1 實作經四輪 peer review 通過:新增「P1 實作裁決」節;狀態仍為 Proposed,未發布
2026-10-02P0 實作經六輪 peer review 通過:新增「P0 實作裁決」節;狀態仍為 Proposed,未發布
2026-10-02第 3 輪審閱通過設計方向;Q1–Q6 定案(「待決點」改為「審閱裁決」);狀態維持 Proposed,實作 P0–P3 另行送審
2026-10-02第 2 輪審閱修訂:等價證明失敗後依實際差異分為語意/脈絡/來源待修復;P2 驗收案例分述 E2E 重跑與人工提議條件;Q2(阻擋整合閘門)、Q4(有歧義才請人確認)、Q6(允許撤回撤銷並修訂 ADR-016 D7)經作者裁決
2026-10-02第 1 輪審閱修訂:補 florae-g1 實測盤點(遷移前 46 份僅 1 份通過驗證);D3 加入「已公告且影響本應用命題的契約變更」依據,框架版本改變本身不構成依據,並適用 S.UAT;D2/D3 改「宣告失效」為「來源待修復」,期間保留結論,重生指南與重新驗收分開;D5 改為目前階段與待補驗事項分開記錄;D6 改為依驗收命題延續通過,並承擔所有舊 schema(含 2、4)的相容責任;新增方案 E、F 與待決點 Q2、Q4、Q6
2026-10-02D3 改以舉證責任表述:E2E 未證明不需要即重跑;人工未證明需要即不重驗;脈絡變更改為自動保留(新增 Q5)
2026-10-02初稿:由 FU-123(遷移使 UAT 證據失效)擴大為證據失效的偵測與分級處置;納入非對稱策略與進度一致性