chore(design-gate): migrate-console-to-hifi-design manifest rebaseline(2/2) - #358
Conversation
…bim-governance.css 追加 PR(migrate-console-to-hifi-design 2/2),接續已合併的 PR #357(product code)。 - token_projection.production_projection: edge-console.css(已retire) → ai-bim-governance.css - 執行 capture-design-system-reference.mjs --rebaseline --confirm-rebaseline:13 screens × 2 viewports 重新擷取 - 26 個 baseline PNG 位元恆等(UnifiedConsole 頁為值恆等 hex→var(--ab-*) 置換,視覺內容未變) - verify-design-system-reference.ps1 -VerifyOrigin:PASS Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 43 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c94d487f65
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| ], | ||
| "upstream_authority": "source/app.js + source/styles.css", | ||
| "production_projection": "web-viewer-sample/src/console/edge-console.css", | ||
| "production_projection": "docs/plans/ai-bim-governance.css", |
There was a problem hiding this comment.
Keep the imported token CSS in product scope
After this flip, the app’s real console entrypoint imports ../../../docs/plans/ai-bim-governance.css, but the manifest still classifies docs/ paths as non-product in change_scope_contract. Since Get-DesignSystemManifestScope checks gate-infrastructure paths and then the broad non-product docs pattern before approved surfaces, a future change to this production token CSS will be reported as not_applicable instead of requiring the visual design gate. Please add this CSS path to the governed/product scope or carve it out of the docs non-product pattern when making it the production projection.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
This is the second of a two-PR split for the OpenSpec change migrate-console-to-hifi-design. PR #357 (already merged) migrated the product code — retiring web-viewer-sample/src/console/edge-console.css (--ec-*) in favor of docs/plans/ai-bim-governance.css (--ab-*) as the single production design-token authority. This PR performs the deferred design-gate rebaseline: it flips the manifest's token_projection.production_projection authority field to the new CSS file and re-locks the golden source snapshot. The split intentionally isolates reference_authority manifest changes from product paths to avoid the Get-DesignSystemChangeScope reference_authority_mixed_fail_closed state, mirroring the earlier #349/#350 precedent.
Changes:
- Flip
token_projection.production_projectionfrom the retiredweb-viewer-sample/src/console/edge-console.csstodocs/plans/ai-bim-governance.css. - Update the
source.fileshash/bytes forAI-BIM 前後端設計文件.dc.htmlto reflect the PR #357 §08 doc sync. - Re-lock
source.snapshot_sha256andsource.captured_at_utcfor the freshly captured snapshot (26 golden PNGs remain bit-identical).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- README draft §3 四條鐵律 R1 子句:「沿用 EdgeConsole 與 --ec-* token 單一真相源」 改為「沿用 EdgeConsole 入口殼;design token 單一真相源=docs/plans/ai-bim-governance.css (--ab-*,production 真實 import);--ec-* token 已退役(.ec-* class 命名空間保留於 legacy-console.css)」,對齊 PR #357/#358 落地現況。 - README draft §1 檔案清單於 Console Hi-Fi 與 support.js 之間補一列 ai-bim-governance.css: design token 權威(--ab-*),上游 production 投影+EdgeConsole.tsx 真實 import 雙重身分, 手寫正本面、變更控制見 design-canon-change-control。 - tasks.md 4.12 打勾並附現況真實性查證(EdgeConsole.tsx:10 真實 import、 ec-token-retirement.test.ts 回歸護欄、legacy-console.css .ec-* 保留註解)、 carve-out 五項全 PASS、openspec validate --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…360) * docs(openspec): doc-first canon v2 提案——本場裁決+失真地圖入 spec 2026-07-17 grill-me 治理場產物:doc-first 權威翻轉(R1-R10+仲裁 A-E) 與 9 波對抗驗證的 21+3 項失真地圖,經 openspec-forge 鍛造為 doc-only 提案。specs delta:documentation-source-of-truth(2 MODIFIED+12 ADDED) + design-canon-change-control(4 ADDED,新 capability)。 openspec validate --strict 通過(v1.6.0 實跑)。 本 change=提案供審;動正本須使用者核准,實作待指令。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * docs(openspec): canon v2 Section 0 前置 hard gate 全過——prep-evidence 入庫 0.1 錨點 spike PASS(正本 sec1..sec8 親驗;Hi-Fi 零 id 錨→植錨涵蓋雙檔) 0.2 PF-1 PASS(main 仍 v3 header,PF-2 未觸發) 0.3 範圍對齊 PASS(2 MODIFIED 逐字、4 條未觸碰、validate --strict 綠) 0.4 baseline tag canon-v2-baseline-20260718 @ 0d24fb6 + dry-run restore diff 空 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * task#0: bootstrap v2-draft 平行副本並植入細粒度穩定錨(tasks.md 0.1 後半) 從 docs/plans/ 完整複製三份原檔到 drafts/(ai-bim-governance.css 本 change 不改寫,不建 draft): - AI-BIM 前後端設計文件.v2-draft.dc.html - AI-BIM Console Hi-Fi.v2-draft.dc.html - docs-plans-README.v2-draft.md 植錨範圍: - 正本 draft:45 個 data-canon-id="cN-<slug>"(§01 鐵律badges;§02 兩欄卡;§03 route-map/舊路由收斂表/元件樹/共用hooks/命名核對塊/三個badge;§04 四張API卡+ 三張契約卡;§05 F1/F2;§06 十張實體卡;§07 CH表+殘留badges;§08 三層輸入/權威表/ R1·R1a·R2·R3·R4卡/驗證鏈/Task表/真實程度表/收尾badges)。 - Hi-Fi draft:8 個 data-canon-id="hifi-<slug>"(shell/home/workspace/pipeline/ ops/concept 六屏 + Workspace 頂列 lease 區 + Pipeline outbox 區)。 - README draft:7 個 <!-- canon:r-<slug> --> HTML 註解錨(§1 檔案表尾/§3 五條逐條/ §4 舊檔去向表尾)。 diff 驗證結論(git diff --no-index 逐 hunk 親驗): - 正本 draft:45 處變更,每處均為既有 <div>/<span> 標籤內單純新增 data-canon-id="..." 屬性,零可見文字/樣式改動;div/span 開閉標籤數、 id="secN"(8)、data-screen-label(8)於改前改後完全一致。 - Hi-Fi draft:8 處同構變更;div/span 開閉標籤數、data-screen-label(6) 改前改後一致。 - README draft:§3 五條列表項改為行尾附加 HTML 註解(不插入新行,避免打斷 markdown 有序清單續號的解析風險);§1/§4 表格各在表格最後一列後插入 1 行 獨立註解(GFM 表格以非表格列行終止,不影響表格解析與渲染)。 - 另以 Python round-trip 腳本做位元組級驗證:自 draft 剝除全部 data-canon-id 屬性(正本/Hi-Fi)或 canon 註解(README)後,與原檔逐位元組比對 100% 相同 (main-doc 104751 bytes、hifi 90258 bytes、readme 5929 bytes,三檔皆 OK)。 - 60 個 canon-id 全域唯一(45+8+7,跨三檔比對零重複)。 範圍驗證:mcp__gitnexus__detect_changes(scope=staged, worktree=本 worktree) 回報 risk_level=low、changed_count=0、affected_count=0(純 doc-only 新檔, 零 code symbol;changed_files=2 與實際 staged 3 檔有落差,經查為工具對中文檔名 octal-escaped 路徑解析導致的計數瑕疵,已用 git diff --name-only --cached 自查 補強確認 staged 範圍恰為上述 3 個新檔、無其他異動);git diff --cached --check 無 trailing whitespace。 tasks.md 0.1 checkbox 已於前次 spike(見 prep-evidence.md)標記完成,本 commit 為該項 DoD 中「植錨方案已入 v2 草稿」的具體落地,不重複打勾。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#1: 驗證 design-canon-change-control spec delta,四項檢核通過,零修改 盤點驗證 openspec/changes/doc-first-canon-v2/specs/design-canon-change-control/spec.md: - 4 條 Requirement(R-A1..R-A4)皆 ≥1 Scenario,WHEN/THEN 齊全(共 6 個 scenario) - R-A1 明列四份手寫正本檔名(AI-BIM 前後端設計文件.dc.html/AI-BIM Console Hi-Fi.dc.html/docs-plans-README.md/ai-bim-governance.css)並明訂 「AI MUST NOT 直接編輯、僅能以獨立提案形式提交、AI MUST NOT 自行 merge」 - R-A2 明列 capture-design-system-reference.mjs 的 --rebaseline --confirm-rebaseline 雙旗標為機器快照面唯一合法寫入路徑 - R-A4 已含「一步 restore(依記錄的 backup path/tag)」+「交付前 MUST dry-run restore 驗證」;prep-evidence.md §0.4 的具體 tag canon-v2-baseline-20260718 為本次一次性示範證據(已於 task 0.4 PASS), 衡量後不寫入 R-A4 本文——R-A4 為通用可回復性契約,須適用未來各次改版 而非僅本次,寫死單一 tag 名稱會使一般性契約與一次性產物耦合;task 說明本身亦以「可引用」標記為選擇性 結論:spec delta 零缺漏,不需補寫,本次僅打勾 tasks.md 1.1。 npx openspec validate doc-first-canon-v2 --strict 於改動前後皆綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#1: fix 補 R-A3 support.js enforcement scenario 對稱缺口 審查發現(important):R-A3「support.js 生成物永不手改」原僅 1 個 happy-path scenario(WHEN 需要改 support.js 行為→THEN 走 dc-runtime 上游再生成),缺少 R-A1/R-A2 具備的「違規被偵測到如何處置」enforcement scenario。R-A1(禁止原地 Edit/Write)、R-A2(PR diff 觸及快照面缺雙旗標 即退回)、R-A3 三條同屬「唯一合法生產面+禁止手改」型態,但只有 R-A3 缺對稱處置 scenario,恐使後續依 scenario 逐條建 CI gate(tasks.md 5.3 gap ledger / 6.x)時漏掉 support.js 違規分支的顯式依據,使 3fc29a8 commit message「spec delta 零缺漏」結論失準。 補一個與 R-A2 處置語意一致的 scenario:WHEN PR diff 觸及 support.js 且未附 dc-runtime 上游再生成佐證 THEN 該 PR MUST 視為違規並退回。 驗證:openspec validate doc-first-canon-v2 --strict 仍綠;scenario 數 6→7、requirement 維持 4;git diff --cached --check 乾淨。純 docs 變更、不涉可執行碼、無 runtime 行為影響。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#1: fix 補 R-A1 自行 merge enforcement scenario+tasks.md 1.1 證據註記 修掉 task#1 quality 兩項 important 發現(皆為「task#1 驗證本身不夠徹底」型 缺口,與 7d2f7e7 抓到的同類問題一脈,但 7d2f7e7 未抓完): [IMPORTANT 2] spec.md R-A1 requirement body 同載兩條 MUST NOT(AI 不得直接 編輯手寫正本/AI 不得自行 merge 該提案),但只有前者有 scenario 覆蓋, 「自行 merge」這條全 capability 風險最高的禁令在全檔零 scenario——未來 task 5.3 依 scenario 逐條建 gate 時會被自動漏掉,且本 change 自己的提案 PR (task 6.3)正是此禁令治理的對象。比照 R-A2/R-A3 detection scenario 補一條 「手寫正本提案 PR 在無使用者核准紀錄下被 merge → 視為治理違規、立即 revert +升級使用者裁決」。 [IMPORTANT 1] tasks.md:15 task 1.1 checkbox 已翻 [x] 但未如同檔 0.1–0.4 附 證據註記;且 3fc29a8 宣稱「四項檢核零缺漏」的原始結論已被 7d2f7e7 與本次 兩次 enforcement scenario 補強推翻,卻無任何追蹤記錄——恰命中本 proposal 存在理由(F1–F4 可稽核性、不留靜默漂移)。比照 0.1–0.4 風格補一行證據 註記,記錄最終態(4 requirement/8 scenario,validate --strict 綠)與結論 被推翻的事實。 驗證:npx openspec validate doc-first-canon-v2 --strict = valid;spec.md scenario 計數=8、requirement=4(與註記一致);git diff --cached --check 乾淨。 純 openspec 文件變更,無可執行碼、無安全風險面。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * fix: 補 R-A1 direct-edit enforcement scenario+tasks.md 1.1 中性化註記 - spec.md:R-A1 補第 4 個 scenario——「PR diff 直接觸及手寫正本檔本身內容(而非以獨立提案/草稿檔形式)即違規退回」,比照 R-A2/R-A3 既有 enforcement 措辭,補上獨立退回閘(唯一合法路徑=R-A1 提案流程) - tasks.md 1.1:移除「最終態以此註記為準」過早完成宣告,改中性措辭「本輪驗證結果記錄,後續輪次可再補強」;scenario 計數更新為真實數 4 requirement/9 scenario(R-A1 現 4 scenario),並補記本輪 direct-edit 補強 - npx openspec validate doc-first-canon-v2 --strict 綠 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#2: 撰寫 AGENTS.md 參照鏈修正草稿(提案 diff,不逕改本體) 新增 openspec/changes/doc-first-canon-v2/drafts/AGENTS-refchain.v2-draft.md: 以「現行條文原文 → 建議改寫後文字」逐段對照形式,提案修正 AGENTS.md §3 「Runtime/product behavior truth」定義句與優先順序清單(現行 code+tests 排序高於 docs/plans,翻為 doc-first:docs/plans=唯一需求權威、code+tests= runtime 現況查證面,保留「不得以文件宣稱 runtime 已完成」誠實鐵律半句), 並新增對 design-canon-change-control capability R-A1 的參照(手寫正本= 使用者專屬,AI 只能提案、不自行 merge)。全文標明僅供審閱,須使用者核准 後另開獨立 PR 才落地套用至 AGENTS.md 本體;AGENTS.md/CLAUDE.md/docs/ 本次未做任何 Edit/Write。 tasks.md 1.2 打勾並附驗證摘要。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#2: fix 修正草稿對 docs/AGENTS.md「不需要對應修改」的失實完整性宣稱 quality finding(important):AGENTS-refchain.v2-draft.md:84-86 原斷言 docs/AGENTS.md 已核對、不需要對應修改,但僅驗證 docs/AGENTS.md:32(純 cross-ref)、漏查 Role 段 docs/AGENTS.md:7——該句「現行行為以程式碼、可執行 tests / contracts 為準;docs/plans 定義目標需求與驗收語意」幾乎逐字複述對照 1 欲翻轉的舊框架本文,屬實質重複而非 cross-ref。若根目錄採納權威序翻轉,line 7 不會自動一致,反而重現 proposal.md F1 「權威序自相矛盾」——只是搬到 sub-file 而非消除。 修法(誠實揭露,YAGNI 不擴大改寫範圍): - docs/AGENTS.md:32 純 cross-ref 保留於「不需要對應修改」桶(§3 翻轉後兩條優先序結構仍在) - 新增「已知缺口」桶,逐字揭露 line 7 實質重複+失效情境+F1 連結,標為須另案 pass 改寫(本 task 範圍限根目錄 AGENTS.md 參照鏈,tasks.md 1.2) - 連帶軟性提示同檔 docs/AGENTS.md:33「以實作為準」措辭待 doc-first 下複審 openspec validate doc-first-canon-v2 --strict 綠;僅動 drafts/ 草稿, AGENTS.md/docs/AGENTS.md 本體逐字未改。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * task#3: 驗證 MODIFIED「Workflow v3…」body 三點逐一到位,tasks.md 2.1 打勾 三點驗證結論(spec.md body 本身零修改,純驗證): (a) header 逐字一致:delta spec.md:3 與 main openspec/specs/documentation-source-of-truth/spec.md:8 位元組級比對 (含 CRLF,python rstrip(\r) 雙向確認)完全相同。 (b) doc-first 權威序與內部裁決序皆已到位:delta:5 明列 `docs/plans` 為 唯一需求權威、code 偏離判待修 implementation gap;delta:7 明列內部 裁決序(視覺=Hi-Fi+ai-bim-governance.css 最高、行為/契約/邊界=設計 文件 §01–§08 為權威)。 (c) 誠實鐵律半句原樣保留(delta:9「亦不得以文件宣稱 runtime 已完成」) 且有非矛盾 Scenario(delta:23-27「誠實鐵律與 doc-first 非矛盾壓 測」)證明「標 planned」與「判待修 gap」並存無矛盾。 三點皆於原提案 commit 378a9c1 已到位,本 task 為驗證非新寫;改動僅 tasks.md 2.1 打勾+附結論。npx openspec validate doc-first-canon-v2 --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#4: 驗證 MODIFIED「文件分工調整必須走 PR 治理流程」body 並勾選 tasks.md 2.2 驗證第二條 MODIFIED header(delta:29)與 main spec.md:31 位元組級逐字一致(含 CRLF);body 已在原提案 commit 378a9c1 內含手寫正本面 cross-ref design-canon-change-control R-A1——第二段(delta:33)引用該 capability 並摘述 「不自行 merge、不原地編輯」約束,另附專屬 Scenario「AI 改寫手寫正本面」 (delta:45-48)以 MUST/MUST NOT 語句重申,語意對齊 R-A1 原文「使用者專屬/AI 只能提案不自行 merge」。本次為純驗證,spec.md 零修改;openspec validate --strict 綠。tasks.md 2.2 打勾並附驗證證據。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#5: 驗證 ADDED R-B1..R-B6 對照裁決,tasks.md 2.3 打勾 六條逐一核對結果: - R-B1(偏離處置序+三態分類):code-defect/canon-defect/undecided 齊全, cross-ref MODIFIED「Workflow v3…」,2 scenario;對映裁1/裁2、風險表 canon-defect 出口(pending-canon-fix+R-A1 提案)。零修改。 - R-B2(誠實鐵律非矛盾):誠實鐵律半句保留+非矛盾證明,1 scenario。零修改。 - R-B3(carve-out 清單+diff 斷言):原僅列 §04 payload 委任/§01 鐵律 1–3/README §3.4 凍結面/§07:575 deferral 四項,**缺誠實鐵律半句**—— 已補入 carve-out 清單第 5 項(cross-ref R-B2,不重複規範文字,維持 single-ownership),既有 scenario 已逐條覆蓋新增項,無需新增 scenario。 - R-B4(需求正本邊界):docs/plans=全部、外部 design repo=唯讀 authoring origin,1 scenario;對映裁4。零修改。 - R-B5(R2 三態+詞彙):existing→整合/repo 內可建→全棧/外接引擎才 mock;ProvTag 7 值(asbuilt/artifact/demo/p1/p15/p3/p4)+data-prov; planned 三態 class enum 含 unclassified;OQ-1 asbuilt-partial 不採用, 2 scenario;對映裁6/裁8。零修改。 - R-B6(內嵌 viewport 防護):EmbeddedViewer 跨-origin iframe signaling* 消毒等價防護/KIT_SPECTATOR_COUNT 預設 0/邀請連結真複製 navigator.clipboard/streamRole=spectator/issues 權威入口 unified #a1?dock=issues,2 scenario;對映裁3/裁9/裁10。零修改。 `npx openspec validate doc-first-canon-v2 --strict` 綠(修改前後皆驗證)。 gitnexus detect_changes(scope=staged):changed_files=2、changed_symbols=0、 risk_level=low(純 doc-only,無 code 符號異動)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#5: fix R-B3 誠實鐵律半句 carve-out 標明 canon 面(README §3.5)與 diff 標的 問題(quality finding, important):R-B3 carve-out 第 5 項(誠實鐵律半句)原措辭 「規範文字與非矛盾證明唯一落實見 R-B2…受本 requirement 改寫前後 diff 斷言約束」 自相矛盾——未指出 canon 面位置,task 2.4 逐條 diff 時對此項找不到 before/after, 恐被靜默當「無出現=無誤動=自動過」使保護虛設;且「唯一落實見 R-B2」與 R-B5/R-B6「R-C2 唯一落實」慣用語不一致。 實查更正審查前提:誠實子句「不得以文件宣稱 runtime 已完成」實落於 canon README §3.5(docs-plans-README.md:40,v2-draft:41 亦帶 canon:r-runtime-authority 錨), 非審查者只查的兩份 .dc.html(該處確 0 命中,但 README 是手寫正本面且既有 carve-out 第 3 項已引 README §3.4);item 23/task 3.2 正是翻轉 §3.5 權威語意的 task。 故第 5 項有具體 canon before/after,與其餘 4 項同類,不需特例化。 修法:第 5 項改標明 canon 面=README §3.5、斷言標的=README §3.5 改寫前後 diff (base 同其餘 carve-out=原正本檔 main 版本)、item 23/task 3.2 翻轉時該誠實子句 MUST 語意保留不被權威序翻轉刪除;規範全文+非矛盾證明改為 cross-ref ADDED R-B2 (並與 MODIFIED body 一致)、不重複文字。tasks.md 2.3 證據註記同步更新。 驗證:npx openspec validate doc-first-canon-v2 --strict 綠;git diff --cached --check 無 whitespace;純 docs(openspec spec.md+tasks.md)無 code 改動。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#6: 新增 carve-out diff 斷言清單,tasks.md 2.4 打勾 新檔 openspec/changes/doc-first-canon-v2/carve-out-assertions.md:對 R-B3 保存性 carve-out 清單五項(§04 payload 委任/§01 鐵律1-3/README §3.4 後端 凍結面/README §3.5 誠實半句/§07:575 A5-A10 deferral)逐條列原文位置、 改寫前後語意等價判準、可執行檢核指令(git show main:<path> 為 diff base, 依 design.md §1.3)、備註(item 14 類顯式化補列不算誤動);外加 §3 合併 執行腳本。基準態(Wave 1/2 尚未動筆)五項全數實跑 PASS,作為後續 wave task 的迴歸防護與 §6 收斂驗收 gate 證據。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#6: fix carve-out 3 最終 gate 偵測盲區(README §3.4 錨點無關全句 diff) §3 [3] 原僅跑兩條子 grep(三禁改檔名/埠禁令),既未跑 §2 97-100 主檢核, 亦未覆蓋 coordinator `:8004`/`byte-identical`;實測 `byte-identical`→ `largely identical` 之凍結面弱化仍靜默回報 PASS,使 tasks.md §6 最終收斂 gate 對真實違規失效——恰是本 change 意圖根除的「宣稱與實況不符」模式。 - §2 item 3 主檢核改為錨點無關全句 diff(sed 剝除 `<!-- canon:* -->` 後比對): 修正 Task 0 行尾內嵌錨造成的假性非空 diff,基準態回復乾淨空 diff PASS, 不再落入決策樹未涵蓋的人工判讀分支。 - 補第三條子 grep(`coordinator :8004`+`byte-identical`),使「僅允許新增」 fallback 路徑對三受保護子字串完整佐證。 - §3 [3] 改為鏡射 §2 主檢核(同一錨點無關全句 diff),真正符合 §3「彙整版、 不引入新判準」自我宣稱;非空即回 MANUAL-CHECK 而非靜默 PASS。 - 備註新增「錨點註解」為允許新增例外;摘要表誤動判準核心/§3 收尾證據/ tasks.md 2.4 [3] 證據同步。 驗證:§3 彙整區塊基準態五項全 PASS;tamper 副本(scratchpad,repo 未動)[3] 回 MANUAL-CHECK,byte-identical/檔名刪除/合法 :49100 新增三情境判讀正確; `npx openspec validate doc-first-canon-v2 --strict` 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#6: fix carve-out 3 主檢核 grep 過寬誤判無關列(README §3.4 前綴錨定) §2 Carve-out 3 主檢核與 §3 彙整腳本 [3] 原用裸子字串 `grep -F '後端凍結面'` 從 docs-plans-README.md 抓比對列,但該四字在 main 同時命中兩處: line 39(§3 第4點,受保護 carve-out 原文)與 line 49(§4 舊檔去向表 TARGET-contracts 列的「後端凍結面見本檔 §3.4」交叉引用句,不在保護範圍)。 後果:若某 wave task 合法改寫該無關交叉引用列(README 全檔本 change 期間 大量重寫,順手調用詞屬合理)、而受保護行 line 40 一字未動,主檢核仍吐非空 diff;依 §2 決策樹(僅「允許新增」/「刪改既有」兩支)會被機械導向誤動判定、 觸發 §0 blocker 退回重做——false positive,方向是誤擋合法編輯而非漏放真違規。 修法:兩處 grep pattern 改前綴錨定 `4. **後端凍結面**`(唯一命中 main line 39/ draft line 40 受保護原文,不撈 §4 交叉引用列);並加註不可退回裸子字串之理由, 與更新 §2 決策樹說明(錨定後非空 diff 只可能源自受保護行,兩支決策樹即完備)。 驗證(scratchpad tamper 副本,repo 未動): - 改寫 line 50 無關列+line 40 不變 → 舊 pattern 非空 diff(誤動);新 pattern 空 diff(PASS) - byte-identical→largely identical 弱化 line 40 → 新 pattern 仍非空(正確偵測) - 刪 governanceProxy.ts 檔名 → 新 pattern 仍非空(正確偵測) - 乾淨 draft → 新 pattern 空 diff(基準態 PASS 保留);三條子 grep 各 1 命中 - npx openspec validate doc-first-canon-v2 --strict → valid Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: carve-out-assertions §3 echo 反引號誤替換+Carve-out 4 裸 grep 錨定補強 修兩項對抗複驗未閉合 findings(本檔為 doc-only openspec change 產物,純 docs): [carveout-echo-backtick] §3 合併腳本 echo「[3]」訊息含未跳脫反引號 `4. **後端凍結面**`,bash 當指令替換執行 → stderr 噴「4.: command not found」、stdout 吃掉關鍵錨點說明,違反 tasks.md 2.4「可執行」DoD。修法: 該 echo 外層雙引號改單引號,反引號轉為字面(訊息無 $ 變數、無單引號, 單引號最穩)。修前實跑 §3 fence 重現 bug(stderr: line 12 4.: command not found);修後重跑整個 §3 fence,stderr = 0 bytes、stdout「[3]」列 正確顯示 `4. **後端凍結面**`、五項全 PASS。全檔確認無其他 echo 混反引號 (L46 為 markdown 註記 prose 之 code-span,非可執行 echo)。 [carveout4-unanchored-grep] Carve-out 4 誠實半句檢核(§2 L132+§3 鏡射 L179)為全檔唯一「裸字串整檔 grep」:未來 wave 稀釋/刪除 point 5 誠實半句 但字串殘影留在檔案他處時會靜默 PASS——恰為本 change 要根除且最關鍵之 carve-out。修法:仿 item 3 錨定手法,鏈式錨定至 point 5 之 `<!-- canon:r-runtime-authority -->` 行(該錨與誠實子句同行、全檔唯一) 再 grep 誠實子句,兩處皆改;同步更新相鄰判準 prose。tamper 實跑驗證: - REAL draft:main check 非空、[4]=PASS(無回歸) - TAMPERED(point 5 稀釋、殘影搬至 L56):修前裸 grep 靜默 PASS;修後 main check 空輸出、[4]=MANUAL-CHECK(破口封閉) - EQUIV(同行改「亦不得…」):非空、[4]=PASS(不誤傷合法等價改述) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#7: §08 權威順序表翻轉為 doc-first(item 22) - draft AI-BIM 前後端設計文件.v2-draft.dc.html §08 c8-authority-table 七列改寫為 doc-first 序: 1 使用者最新明確指令 / 2 docs/plans 需求正本(§01–§08;前端視覺/互動面=Hi-Fi+ai-bim-governance.css 最高)——依領域分工 / 3 tests/contracts/*.json(payload 委任,§04 保留) / 4 AGENTS.md/OpenSpec(治理 程序) / 5 Prompt Board 文字(僅意圖參考) / 6 應用場景圖(僅視覺上下文) / 7 圖中示例數字(fixture) - 新增誠實半句:「code+tests=runtime 現況的查證面;code 偏離本正本=implementation gap 待修,不得以 文件宣稱 runtime 已完成」 - 表頭「(寫進 AGENTS.md)」與 §08 尾 badge「把本節鐵律與權威順序寫進 AGENTS.md / OpenSpec」同步改為 參照語意(AGENTS.md 參照本節,不重抄) - carve-out 五項迴歸複驗全 PASS(未觸碰任一 carve-out);openspec validate --strict 綠;Crosswalk 對號沿用 design.md §4 既有列(item 22|normative(doc) 翻轉|Wave1|裁1,2) - tasks.md 3.1 打勾 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#7: fix §08 權威順序表移除誤植的「使用者最新明確指令」列(doc-first review-fix) 審查發現(important):§08 c8-authority-table 新表第 1 列塞入「使用者最新明確指令」、docs/plans 需求正本退居第 2 列,與本 change 自身規格互斥: - 牴觸 MODIFIED spec.md:5「docs/plans…是唯一需求權威」——需求權威表內不得有列凌駕唯一權威。 - 破壞姊妹草稿 AGENTS-refchain.v2-draft.md 對照2 明文要求的「§08 表與 AGENTS.md 清單同構」(該清單 docs/plans 為第 1、無此列)。 - 「使用者最新明確指令」屬 canon:r-user-instruction-supremacy 指令優先序 meta-rule(docs-plans-README.v2-draft:37),非需求權威表列,混入即 proposal F1「權威序自相矛盾」再現。 修法(採 finding 建議 (a),最小且合本 DoD):移除該列,docs/plans 回歸第 1 列(去除其 border-top 以符首列樣式),其餘五列 renumber 2–6;誠實半句 badge 與尾 badge 位置隨之上移一行。「使用者最新明確指令」概念保留於 docs-plans-README.v2-draft:37 既有 meta-rule,無資訊遺失。 驗證: - 目標斷言 pre-fix FAIL(7 列、列1=使用者最新明確指令)→ post-fix PASS(6 列、列1=docs/plans)。 - carve-out §3 五項迴歸全 PASS(未觸碰任一 carve-out)。 - HTML div/span 配對平衡(273/273、514/514);CRLF 保留(742→741 行)。 - npx openspec validate doc-first-canon-v2 --strict 綠。 - tasks.md 3.1 PASS 證據同步改為六列、修正過度宣稱、附 review-fix 註記。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * task#8: README §3 權威語意翻轉——第2條權威順序對齊 Task 7 新表、第5條翻為 doc-first(item 23/tasks.md 3.2) docs-plans-README.v2-draft.md §3 效力節兩點改寫: - 第 2 條權威順序改為 doc-first 六項序,與 §08 c8-authority-table(draft:611-616)逐項對齊: docs/plans 需求正本(§01–§08) > tests/contracts/*.json(payload 委任) > AGENTS.md/OpenSpec > Prompt Board 文字 > 應用場景圖 > 圖中示例數字(fixture)。 - 第 5 條由「現況行為權威=code+tests;設計文件=目標權威」翻轉為「需求權威=本目錄設計正本 (doc-first);code+tests=runtime 現況查證面;code 偏離正本=implementation gap,列入 gap ledger 排修」,誠實子句「不得以文件宣稱 runtime 已完成」原文全句保留。 carve-out-assertions.md §3 合併執行區塊七項全 PASS,確認 §3.1 使用者指令最高、§3.4 後端凍結 面、§2 讀取路線三處 carve-out 原文未動;tasks.md 3.2 打勾並附驗證記錄。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#9: 刪 §03 命名核對 carve-out,改寫為現況對照(doc-first) - §03 c3-naming-check 區塊標頭「命名核對(code-truth,對照 console/unified/*)」改為「現況對照(doc-first,對照 console/unified/*)」 - 引言句移除權威語句「以下以程式碼為準,不回頭改程式碼命名以遷就舊文件」,改為中性引導「以下逐條列現況對照」;前段「先前的理想化命名,與現行…不符」誠實描述保留 - 四則刪除線事實比對(AppShell→EdgeConsole.tsx/UnifiedShell.tsx、UsdStageTreePane/ViewportLayer 無 video、DockPanel→docks.tsx、六個 hooks→UnifiedShell.tsx UnifiedStateProvider)與 mappingCache 未接線事實逐字保留,均為仍成立之誠實現況 - 新增收斂語句(獨立 badge,樣式比照 §08 誠實半句 badge):「上列為 2026-07-18 現況;理想 IA(含元件/hook 命名)為應建目標,收斂路徑見 §07 分期與 follow-up changes;命名遷移屬實作 PR 範疇」 - §03:214 DataChannel stale 自糾句原樣未動(不在本 task,留給 task 3.7/Task 13) - tasks.md 3.3 打勾:carve-out-assertions.md §3 合併執行五項全 PASS、Crosswalk 對號 design.md §4 item 24、npx openspec validate --strict 綠 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#10: §08 R3 詞彙收斂為 ProvTag/Prov 7 值+新增 OQ-1 Open Decision 註記塊 - draft §08 R3 卡(c8-r3-provenance):ProvenanceTag(mock | live)改為實碼詞彙 ——元件 ProvTag+7 值 Prov(asbuilt/artifact/demo/p1/p15/p3/p4,cross-ref web-viewer-sample/src/console/data.ts:6)+unified 層 data-prov="fixture|live"。 - 緊接新增巢狀 non-normative『OQ-1 Open Decision 註記塊』(dashed border 視覺 區隔,標「Open Decision(未裁決,預設不採用)」+non-normative 標籤):是否 新增 asbuilt-partial 外接待決 Prov 值預設不採用,normative enum 維持 7 值 封閉,擴充唯一路徑=design-canon-change-control R-A1 提案+使用者核准。 - §08 共用元件清單 badge:ProvenanceTag → ProvTag(既有)。 - grep 驗證 ProvenanceTag/mock | live 全檔歸零;asbuilt-partial 僅命中 Open Decision 塊內、未污染 normative 7 值列表;carve-out-assertions.md §3 合併執行七項全 PASS;npx openspec validate --strict 綠。 - tasks.md 3.4 打勾並附證據。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#10: fix README §3.3 R3 殘留 ProvenanceTag(mock|live) 收斂為 ProvTag/data-prov 姊妹 draft docs-plans-README.v2-draft.md:39(四條鐵律 R3 子句)殘留與 §08 R3 同源的失真詞彙 ProvenanceTag(mock|live)(proposal F4)。task#10 原 Files 僅涵蓋 §08 R3(.dc.html),未認領此第二地點;若不補,採納後會原樣寫回真正 docs/plans/docs-plans-README.md、復燃 F4(R2 三態裁決無共同詞彙可落地執行)。 將該 R3 子句收斂為實碼詞彙 ProvTag/7 值 Prov/data-prov,語意鏡射 §08 R3(示意數字一律 fixture 並以 data-prov 標示;面板掛 ProvTag(7 值誠實分類);未接通 action 誠實停用並標 Concept Preview / Roadmap,不做假成功)。 同步 design.md §4 crosswalk item 9 錨點欄由「§08 R3」補為「§08 R3 + README §3.3 R3」認領第二地點;tasks.md 3.4 note 補記 gap fix。 驗證:README draft 內 ProvenanceTag/mock|live 兩字樣歸零(grep 無命中);§3.3 非五項 carve-out 之一,carve-out-assertions §3 五項受保護 carve-out 改寫後全 PASS([1b] tests/contracts 次要回聲屬 task 3.2 既有、非本次);openspec validate doc-first-canon-v2 --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * task#11: §07 變更守則 badge 移除 docs/ai_journal 死引用,改指實存留痕機制 - draft §07:577「AI journal 留痕(docs/ai_journal/changes.jsonl)」——該路徑從未存在於 repo - 改寫為「變更留痕(OpenSpec change 目錄 openspec/changes/<id>/ + PR body 的 AI Coding Governance 表)」,對映 repo 現行機制(.github/PULL_REQUEST_TEMPLATE.md / docs/agents/github-workflow.md:47) - 僅改 draft,正本 docs/plans/AI-BIM 前後端設計文件.dc.html 逐字未動 - draft 全文 grep ai_journal 歸零;tasks.md 3.5 打勾 - carve-out-assertions.md 五項合併執行 PASS;npx openspec validate doc-first-canon-v2 --strict 綠;GitNexus detect_changes(staged)0 symbol/0 process 影響 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#12: 改寫 §07/§08 對 align-frontend-design-system-reference 的 stale 任務編號引用,刪除已修復的已知不一致註記 - §07 badge 與 §08 驗證鏈段落中「2.4–2.8 未完成」「3.4 為 archive 前提」的硬編任務編號引用,改為指向該 change tasks.md 現行版本的不硬編寫法;經查證上游 align-frontend-design-system-reference/tasks.md 現行結構為 §1–§5、archive gate=5.3,與 draft 原載編號完全不同,證實原編號確已 stale - 刪除 §07「已知不一致:spec.md 仍引用已刪除 TRUTH/TARGET/PROCESS/BACKLOG」註記;經查證上游 documentation-source-of-truth/spec.md 全文已零命中該四詞,該不一致已於 #354 修復,註記本身 stale - tasks.md 3.6 打勾並附驗證證據(grep 四字樣歸零、div/span 標籤配平、carve-out-assertions.md 七項全 PASS、openspec validate --strict 綠) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#13: 刪 §03:214 stale 自糾句,DataChannel 待補事實併入現況對照塊 §04:280 現行已將 selectPrimsRequest / composeStageRequest 標「已實作」, §03:214 原「與現況不符」自我糾錯句已指向空氣;整句刪除,保留真正待補 事實,改寫為同塊一句「DataChannel 唯一待補=commandRejected(見 §04)」。 - grep 驗證「標「待補」與現況不符」全檔歸零,commandRejected 命中數 4 (214/283/569/578)語意一致、未受影響 - div/span 標籤配對 node 腳本核驗全檔平衡(275/275、524/524) - carve-out-assertions.md §3 合併執行七項全 PASS - npx openspec validate doc-first-canon-v2 --strict 綠 - tasks.md 3.7 打勾 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#0: §03 Route Map+CH-G 收斂表改寫為目標/現況雙欄對照 - Route Map(c3-route-map)由 2 欄(Route/頁面-行為)擴為 3 欄(Route/目標/現況 2026-07-18);#/workspace、#/ops、#/app/:slug 三路由 key 依實碼查證標「未做」(實掛 #a1..#a4+?dock=、#runtime、#a5..#a10+legacy AppVisionPage),#/home、#/pipeline、/ui/open?session= 標「已達成」 - 舊路由收斂(CH-G)表(c3-legacy-route-convergence)由 flex badge 列表改為同款 3 欄表;七條舊 hash(#coordinator/#conv/#minio/#gpu/#kit/#review/#viewer)歸一列標「未做,零 redirect」;新增 #intake(已有 alias 但導至 legacy #minio 非 #/pipeline,非收斂目標)、#runtime 與 #a1..#a4(語意已達成、非經收斂重導——實碼查證兩者已是 unified 現行 hash key,非零 redirect legacy 頁,不與七條同歸類)三個獨立澄清列;表外新增「CH-G 整體狀態:未做(目標)」收斂 badge - 現況事實逐一比對 web-viewer-sample/src/console/EdgeConsole.tsx(renderUnified/renderBody switch、UNIFIED_WS_KEYS/UNIFIED_CONCEPT_KEYS、AliasRedirect)、routing.ts(PRODUCT_CONSOLE_ROUTES)、unified/WorkspacePage.tsx(dockFromHashQuery)、bim-review-coordinator/src/app.ts:3703-3704(/ui/console 301) - carve-out-assertions.md §3 合併執行相關子集([1]§04 payload 委任/[2a]鐵律1/[2b]鐵律2/[2c]鐵律3/[5]§07:575 A5–A10 deferral)全 PASS;div/span 標籤配對 node 腳本核驗全檔平衡(281/281、545/545);GitNexus detect_changes(staged)0 changed_symbols/0 affected_processes、risk_level low;npx openspec validate doc-first-canon-v2 --strict 綠 - tasks.md 4.1 打勾並附完整驗證記錄;Crosswalk 對號 design.md §4「1|§03 Route Map / CH-G|normative(doc)|2|1,2」 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#0: fix CH-G #intake 現況欄移除偽斷言「#/pipeline key 不存在」 §03 CH-G 收斂表 #intake 列現況欄原括號句「AliasRedirect 導至 legacy #minio (非 #/pipeline;#/pipeline key 不存在)」誤植偽斷言,與同表 Route Map #/pipeline 列(draft:159「已達成:hash key #pipeline 存在,渲染 UnifiedShell(page=pipe)+ PipelinePage」)及實碼直接矛盾:EdgeConsole.tsx:55 usePageHash 正規化剝除可省略 `#/`,故 #/pipeline 與 #pipeline 正規化後同為鍵 `pipeline`;:108 case "pipeline" 渲染 UnifiedShell(page=pipe)+PipelinePage,route key 確實存在。 改為「AliasRedirect 導至 legacy #minio,非收斂去向 #/pipeline(該 unified route key 已存在、見上表,惟 alias 尚未改指)」,移除偽斷言且與 draft:159 及 tasks.md 本列摘要一致。lines 158/160/161 三處 legit `key 不存在`(#/workspace·#/ops· #/app:slug 三路由 key 真不存在)未動。tasks.md 4.1 補 fixer gap-fix 註記。 驗證:grep `#/pipeline key 不存在` 歸零;div/span 平衡 281/281·545/545 不變; CRLF 保留;carve-out §3 七項全 PASS;openspec validate doc-first-canon-v2 --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * task#1: §06 LineagePublicationOutbox 六態標 planned(class) CallbackOutbox/LineagePublicationOutbox 卡(c6-callback-outbox-lineage-outbox) workflow 3 態(pending→sent|dead-letter)標「已實作」;lineage 六態 (DISABLED|PENDING|RETRYING|DELIVERED|DEAD_LETTER|CONFLICT)標 「planned(class: repo 內可建/全棧)——coordinator 現況僅 3 態 outbox, 六態契約在 openspec/changes/rvt-ifc-usdc-lineage(未實作); 實作=follow-up lineage-outbox-impl」。 tasks.md 4.2 打勾並附驗證記錄(grep/div-span 平衡/carve-out 五項/ openspec validate --strict)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#1: fix §06 lineage planned class 改用 R-B5 封閉列舉 token in-repo-fullstack-pending R-B5(spec.md:102)要求正本 v2 任一 planned 標記附 R2 三態 class 封閉列舉值 {integrated-ready|in-repo-fullstack-pending|external-mock-legit|not-built|unclassified} 之一。draft §06 c6-callback-outbox-lineage-outbox 卡原標 `class: repo 內可建/全棧` (中文改述,逐字繼承自 Plan B canon-v2-planB.md:17,非 implementer 新增偏差),字面非該 封閉 token,已改為 `in-repo-fullstack-pending`(語意對映 spec.md:100 R2 中段「正本有列 +repo 內可建→後端+前端一次建到位」=in-repo+fullstack+pending)。token 落於既為 JetBrains Mono monospace 的卡片體、比照同卡姊妹 enum(DISABLED|PENDING|…)採 inline 呈現。 tasks.md 4.2 追加 fixer 註記記錄本次修正。 驗證:draft 內 `repo 內可建/全棧` 歸零、`in-repo-fullstack-pending` 命中 1、git diff 恰 1 行 (1 add/1 del)、div/span 平衡 281/281·547/547 不變、CRLF 保留、carve-out §3 合併執行五項 全 PASS、openspec validate doc-first-canon-v2 --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#2: §03 spectator gate badge 改寫為誠實雙態+follow-up 具名 draft §03 c3-badge-spectator-gate(draft:203)由單態全稱宣稱「spectator 一律 readonly:resolveGovPanelState 統一 gate 所有 Dock 的寫入行為」改寫為【目標】/ 【現況】雙態對照:目標維持 gate 全部 Dock 寫入,現況揭露 gate 僅接線 legacy viewer overlay 路徑(windowOverlayGlue→Window/GovernanceOverlay),unified docks 現為 fixture 殼、無真實寫入亦無 gate 接線,並引用既有具名 follow-up unified-docks-real-api(design.md §6a/§5 附記已預先具名,非本次新增)。 對主工作區實碼查證(worktree 本身 doc-only 不帶 web-viewer-sample/): resolveGovPanelState 唯一呼叫鏈=windowOverlayGlue.deriveOverlayInputs→ Window.tsx(:41 匯入/:42 匯入 windowOverlayGlue/:2668 渲染 GovernanceOverlay);console/unified/docks.tsx 與 WorkspacePage.tsx 全文 grep governance 系匯入 0 命中(僅 WorkspacePage.tsx:108 一處 toast 文案字串 提及 gate 名稱,非真實呼叫),證實現況描述屬實。 驗證:舊句全檔歸零、新句四要素(目標/現況/windowOverlayGlue→Window/ GovernanceOverlay/follow-up 名)grep 皆命中;div/span 標籤配對 281/281· 547/547 不變(僅改單一 span 文字);carve-out-assertions.md §3 合併執行七項 全 PASS;openspec validate doc-first-canon-v2 --strict 綠;tasks.md 4.3 打勾。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#3: §02 拓撲修正——governance-service 移至 host-native 欄、MinIO 改標外部 service、UnifiedConsole 註明內建 bundle 依 compose.host-kit.yml:16「governance-service 永遠 host-native(CPU ifcopenshell,:49102), 不在任何 compose 內」,將 draft §02 的 governance-service 列從「Docker Web-Plane」欄移至 「Windows Host-Native GPU」欄;交叉核對 compose.runtime-manager.yml 全文確認無 governance-service 與 minio service 定義。MinIO 列改標「外部既有物件儲存(非本 compose service;coordinator 以 MINIO_WATCH_* env 對接)」,對應該 compose 檔 coordinator 區塊十個 MINIO_WATCH_* env 透傳。 Docker Web-Plane 欄 UnifiedConsole 列註明「= coordinator image 內建 bundle(非獨立 service)」, 對應該 compose 檔註解「UnifiedConsole build 由 coordinator image 內建」。 三處均只動文字/結構,未增減任何 div/span 標籤(node 腳本核驗全檔平衡 281/281、547/547,與 task 4.3 基準相同);tasks.md 4.4 打勾並附驗證紀錄;npx openspec validate --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#4: item 7——§06 IfcReadyRecord/ConversionJob status enum 對齊實碼(tasks.md 4.5) draft §06 兩張資料模型卡的 status 列由虛構/簡化值改為實碼真實 enum 逐字全列: - c6-ifc-ready-record 卡:「status: received→converting→ready」(非實碼,intake job 之 status 欄位從無 ready 值)→「status: accepted|queued_for_conversion| dispatched|dispatch_failed|dropped_on_restart|failed」。來源: IfcReadyIntakeStatus type,bim-review-coordinator/src/types.ts:195-206 (型別掛於 IfcReadyIntakeJob.status,types.ts:212/214)。 - c6-conversion-job 卡:「status: queued|running|done|failed」(非實碼)→ 「status: detected|queued|converting|ready|failed」。來源: ConversionLedgerStatus type, bim-review-coordinator/src/services/conversionLedger.ts:11 (型別掛於 ConversionLedgerRecord.status,conversionLedger.ts:24)。 兩實碼型別互為獨立檔案(record vs job 概念在 doc/code 命名交叉——doc 卡名 「IfcReadyRecord」實對應 code IfcReadyIntakeJob;doc 卡名「ConversionJob」 實對應 code ConversionLedgerRecord),依 task 要求分開標明來源檔,已各自於 卡片內以行內 <span style="color:#5a7089">(型別名,檔案:行號)</span> 標註。 僅動 status 行;job_id/artifacts/quality/retry_count 等其餘欄位未動(本 task 範圍僅 enum,非全欄位重寫)。此為 descriptive(tests-delegated) 修正:文件描述 委任層現實,非行為變更。 驗證: - grep 舊字串「received→converting→ready」「queued|running|done|failed」全檔歸零 - div/span 標籤配對 node 腳本核驗全檔平衡(281/281、549/549,較上一 task 基準 547/547 淨增 2 對行內來源引用 span) - carve-out-assertions.md §3 合併執行七項全 PASS - npx openspec validate doc-first-canon-v2 --strict 綠 tasks.md 4.5 已打勾。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#5: §08 features/a1..a10 佈局與共用元件清單改標 target vs 現況(item 10) - §08 收尾 badge「結構 = modular monolith frontend(單一 SPA + features/a1..a10)」 拆為已達成/目標兩段:「結構=modular monolith(單一 SPA)✔」保留(單一 SPA、 非 microfrontend 事實不變)+新增巢狀強調「features/a1..a10 為目標佈局 (現況=src/console/ 扁平+console/unified/ 子夾,遷移屬未來實作 PR,非現況)」。 - 「共用元件優先抽取(20 張圖重複 UI)」14 清單標題補註 amber badge: 「待抽取目標;現況 0/14 以此命名存在,功能近義物異名散落(ProvTag/Metric/ FlowBar 等)——命名收斂於抽取時裁決」。 - tasks.md item 4.6 打勾,附 PASS 證據(grep/div-span 平衡/CRLF/openspec validate --strict 綠)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#5: fix §08 共用元件清單「0/14」→1/14+結構 badge 子夾清單補全(item 10 現況失真矯正) 兩處插入文字逐字繼承任務需求原文,但 committed 後帶可驗證現況失真,依 doc-first-canon-v2 誠實鐵律(修復現況宣稱失真)同向矯正: - 共用元件清單標題 badge「現況 0/14 以此命名存在」矯正為「1/14(僅 ProvTag,見 components.tsx)」。 ProvTag 確以精確命名存在(web-viewer-sample/src/console/components.tsx:17 export function ProvTag, 另在 pages.tsx/GovernanceOverlay.tsx/modelData/ModelDataPage.tsx/console.test.tsx 4 檔 import), 與同清單第 699 行既有「ProvTag(既有)」直接自相矛盾;其餘 13 項逐一 grep 均 0 命中→正確計數=1/14。 ProvTag 自「異名散落」例舉移除,僅留確為異名既有物的 Metric(imported)/FlowBar。 - 結構 badge「現況=src/console/ 扁平+console/unified/ 子夾」僅點名 unified 一子夾,矯正為 「以扁平檔為主,另有 coordinator/unified/governance/modelData/viewer 五個既有功能子夾、皆非 aN 對齊」 (實測 src/console/ root 68 檔為多數、另有 5 個既有子夾)。 - tasks.md item 4.6 補 gap-fix 追認註記。 純文字替換未增減標籤:div/span 平衡 281/281·551/551 不變、CRLF 保留(0 bare LF)、 carve-out 五項未觸及、openspec validate doc-first-canon-v2 --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#6: §08 補 Task↔CH crosswalk 對照表(item 11) - draft §08 `c8-task-sequence-table` 之後插入新區塊,substantiate 表頭既有 「(對映 §07 CH 分期)」宣稱:小標頭「Task↔CH Crosswalk(近似對映,非嚴格 一對一)」+ 新表 `c8-task-ch-crosswalk`(Task/對應 CH/備註 三欄、5 列)。 - 對映內容依 tasks.md 4.7/canon-v2-planB.md Task 6 原文:Task 0↔CH-0/CH-A (基建);Task 1–3↔CH-B/CH-C/CH-E(A1–A3 真整合,已落地);Task 4↔CH-E/CH-F (Model Data+Runtime 共用元件);Task 5–10↔「—(無對應 CH)」(feature 軸, 依 R2 三態重詮釋=repo 內可建面全棧一次到位);Task 11–12↔「CH-G+新期」 (跨頁/E2E 貼近 CH-G、A10 儀表板無專屬 CH 待未來新期承接,§07 CH-H 家族 尚未存在於本文件、未虛構)。 - 表格後補二軸性質收斂 note badge:CH=基礎建設軸(多已出貨)、Task=feature 軸(建議順序),二軸非逐項嚴格對應。 - tasks.md item 4.7 打勾,附 PASS 證據:CH 標籤核對 §07 c7-ch-schedule-table 實際 8 期一致、div/span 平衡(288/288、571/571,淨增 7 div/20 span)、 CRLF 保留(758 段、0 bare LF)、git diff 純新增(10 insertions/0 deletions)、 carve-out-assertions.md §3 七項全 PASS、openspec validate --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#7: item 12——A4 hybrid 誠實化+R2 卡三態重寫(tasks.md 4.8;scope 擴充認領 final-review f1) 三處改寫(draft-submitted): - §08 R2 卡(c8-r2-api-tristate)pre 區塊由三態(Existing/Planned/Missing)重寫為新四行敘述: Existing/In-canon+repo 內可建/In-canon+依賴外接引擎/Missing,Missing 補「先走 design-canon-change-control R-A1 提案」路徑;卡下說明文字同步插入 R2 三態分類提示, 「瀏覽器仍只連 :8004…」句原樣保留(Task 9/item 14 範疇,未搶做)。README draft §3.3 R2 子句同步改為同語意精簡版(existing/in-canon+repo 內可建/in-canon+依賴外接引擎/missing)。 - §08 真實程度表(c8-domain-reality-table):標頭改「A4=hybrid 已部分落地;A5–A10=Concept 稿」;A4 列改「deterministic 檢索已全棧落地(governance-service/search)+semantic=外接 LLM(對應 a4-semantic-search-model-qa change)」;A5/A6/A10 補雙標記(in-repo 元件= planned(全棧)+外接依賴=external(mock 合法,掛 ProvTag));A7/A8/A9 補 external 標記, 移除具名廠商(Isaac/Replicator/P6)改 genericize 詞彙。 - Task 表「5–10」列改「A5–A9:repo 內可建面全棧一次到位(預設不做 mock 過渡);僅外接 引擎面可 mock;A4 已超前完成 deterministic 全棧」。 f1 認領記錄已寫入 tasks.md 4.8 註記(單一 ownership 歸 item 12)。 驗證:grep 確認舊字串歸零/新字串命中、無具名外部廠商依賴;div/span 全檔平衡 (288/288、575/575);CRLF 全檔保留(759/0);carve-out-assertions.md §3 七項全 PASS; openspec validate --strict 綠;gitnexus detect_changes(staged)3 檔、0 symbols、 risk_level=low。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#7: fix §08 餵法表殘留「A4–A10 contract-first」對齊 A4 全棧/A5–A10 概念稿 canon 修 final-review IMPORTANT-1:§08「餵法 → 成果對照」表中列(圖 + repo + 文字契約)成果欄 殘留舊框架「A4–A10 contract-first」,與本 change 於同 §08 新寫入的 canon 直接矛盾——Task 表 (c8-task-sequence-table)已改「A5–A9 repo 內可建面全棧一次到位;A4 已超前完成 deterministic 全棧」、真實程度表(c8-domain-reality-table)已標「A4=hybrid 已部分落地、deterministic 檢索已 全棧落地」。原 task#7 commit(6a6cfa1)grep 只鎖被移除的舊字串全稱「A4–A9 contract-first prototype」(命中 0),未涵蓋語意相同、文字不同的「A4–A10 contract-first」變體,故此殘留漏過、 會在同頁重新製造未追蹤的建置狀態失真點(doc-first-canon-v2 要根除的 F2 失效模式)。 改法(沿用 canon 既有詞彙,不新增框架):成果欄改為「統一 shell;A1–A3 真整合;A4 deterministic 已全棧;A5–A10 仍為概念稿(缺逐模組 task/E2E)」——A4 措辭對齊 Task 表「A4 已超前完成 deterministic 全棧」與真實程度表 A4 列;A5–A10 用 §07:575/真實程度表既有詞「概念稿」框定為 「較弱餵法之成果」,三階餵法 tiering(row1 demo-ware < row2 本列 < row3 產品級)完整保留, 非改動 A5–A9 全棧 canon 本身。 驗證:HTML/README draft 全檔 grep `contract-first` 歸零(tasks.md 唯一 1 處為 4.8 完成註記中 「舊字串已移除」之歷史記錄、非活躍宣稱,依規不動);div/span 全檔平衡 288/288·575/575 不變 (純 span 內文字替換、未增減標籤);CRLF 全檔保留 759/0;git diff --cached --check 乾淨; carve-out-assertions.md §3 合併七項全 PASS(本列非任一 carve-out 錨點);npx openspec validate doc-first-canon-v2 --strict 綠;gitnexus detect_changes(staged,worktree)changed_files=1、 changed_symbols=0、risk_level=low。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * task#7: fix A5/A6/A10 planned 標記補封閉 class token(R-B5 spec.md:102 SHALL) review IMPORTANT-1:canon draft §08 c8-domain-reality-table 之 A5/A6/A10 三列(html 728/729/733)新增之 planned(全棧) 為可讀中文,未附 R-B5 (spec.md:102)明定之封閉列舉 class token,構成 SHALL 違反,3 處裸 planned 已隨 6a6cfa1 落地。 比照 task 4.2(LineagePublicationOutbox)同類情境之 gap-fix 前例、且 item 12 (本 task)即 A5/A6/A10 三列之唯一 R-C2 owner(single-ownership,spec.md:147-150), 就地補封閉 token:planned(全棧) → planned(class: in-repo-fullstack-pending) ×3; 語意對映 spec.md:100 R2 中段「正本有列+repo 內可建→後端+前端一次建到位」, 與 §06 lineage 卡(draft:543)同 token、同 house style。原 4.8「刻意不越權、留待 6.1」推理經 review 推翻(6.1 仍待辦、無機制保證補上),tasks.md 4.8 補 gap-fix 記錄。 同批 6 個 external(mock 合法,掛 ProvTag) 標記(A5–A10)未動:spec.md:102 SHALL 子句字面只點名 planned 標記,external 屬 review 次要項(嚴重度較低),留 6.1/後續 判斷是否比照 external-mock-legit。 驗證:grep planned(全棧)=0、planned(class: in-repo-fullstack-pending)=4 (§06 lineage 1 + A5/A6/A10 3)、div/span 288/288·575/575 不變、CRLF 759/0、 carve-out-assertions.md §3 七項全 PASS、openspec validate doc-first-canon-v2 --strict 綠、git diff --cached --check 乾淨。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * task#8: item 13——§04 tests/contracts 誠實化(tasks.md 4.9) draft §04 subheader「Payload 以 tests/contracts/*.json 為最高標準」逐字保留 (carve-out),緊接新增誠實現況 badge:現況覆蓋僅 ifc_ready_payload v1.1.0 與 conversion_result_callback v1.0.0 兩檔+structured-log 子樹;A1–A10 各 API 契約檔=planned(class: in-repo-fullstack-pending),落地前該 API 的 payload 權威=本節文字+實碼。封閉 token 選用比照 item 2/12 已確立之 house style 就地補齊,不留待 6.1。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#9: item 14——§04/§08 HTTP 語意補列(tasks.md 4.10) 顯式化四處既有 HTTP 語意事實(R-B3 判 normative(doc)、非誤動 carve-out): - coordinator 卡新增 GET element-mapping/for-session/:id 列:coordinator 直服(不經 governanceProxy.ts),轉打 conversion authority :49101(非 :49102);實碼查證 for-ifc-ready 變體現只見於 sibling 端點(rule-runs/search-model),element-mapping 本身尚無此變體,未照抄 任務原文可能失真的字面。 - governance 卡:apply-overlay 標 501(client-side highlightPrimsRequest);federated-sets 標 201 同步 create(對比 A1/A2 為 202 async)。 - PROXY 列改述為顯式白名單轉發(governanceProxy.ts ~30 條、kit 5 條),非萬用轉發。 - §08 R2 卡補列 :49100/spectator/:47998 為合法瀏覽器直連例外(WebRTC 串流本體)。 四處皆逐一對照實碼(app.ts/governanceProxy.ts/governance-service api.py/federation api.py/SYSTEM_DESIGN.md)驗證後落筆;carve-out-assertions.md §3 七項全 PASS、div/span 標籤配對平衡(289/289、581/581)、CRLF 全檔保留、openspec validate --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#10: draft §01 鐵律 3 badge 由 byte-for-byte 改行為級凍結描述+known gap 鐵律 3 badge「/ui/open?session= handoff 凍結,byte-for-byte + CI guard」 改為行為級描述——301/302 精確性、redirect target=viewer origin、參數白名單 streamRole/kitInstanceId 轉發+signaling* 剝除,CI guard 明列為 coordinator vitest dev-console.test.ts;並補 known gap(不是 pass)標註: e2e/ui-open-regression.spec.ts 尚未接 CI,接 CI 列第一順位 follow-up。 凍結本體(handoff 對象 /ui/open?session=、凍結宣告、CI guard 要求)三要素 逐字保留,carve-out-assertions.md §2c must-preserve 鏈 PASS;鐵律1/鐵律2/ §04 payload 委任三項 carve-out 對 main 逐字 diff 皆空輸出。 tasks.md 4.11 打勾並附驗證紀錄。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#10: fix 鐵律 3 badge signaling* 萬用字元改具名 allowlist 語意 審查 important 發現:§01 鐵律 3 badge 用「signaling* 剝除」萬用字元寫法, 暗示存在一條以 signaling 為前綴的專屬過濾規則,但實碼 bim-review-coordinator/src/app.ts:3748-3775 之 VIEWER_REDIRECT_QUERY_PARAMS 為 7 個具名 key 的 default-deny allowlist,buildViewerRedirectUrl 只轉發白名單內 key、白名單外(含 signalingServer)一律剝除,並無任何 signaling 前綴比對路徑; signalingServer 遭剝除與其他未列名參數同理,非因專屬規則。 修正:draft:107 badge 改為精確 allowlist 語意「streamRole/kitInstanceId 轉發+ 白名單外一律剝除(如 signalingServer)」,與同 commit tasks.md 既有正確表述 「signalingServer 遭剝除」一致;同步 tasks.md:49 內嵌 badge 引用與三要素轉述 兩處 signaling* 寫法(既有正確之「signalingServer 遭剝除」句未動)。 驗證:carve-out §2c must-preserve 鏈(鐵律3→/ui/open?session=→凍結)PASS、 鐵律1/2 與 §04/§07 carve-out diff 皆空輸出、openspec validate --strict 綠、 git diff --cached --check 無 trailing whitespace。純 docs 改動、未觸 code。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * task#10: fix tasks.md 4.11 PASS 敘事三 it() 誤歸單一 RK6 case 之 citation 失真 審查 important 發現:openspec/changes/doc-first-canon-v2/tasks.md:49(task 4.11/ item 15)PASS 驗證敘事把 bim-review-coordinator/tests/dev-console.test.ts 三個 獨立 it() 區塊的斷言全歸給單一「RK6 case」,係測試歸屬(citation)失真。實查:全檔 grep `RK6` 僅命中 dev-console.test.ts:122(it 描述)與 :134(內部註解),對應 app.ts:3701 CH-E/CH-G(RK6 CRITICAL) 風險標籤——真正帶 RK6 標籤者僅 it("CH-E/RK6:…不以 /ui/* 萬用吞掉凍結的 /ui/open")(:122-145),斷言僅 301/302 + viewer origin + /ui 200;「not.toContain evil.example/127.0.0.1」出自未標 RK6 的 it("redirects /ui/open to configured browser-visible viewer URL")(:101-120); 「streamRole+kitInstanceId 保留而 signalingServer 剝除」出自未標 RK6 的 it("forwards only whitelisted viewer identity params through /ui/open")(:238-259)。 修正:比照本檔既有 fixer-note house style(task 4.2/4.6/4.8 append-only,保全原 PASS 敘事之可稽核性),於 4.11 敘事尾追加 gap-fix 註,把三組斷言分別點名各自所屬 it() 描述字串與行號。三組行為均真實存在、各有獨立 it() 覆蓋,draft:107「行為級 凍結」PASS 判定不變(出貨徽章正文未提及「RK6 case」、內容準確、讀者不受影響);本次 僅修正 tasks.md 驗證軌跡內部之測試歸屬標籤,未觸 draft/code/carve-out。 驗證:git diff 恰 1 行(tasks.md:49,1 add/1 del)、CRLF 73 段/0 bare LF 不變、 git diff --cached --check 無 trailing whitespace、npx openspec validate doc-first-canon-v2 --strict 綠。純 docs 改動、未觸任何 runtime code。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * fix: 更正 tasks.md 4.11 CRLF 計數誤植 762→761(append-only gap-fix) task 4.11(item 15)PASS 敘事誤植「CRLF 行結尾全檔保留(762 段)」,正確值=761: draft `AI-BIM 前後端設計文件.v2-draft.dc.html` 經 fs 位元組層(CRLF 位元組對=761、 0 bare LF)與 git blob 層(LF-normalized 761 行)雙法核驗,於 0485a22^/0485a22/ a44b892/eaeff4b 四 commit 點皆恆為 761,亦與 task 4.10 基準 761 及本 task「git diff 恰 1 行(1 add/1 del)」淨零行數變動一致。比照本檔既定 append-only gap-fix house style 於 4.11 敘事尾補註記、不重寫原敘事,供 4.12+ 沿用正確基準 761。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#11: README token 修正+§1 補列(item 16) - README draft §3 四條鐵律 R1 子句:「沿用 EdgeConsole 與 --ec-* token 單一真相源」 改為「沿用 EdgeConsole 入口殼;design token 單一真相源=docs/plans/ai-bim-governance.css (--ab-*,production 真實 import);--ec-* token 已退役(.ec-* class 命名空間保留於 legacy-console.css)」,對齊 PR #357/#358 落地現況。 - README draft §1 檔案清單於 Console Hi-Fi 與 support.js 之間補一列 ai-bim-governance.css: design token 權威(--ab-*),上游 production 投影+EdgeConsole.tsx 真實 import 雙重身分, 手寫正本面、變更控制見 design-canon-change-control。 - tasks.md 4.12 打勾並附現況真實性查證(EdgeConsole.tsx:10 真實 import、 ec-token-retirement.test.ts 回歸護欄、legacy-console.css .ec-* 保留註解)、 carve-out 五項全 PASS、openspec validate --strict 綠。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#11: fix 更正 4.12 驗證敘事「worktree 為 doc-only 不帶該目錄」失真(append-only gap-fix) quality important 發現:tasks.md:50(task 4.12 PASS 敘事)之「現況真實性查證(對主工作區 web-viewer-sample/src/console/ 實碼,本 worktree 為 doc-only 不帶該目錄)」為不實查證方法陳述。 實測本 worktree(.worktrees/doc-first-canon-v2)即完整追蹤 web-viewer-sample/src/console (git ls-files 119 檔、實體在磁碟、非 sparse);merge-base HEAD main=main tip 0d24fb6、 自 merge-base 起零 commit 觸及 web-viewer-sample、四引用檔對 main git diff 皆空(與主工作區 逐位元組相同)——查證原可於本 worktree 內就地完成,毋須切往主工作區。 比照同 task 鏈 eaeff4b/db7f32c 之 append-only gap-fix 慣例,於 4.12 敘事末補正註記: retract 該不實敘述、記錄實測基準、確立「本 worktree 本身即含該追蹤目錄可就地核驗」。 所援引具體事實(EdgeConsole.tsx:10 import/legacy-console.css 退役/data.ts:6 之 7 值 Prov) 經本 worktree 內獨立複查全部屬實,README §1/§3 draft 改寫之 PASS 判定不變。 驗證:git diff --cached 僅 tasks.md(1 insertion/1 deletion)、git diff --cached --check 乾淨、 npx openspec validate doc-first-canon-v2 --strict 綠。純 docs/plan 無 code 改動。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WixYKeCVPNH9pVoxXgaiKB * task#12: 更正 draft §03 i18n 落點描述(item 17,tasks.md 4.13) draft c3-badge-i18n 原句「字典置 console/i18n.ts」與實碼不符—— console/i18n.ts 只提供 runtime(getLang/setLang/t/useLang),自身註解明言 「不維護中央字典 key」;真正的中央字典(Dict interface + getL())落在 console/unified/fixtures.ts。改寫為兩檔並列描述,並註明搬遷至獨立字典 檔屬 backlog、非本 change 範圍。tasks.md 4.13 打勾並附驗證軌跡。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#13: draft §07 補 CH-H semantic viewer 家族 + CH-I 內嵌 viewport 新期,翻轉 §03 handoff badge - draft §07 c7-ch-schedule-table 於 CH-G 後新增 CH-H(semantic viewer 家族 H1/H2/H3,code 已出貨於 viewer/viewer.css、Window.tsx,既有 e2e:gov-viewer-layout.spec/element-semantics.spec,已落地色) 與 CH-I(Workspace 內嵌 viewport,理想元件樹 RemoteVideo 升格應建;EmbeddedViewer iframe 方案+lease 掛載+signaling 消毒等價防護+spectator 政策,follow-up embedded-viewport,planned 色) 兩列。 - draft §03 c3-badge-workspace-handoff 由「Console 不長 WebRTC」舊句翻為【目標】內嵌 viewport 併存 /ui/open 凍結面/【現況】unified Workspace 為靜態示意、內嵌=CH-I,對映 spec delta R-B6。 - tasks.md 4.14 打勾,附驗證軌跡(CH-H1/H2/H3 標籤與既有 e2e 具名查證、carve-out 五項 PASS、 div/span 平衡、CRLF 保留、openspec validate --strict 綠)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#14: §03 補雙軌現況誠實入文徽章(item 19) 新增 c3-badge-dual-track 徽章:unified 殼(#home/#a1..#a10/#pipeline/#runtime) 為 Hi-Fi 像素級移植 fixture(data-prov=fixture,不打 /api);真實整合頁活在 legacy 深連結 #a1-workbench(A1)/#semantic-search(A4)等,legacy nav 無條目 指向此二頁。issues 權威入口裁決:【目標】unified #a1?dock=issues,legacy #issues(現況仍有 nav 條目)列雙軌退役清單。收斂沿用既有具名 follow-up unified-docks-real-api。tasks.md 4.15 打勾並附驗證軌跡。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#15: draft §04 metadata-only HARD RULE 補 allowlist follow-up 具名(item 20,tasks.md 4.16) conversion_result_callback 卡 HARD RULE(METADATA-ONLY)句後新增一行補註: 現行防護=blocklist(FORBIDDEN_KEYS+USDC magic/長度啟發),可被非黑名單 key 繞過;強化為 allowlist=follow-up metadata-allowlist(planned);鐵律語意不變。 現行防護機制描述經實碼查證(bim-review-coordinator/src/services/ callbackOutbox.ts:53-85):FORBIDDEN_KEYS blocklist(usdc/usdc_body 等 6 鍵)+字串值 USDC_MAGIC 前綴(PXR-USDC/PK)+長度>4096 啟發式偵測,非黑名單 外 key 或未達長度門檻可繞過。follow-up 具名沿用 design.md §6 crosswalk 既有列(metadata-allowlist|—(本 change 新提)|item 20),非新配。 HARD RULE 原句逐字未動(diff 僅新增一行);tasks.md 4.16 打勾並附證據 (div/span 標籤配對全檔平衡 291/291·591/591、CRLF 全檔保留、 carve-out-assertions.md §3 合併執行五項全 PASS、openspec validate --strict 綠)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#16: Hi-Fi A4 LIVE 分界改寫為 hybrid(item 21,tasks.md 4.17) - 應用啟動器 caption「A1–A4 live · A5–A10 Concept Preview」→「A1–A3 live · A4 hybrid · A5–A10 Concept Preview」 - A4 workbench dock 標頭 badge 與 apps 資料陣列(同步驅動側欄 navApps/home appCards 兩處渲染)徽章文字「LIVE」→「HYBRID」;tone/互動邏輯(showConcept filter)與樣式結構(badgeTone 配色)逐字未動,只換文字 - concept_note 雙語(zh/en)同步改寫,不再籠統宣稱 A1–A4 皆 live - hybrid 事實依據 R-B5(spec.md:100,A4 mock 邊界劃在 LLM 解讀層)與同批 item 12(task 4.8)已於另一正本確立之 hybrid 框架,不另立新事實 - tasks.md 4.17 勾選並附 PASS 證據(grep/div-span 平衡/CRLF/git diff hunk 數/openspec validate) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#0: §03 merge-assembly 驗證(tasks.md 5.1) 新增 assembly-verification.md,以 git diff --no-index -U0 對兩份 .dc.html 取 §03(sec3)全部 8 個 hunk 逐一對號:hunk1→item1、hunk2/3→純植錨(task#0 bootstrap 3ed51f5,內文未動)、hunk4b/4c/4d→item3/17/19、hunk5/6/8→item24、 hunk7→item8;item13 hunk 落 §04 範圍已排除。hunk4a(workspace-handoff badge) 對號於 item18(§07 CH-H/CH-I 主任務之 §03 side-effect)——非原列六項但有 design.md 三處既存佐證(裁決3/24x11矩陣/follow-up表「§03 註記」)+task 4.14 R-B6 記錄+回改會與 §07 CH-I 矛盾之反向驗證,判定對號不回改。窮盡性以行數 增量總和(+4)精確等於 §03 淨增行數(+4)數學自證。 §03 全文連貫性複核(含 Plan 指定之 Task9 c3-naming-check vs Task14 c3-badge-dual-track 比對):二者主題正交(命名精確性 vs 功能雙軌並存),為 伏筆與展開關係,不重複不衝突,不合併。未發現矛盾,draft 本檔零修改。 tasks.md 5.1 打勾並附 PASS 證據摘要。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * task#0: fix §03 驗證報告 hunk 總數 62→69 assembly-verification.md:26 與 tasks.md:59(5.1 PASS 證據)原稱 `git diff --no-index -U0` 全檔共 62 hunk。實測(本 worktree HEAD=task#0 commit 4653803、draft 已凍結於祖先 commit 1e5daea)連續三次重跑 grep -c '^@@' 皆為 69,62 係誤計,非 point-in-time 漂移。改為實測值 69。 §03 範圍內 8 個 hunk(old 154–215)、+4 淨增行數(2+0+0+1+0+0+0+1)之 窮盡性數學自證均逐一重算確認正確、不受影響;此總數僅為章節框定背景, 核心結論(§03 全部異動已窮盡對號、零…
…414) 以 git/code 證據為準的 forensic 調和:#357/#358 已落地項補勾(§2 七項、§3 五項等), 修正四處 task 文字事實錯誤(217 token 數字、IntentDialog.css 不存在、3.1/7.4 拆分、 5.3 排除歷史 artifact);9 項未完成維持不勾。分支已 push origin 保全,worktree 已棄置。 Claude-Session: https://claude.ai/code/session_01Bi4ujiFajBbd4nRhayJFxe Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
PR #507 上 9 條 P2 review threads 逐條以現行原始碼獨立查證,全部成立, 逐條改判並重算總覽表使其與 66 個 Scenario 標題機械一致。 Part 1 `edge-console-operator-frontend`(4 條 HOLDS → STALE): - R1 兩段式導覽:EdgeConsole.tsx:86,100 usePageHash() 無 hash 回 "home", 324-326/203 先命中 renderUnified 的 UnifiedShell,LegacyEdgeConsole 不掛載, NAV_GROUPS(370-385) 只在 legacy 深連結渲染。 - R5 缺 mediaPort:App.tsx:74 mediaport: number、100/129 初始 0、360/374 直接餵 AppStreamProps;spec 只描述 undefined 一種哨兵(AppStream.tsx:311-315 自承兩種)。 - R7 預設與 viewer 一致:coordinatorBase.ts:6-9 於 /ui 非 dev port 回 origin, config/env.ts:71-73 恆為 127.0.0.1:8004;coordinator-web-plane.Dockerfile:14 的 build:ui 未帶任何 VITE_COORDINATOR_* build arg,same-origin 是唯一部署分支。 - R13 GPU/首幀未取得:#runtime 現由 EdgeConsole.tsx:205 掛 fixture-only OpsPage, 68-70/93 畫出 82%/24%/14.6GB/first-frame 1840ms 而非「未取得」。 Part 2 `unified-governance-console`(3 條 → STALE、2 條 → UNVERIFIABLE): - R12 mock viewport:MockViewport.tsx:196 未傳選取 callback 給 StructureStats, 202-210 無 highlight echo/camera 欄位;原引用的 unified dock 測試零命中 MockViewport。 - R17 product console:UnifiedShell.tsx:199-209 無 Chat USD Agent side panel。 - R18 Operator opens A1:#a1 由 UNIFIED_WS_KEYS 掛 fixture WorkspacePage/A1Dock, unified/ 全目錄無 Excel;真正的 Excel 在 #issues 的 pages.tsx:1071-1072。 - R9 真實 IFC 切片:HOLDS-WITH-NOTE → UNVERIFIABLE(原 note 內容即 UNVERIFIABLE 定義)。 - R14 模型↔問題分頁:原證據僅一個 prop + 一個 CSS class;spec 要求 browser E2E, 而 package.json:25 verify 不含 test:e2e,issues-tab.spec.ts:17 亦為條件 skip。 總覽重算(機械計數,與 66 個標題逐一相符): - edge-console-operator-frontend 30 = 25 HOLDS / 1 HWN / 4 STALE / 0 UNVERIFIABLE - unified-governance-console 36 = 26 HOLDS / 2 HWN / 3 STALE / 5 UNVERIFIABLE - 合計 66 = 51 / 3 / 7 / 5(原表 57/5/0/4 與原結論 58/5/0/3 互不相符,一併修正) 新增「STALE 項清單」一節;UNVERIFIABLE 清單補齊為 5 條並移除原本自相矛盾的 「第三項見總覽表」註記。ledger current_slice 與 tasks.md 7.4 同步新數字。 7 項 STALE 皆為早於本次遷移的 spec 落後(#357/#358/#429 僅動 CSS token/主題移除/ golden baseline),非本次遷移造成。 驗證:node --test scripts/tests/test-openspec-machine-truth.mjs 24/0; scripts/tests/test-ai-coding-metrics.mjs 13/0。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…it (7.4) (#507) * chore(openspec): tick hifi-design 7.3, audit 7.4 consumer spec scenarios 7.3: npm install (worktree lacked node_modules) then npm run verify — typecheck + build + vitest (78 files/1069 tests) + test:struct-log (23/23) all green, exit 0. package-lock.json's npm-11-induced "peer": true annotations reverted (no real dependency change, local npm 11.6.2 vs manifest-pinned 10.9.4 lockfile normalization noise). 7.4: walked every Scenario block in edge-console-operator-frontend (30) and unified-governance-console (36) against current source, recorded verdicts with file:line evidence in artifacts/2026-08-12-hifi-consumer-spec-scenario-audit.md. 58 HOLDS, 5 HOLDS-WITH-NOTE, 0 STALE, 3 UNVERIFIABLE (browser E2E scenarios that need a live deploy stack/GPU to execute end-to-end; none touched by this migration's actual diff). Left unticked per design.md's Risk clause since not every scenario is HOLDS. 7.1: ran the golden rebaseline command; it was NOT a no-op. The generic capture script has no special-case handling for the single screen (workspace.a4.default) whose baseline_provenance marks it canonical_product_surface (must be captured via the product e2e spec, not the origin mockup site per PR #429). Running --rebaseline silently reverted that baseline back to its pre-#429 mockup-origin state, undoing an explicitly human-approved fix. Reverted the diff via git checkout before this commit (never committed the regressed golden); verify-design-system-reference.ps1 -VerifyOrigin still passes afterwards. Left unticked and flagged the capture script gap for a follow-up fix, out of scope here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(openspec): reconcile hifi-design ledger row for 7.3 tick + 7.4 audit task_ledger 31->32, subject_commit rebound to the tasks.md tick commit (af60c29), current_slice refreshed with the 7.1 STOP finding, 7.3 pass evidence, and 7.4 audit summary (66 scenarios, 58 HOLDS/5 HOLDS-WITH-NOTE/0 STALE/3 UNVERIFIABLE). Local gates: test-openspec-machine-truth 24/0, test-ai-coding-metrics 13/0, test-agent-governance-check 45/0, openspec validate --strict PASS. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(openspec): reclassify R10 binding scenario to UNVERIFIABLE per review Review P2 on #507 proved the R10 spectator/primary binding scenario was marked HOLDS on two-layer evidence (frontend disabledReason + coordinator 403 gate) while the Requirement demands three-layer depth: the repo's own evidence records the binding revision as client-generated (browser- evidence-summary.json) and the host-native Kit DataChannel mutator path as unobserved (frontend-redesign-implementation-notes.md section 11). Verdict corrected to UNVERIFIABLE with citations; tallies 58/5/0/3 -> 57/5/0/4; ledger current_slice synced. machine-truth 24/0, metrics green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(openspec): reclassify nine audit verdicts per PR #507 review PR #507 上 9 條 P2 review threads 逐條以現行原始碼獨立查證,全部成立, 逐條改判並重算總覽表使其與 66 個 Scenario 標題機械一致。 Part 1 `edge-console-operator-frontend`(4 條 HOLDS → STALE): - R1 兩段式導覽:EdgeConsole.tsx:86,100 usePageHash() 無 hash 回 "home", 324-326/203 先命中 renderUnified 的 UnifiedShell,LegacyEdgeConsole 不掛載, NAV_GROUPS(370-385) 只在 legacy 深連結渲染。 - R5 缺 mediaPort:App.tsx:74 mediaport: number、100/129 初始 0、360/374 直接餵 AppStreamProps;spec 只描述 undefined 一種哨兵(AppStream.tsx:311-315 自承兩種)。 - R7 預設與 viewer 一致:coordinatorBase.ts:6-9 於 /ui 非 dev port 回 origin, config/env.ts:71-73 恆為 127.0.0.1:8004;coordinator-web-plane.Dockerfile:14 的 build:ui 未帶任何 VITE_COORDINATOR_* build arg,same-origin 是唯一部署分支。 - R13 GPU/首幀未取得:#runtime 現由 EdgeConsole.tsx:205 掛 fixture-only OpsPage, 68-70/93 畫出 82%/24%/14.6GB/first-frame 1840ms 而非「未取得」。 Part 2 `unified-governance-console`(3 條 → STALE、2 條 → UNVERIFIABLE): - R12 mock viewport:MockViewport.tsx:196 未傳選取 callback 給 StructureStats, 202-210 無 highlight echo/camera 欄位;原引用的 unified dock 測試零命中 MockViewport。 - R17 product console:UnifiedShell.tsx:199-209 無 Chat USD Agent side panel。 - R18 Operator opens A1:#a1 由 UNIFIED_WS_KEYS 掛 fixture WorkspacePage/A1Dock, unified/ 全目錄無 Excel;真正的 Excel 在 #issues 的 pages.tsx:1071-1072。 - R9 真實 IFC 切片:HOLDS-WITH-NOTE → UNVERIFIABLE(原 note 內容即 UNVERIFIABLE 定義)。 - R14 模型↔問題分頁:原證據僅一個 prop + 一個 CSS class;spec 要求 browser E2E, 而 package.json:25 verify 不含 test:e2e,issues-tab.spec.ts:17 亦為條件 skip。 總覽重算(機械計數,與 66 個標題逐一相符): - edge-console-operator-frontend 30 = 25 HOLDS / 1 HWN / 4 STALE / 0 UNVERIFIABLE - unified-governance-console 36 = 26 HOLDS / 2 HWN / 3 STALE / 5 UNVERIFIABLE - 合計 66 = 51 / 3 / 7 / 5(原表 57/5/0/4 與原結論 58/5/0/3 互不相符,一併修正) 新增「STALE 項清單」一節;UNVERIFIABLE 清單補齊為 5 條並移除原本自相矛盾的 「第三項見總覽表」註記。ledger current_slice 與 tasks.md 7.4 同步新數字。 7 項 STALE 皆為早於本次遷移的 spec 落後(#357/#358/#429 僅動 CSS token/主題移除/ golden baseline),非本次遷移造成。 驗證:node --test scripts/tests/test-openspec-machine-truth.mjs 24/0; scripts/tests/test-ai-coding-metrics.mjs 13/0。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(openspec): reclassify three more audit verdicts, refute the overlay claim PR #507 第二輪 4 條 P2 review threads 逐條以現行原始碼獨立查證:3 條成立改判, 1 條查證後不成立、附逐字反駁並維持 HOLDS。總覽表重算至與 66 個標題機械一致。 改判(3 條): - Part 1 R3「A2/A3 為 as-built 操作頁」HOLDS → STALE:EdgeConsole.tsx:175 UNIFIED_WS_KEYS=["a1","a2","a3"] 把 #a2/#a3 一併攔去 fixture WorkspacePage; docks.tsx A2Dock 標 data-prov="fixture",畫捏造 diff 數字(added 12/removed 4) 與假成功 apply-overlay ✓(真後端誠實回 501)。真正的 VersionDiffPage/ FederationPage 只在 #version-diff/#federation(EdgeConsole.tsx:236-237)。 - Part 2 R3「在 3D 標紅」HOLDS → STALE:production Kit stage_management.py:396-458 _on_highlight_prims docstring 自承 "First MVP uses USD selection as the visual fallback",426-442 只讀 prim_path、444-450 只呼叫 set_selected_prim_paths、410/454 寫死 applied_mode:"selection",grep -n "color" 全檔零命中。client 端 highlightBridge.ts:59,90 有送 color,其 70-71 註解亦自承 Kit 不讀。 三條 THEN/AND 仍成立,不成立的是標題的「標紅」。 - Part 2 R11「全幅 6 分區版面」HOLDS → UNVERIFIABLE:原證據為元件存在+單元 測試數,證不到整合版面/可操作/spectator;Scenario 逐字要求 gov-viewer-layout browser E2E 截圖,該 spec 存在(4 個 ?harness=1 測試)但 verify 不含 test:e2e。 反駁(1 條,維持 HOLDS): - Part 2 R1「A1–A10 治理以 overlay 疊在 primary viewer」:review 主張 MVP_ENGINES 只有 M4/A1/A4、ROADMAP_ENGINES 只有 A3 與兩個 code "—", 故 A2 與 A5–A10 缺席。code 標籤讀法無誤,但該推論混用兩套刻意不同的編號: spec line 76 明文本 capability spec 採「新治理工作流編號」(A2 轉檔語意/ A5 碰撞/A6 圖模/A8 Issue·BCF/A10 報表稽核…),與 roadmap-data.jsx RM_APPS 刻意不同;而 GovernanceOverlay.tsx:163 的 Panel sub 自述 code 取自 「權威:data.ts A1A10」即舊那套。以 spec 自身詞彙回推,被指缺席者多在列: A2=mapping(79,asbuilt)、A5=clash(94,p1 誠實 disabled)、A6=dwg(95,p4)、 A8=issues(82,asbuilt+272 可操作面板)、A10=audit(96,p4)。且 MVP_ENGINES/ ROADMAP_ENGINES 是「已接能力」(163)/「願景待建」(312) 兩塊清單面板,非治理 操作面;本 Scenario 兩條 THEN/AND 只斷言「疊在同一 primary viewer、非獨立殼」, 無模組完整性要求(該義務在 R2 Scenario)。 原證據(檔頭註解+測試數)確實過弱,已換成結構證據:Window.tsx:65 import、 5775 於持有 WebRTC <video> 的 Window render tree 內掛載 GovernanceOverlay, 並接上 onHighlight/_overlayHighlight、onClearHighlight/_sendStreamMessage、 onRunRuleCheck、onCreateIssues、onApplyBinding 等真實 handler。 總覽重算(機械計數,與 66 個標題逐一相符): - edge-console-operator-frontend 30 = 24 HOLDS / 1 HWN / 5 STALE / 0 UNVERIFIABLE - unified-governance-console 36 = 24 HOLDS / 2 HWN / 4 STALE / 6 UNVERIFIABLE - 合計 66 = 48 / 3 / 9 / 6(前一輪 51/3/7/5) STALE 清單擴為 9 條、UNVERIFIABLE 清單擴為 6 條,兩處「這 N 項的共同特徵」同步; STALE 共同特徵新增誠實區分:9 項中 8 項為 spec 措辭落後於程式碼,僅 R3 標紅為 真正能力缺口(Kit 端從未實作顏色),不能只改文字。ledger current_slice(486 字元) 與 tasks.md 7.4 同步。 驗證:node --test scripts/tests/test-openspec-machine-truth.mjs 24/0; scripts/tests/test-ai-coding-metrics.mjs 13/0。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
migrate-console-to-hifi-design(2/2):manifest rebaseline(design token authority 欄位翻轉 + golden baseline 重新鎖定)
對應 OpenSpec change
migrate-console-to-hifi-design(openspec/changes/migrate-console-to-hifi-design/)。這是拆分成兩個 PR 的第二個,接續已合併的 PR #357(product code,898930f)。比照本 repo 既有先例 PR #349(只動 manifest + gate infra)與 PR #350(只動產品碼)的拆分方式。Change Classification
docs/superpowers/specs/2026-07-16-migrate-console-to-hifi-design-design.md(對應 OpenSpec changemigrate-console-to-hifi-design)AI Coding Governance
migrate-console-to-hifi-design;PR #357(product code,已合併)docs/superpowers/specs/2026-07-16-migrate-console-to-hifi-design-design.md驗證結果
docs/plans/design-system-reference.manifest.json本次唯一改動:token_projection.production_projection:web-viewer-sample/src/console/edge-console.css(PR feat(console): UnifiedConsole 遷移至 Hi-Fi design token(1/2 product code) #357 已 retire)→docs/plans/ai-bim-governance.csssource.files內AI-BIM 前後端設計文件.dc.html的 hash/bytes(反映 PR feat(console): UnifiedConsole 遷移至 Hi-Fi design token(1/2 product code) #357 §08 文件同步後的最新內容)source.snapshot_sha256/source.captured_at_utc:重新擷取的時間戳與快照雜湊26 個 golden baseline PNG 位元恆等(
git status只顯示 manifest.json 一個檔案變動)——因為本次遷移涉及的 13 screens 皆為 UnifiedConsole 頁面,PR #357 對其只做「值恆等」的inline hex → var(--ab-*)置換,渲染像素輸出未改變,故 rebaseline 結果與原基準位元相同,非遺漏 rebaseline。Get-DesignSystemChangeScope(真實 diff):status=gate_infrastructure_only,frontend_product=false——純 manifest/gate 範疇,不觸碰任何 product 檔案,Frontend Verification 表不適用。Deploy Path Verification
不適用——本 PR 僅動
docs/plans/design-system-reference.manifest.json一個 metadata 檔案。Co-Authored-By: Claude Fable 5 noreply@anthropic.com