FR-132 LOG(append-only)

§1

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 合併並裁四項模組歸屬爭議。

§2

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)。

§3

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。

§4

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 設計討論前先要基準截圖。

§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 跑中。
§6

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。

§7

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 口徑等裁。

§8

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 等派;公用角色等裁;舊資料討論等開;收口等裁。

§9

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,不能抓請求行。下棒第一件事把這支查完。

§10

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 不變。

§11

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 不變。

§12

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 支)。

§13

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 轉真擋與收口動作之後才排。

§14

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 備忘。