# FR-132 LOG（append-only）

## 2026-10-06 第 1 棒（首腦）

**commits**：BE `36393a257`（討論稿定案＋design.md 落地＋README 登記）、`6dc9b5a8f`（開 Notion 卡＋design.md 回填卡號）；本交接雙檔另一 commit。皆未 push。
**Notion**：母卡 CM-2510＋子卡 CM-2511～2541（A.1 2511–2516／A.2 2517–2522／A.3 2523–2530／A.4 2531–2535／A.5 2536–2541），全 Not started；CM-2517、CM-2534 append 首腦補裁。T-1.1（CM-2511）決策者當日已派 runner。

**做了**
- FR-132 資料夾：discussion.md（722 行）、design.md（447 行）、README.md、inventory 三份探脈、notion-cards-spec.json、notion-cards.json。
- DEV 修資料：role 38「Billows 系統管理員」補 43 個能力點至 103（與 Billows Admin 一致），一個 transaction，只動 DEV。
- 三環境唯讀盤點：STG is_admin 角色 121／能力點 101（落後兩個）；190 為 123／103 乾淨但 user_roles 82 筆全掛部門；DEV 39 筆部門指派。
- A.1 五棒派工 prompt 交給決策者（CM-2511～2515）。

**決策**
- D1–D12 全照建議。D4 涵蓋子部門；D6 系統管理員 `*.*.*` 內建不可刪、三範例角色可改刪；D12 做機制＋租戶開關預設關。理由：多數客戶的部門只是組織標記，預設關升級無感。
- 部門繼承採方式乙（範圍套在資料列 org_unit_id，使用者所屬部門不參與）。理由：方式甲會讓隸屬稽核部、被指派管財務部專案的人用不到那筆指派，且管理員無法從指派畫面推出結果。
- `require_capability_on` 單筆寫入守門要做、直接擋；只記錄模式改為每能力點旗標；T-2.1 改名連程式內宣告一起改。
- is_admin 轉換：能力點等於租戶全集者轉 `*.*.*`，同租戶多個取最早建，其餘保留旗標、能力點原樣轉。
- 首腦不切 branch：A.2 起由決策者開 branch 後通知；A.1 唯讀不等 branch。FR-B 另開，時間待決策者與 PM 討論。

**推翻了什麼**
- 部門繼承原寫方式甲（使用者所屬部門與指派部門互比）→ 改方式乙。
- 原估「19 支 service 硬編能力點」→ 實為約 70 處。
- 原估兩套能力點命名寫法 → 實為三套。
- 原計畫升級時自動補租戶層指派 → 方式乙下開關關即等同整租戶，不需要。

**教訓**
- 開卡棒中途 Notion API 500 中斷一次；重派前先查 Notion 有沒有建了一半的卡，避免 Case No 重複或跳號。

**留給下一棒**：等 A.1 五棒回來，首腦做 T-1.6 合併並裁四項模組歸屬爭議。

## 2026-10-06 第 2 棒（首腦，A.1 驗收與裁決）

**commits**：`3190788c5`（T-1.1 Done、CM-2513 補裁、開 T-4.6）、`d8d3f0579`（T-1.5 定案）、`5f8b92a15`（T-1.4 定案）、`ad1f3bd9c`（T-1.2／1.3 定案、三通則、12 模組）、`32c0ee9ed`（修模組表四列）、本交接一 commit。runner 側：`7bc95380f`／`9ef0079f9`（T-1.1）、`ebef8fa9c`（T-1.5）、`27cf23dae`（T-1.4）、`1f0b6e221`（T-1.2）、`bda34a909`（T-1.3）。T-1.1 兩支已 push，其餘未 push。
**Notion**：CM-2511～2515 Done；新開 CM-2542 T-4.6；CM-2513 補裁 device 歸 asset。

**做了**
- 驗收五份盤點（每份開檔對程式碼抽查 4-6 處守門宣稱＋DEV 能力點數），全部通過。
- 決策者逐條裁 46 項（grc 10、platform 8、system-iam 8、detection 12、oscal 10，部分批次）。
- 立三條情境通則；模組 9→12。

**決策**
- 模組 12 個（grc、oscal、flow、detection、evidence、survey、system、iam、platform、asset、ai、workspace），表在 design §6.1；三條情境通則 A／B／C，原廠層兩道都過。
- information-system→asset；storage-config→system 且五門拆開；ai-quota 拆兩個；ai 獨立；公告與回饋→workspace；license 原廠端→platform.license。
- 填答、檢測執行、任務問卷設定、專案雲端資料夾歸 grc.job／grc.project，不開 survey.response（決策者質疑後首腦修正，理由通則 A）。
- flow 維持獨立並開 flow.template.publish（首腦推翻 runner「併 grc」建議，理由 `grc.*.*` 萬用字元會順帶拿到範本設計權）。
- 部門資源名採 `iam.org-unit`（決策者推翻首腦建議，理由「以前改版過、跟程式統一才不亂」）。
- workflow.* 刪除；grc.audit 不拆；project.approve 名字移給 grc.audit.approve；jedi-* 套件該動就動；拆 jedi-remote-agent 守門插槽為讀寫兩個。

**教訓**
- 回寫棒會把定案寫反（公告歸 platform），首腦驗收必開檔對定案源、不信自報。
- 批次裁決前先把低爭議 11 條挑出整批過、取捨的逐條，決策者接受度高。
- 決策者看不懂 API 路徑，T-1.6 產出要以功能（畫面／按鈕）為主軸。
- 「套件」一詞對決策者有歧義（jedi-* BE 程式庫 vs Agent 安裝包），講時要指明。
- Notion 改狀態常撞 504，重試後讀回確認即可。

**推翻了什麼**
- design 草案「platform＝16 個原廠能力點集中地」前提不成立（實查 16 個散在 oscal／system，platform 範圍只有 log.read）。
- T-1.1「process-definition 是舊入口可退役」→ T-1.2 查明被四支活頁面用、必須保留。
- 卡上 feedback.export、cloud_integration.update「孤兒」→ 都有 route 守；system_config.*「純孤兒」→ 是 GROUP 分流 fallback。

**留給下一棒**：T-1.6（CM-2516）。

## 2026-10-06 第 3 棒（首腦，T-1.6 合併定稿）

**commits**：`16ed89083`（決策者 session 產出三檔：a1-capability-tree／a1-shipped-roles.json／a1-d12-tables）、本棒一 commit（裁示寫入三檔＋design D6／D12＋STATE／LOG）。未 push。
**Notion**：CM-2516 修正待驗證。

**做了**
- 派兩支 opus：B 棒（角色 JSON＋D12 表）完成並驗收；A 棒（能力點樹）撞閘道 500 兩次中斷，決策者改自己開 session 做完。
- 驗收：附錄 B 對 DEV 123 列逐列比對無缺無多；41 個畫面涵蓋 ui_routes 49 條；B 棒四條關鍵斷言（tenant 指派 140/141 帶部門值、job_executions 只看 tenant、26 個跨部門資源庫引用、feedback export 不濾 owner）全部實查屬實。
- 首腦裁 10 條（見 STATE「已定裁示」最後三點）；決策者裁 3 條。

**決策**
- **D12 本版不做，全放**（決策者）：理由「目前版本什麼都沒擋」，維持現狀；跨部門成員放行與 SSP 軟參照名稱問題隨之延後。T-3.6／T-5.6 整卡延後，T-2.3／T-3.8／T-4.4 拿掉隔離段。
- 補第五個範例角色「一般成員」（決策者）：受稽方人員沒有合適角色可套，今天範本靠 `project.update` 做任務動作，新模型改由 `grc.job.update` 承接。
- 稽核員 job 不給 create／delete、audit 加 create；可改角色不給 `feedback.export`；三支挑選下拉走通則 B；taxonomy 寫入不新開資源。

**教訓**
- subagent 跑長文件（讀 2,400 行＋查 DB＋寫 1,400 行）撞閘道 500 兩次，續跑一次後決策者改自己開 session 跑完。長產出類工作派 subagent 前先評估「中斷重跑成本」，要嘛拆小、要嘛直接開 session。
- B 棒查 DB 查出的事實（140/141 租戶指派帶部門值）推翻了 design 6.3「租戶指派為空」的措辭——文件措辭要以 DB 實況為準，下一版開 D12 時先改。

**推翻了什麼**
- design D6「唯讀＝`*.*.read`」→ 改列舉業務模組 read（`*.*.read` 會露出 SMTP／LDAP 設定頁與全部帳號）。
- design D12「做機制＋開關預設關」→ 本版不做。
- 首腦派工單「四角色」→ 五角色。

**留給下一棒**：決策者核功能表；發令後改五張卡與 design §7；A.2 等 branch。

## 2026-10-06 深夜 第 3 棒續（首腦，A.2 收口、A.3／A.4 開跑）

**commits（首腦側）**：`5776cdf09`（T-2.3 補登 manifest）、`806cab92c`／`29558ac87`（STATE 記 A.5 重設計）、`8a2777491`（無基線庫新裝另開 FR）、本棒 STATE/LOG 一 commit。
**runner 側**：T-2.1 BE `5aac0e37c`＋jedi `5c6d2f0c`＋FE `113646d3`；T-2.2 `23c87b602`＋`7039e820`；T-2.3 `1161e0280`；T-2.5 `d863799ff`；T-3.1 `a20837d6d`＋`3d78746b`＋FE `031795f3`；T-4.1 `3efa9a998`＋`2a70e12cf`＋`44f9836c`；T-2.4 `bd0979055`＋`f19ab9f9`；T-3.3 `fe9cc2ab6`＋`006a635c`。皆未 push。pyproject.toml 是 16 支套件 path dependency 模式未 commit。
**Notion**：CM-2517～2521、2523、2525、2531 修正待驗證；CM-2526／2527／2532／2533 派出跑中。

**做了**
- 驗收八張（每張：DB SELECT、跑測試、實打 admin／blsit 端點）。T-2.3 漏登 manifest 自己補。T-4.1 全量 pytest 兩支紅＝caplog 污染，退回 runner 改 patch 模組 logger 後綠。
- 全量 `pytest test` 用 `518931af9` worktree 跑基線比對：開工前就 61 紅，三棒只新增 5（3 條是 seed 未重產、2 條 T-4.1 已修）。
- A.5 mockup 兩版（opus subagent）皆退回。

**決策**
- 新租戶管理員角色名 System Manager→系統管理員（T-2.4 runner 定、首腦認可）；test repo 兩處要跟改。
- `TENANT_ADMIN_EXCLUDED_RESOURCE_TYPES` 清空（T-3.3 查清五個舊鍵對應能力點全不存在）。
- 出貨角色 JSON 放 `resources/roles/shipped-roles.json` 不放 `scripts/init/`（打包不帶 scripts）。
- T-3.5 本版 `require_capability_on` 開關固定 False（D12 延後），邏輯與測試全寫。
- 派工分兩批各四張、不一棒多張：同時八張會在 jedi-iam 同區互踩；一棒多張 context 重且撞 500 整棒報廢。

**教訓**
- subagent 跑長產出撞閘道 500 兩次；mockup 類視覺產出 subagent 兩版都不中決策者口味——下次先要決策者給基準截圖再做。
- 「非 root `*.*.*`＝188」是首腦憑記憶估的，runner 實查 164；補裁寫數字要先 SELECT。
- 全量 pytest 基線本來就紅 61 條，驗收必用 worktree diff 不看絕對數。

**推翻了什麼**
- T-2.5 原卡範圍大半被 T-2.1 順手做掉→縮成三件。
- T-3.3 原估殘留舊名 BE 116 處→實掃 0（T-2.1 已全換）。
- 首腦補裁「T-2.4 先用臨時展開」→runner 直接用 T-3.1 正式函式，T-3.3 不必回頭換。

**留給下一棒**：驗第一批四張；A.5 設計討論前先要基準截圖。

## 2026-10-06 深夜 第 3 棒補記（首腦）

- T-4.3（`3490700b6`）、T-4.2（`42cb17bc2`）驗收通過：對照附錄 A、AST 守衛測試綠、DB 29 顆 log_only（20＋9）。
- 🔴 **首腦自己踩了夾帶事故**：交接 commit `bd1ad4a10` 時 T-4.2 runner 的 16 個檔已 staged，`git add` 三個 docs 路徑後 commit 把 index 全部帶進去，T-4.2 掛點掛在 docs commit 裡且裝飾器重複兩次；runner 用 `42cb17bc2` 去重補救。未改寫歷史（兩棒並行、未 push，rebase 風險更高）。**教訓**：平行 runner 在跑時，首腦 commit 前必 `git status` 看第一欄，有別人 staged 的檔要 `git commit -- <自己的路徑>` 限定路徑或先 `git restore --staged` 別人的（同 memory `feedback_parallel_runner_git_add_only_own_files`，這次是首腦違規不是 runner）。
- 剩第一批 T-3.4／3.5 跑中。

## 2026-10-07 凌晨 第 4 棒（首腦，第一批驗收、第二批派出、T-4.7 開卡）

**commits**：首腦側 `42e115ba1`（開 T-4.7a/b/c 三張子卡）、本棒 STATE/LOG 一 commit。runner 側（已驗收）：T-3.4 jedi `f741d36b`；T-3.5 jedi `eff7b8e5`＋BE `5e44907de`。皆未 push。
**Notion**：CM-2526（T-3.4）、CM-2527（T-3.5）驗收通過，維持修正待驗證等決策者手測收 Done；第二批 CM-2524／2529／2534／2542 四張各 append 一段「首腦補裁（第 4 棒）」並由決策者凌晨派出；新開 CM-2543（T-4.7a 任務線）、CM-2544（T-4.7b 檢測證據線）、CM-2545（T-4.7c 其他六套件），卡號登入 `notion-cards.json`、規格在 `notion-cards-spec-t47.json`。

**做了**
- 驗收 T-3.4：選單可見性、選單明細、JWT `is_admin` 三處改吃 `get_active_capability_names`／`get_active_roles_brief`；新增 `UserService.is_admin_by_active_roles`；`UiRouteRepoImpl.get_viewable_by_user_uid` 改名 `get_viewable_by_capability_names`（改收能力點名集合）。兩條突變各自紅（claim 改回 `user.roles` 2 紅、明細改回 1 紅），jedi-iam 整包 698 綠；DEV 把 blsadmin／blsit 三筆 `user_roles.ends_at` 改成昨天後重登：blsadmin claim 變 false、兩人選單只剩 3 個無需求路由；改回後 web-menu 與基準逐 byte 相同，資料已還原。BE 無程式碼變更。
- 驗收 T-3.5：`get_active_assignments` 帶回部門 path（org_units outer join）、新檔 `jedi_iam/authz/org_scope.py` 純判定、`require_capability_on`／`viewer_has_capability_on` service 層函式、`org_unit_isolation_enabled()` 固定 False、BE shim re-export＋DI 多注入 `org_unit_domain_service`、守衛測試登記。29 條綠、兩條突變紅（前綴改相等 4 紅、開關開不過濾 6 紅）；BE 守衛測試 114 綠 3 紅（既有 seed 基線）；DEV 真 DI 六組合（開關關 99／98／None 全放行；開 99 放行、98 與 None 擋 `GRC_403022`）與回寫相同；沒掛任何 route。
- 兩棒共用檔 `user_role_repo_impl.py` 沒互蓋：T-3.4 的 is_system 欄與 T-3.5 的 `get_active_assignments` 都在 HEAD。
- 第二批四張補裁：T-3.2 快取掛 `CapabilityExpansionService.expand_roles`，jedi-iam 不加 redis 硬依賴、開可選 port 由宿主注入 `core/extensions.py` 的 redis_client，版本號在 `system_configs`（tenant_id=1、group CAPABILITY_CATALOG、key VERSION），版本號加一靠 migration 慣例＋守衛測試掃 `scripts/sql`；T-3.7 新增 `iam.role.export`／`iam.role.import` 兩顆（enforce、license_module=role）、版本號改 2，匯入走既有角色寫入方法（T-3.2 在那裡掛失效）；T-4.4 縮到主專案六個 route 檔（system_config、ai_quota、diagnostic_bundle、recent_error、drive_app_credential_verify、setup 只登豁免）＋jedi_system_core 5 支 system config route＋豁免清單擴進既有 `test/security/code/test_route_guard_inventory.py`；T-4.6 缺口二只剩授權軸、缺口四 FE 仍在用（`api.js:100`、`WorkflowSetupForm.vue`）、多一支 `GET /oscal-framework-parse-jobs/<uid>`→oscal.framework.read、缺口三拿 is_admin 旁路前先 grep 呼叫端。
- 開 T-4.7 三張：附錄 A 標「無」的套件 route 143 支，扣附錄 C 豁免 108 支，拆成任務線 49（task-platform／compliance-audit／survey）、檢測證據線 36（detection／evidence-classification／remote-agent，remote-agent 4 支全豁免只核對）、其他六套件 21（license-runtime／iam／system-core／bulletin／ai-bot／issue）。各套件 plugin contract 有 `capability_required` 插槽的：survey／detection／system-core／bulletin／issue／iam；要補 port 的：task-platform／compliance-audit／evidence-classification／license-runtime／ai-bot。三張依賴 T-4.4 完成才派。
- 決策者凌晨離座，首腦掛 Monitor 盯四張卡回寫，回寫即驗收。

**決策**
- JWT `is_admin` 口徑維持跨租戶（登入時 tenant_id=None、任一租戶有效管理員指派即真），側欄選單按作用租戶算。理由：這是舊行為非本案新增，真正守門在能力點判定、已按作用租戶，claim 只影響前端入口顯示。記待辦不改，A.5 前端重設計時一起看。
- T-4.7 現在就開卡、不等第二批過。理由：卡號 auto_increment 要連號；開卡不等於派。

**教訓**
- 交接文寫「第一批四張跑中」，實際 Notion 狀態是 T-3.4 In progress、T-3.5 Not started、T-4.2／4.3 已驗收。接手要以 Notion 狀態與 git log 為準，不抄交接文。
- 驗收腳本用 zsh 把 psql 指令放進變數字串，被當成單一指令、UPDATE 根本沒跑，而 probe 結果看起來像「過期沒生效」。手測腳本的 DB 寫入要先確認回了 `UPDATE N` 才看結果。
- `python -I` 會忽略 `.env` 載入的環境變數，`create_app` 會因缺 `DRIVE_TOKEN_ENCRYPTION_KEY` 炸；跑 BE 內 script 要先 source `.env`。

**推翻了什麼**
- 交接文「第一批四張跑中」→ 實為 T-4.2／4.3 已驗收、T-3.4 在跑、T-3.5 還沒開始（上一棒夾帶 commit 的事故也讓 T-4.2 掛點先入了 docs commit）。
- T-4.4 原範圍含全部套件 route → 改成只做主專案六檔＋system_core 五支，其餘 138 支拆去 T-4.7。
- T-3.7 建議 model sonnet → opus（匯入要走既有寫入方法、牽涉 T-3.2 失效，不是機械活）。

**留給下一棒**：驗第二批四張（回寫即驗）；T-4.4 過後派 T-4.7a／b／c；A.5 設計討論前先要基準截圖；等決策者裁基線重產與 T-2.6 dump。

## 2026-10-07 凌晨 第 4 棒續（首腦，第二批驗收、T-3.9／T-4.7 開卡）

**commits（首腦側）**：`42e115ba1`（T-4.7 三卡）、`31f555923`（STATE/LOG）、`31397a22d`（T-3.9 開卡＋STATE）、`879eeb4c0`（STATE 記 T-4.4 驗收通過）。
**runner 側**：T-4.6 BE `131779220`＋jedi `595fdf7f`；T-3.2 BE `62ed50b89`＋jedi `193df352`；T-3.7 BE `2ba80eff6`＋jedi `2aec6fd0`＋FE `7aa2f015`；T-4.4 BE `11cfa8a17`＋jedi `9007cb2b`。皆未 push。
**Notion**：CM-2524／2529／2534 修正待驗證（首腦驗過，各卡末段有「首腦驗收」）；CM-2542 退回 In progress（弄紅 T-4.2 的 `test_fr132_t42_route_capability_mounts.py`，MOUNTS 表沒加 `WorkflowExecutionRoute.get → flow.template.read`，其餘三項通過）；新開 CM-2543～2545（T-4.7a／b／c）、CM-2546（T-3.9）。

**做了**
- 驗收四張（每張：開檔核 diff、跑測試、首腦自選突變、DEV 真 DI／真 Redis／實打端點）。T-3.2 真 Redis 寫入命中清除全對（鍵 `authz:exp:102:2:4`）；T-3.7 實打四情境（零命中 400 列出、同名 409、系統管理員同名另存且內建不動、blsit 403），測試角色已清；T-4.4 blsit 讀 SMTP 設定 200＋log_only、支援頁平台門照擋 403。全量 pytest 與基線比無新增紅。
- 開 T-4.7a／b／c 三卡：附錄 A 標「無」守門的套件 route 143 支，扣附錄 C 豁免 108 支，依套件 plugin contract 有無 `capability_required` 插槽拆三棒。開卡後實查 venv 發現 path 模式只有 16 支，task-platform／evidence-classification／ai-bot／oscal-v2 仍是 Nexus pin，三卡各 append 補正。
- 開 T-3.9：T-3.7 順帶發現、首腦實查屬實——jedi-iam `RoleDomainService.add_role`／`update_role` 只寫舊表 `role_capabilities`，FE 角色表單送能力點 id，T-3.3 之後判定只讀 `role_capability_patterns`，**畫面新建的角色沒權限、改過的角色判定不變且不報錯**。拆分表沒有任何卡負責，A.5 前端開工前必修。

**決策**
- T-4.6 退回不收：守衛測試紅就是沒驗完，不因「不是我弄壞的檔」放過。
- T-4.4「改名兩組也認舊名」收下但記拿掉：DEV 舊名能力點已不存在，多認等於沒放寬。
- T-4.4 `PENDING_GUARD_ROUTES` 用包含斷言是守衛弱點（新裸端點加進去也會過），111 條待 T-4.7／T-4.5 清到 0 後改集合相等。
- T-4.7 三張依賴 T-4.4，現已可派，等決策者令。

**教訓**
- runner 回寫「相關測試全過」要問跑了哪幾支：T-4.6 只跑 T-4.3 的 AST 測試，沒跑 T-4.2 那支，弄紅了沒發現。驗收固定跑 `test/test_fr132_*`＋`test/security/code/` 全部。
- 卡上「套件全部已是 path 模式」是首腦憑 STATE 寫的，開卡後查 `.pth` 才發現只有 16 支——環境斷言開卡前要 `ls .venv/.../*.pth` 實查。
- T-3.7 手測的 `is_admin` 是整數不是布林，送 `false` 回 `COMMON_400001`，看起來像端點壞掉；回寫手測清單要標欄位型別。
- 平行四棒同時改 jedi-iam `authz/capability.py`（T-3.2／3.7／4.4）與 BE `common/authz/`，靠 runner 各自只 add 自己的 hunk 撐過去，沒撞；但 T-4.6 與 T-4.4 各自維護不同的守衛清單（MOUNTS 與 JWT_ONLY_ROUTES），一棒掛點另一棒清單就紅，派工時要在卡上寫「掛點後更新哪幾份清單」。

**推翻了什麼**
- T-4.6 缺口二「補 require_license」→ 摘要報告在 FR-062 §6 屬基礎包，不補，缺口關閉。
- T-4.6 缺口四「退役端點」→ FE 四支活頁仍在用，改掛 `flow.template.read` log_only；注意出貨角色只有唯讀持有這顆，真擋前要調角色。
- 首腦補裁「T-3.2 版本號只由 migration 加」→ runner 查出 `flatten_pkg_migrations.sh` 每次升級重跑 `_capabilities.sql` 也會新增能力點，改成產生器檔尾固定加一。

**留給下一棒**：T-4.6 補 MOUNTS 後驗收收尾；派 T-4.7a／b／c（等令）與 T-3.9（優先）；派前先把 jedi-task-platform／evidence-classification／ai-bot 切成 path 並重啟 BE（T-4.6 缺口一在 DEV 才生效）；A.5 討論前要基準截圖；JWT `is_admin` 口徑等裁。

## 2026-10-07 下午 第 4 棒末段（首腦，T-5.5 驗收、DEV 大清理、決策者開始手測）

**commits（首腦側）**：`189fa259c`（STATE 終局）、`47360bc71`（E2E 專案清理）、`f1261adf0`（e2e 帳號清理）、`96156fc0e`／`7a0e05755`（MEMORY.md 瘦身）、`0a79ad1f3`（T-6.1 卡＋memory）、`bc880617c`（T-5.6 卡）、`7b53efb40`／`aa87e822d`（D12 analysis）、`8eff09605`（第五類動詞）、`6aa0ae2fd`／`f4526dcc5`（T-3.9／3.10 登記）。
**runner 側**：T-3.10 jedi `9698dfe2`；T-5.1 FE `b194d460`＋jedi `19dec3ec`＋BE `cafbce81f`；T-5.2 FE `e4cc8188`＋jedi `8b0a8847`；T-5.3 FE `26e5f52e`＋jedi `c9a07dc8`；T-5.4 FE `d2b7b6d4`；T-5.5 FE `caaaf1be`＋BE `91b9bc650`＋jedi `a664ae8a`；T-1.7 BE `0346f3a4f`。皆未 push。
**Notion**：CM-2546／2548～2553／2547 修正待驗證（首腦驗過）；CM-2528／2541 Done（D12 結案）；新開 CM-2554（T-6.1 手測清單，未派）、CM-2555（T-5.6 回饋）。

**做了**
- 驗收 T-3.10／T-5.1～5.5／T-1.7 七張：headless 實開三頁、HTTP 實打、突變。
- DEV 清 164 個 e2e 帳號（甲）與 1,055 個 E2E 專案（乙）。乙案三次 dry-run ROLLBACK 看數字才 COMMIT；OSCAL import 鏈三層 NO ACTION，要留 5 AP＋5 SSP。
- 清 3 筆髒指派與 `user_change_pwd_logs`；重起前後端。
- 三張 mockup 定稿 → design §6.6 改寫 → A.5 五卡重開。
- 給決策者 15 步驗證路徑。
- MEMORY.md 瘦身並補回被讀取上限吃掉的 10 條。

**決策**
- 決策者：D12 不做、記為設計決定；介面用語「權限」；角色不分類型欄；指派這版不開部門範圍；第五類獨立動詞 execute；T-1.7 兩項高優先併 T-3.8 補件；稽核證據是法規紀錄、不能用 housekeeping 自動清除；刪 e2e 帳號與 E2E 專案。
- 首腦：T-5.6 四件回饋開一張卡；公用角色預設不做、等裁；角色與指派維持分頁，另加「指派給人」鈕。

**教訓**
- 🔴 subagent transcript 只有 192 bytes 不是死訊，兩次砍掉活 agent（T-1.7、T-6.1）。已記 memory `feedback_subagent_transcript_size_not_liveness_signal`，判準只認完成通知或硬期限。
- 決策者要的是「怎麼驗 FR 對不對」，不是「27 張卡的手測清單」。派工前先問目的。
- 大型刪除一律 dry-run ROLLBACK 看數字再 COMMIT；OSCAL import 參照是 NOT NULL＋NO ACTION，會逐層擋。
- headless 注入 token 要連 `permissions`（web-menu）一起塞進 `cm_store`，否則 `hasCap` 全假，頁面顯示沒權限，會誤判成 bug。

**推翻了什麼**
- T-6.1 開了又不派（決策者只要驗證路徑）。
- 「60 天回收桶到期硬刪」建議整個撤回（法規證據不能自動清）。
- T-4.4 原卡「拿掉指派相關部分」→ T-5.5 保留租戶／部門編輯，否則沒畫面能把人加進第二租戶。

**留給下一棒**：接決策者手測回饋；T-5.6 等派；公用角色等裁；舊資料討論等開；收口等裁。

## 2026-10-07 傍晚 第 5 棒（首腦，接決策者手測回饋）

**Notion**：CM-2555 append 兩段補件（六件小修）；未開新卡，兩件待裁。

**做了**
- 接三批回饋，逐條開檔、查 DB、實打 API 分類。小修六件併進 T-5.6；兩件要裁的寫進 STATE 待裁第 0、6 條。
- 實打 API 時用 `.env.e2e` 的管理員帳號登入失敗三次，把 blsadmin 鎖了 15 分鐘（決策者正在用）。已用 SQL 把失敗次數歸零解鎖。

**決策**
- 角色列表「權限」「可見頁面」欄的值是前端另打 stats 算的，BE 不能排；收「只排本頁」，不為排序落統計欄。
- 「佐證」統一成「證據」（FE 目前證據 109 處、佐證 19 處，功能名也是證據分類）。
- 「角色這批是舊資料嗎」答：不是。匯入匯出是 T-3.7 今天新加的兩顆，舊角色沒有是因為沒人補給它們——併進待裁第 0 條。

**教訓**
- 🔴 首腦實打 API 前先確認帳密有效：`.env.e2e` 的管理員密碼與 DEV 不一致，三次失敗就鎖，鎖到的是決策者正在手測的帳號。實打一律先打一次、失敗就停、改用 SQL 或另一個帳號。
- 「轉換 migration 只改名不補新拆出的權限」是拆分表沒有任何卡負責的缺口，和 T-3.9 同一型：每張卡都對，卡與卡之間的空隙沒人管。

**留給下一棒**：T-5.6 等派；待裁第 0、6 條等決策者。

**17:10 驗收 CM-2557 通過**（BE 147036106／beedf0247、jedi c8204b44、FE 3f16ebc4）。守衛兩突變皆紅。發現 CM-2556 已先 commit 補授 migration（c059265a8），兩支 ON CONFLICT 互不衝突。教訓：平行棒的「誰給了這顆」要看 git log 不要看回寫——回寫只寫自己那支。

**17:25 驗收 CM-2556 通過（舊庫排練除外）**（c059265a8／0074073d0）。抽查六顆歸類、冪等重跑、自選突變「改類別不刪列」皆過。runner 查出升級補授模板寫舊表→開 CM-2562。教訓：runner 回寫「其他發現」要當線索立刻核實，核實屬實就當場開卡，不要堆到收尾——這條若漏掉，下一版新增權限就是靜默缺授。

**17:55 驗收 CM-2555 通過**（FE 2a065f6f／da8c129c、jedi 298254bb／67b0c991）。runner 誠實標「沒實打」，首腦用 DEV 臨時帳號（已刪）headless 實開四頁補驗，十五件全對、console 零錯。順帶抓到樹不認三層選單→開 CM-2563。教訓：runner「打折處」寫得清楚時，首腦驗收就該直接補那一塊，不重驗它已驗的；臨時帳號建法記 scratch（users 要 created_at、user_tenants 要 starts_at／is_default，trigger 會擋非成員指派）。

**18:20 驗收 CM-2558／2560／2561 通過**（2558：jedi a66f3bd7＋FE 4f7c5159，匯入裁回單角色；2560：jedi f4b08dcd＋FE e0dc67a8＋BE 84c9a9520；2561：BE 3d25e410d 盤點 428 顆）。2560 的「沒權限→按鈕消失」runner 沒驗到（DEV 所有角色都有小幫手權限，是 2556 B 類補授的副作用），首腦建無權限臨時角色＋帳號補驗（已清）。2561 四題首腦裁：專案情境看專案權限、合規框架保留 isPlatformAdmin 第二層、批次建帳號要 assign、清除對話非按鈕結案。決策者再裁：角色列表「可見頁面」欄拿掉改預覽 Dialog，併 CM-2563。六棒全收。
教訓：平行棒會互相改變對方的驗證前提（2556 補權限讓 2560 找不到反例）——驗收時「找不到反例」要自己造，不能接受「DEV 沒這種帳號」當通過。

**19:50 驗收 CM-2567 通過**（FE 1b0b4973）。runner 標「沒看 console」，首腦臨時帳號 headless 開四頁補驗零錯。教訓：抽 DEV 樣本要用活旗標（projects 是 deleted_at 不是 is_delete），按 id 抽到軟刪列會誤判成頁面壞掉；本棒 runner 的三種引用查法（import／動態載入／router）加 i18n 三條件可當日後死碼清理的標準做法。

**20:05 驗收 CM-2568 通過**（jedi 0754938a＋BE dc7712094）。突變用 `if False:` 包住呼叫，不能用 `#` 註解單行（多行呼叫會變語法錯，測試報 error 不是 failed，看不出守衛有沒有牙）。runner 發現 PUT /role 缺 tenant_id 變 500→併 CM-2564。

**20:40 驗收 CM-2565 甲通過**（FE 81f22827＋BE cd33a4675）。runner 讀完卡自判做不完、先拆再做，是這輪最乾淨的一棒。首腦突變「CAP 換成存在但錯的常數」仍綠——這不是漏，是甲的守衛界線（乙三向核對才抓掛錯顆），回寫有講明。教訓：守衛測試要寫清楚「抓什麼、不抓什麼」，驗收才知道哪個突變該紅哪個該綠。

**21:05 驗收 CM-2562 通過**（21b90c2c8）。runner 標「沒跑完整 flatten」，首腦只重現它那一行 sed 替換、產物進交易跑完 ROLLBACK——補驗打折處不必重跑整條管線，找到最小可重現的那一步就夠。突變用「另加一段寫舊表」而非改名，守衛仍紅。

**21:30 驗收 CM-2563 通過**（FE 47744ad3）。突變選「拿掉 url 判斷」而非 runner 的「改回兩層」，兩紅。headless 補驗四項皆對。

**22:10 驗收 CM-2564 通過**（三 repo）。突變「多綁第二顆 ALL」紅。runtime 稽核人員直打內頁→403 頁帶缺哪顆。runner 漏做補件四（tenant_id），卡尾堆太多補件是首腦的錯——補件超過兩段就該拆卡，不該繼續往上疊。教訓已在 2565 吃過一次，這次又犯。

**23:05 CM-2571 退回**（FE 9a4b511f＋BE db74efce2 留著，補一個 commit）。composable 測試綠、畫面沒變——同一份 grouped 在 RoleDetail 與 PermissionTree 各算一次，只改了一邊。教訓：驗收「顯示層」的卡一定要數 DOM，不能只看 vitest；runner 標「未做瀏覽器實測」時首腦就該預期這類洞。

**23:30 CM-2571 複驗通過**（FE 3c3c572c）。runner 補的元件測試有對照組（不給 labelOf 會三列），首腦突變 aliases 也紅。首腦第一次數列用 innerText 第一行，漏掉同列後段的「3 個入口」，差點誤判標記沒出——數 DOM 要看整列不要只看首行。

**00:15 驗收 CM-2566 通過**（三 repo）。runner 實測出 `.claude/rules` 不吃絕對路徑／`--add-dir`，改成各 repo 放複本＋守衛逐字同步——比首腦補件寫的備案更對。首腦突變 jedi 複本一字→同步守衛紅。CM-2564 補件三兩度漏做→拆 CM-2573，不再往 2569 疊（今晚第三次學這條）。

**00:55 驗收 CM-2572 通過**（FE 2fd541ad）。首腦突變第一次打錯層（2571 的 key），第二次對準 groupInnerByGate 才紅——同一支檔疊了三層合併，突變要先確認打的是哪一層。27→25：卡上數字把原廠門檻算進去，runner 用 DEV 實數對。

**01:20 驗收 CM-2573 通過**（jedi 6899d225＋FE c911558c）。首腦實打先用自己拼的 body 拿到 500，查 traceback 才知是多帶了 `is_admin`——實打 API 要用 FE 真實 body（useRoleEditor.js save），不要憑 GET 回應反推。順帶挖出 schema／DTO 欄位不對稱的潛在 500，記待辦。

**02:00 CM-2569 退回**。機制本身乾淨（突變「存在但錯的常數」紅，補上 2565 甲的洞）。但 runner 回寫說「要首腦裁」之後 20:19 又自己 commit 兩個、方向還裁反（前端迎合套件錯誤守門），回寫完全沒提。首腦 revert 兩 repo。教訓：驗收一定 `git log --grep=CM-xxxx` 對回寫列的 commit，多出來的每一個都要開——回寫外的 commit 比沒回寫更危險。另：交辦進別張卡的事項要在那張卡的驗收清單上逐條點名，不然就會像這次兩條登記改法靜默消失。

**02:30 CM-2569 根因**：追到底是 `asset.device.import`／`export` 從未進 jedi-asset 的 `CAPABILITIES` tuple——宣告、DEV、常數檔三處都 206，只有出貨 seed 與設計文件說有。首腦傍晚回報的「208」是錯的（當時 DB 查到的數字來源已不可考，之後 flatten upsert 把兩顆沒宣告的列也沒刪，純粹是我少驗一層）。runner 撞到真矛盾但往反方向修；正確是補宣告修 route。教訓：「DB 有」「seed 有」「文件有」三個都不等於「宣告有」——權限的真相鏈最上游是套件 contract tuple，驗任何權限存不存在要從那裡起算。

**03:10 CM-2569 複驗通過；更正 02:30 的根因**。「import／export 從未進宣告、全鏈 206」是首腦誤判：兩顆一直在 contract.py:38-39，首腦 `sed|cut` 截斷了行，又在 runner 工作樹刪了那兩行、DEV 被未入版控刪除腳本動過的過渡時刻查 DB，就把過渡狀態寫成根因。runner 退回後自報了那支刪除腳本並以 DEV-only migration 修復，誠實。兩棒各錯一次：runner 在「等首腦裁」期間動手且方向反；首腦寫根因前沒 `git log -L` 核那兩行的歷史。教訓：①權限存不存在要看 `git show HEAD:contract.py`，不看工作樹、不看當下 DB；②寫進 LOG 的根因必須附「怎麼核的」，核法不能只有一個來源；③決策者說「你們兩棒都有點失智」是對的。

**05:20 驗收 2574／2575／2578 通過**。八棒各自撞到的「套件 route 守門比盤點表粗」收斂成七組，開 CM-2582 統一修，不讓豁免清單變成第二套真相。2578 沒用共用的 Menu 過濾機制自己手寫——九棒平行時共用 composable 要寫在卡上「用哪支、在哪登記」，不能只寫「登記豁免」讓 runner 自己找。2581 挖出 `v_user_capabilities` view 還建在退役表上、license 通知在讀：T-3.3 改判定時「找出所有讀取端」漏了一個 view，印證 [[feedback_grep_sql_keywords_misses_orm_writes]] 反過來也成立——view 和 SQL 字串是守衛盲區。

**06:10 驗收 2579 通過**。首腦差點退回：headless 選 `.p-inputswitch` 與含「已發布」文字的元素，抓到的是狀態篩選分頁與計數，不是發布開關；開檔核三個真開關都掛了 v-can 才發現。教訓：DOM 斷言要選到「那顆控制元件本身」（v-can 掛點的元素），不能用文字或 class 泛選；要退回之前先開檔對一次 runner 說的那幾行。CM-2582 收到第八組（問卷 release route 守 update／delete 而非 publish）。

**07:10 八棒全驗完**。守門落差最後收成十一組進 CM-2582——每棒都誠實登記了豁免並回寫問首腦，首腦的工作是把它們收攏成一棒而不是讓十一條豁免永遠留著。九棒共用矩陣 JSON 撞了三次（2580↔2574、2577↔2579、2576 只補行號），每次都被後 commit 的棒自己發現並補回：共用檔「改完立刻 commit」有效，但收口時仍要整份重產一次對帳。首腦 headless 選擇器今天錯兩次（2571 數列、2579 發布開關），規則記進 LOG：斷言要選到掛點元素本身。

**08:05 九棒全收**。2570 通過；首腦做了承諾的「全收後對帳」：重產矩陣只動行號、兩份守衛與三向守衛 9 綠，commit adf47dcf4。九棒期間矩陣撞三次、基線撞一次，都被後棒自己發現補回；對帳只剩行號，證明「共用檔改完立刻 commit」撐住了。接下來 2582 收十一組守門落差，然後重啟 BE、全量守衛、總測。

**09:05 CM-2582 驗收通過**。首腦實打先三次 403 才通：同一角色逐顆加 pattern＋手動 bump 版本號**不會**清該使用者的 Redis 展開快取（快取跟角色改動事件走），每次新登入仍拿舊集合。測權限變化要「新角色一次給齊」或走角色編輯 API，不要直接改 DB 再 bump。這條與 CM-2560 runner 回寫的提醒同源，首腦自己又踩一次。決策者裁開獨立 session 重驗全部產出——今晚首腦誤判三次（2569 根因、2571 數列、2579 開關），該驗。

**10:30 CM-2583 獨立驗收**：首腦驗過的 28 張沒有一張被推翻，但驗收員找到首腦完全沒驗到的一層——CM-2556 補進新表的權限，會被角色頁一次「儲存」蓋掉，因為勾選來源還是舊表。首腦驗 2556 只驗「補進去了沒」，沒驗「之後存檔還在不在」；驗 T-3.9（UI 寫 pattern 表）時也沒想到「讀」還在舊表。兩表並存期的教訓：**改寫入端時，所有讀取端一起列**，不然寫得再對、下一次存檔就被讀取端的舊真相覆蓋。開 CM-2585 阻斷手測。決策者裁開獨立驗收是對的：同一雙眼睛驗三十張，盲區會一路帶到底。

**11:40 CM-2584 通過**（FE 76c54535）。首腦量字級第一次 selector 打到樹的 span 讀到 14px，差點誤判「沒變」；改看截圖才對。這是今晚第四次 DOM 選擇器出錯，規則不變：量「那一顆元素本身」，量不到就看圖。

**12:00 CM-2584 退回**：字級「放大一級」只寫了頁名與分組，卡片標題與工具列沒寫，runner 照做就把層級做反了；首腦驗收截圖看到了頁名變大就算過，沒看整張卡的大小關係。教訓：字級／間距類的卡要寫「整組層級」不寫「某一層放大」，驗收看圖要看相對關係不看單一元素。

**00:05 CM-2585 通過、CM-2584 複驗過，手測阻斷解除**。2585 把回填做在 model 層而不是回應層，順手堵了卡上沒寫的第二個讀舊表處（存角色時的授權檢查）——這是 runner 比首腦看得深的一次，記下來：**兩表並存期的修法要掃「所有讀者」，不是只修卡上點名那一個**。另一個教訓：首腦對決策者說 Drive folders「零 403」，是 grep 用 `google-drive/projects/fff5b047.*folders` 配到的是 before_request 行而不是回應行，就斷言沒擋；決策者拿 DevTools 截圖打臉。**log 查「有沒有 403」要抓回應行或 error_code，不能抓請求行**。下棒第一件事把這支查完。

## 2026-10-08 凌晨 第 6 棒（首腦，接決策者手測回饋第二批）

**commits（首腦側）**：FE `988d0f3f`（勾選框 SVG 圖示）、FE `09d54f1b`（帳號頁角色區塊重做成指派表）、本棒 STATE/LOG 一 commit。**runner 側**：CM-2586 FE `82368c97`＋BE `65477cbc6`（design 一句）；CM-2587 BE `f3f906a3b`；CM-2588 BE `1b0c0c1d0`。皆未 push。
**Notion**：新開 CM-2587／2588；2586／2587／2588 皆修正待驗證，各卡末段有首腦驗收與明天手測清單。

**做了**
- 查清 Drive folders 403：api_logs 五筆 `GRC_403022` required `evidence.cloud-integration.read`；根因 T-2.1 改名直翻、沒照附錄 D 第 4 條改 `grc.project.read`。IT Manager 新舊表都沒那顆，出貨五角色靠 `evidence.*.read` 剛好蓋住所以測不出。開 CM-2587。
- 待裁 2b 盤完：守 `grc.audit.read` 的讀取端點 BE 12 支＋套件 1 支，附錄 A 皆如此登記、非誤歸；DEV 命中「有 audit.* 或 project.read 卻無 audit.read」的角色三個（PM／IT Manager／IT執行人員），出貨五角色全有。建議乙、決策者裁乙，開 CM-2588。
- 既存紅燈實跑：module_boundaries 三條確實紅（基線重產附屬）；role_transfer 單跑與同批皆綠。
- 決策者令重啟 BE 測 2587：kill 79879 → 起 91549。
- 決策者截圖勾選框「V 疊一橫」令直做：根因三態元件 `pi-check` 字型圖示撞主題 `theme.css:11394` 的 CSS 畫勾；改 `CheckIcon`／`MinusIcon`，守衛三條、突變兩紅、headless 截圖三態分明。
- 決策者看 2586 畫面點名「應付」：runner 把新列貼在舊膠囊摘要下面，同一筆指派出現兩次。首腦重做成與指派頁同一套的 DataTable（七欄、同狀態判法、同授權唯讀），headless 開 blsadmin／blsit 編輯頁核對列數與欄位。
- 三棒驗收：2587 守衛 19 綠＋live 實打（臨時 IT Manager 200、臨時無專案權限角色 403 required 對）；2588 開檔核 migration＋DEV 實查三角色與版本號；2586 以首腦重做版為準。臨時帳號／角色全部刪除。

**決策**
- 2b 走乙不走甲：出貨五角色已假設「進專案的都有 audit.read」；甲要動 12 支端點歸屬，連帶路由登記與矩陣。
- 勾選框與 2586 重做由首腦直做（決策者明令），不另開卡；commit message 記 CM-2586。

**教訓**
- 🔴 「有沒有 403」要查 api_logs 的 response 欄，app.log 沒有回應行——第 5 棒用 app.log grep 請求行斷言「零 403」就是這樣錯的。
- psql `-c "... RETURNING id"` 的輸出會夾 `INSERT 0 1`，拿去當變數會把後續 SQL 弄壞；要 `-Atq` 或分開跑。第一次建臨時帳號因此留下孤兒列，已清。
- runner 做「加功能」類 UI 卡會傾向在既有畫面旁邊疊一塊而不是重整；卡上要寫清楚「取代」還是「並列」，驗收要看截圖不能只數 DOM。
- 決策者插問時先回一句狀態再查，連續十幾個 tool call 不出聲會被當成卡住（本棒被問兩次「又卡住了？」）。

**推翻了什麼**
- 第 5 棒「Drive folders 端點不是問題、零 403」→ 是問題，實作掛錯權限。
- 第 5 棒傾向甲 → 決策者裁乙。
- 第 5 棒待裁 2c「4 條紅燈」→ 實為 3 條（role_transfer 不紅），且屬基線重產附屬不另開卡。

**留給下一棒**：決策者手測 2586／2587／2588＋勾選框（清單在 CM-2586 卡末段）；「專案管理員不能做專案自動分類」待決策者給帳號；`GET /user/<uid>` 停用列 500 收尾前順手收；待裁 3／4／5 不變。

## 2026-10-08 上午 第 6 棒續（首腦，決策者手測角色樹連續回饋，收工交接）

**commits（首腦側，FE）**：`988d0f3f` 勾選框 SVG、`09d54f1b`／`fe72834e` 帳號頁角色表＋文案統一、`e108b482`→`1d131897`→`2fa5173c` 角色樹三版到定案（內頁併母頁權限「可進入頁面／可使用功能」）、`8e15f56c` 工具列分兩排、`637a6f94` 拿掉主要權限星號、`5c6d6c7b` 儀表板不打統計 API、`ba87b821` 拿掉「即時預覽」字樣。**BE**：`e9106cc2e` 產生器 FE_NOT_WIRED、`7a58a440a` 回收 feedback.export migration、STATE 數次。**runner 側**：CM-2587 `f3f906a3b`、CM-2588 `1b0c0c1d0`、CM-2589 BE `1609503b1`＋FE `28243b64`／`08f78305`、CM-2590 FE `cb51fd33`、CM-2591（另一 session）FE `0987cb8b`＋BE `cf281a0e5`。皆未 push。
**Notion**：CM-2589／2590 新開並收（2589 退回一次後首腦直做收尾）；2591 另一 session 開與做。九張修正待驗證。

**做了**
- 決策者整個上午對角色樹連續回饋，首腦逐條查證分類：AI 小幫手 CRUD（空殼）、公告／問卷／回饋底下多出項目與「少一層」（內頁壓扁）、證據分類設定檔四顆（後端有前端沒接）、「建立角色跟新增角色差在哪」（內頁重列母頁權限）、儀表板 403（頁 fail-open 但 API 守 project.read）、回饋匯出殘廢（只有 export 沒 review.read）、主要權限星號（設定入口已消失且無運行時用途）、「即時預覽」（純說明字被當按鈕）。
- 角色樹呈現改到定案：內頁不上樹，權限上移母頁，母頁權限下列「可進入頁面：…；可使用功能：…」。空殼判準加 FE_NOT_WIRED 明列＋自檢（不用「沒按鈕就藏」寬判準——會連 grc.audit.close 等 21 顆前端有用的一起藏）。
- 開 CM-2590 文案專業化（規範＋範例＋守衛）派 runner；CM-2591 由另一 session 以方案 C 處理「同一顆權限列多頁連動」。

**決策（決策者）**
- 甲：內頁歸母頁走後端 pid，不前端 meta；公告瀏覽頁拿掉管理鈕；可見選單預覽只列側欄。
- 樹只列可設定的權限；內頁併進主要權限的涵蓋說明；文案「可進入頁面／可使用功能」。
- 證據分類設定檔四顆先藏（前端沒接）；主要權限拿掉顯示欄位保留；回饋匯出跟審閱權限走。

**教訓**
- 🔴 **接畫面回饋先給終局圖再動手**：角色樹改了四版（門檻列→頁名列→說明列→拿掉），決策者點名「我說一步改一步，改得亂七八糟」。正確做法是第一次看到「建立角色跟新增角色差在哪」就畫出終局三層圖請決策者裁，一次改完。
- 「是不是殘廢權限」要分三種：真空殼（無端點無頁面）、後端有前端沒接、功能在別顆門檻的頁上；處置各不同（藏／明列藏／改補授規則），不能一條寬判準打死。
- 突變驗證前先 `git stash` 或分 commit，`git checkout` 單檔會把同檔未 commit 的正式改動一起還原（本棒踩一次、重做了一遍）。
- 共用元件以 `:view="true"` 嵌入的頁，矩陣掃描器靜態抓不到 view 條件；CM-2589 已讓掃描器認 `!props.view`，但執行期才決定的（回饋頁 `feedbackScope`）仍要豁免登記。

**留給下一棒**：接決策者下一批回饋；九張等收 Done；「專案管理員不能做自動分類」待帳號；`GET /user/<uid>` 停用列 500 未開卡；待裁 3（基線重產，migration 累計 22 支）／4／5 不變。

## 2026-10-08 下午 CM-2594 runner（專案管理拆三工作面子頁）

**做了**：`ui_routes` 加 `tree_page`，專案規劃／專案總覽／稽核計畫三支內頁上角色樹成專案管理底下的子頁；稽核寫入五顆從我的稽核改綁稽核計畫頁。migration `2026-10-08-fr132-tree-work-faces.sql` 只套 DEV。

**推翻了什麼**：第 6 棒定案「內頁一律不上樹」→「內頁預設不上樹，`tree_page=true` 者上樹成第三層」（決策者 2026-10-08 裁）。

**卡上沒寫、runner 補做**
- 專案規劃／專案總覽原本 pid 掛在稽核計畫底下，輪次版、證據分類、專案設定等也都掛稽核計畫；只標 `tree_page` 會長成「稽核計畫 › 專案規劃」且輪次頁按鈕全倒進稽核計畫。migration 一併把十支內頁改掛對應子頁（依 FE breadcrumb）。
- `home_route_name` 升級時照套件宣告覆寫，只改 DB 會被打回；`jedi-compliance-audit` 的 close／import 宣告同步拿掉 `home_route`。
- 三支子頁 sort 同為 900，改 910／920／930 定順序；`pageTitle` 相鄰同名去重，輪次版才能併回同一列。

**教訓**：pattern 授權有 Redis 展開快取，直接 SQL 塞 `role_capability_patterns` 不會清快取——臨時角色要一次建好 pattern 再指派，先建空角色登入一次就會快取到空集合。

**留給下一棒**：專案總覽與終局圖仍有落差（修改任務歸專案規劃、檢視／審閱任務歸專案管理、留言證據歸待辦任務），擁有者規則下無法只靠本卡收斂，待決策者裁（選項見 CM-2594 卡）。出貨基線待重產（本 arc 累計 25 支）。

## 2026-10-08 下午 第 7 棒（首腦，接決策者手測回饋第三批、驗收四棒、收工交接）

**commits（首腦側）**：FE `cb3308e0`（問卷非指派人員判定＋抽屜三區塊照權限藏）、`1005d2e6`（角色樹找回檢視任務＋審閱任務文案）、`4b838449`（抽屜 hasCap→v-can 守衛修回）、`b0ff4b3d`（藏依資源切換）、`a9c15c1d`（擁有者規則 home_route 優先）、`3b1ff397`（指派頁分組列照 mockup）；BE `97a6aaf26`（稽核員收窄）、`d519efe7c`（10 顆 home_route 改專案總覽＋migration＋補 2593 manifest）、STATE 數次。**runner 側**：CM-2592 FE `0b225b74`；CM-2593 套件 `56e6866b`／BE `b380dec5a`／FE `a0859a87`（決策者另 session）；CM-2594 套件 `997ecba3`／BE `4dffee9e8`／FE `e8adc932`；CM-2595 套件 `4c5e3fe3`／FE `bd6dafbf`／BE `6df5edc20`。皆未 push。
**Notion**：開 CM-2592／2593／2594／2595 並全部驗收通過（各卡末段有首腦驗收段）；決策者手測四張「應該都 OK」，尚未收 Done。

**做了**
- 回饋一：blspan 非指派人員被標「填寫人員」→ 根因抽屜找不到自己就落 filler；共用 composable 判定，不在名單且非 manager → 無身份唯讀；順手把抽屜證據／留言／問卷區塊照讀取權限藏、開啟鈕看能否進填答頁；文案「匯入稽核計畫／審閱任務」。
- 回饋二：角色樹沒有「檢視任務」可勾 → 根因它唯一矩陣列是填答頁的進入列，被歸到無母頁內頁上；歸頁不看進入列、無母頁內頁不收權限。
- 回饋三～六（開卡）：任務卡不可點 2592；結案問卷與掃描紀錄以證據權限可讀 2593（決策者裁甲）；專案管理拆三工作面子頁＋稽核七顆歸稽核計畫 2594；問卷本體依情境守門 2595（2593 runner 抓到的缺口，裁甲治根）。
- 裁示落地：稽核員範本任務組收窄為 read＋update；藏依資源切換；指派頁分組列照 mockup。
- 驗收四棒：每張從 git HEAD 核 diff、自跑測試、臨時帳號 headless 或 curl 實打，runner 打折處首腦補驗；2594 擁有者與終局圖不符 → 決策者裁改歸屬宣告，首腦直做。
- 證據／專案規劃控管盤點：三種證據與規劃頁端點全守、按鈕全擋；手測看不出效果是任務組 17 顆仍 log_only，前端不需再補。

**決策（決策者）**
- 結案問卷與檢測執行紀錄視為證據：持 `grc.job-evidence.read` 可讀；未結案只認 `grc.job.read`（通則 A 例外）。
- 問卷本體端點依情境：帶 task_survey_uid 看任務權限、不帶看設計器（通則 C）；情境由前端明示不反查。
- 內頁預設不上樹、`tree_page=true` 例外上樹；三子頁用側欄既有頁名。
- 擁有者：直綁 → home_route_name → 同資源數；任務執行面 10 顆歸專案總覽。
- 稽核員不給 assign／import／export，保留 update 讓他做完自己的任務。
- 依資源視角先藏（一般管理員看不懂）。

**教訓**
- 🔴 **卡上寫「擁有者規則不改」等於沒定擁有者**：同一顆權限多頁時誰可勾是看得見的 UI 結果，要在卡上畫明（本棒 2594 因此多一輪）。
- 🔴 **自己也會踩守衛**：`cb3308e0` 在抽屜散寫 6 處 hasCap 弄紅 v-can 守衛，runner 跑守衛抓到並正確不越權修。首腦直做也要跑該檔對應守衛再 commit。
- **runner 偏離卡片先驗它對不對**：2593 保留 ALL 不改 ANY（零 ALL 列＝全開）、2594 改掛十支內頁與套件宣告——三處都是 runner 對、卡錯。驗收不是對卡，是對設計意圖。
- 「看不出效果」要先分 log_only 與真擋：決策者一整天拿掉任務類權限都沒反應，全因那組 17 顆仍只記錄；先講清楚省掉很多「是不是沒做」。
- 用 headless 讀 TreeTable 結構，靠文字 indexOf 三次都失敗（同名列、label 帶計數後綴）；「本頁另需」的指向字串反而是最可靠的結構證據。
- `source .env` 在 zsh 會把含空格的註解行當指令（`.env:45: command not found: AI`），無害但吵；要查值用 python 解析。

**推翻了什麼**
- 第 6 棒「內頁一律不上樹」→ `tree_page` 例外（決策者裁）。
- 第 6 棒驗證路徑假設「出貨稽核員帶 assign」→ 拿掉。
- STATE 待裁 2b 一直標 🔴 未裁，實際凌晨已裁乙並做完 CM-2588 → 改為已裁。
- CM-2594 runner block「擁有者落差待裁」→ 本棒已裁甲做完（FE `a9c15c1d`／BE `d519efe7c`）。
- 本棒卡上 2593 寫「ALL 改 ANY」是錯的（零 ALL 列會讓所有登入者進得去），runner 已糾正。

**留給下一棒**：見 STATE「下一步」。四張待收 Done；基線重產（26 支）／舊客戶庫 dump／push 三件等決策者裁；T-4.5 轉真擋與收口動作之後才排。

## 2026-10-08～09 第 8 棒（首腦，上版：基線重產、排練、真擋、收口、進版 1.26.0、三環境升級）

**commits（BE main）**：`a70536d69` 基線重產一（25 支）、`a256816da` 基線重產二（真擋）、`73d5bc375` 進版 1.26.0（RN／stamp／spec 快照）、`7bf292077` 19 支釘版（runner）、`1fc0b484a` jedi-log 加 error-tracking extra、`01dca31a4` sentry_sdk 整包編＋smoke 探針④c、`8d452760e` RN 補 SBOM；FE `0e2b1799` 版號；jedi `143c309e` 19 支版號。**runner**：CM-2522 `e18a3fc40`、CM-2535 `45391c556`＋jedi `82de16de`、CM-2596 `7bf292077`、CM-2599 `8e6817909`。三 repo 皆併回 **main** 並 push。
**Notion**：CM-2522／2535／2596／2599 驗收通過；CM-2597 裁不做、CM-2598 裁停；CM-2600 進版紀錄。

**做了**
- 基線重產兩次（188 基線庫備份 `guidant_ai_baseline_20261008_1536_before_FR-132.dump`）；`test_module_boundaries` 三條紅轉綠。
- CM-2522 排練用 190（決策者裁）：190 唯讀 dump，本機 `guidant_ai_rehearsal`／`_pre` 走 migrate.sh，首腦自己 SQL 展開逐列 diff 遺失 0（8 筆差異皆裁定刪除的 workflow.*／bulletin.read）。排練庫未 drop。
- CM-2535 真擋：決策者裁**不觀察直接擋**（DEV 三小時 243 筆 log_only 全是手測帳號）。首腦 blspan 實打 403、重啟後 log_only 零筆。
- 收口拆五卡 CM-2596～2600：A（19 支 jedi 發 Nexus、jedi-iam 1.5.0）、D（spec 四頁＋手冊）過；B arc-review 裁不做（三 repo 7 萬行超出一次審閱範圍）；C e2e 裁停（site-regression 過時，重建前不作 gate，memory `project_site_regression_gate_suspended_until_rebuild`）。
- 進版 1.26.0（功能版），spec 快照 `docs/spec-site/v1.26.0/`。
- GitLab pipeline 出包四次：2925839814 紅 classifier（jedi main 未含 1.6.3 → 併 main）；2925933217 綠但缺 sentry-sdk；2926571216 綠但缺 `sentry_sdk/integrations/`；**2926721749 最終**。190 第一次 deploy 容器起不來（主機 seccomp errno 524，unattended-upgrades 新核心未重開）→ 決策者重開 → `sudo guidantai start`。
- Sentry：主專案釘 jedi-log 沒帶 `[error-tracking]`，sentry-sdk 從沒進 lock；修後 Nuitka 又漏收整個 integrations 子包（SDK 用 importlib 字串載 49 支）；整包 `add_pkg sentry_sdk`＋smoke 探針①帶假 DSN＋探針④c 斷言「已啟用」。190 最終 log「已啟用（environment=PRD, release=guidant-ai@1.26.0+01dca31a4…）」，決策者在落地版 Sentry 核過事件。
- STG／POC（決策者放行）：各先 pg_dump 備份；deploy_only pipeline 2928782083／2928798069（POC manual 首腦按 play）皆 success，三環境對齊 311 支／208 全 enforce。

**決策（決策者）**
- 不觀察直接真擋；舊庫排練用 190；jedi-iam 進 1.5.0 其餘 patch；壞包同版號重出（甲）；arc-review 不做、e2e 不跑直接進版；site-regression 重建前發版不以 e2e 為 gate；三 repo 併回 main；授權首腦 push 與放行 STG／POC。

**教訓**
- 🔴 **首腦盤點漏判三支套件（flow-engine／evidence-classification／notification 有 FR-132 改動）**，runner 把 Nexus wheel 抓下來逐檔比對才抓到；釘回舊版會讓出貨帶舊能力點名、守門整個對不上。盤「哪些套件有改」要用 `git log main..HEAD -- <pkg>/` 逐支，不要靠 diff --stat 的目錄名 grep。
- 🔴 **STATE 沒更新害兩棒抄錯**：CM-2562 10/7 就修完驗過，STATE 待裁段一直寫「新開未派」，CM-2522／2535 兩 runner 都抄成「缺口驗不到」，首腦還據此問決策者要不要修。待裁段每棒要對 Notion 狀態核一次。
- 🔴 **smoke 沒設 DSN 等於沒測錯誤追蹤**：選用相依在 init 第一行就回頭，整段子包漏收 smoke 全綠；選用功能要在 smoke 用假值逼它走完 init 並斷言成功訊息。
- 🔴 **Nuitka 對「字串動態 import 子模組」的套件一律整包 `add_pkg`**（gunicorn、sentry_sdk 同病）；症狀是 init 吞例外只記 warning、服務照常起。一次列完「該在／實在」diff（容器內 `ls /app/<pkg>/` 對本機 site-packages）再修，不逐輪補。
- `.env` 密碼鍵是 `DB_PASSWORD` 不是 CLAUDE.md 寫的 `DB_SECRET`；讀成空字串 psql 會改互動問密碼、看起來像掛住。
- 取消的 GitLab pipeline 不殺 188 上的 Nuitka／scons 子程序，重跑前要 `pgrep` 手動 kill，否則 verify 守門擋或互撞。
- 主機 `reboot-required` 旗標＝升級後容器可能起不來（seccomp errno 524）；三台都有旗標但只有 190 重演，升級前看一眼、起不來就重開再 `guidantai start`，不重跑 upgrade。
- jedi monorepo 的 gitlab push 在這台機器可用，舊 memory「無憑證」已不成立。

**推翻了什麼**
- 第 7 棒 STATE「CM-2562 新開未派」→ 早於 10/7 修完（`21b90c2c8`）。
- 首腦「16 支套件發版」→ 19 支（runner 糾正）。
- 收口 B／C 原計畫 → 決策者裁不做／停。
- 「同版號重出一次」→ 三次才對。

**留給下一棒**：見 STATE。FR-132 實作與上版皆完成；剩決策者打 tag、收 Done；follow-up 清單在 STATE 備忘。
