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。
做了
決策
*.*.* 內建不可刪、三範例角色可改刪;D12 做機制+租戶開關預設關。理由:多數客戶的部門只是組織標記,預設關升級無感。require_capability_on 單筆寫入守門要做、直接擋;只記錄模式改為每能力點旗標;T-2.1 改名連程式內宣告一起改。*.*.*,同租戶多個取最早建,其餘保留旗標、能力點原樣轉。推翻了什麼
教訓
留給下一棒:等 A.1 五棒回來,首腦做 T-1.6 合併並裁四項模組歸屬爭議。
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。
做了
決策
grc.*.* 萬用字元會順帶拿到範本設計權)。iam.org-unit(決策者推翻首腦建議,理由「以前改版過、跟程式統一才不亂」)。教訓
推翻了什麼
留給下一棒:T-1.6(CM-2516)。
commits:16ed89083(決策者 session 產出三檔:a1-capability-tree/a1-shipped-roles.json/a1-d12-tables)、本棒一 commit(裁示寫入三檔+design D6/D12+STATE/LOG)。未 push。 Notion:CM-2516 修正待驗證。
做了
決策
project.update 做任務動作,新模型改由 grc.job.update 承接。feedback.export;三支挑選下拉走通則 B;taxonomy 寫入不新開資源。教訓
推翻了什麼
*.*.read」→ 改列舉業務模組 read(*.*.read 會露出 SMTP/LDAP 設定頁與全部帳號)。留給下一棒:決策者核功能表;發令後改五張卡與 design §7;A.2 等 branch。
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 派出跑中。
做了
pytest test 用 518931af9 worktree 跑基線比對:開工前就 61 紅,三棒只新增 5(3 條是 seed 未重產、2 條 T-4.1 已修)。決策
TENANT_ADMIN_EXCLUDED_RESOURCE_TYPES 清空(T-3.3 查清五個舊鍵對應能力點全不存在)。resources/roles/shipped-roles.json 不放 scripts/init/(打包不帶 scripts)。require_capability_on 開關固定 False(D12 延後),邏輯與測試全寫。教訓
*.*.*=188」是首腦憑記憶估的,runner 實查 164;補裁寫數字要先 SELECT。推翻了什麼
留給下一棒:驗第一批四張;A.5 設計討論前先要基準截圖。
3490700b6)、T-4.2(42cb17bc2)驗收通過:對照附錄 A、AST 守衛測試綠、DB 29 顆 log_only(20+9)。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)。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。
做了
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 無程式碼變更。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。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 呼叫端。capability_required 插槽的:survey/detection/system-core/bulletin/issue/iam;要補 port 的:task-platform/compliance-audit/evidence-classification/license-runtime/ai-bot。三張依賴 T-4.4 完成才派。決策
is_admin 口徑維持跨租戶(登入時 tenant_id=None、任一租戶有效管理員指派即真),側欄選單按作用租戶算。理由:這是舊行為非本案新增,真正守門在能力點判定、已按作用租戶,claim 只影響前端入口顯示。記待辦不改,A.5 前端重設計時一起看。教訓
UPDATE N 才看結果。python -I 會忽略 .env 載入的環境變數,create_app 會因缺 DRIVE_TOKEN_ENCRYPTION_KEY 炸;跑 BE 內 script 要先 source .env。推翻了什麼
留給下一棒:驗第二批四張(回寫即驗);T-4.4 過後派 T-4.7a/b/c;A.5 設計討論前先要基準截圖;等決策者裁基線重產與 T-2.6 dump。
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)。
做了
authz:exp:102:2:4);T-3.7 實打四情境(零命中 400 列出、同名 409、系統管理員同名另存且內建不動、blsit 403),測試角色已清;T-4.4 blsit 讀 SMTP 設定 200+log_only、支援頁平台門照擋 403。全量 pytest 與基線比無新增紅。capability_required 插槽拆三棒。開卡後實查 venv 發現 path 模式只有 16 支,task-platform/evidence-classification/ai-bot/oscal-v2 仍是 Nexus pin,三卡各 append 補正。RoleDomainService.add_role/update_role 只寫舊表 role_capabilities,FE 角色表單送能力點 id,T-3.3 之後判定只讀 role_capability_patterns,畫面新建的角色沒權限、改過的角色判定不變且不報錯。拆分表沒有任何卡負責,A.5 前端開工前必修。決策
PENDING_GUARD_ROUTES 用包含斷言是守衛弱點(新裸端點加進去也會過),111 條待 T-4.7/T-4.5 清到 0 後改集合相等。教訓
test/test_fr132_*+test/security/code/ 全部。.pth 才發現只有 16 支——環境斷言開卡前要 ls .venv/.../*.pth 實查。is_admin 是整數不是布林,送 false 回 COMMON_400001,看起來像端點壞掉;回寫手測清單要標欄位型別。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),一棒掛點另一棒清單就紅,派工時要在卡上寫「掛點後更新哪幾份清單」。推翻了什麼
flow.template.read log_only;注意出貨角色只有唯讀持有這顆,真擋前要調角色。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 口徑等裁。
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 回饋)。
做了
user_change_pwd_logs;重起前後端。決策
教訓
feedback_subagent_transcript_size_not_liveness_signal,判準只認完成通知或硬期限。permissions(web-menu)一起塞進 cm_store,否則 hasCap 全假,頁面顯示沒權限,會誤判成 bug。推翻了什麼
留給下一棒:接決策者手測回饋;T-5.6 等派;公用角色等裁;舊資料討論等開;收口等裁。
Notion:CM-2555 append 兩段補件(六件小修);未開新卡,兩件待裁。
做了
.env.e2e 的管理員帳號登入失敗三次,把 blsadmin 鎖了 15 分鐘(決策者正在用)。已用 SQL 把失敗次數歸零解鎖。決策
教訓
.env.e2e 的管理員密碼與 DEV 不一致,三次失敗就鎖,鎖到的是決策者正在手測的帳號。實打一律先打一次、失敗就停、改用 SQL 或另一個帳號。留給下一棒: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,不能抓請求行。下棒第一件事把這支查完。
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 皆修正待驗證,各卡末段有首腦驗收與明天手測清單。
做了
GRC_403022 required evidence.cloud-integration.read;根因 T-2.1 改名直翻、沒照附錄 D 第 4 條改 grc.project.read。IT Manager 新舊表都沒那顆,出貨五角色靠 evidence.*.read 剛好蓋住所以測不出。開 CM-2587。grc.audit.read 的讀取端點 BE 12 支+套件 1 支,附錄 A 皆如此登記、非誤歸;DEV 命中「有 audit.* 或 project.read 卻無 audit.read」的角色三個(PM/IT Manager/IT執行人員),出貨五角色全有。建議乙、決策者裁乙,開 CM-2588。pi-check 字型圖示撞主題 theme.css:11394 的 CSS 畫勾;改 CheckIcon/MinusIcon,守衛三條、突變兩紅、headless 截圖三態分明。決策
教訓
-c "... RETURNING id" 的輸出會夾 INSERT 0 1,拿去當變數會把後續 SQL 弄壞;要 -Atq 或分開跑。第一次建臨時帳號因此留下孤兒列,已清。推翻了什麼
留給下一棒:決策者手測 2586/2587/2588+勾選框(清單在 CM-2586 卡末段);「專案管理員不能做專案自動分類」待決策者給帳號;GET /user/<uid> 停用列 500 收尾前順手收;待裁 3/4/5 不變。
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 開與做。九張修正待驗證。
做了
決策(決策者)
教訓
git stash 或分 commit,git checkout 單檔會把同檔未 commit 的正式改動一起還原(本棒踩一次、重做了一遍)。:view="true" 嵌入的頁,矩陣掃描器靜態抓不到 view 條件;CM-2589 已讓掃描器認 !props.view,但執行期才決定的(回饋頁 feedbackScope)仍要豁免登記。留給下一棒:接決策者下一批回饋;九張等收 Done;「專案管理員不能做自動分類」待帳號;GET /user/<uid> 停用列 500 未開卡;待裁 3(基線重產,migration 累計 22 支)/4/5 不變。
做了:ui_routes 加 tree_page,專案規劃/專案總覽/稽核計畫三支內頁上角色樹成專案管理底下的子頁;稽核寫入五顆從我的稽核改綁稽核計畫頁。migration 2026-10-08-fr132-tree-work-faces.sql 只套 DEV。
推翻了什麼:第 6 棒定案「內頁一律不上樹」→「內頁預設不上樹,tree_page=true 者上樹成第三層」(決策者 2026-10-08 裁)。
卡上沒寫、runner 補做
tree_page 會長成「稽核計畫 › 專案規劃」且輪次頁按鈕全倒進稽核計畫。migration 一併把十支內頁改掛對應子頁(依 FE breadcrumb)。home_route_name 升級時照套件宣告覆寫,只改 DB 會被打回;jedi-compliance-audit 的 close/import 宣告同步拿掉 home_route。pageTitle 相鄰同名去重,輪次版才能併回同一列。教訓:pattern 授權有 Redis 展開快取,直接 SQL 塞 role_capability_patterns 不會清快取——臨時角色要一次建好 pattern 再指派,先建空角色登入一次就會快取到空集合。
留給下一棒:專案總覽與終局圖仍有落差(修改任務歸專案規劃、檢視/審閱任務歸專案管理、留言證據歸待辦任務),擁有者規則下無法只靠本卡收斂,待決策者裁(選項見 CM-2594 卡)。出貨基線待重產(本 arc 累計 25 支)。
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。
做了
決策(決策者)
grc.job-evidence.read 可讀;未結案只認 grc.job.read(通則 A 例外)。tree_page=true 例外上樹;三子頁用側欄既有頁名。教訓
cb3308e0 在抽屜散寫 6 處 hasCap 弄紅 v-can 守衛,runner 跑守衛抓到並正確不越權修。首腦直做也要跑該檔對應守衛再 commit。source .env 在 zsh 會把含空格的註解行當指令(.env:45: command not found: AI),無害但吵;要查值用 python 解析。推翻了什麼
tree_page 例外(決策者裁)。a9c15c1d/BE d519efe7c)。留給下一棒:見 STATE「下一步」。四張待收 Done;基線重產(26 支)/舊客戶庫 dump/push 三件等決策者裁;T-4.5 轉真擋與收口動作之後才排。
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 進版紀錄。
做了
guidant_ai_baseline_20261008_1536_before_FR-132.dump);test_module_boundaries 三條紅轉綠。guidant_ai_rehearsal/_pre 走 migrate.sh,首腦自己 SQL 展開逐列 diff 遺失 0(8 筆差異皆裁定刪除的 workflow.*/bulletin.read)。排練庫未 drop。project_site_regression_gate_suspended_until_rebuild)。docs/spec-site/v1.26.0/。sentry_sdk/integrations/;2926721749 最終。190 第一次 deploy 容器起不來(主機 seccomp errno 524,unattended-upgrades 新核心未重開)→ 決策者重開 → sudo guidantai start。[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 核過事件。決策(決策者)
教訓
git log main..HEAD -- <pkg>/ 逐支,不要靠 diff --stat 的目錄名 grep。add_pkg(gunicorn、sentry_sdk 同病);症狀是 init 吞例外只記 warning、服務照常起。一次列完「該在/實在」diff(容器內 ls /app/<pkg>/ 對本機 site-packages)再修,不逐輪補。.env 密碼鍵是 DB_PASSWORD 不是 CLAUDE.md 寫的 DB_SECRET;讀成空字串 psql 會改互動問密碼、看起來像掛住。pgrep 手動 kill,否則 verify 守門擋或互撞。reboot-required 旗標=升級後容器可能起不來(seccomp errno 524);三台都有旗標但只有 190 重演,升級前看一眼、起不來就重開再 guidantai start,不重跑 upgrade。推翻了什麼
21b90c2c8)。留給下一棒:見 STATE。FR-132 實作與上版皆完成;剩決策者打 tag、收 Done;follow-up 清單在 STATE 備忘。