每棒追加一 block,既有 block 不改。發現舊 block 有誤 → 在新 block「推翻了什麼」欄更正。
本棒範圍:從「jedi-asset plugin.py 很亂」一句話起頭,長成三段 arc(FR-089/090/091)並派出第一波。
commits(主專案):ceb455df FR-089/090 母卡登記+資料夾、c4129183 plugin-anatomy 說明頁進站、7fad430c FR-091 登記。其餘 commit 由各 runner 產出,見 Notion 各卡回寫。
派出/收回:
決策(全部決策者 2026-09-12 裁):見 STATE §2 表。關鍵三條——全部統一、adapter 與填表同檔放 core/plugins/(改判 1684)、DI 瘦身排最後。
推翻了什麼:
教訓:
doc-site-build 模式進站,不要在套件目錄手寫 HTML(做了一次又重做一次)。下一棒:STATE §3。
收回:CM-1692 jedi-notification Done(247 passed、守衛突變紅、harness smoke 含真 SMTP sink、主專案 6 import+boundaries 90 passed,均以 PYTHONPATH 指工作樹跑)。
教訓(runner 抓到):主專案 venv 裡 jedi-notification 是 Nexus wheel 0.0.11,pyproject.toml:199 path override 是註解掉的。在主專案跑的驗證若不強制 PYTHONPATH,驗的是舊 wheel,假綠。這條會影響第一批其餘四支與之後所有批次;已寫進 STATE §4 並 append 到四張在跑的卡。首腦驗收 SOP 加一步:先印 jedi_<pkg>.__file__。
runner 加分:發現 SMTP adapter 寄不出去時端點仍回 200(只有 data=false),把 harness smoke 改成起假 SMTP sink 斷言真的收到信。這是「壞了會靜默」的典型,值得其他有寄信的套件照抄。
收回:CM-1691 ai-bot、1692 notification、1693 integrity、1694 remote-agent、1695 ai-dashboard 全 Done。各支 pytest 綠(ai-bot 36/notification 247/integrity 105/remote-agent 110/ai-dashboard 62)、版面守衛突變全紅、主專案 import 全 OK、boundaries 90 passed(PYTHONPATH 指五支工作樹)。
教訓:
tests/ 被裝成頂層套件遮其他套件的 tests.xxx(首腦驗收抓到)。後者整理前就有。兩條都寫進 STATE §4,第二批卡的手測段固定帶。--smoke,只能 app.run() 綁 port,並行驗收時互撞。標準形狀該把 --smoke(test client)列為必備,SOP §6.1 要補。git add 會把別人的檔夾帶進自己的 commit(1692 的 87f3a86 夾了 1693 的 14 檔)。內容沒壞,但 git log 對不上卡。卡上「顯式 git add」要改成「只 add 自己套件目錄下的檔」。推翻了什麼:無。
下一棒:等 1689;然後第二批。
收回:CM-1689 Done。core/plugins/ 11 檔、app_factory 695→450 行改迴圈、兩支守衛突變紅、boundaries 90 passed、BE 重啟零 Traceback、11 支插件各打一條真實端點全部掛載且守門生效。SOP §5 與 plugin-anatomy 改三步版並重 build。
runner 改判首腦設計:Plugin(build, register)+raw → 每檔 mount(app, container, host) 單一契約+HostContext。理由:一半插件簽名對不上,逃生口若一半人要走主路徑就是錯的。首腦認同。
推翻了什麼:首腦 ea34a17e docs commit 吞了 1689 runner staged 的 22 檔(③④⑤ 三組),git log 對不上卡;1692 同型吞了 1693 的 14 檔。根因是裸 git commit 提交整個 index。已寫進 STATE §4/§7。
教訓:
git commit -- <路徑> 是硬規則,寫進下批卡與首腦 SOP。grep build_* 找接線入口漏了被 route 直接 import 的函式,起 BE 才炸 ModuleNotFoundError;改 AST 掃全部 import 才抓齊。搬模組類的卡要寫「用 AST 掃 import,不用 grep 符號名」。api.js 或套件 routing 抓真實 URL,猜 URL 浪費三輪。本棒 context 已滿,建議下一棒換 session 冷接。
本棒範圍:冷接 → 開 FR-091 第二批五張(CM-1697~1701)→ 給三張並行 prompt → 驗收 1697/1698/1699 收 Done → 開收尾卡 CM-1702 → 給 1700 與 1702 的 prompt,兩張派出。
commits(主專案):bb463736 第二批開卡、README 第一批標 Done;之後三個 docs commit(前三張驗收 Done、開 1702、1700/1702 派出中)。套件側 commit 由 runner 產出(bulletin 6、file-upload 6、system-core 7),見各卡回寫。
派出/收回:
決策(首腦裁,無決策者新裁示):
core/plugins/(STATE §4 早已預告,不另開卡)。推翻了什麼:
教訓:
PKG_ROOT = Path(plugin.__file__).parent 在拆檔後失效,bulletin 照抄也中,1699 runner 用突變才抓到。開卡「照範例做」之前,範例本身要先被突變驗過一次。下一棒:STATE §3。本棒 context 尚可,繼續驗 1700/1702。
收回:CM-1701 license-runtime、1712 issue、1713 log、1714 flow-engine、1716 survey 全 Done。1701/1716 含主專案 G 組(license 接線收進 core/plugins/license.py;survey 接線改走 D8 identity、IAuditNicknameEnricher 退役、順收 evidence-classification 三處死引用)。
開卡:第三批 CM-1712~1716(1703~1711 非本 arc)。改判 STATE §2 兩條:log 已有 IUserNameResolver port 不另開 identity;survey repo JOIN 早在 CM-1512 拔了,做的是三條補名路徑收成 D8 一條。flow-engine 與 compliance-audit 主專案接線共用 api/flow_control/__init__.py,收斂全交 1715 G 組。
推翻了什麼:
/survey-folders 送 pager 回 500,差點當回歸;baseline 一樣炸,FE 只送 {is_delete:0}。打端點前看 FE 送什麼,不憑 RequestMetaSchema 慣例猜。教訓:
plugin/wiring.py 第六檔、1713 forwarding/plugin.py 不拆——標準形狀允許有理由的偏離,判準是「反悔條件有沒有寫進 README」。下一棒:派 1715;再開三張大卡。
本棒範圍:冷接 → 第二批五張開卡與驗收 → 收尾卡 1702 → 第三批五張開卡、四張驗收 → 三張大卡開卡 → 派出 1715、1725 → 交接。FR-091 從 5 Done 推到 14 Done。
commits(主專案):全是 docs——bb463736 第二批開卡、2efa62ae 1702 驗收、01256f86 1701 驗收、932123d7/本棒最後一個 STATE/LOG 補記,以及第三批開卡、四張驗收、大卡開卡各一個。套件側 commit 全由 runner 產出(見各卡回寫)。
派出/收回:收 Done 11 張(1697~1702、1712~1714、1716、加 1700/1701 的 G 組);在跑 1715、1725;已開待派 1726、1727。
決策(首腦裁,決策者未另裁):
推翻了什麼:
教訓(本棒新增,前面 block 已記的不重複):
notion_case.py get 輸出 pipe 進 awk 會被截成空,先重導到檔再讀。下一棒:STATE §3。本棒 context 尚可但接近臨界,建議下一棒換 session 冷接驗 1715/1725。
本棒範圍:冷接(自檢四題、pre-flight)→ 決策者追問「能力點(capability)是不是定義在套件內、怎麼檢查」→ 查明現況 → 拍板 → 開三卡 → 1726/1727/母卡 append → README 登記。1715/1725 仍在跑未回寫,未驗收任何卡。
commits(主專案):e545e851 docs(FR-091) 能力點前置三卡開卡。套件側零 commit(本棒沒派 runner)。
開卡:CM-1728(asset 定形 CAPABILITIES 清單+jedi-common Capability 型別,Opus/high,可派)、CM-1729(bulletin/system-core/notification 補清單,survey 23 處寫死字串收 config,Sonnet 5/medium,等 1728)、CM-1730(主專案守衛:Plugin 帶 capabilities、測試掃 PLUGINS 對 seed 檔,Sonnet 5/medium,19 支齊了才派)。1726 append detection 寫死字串收 config 段;1727 append「先列能力點表等裁」段;母卡 1690 append 裁示+四卡對照表。
查明的事實(首腦核對):
DEFAULT_*_CAPABILITY 常數進 PluginConfig),route 用 @capability_required(lambda rt: rt.config.xxx) 取名。判定全在主專案:core/plugins/_host.py:87-91 把 common.authz.require_capability 填進 adapters,實體在 jedi_iam.authz.capability(super_admin 旁路→查有效角色指派→flask.g 快取)。這是標準 ports and adapters,不動。scripts/init/04-seed-core.sql(127 筆,gen_seed_sql.sh 從基線庫 pg_dump 產生),21 支套件的 migrations/ 都不 seed。同一件事寫三次(migration→基線庫→seed 檔),沒有守衛比對套件宣告與 seed。role_capabilities 在 seed 檔是 (2, 135) 寫死整數對;06-admin.sql 已改用名字查 id;近期 migration 也是查 name 回 id。決策(決策者裁):
推翻了什麼:survey guards.py 檔頭「require_capability 不 port 化」的設計說明(CM-1716 前一棒留的)被本棒裁示推翻,由 CM-1729 改寫。
教訓(本棒新增):
notion_case.py append 參數是 --file,zsh 用 set -- $pair 拆字串不會拆,改用陣列。plugin/assembly.py 的 build_services() 是備用組裝路徑(宿主沒給 provider 才走),主專案實際走 DI container Factory;兩套並存是刻意的,回答要說清楚哪條是實際路徑。決策者另交代(本棒起生效):派工 prompt 從簡(model/effort 一行+卡 URL+工作目錄+branch+並行注意+回寫不等令),細節全寫進卡片白話。
下一棒:STATE §3。1728 prompt 已交決策者。
決策者打開 jedi-integrity 看到頂層 12 支業務檔平鋪問「是不是沒整理好」。首腦掃 21 支頂層:integrity 12 檔/iam 1 檔(security_policy.py)平鋪;五支開頂層 ports/(file-upload/issue/notification/oscal-v2/iam,iam 雙軌);jedi-issue tests 在套件內。根因:FR-069 早期各支就近做的選擇,FR-091 前三批的卡與驗收 SOP 都沒列「頂層平鋪/ports 位置/tests 位置」為檢查項,runner 照卡做自然漏。處置:SOP §4.3 補三條規則;開 CM-1731(integrity 歸三層,Sonnet 5/medium)、CM-1732(三支 ports+issue tests,Sonnet 5/medium),1725 append iam 兩處;驗收 SOP ③ 加三項;oscal-v2 無 plugin 仍待裁。commit:SOP+README+STATE 見本次 commit。教訓:定形範例(asset)本身沒有的問題,卡與 SOP 就不會提到——每批開卡前該對全部套件跑一次「與範例的目錄樹 diff」,不只看範例有的東西。
ui_routes+route_capabilities)。決策者裁 21 支全列、形式一致。開 CM-1734 兩段式(Opus/high):第一段 134 筆歸屬表回寫等確認(seed 有 21 筆舊命名:report 沒有點會讓 Capability.__post_init__ 炸、cloud_integration/notify_config/flow_template/system_config 用底線,活廢待查),第二段補 12 支。1730 改「每支必帶、空 tuple 允許」。修正待驗證;1728 runner 已 commit jedi 89db991。驗收照角色規則開新 session(十步實跑回報太長,不在首腦 context 跑)。runner 查出:seed 127 筆非 134(7 筆 cruise-project 只在 DEV);20 筆綁停用頁面疑廢;首腦 grep 的 survey.create 2 處是 authz 文件範例非守門、漏了 cloud_integration 4 筆 11 處守門;「21 筆舊命名」是首腦用 DEV 數減算錯,實為 14。決策者四點裁:① report 不進套件清單不改型別;② flow_template.* 歸主專案(誰的 route 在守);③ 主專案 39 筆要宣告但歸 FR-090 另開卡,1730 先豁免名單;④ 疑廢照列不刪。oscal-v2/common 走豁免不建目錄。教訓:首腦開卡引用的數字要標來源(DEV 庫 vs seed 檔),兩者不同步時差額會被誤讀成規律。
驗收棒(新 session)十步實跑:1715 通過 Done——identity port/拆檔/dataclass/疆界守衛全有突變證明;打折處:FR-048 403 路徑因 DEV 孤兒 mapping 湊不出真實 AP 未複驗,採信 runner;順手查出 task-setup/tree 500 既有缺陷(CM-1492 時期)與 compliance-audit 缺 compose/integration tests,記 STATE §3 第 8 項。1725 不通過改需修正——A~F 六組全過品質好,但首腦追加段三項(security_policy 歸位、ports 雙軌收斂、get_tenant_by_uid 500→404)一項沒做;runner 補三項不重做。教訓:追加段 append 在卡尾,runner 開工時可能已讀過卡沒再回頭看——之後追加要求時同步在派工 prompt 點名「卡尾有首腦追加段必讀」,或乾脆等 runner 收工再開小卡。
jedi_task_platform/migrations/__init__.py 出實作、兩子插件委派(第三方案,避免 task 委派 participant 的怪方向又不建第三組 plugin);_guarded() 不搬;ctx 不留 alias。participant 10 條註解死路徑 E 組刪。能力點兩半空 tuple 已由 1734 做,1727 只確認守衛。__all__ 沒同步凍結集合,HEAD 上 license-runtime/remote-agent/log 紅。教訓:「commit 了」不等於「回寫了」,runner 鐵律三步缺第二步等於首腦看不到;驗收棒 SOP ② git log 對卡 之外要加「HEAD 全量 pytest」,因為並行卡會把前一張的綠跑成紅。api/survey/__init__.py 接線 0ac7022d),驗證等級中,開驗收 case。決策者裁「驗收是首腦本職,不外派」——第 3 棒前段把 1715/1725 驗收外包給新 session 是角色理解錯誤(CLAUDE.md「執行外包」指產出,驗收抽查屬首腦本體);之後一律自驗,context 撐不住就中繼交接。
comm 對照 c29bad9 vs ~1 為 93 vs 90,新增 3 紅同一根因(_assert_wiring 把 capability_required 列必填但測試 fixture 沒給)。教訓:runner 說「逐字相同」要看它有沒有貼 diff 指令;沒貼一律自己 comm。git commit -- <路徑> 漏了 12 支未追蹤新檔,本機綠是假綠,checkout 即 ModuleNotFoundError(1734 runner 抽出還原實測)。教訓:驗收 SOP 加 ⓪ git status 看該卡有無 ??;「顯式 git add」規範的真正理由就在這。tests/ 的 tail -1。comm,90/90;自我檢討寫得對——上一棒是拿改動後的失敗集合比「記憶中的數字」,契約變嚴造成的新紅正好在盲區。core/plugins/task.py 組 adapters、attach 留 flow_control 共用 blueprint),首腦接受並確認 1715 已收同形;稽核詞守衛白名單隨檔案搬路徑屬維持原狀。runner 抓到 venv jedi-common 0.0.22 舊 wheel 讓 baseline 起不來,與 memory 舊坑同源。comm 輸出;沒有就是沒比。0,/pat/s// 是空替換、Nd 行號算錯,兩個突變「沒紅」其實沒改到檔,差點誤判守衛無牙齒;突變前必看 git diff --stat。能力點線收口:Plugin 帶 capabilities(Optional=None 表「沒填」判紅,空 tuple 允許),五條守衛把 21 支 80 筆對 seed 127 筆分四類(套件 80/主專案 36/疑廢 11/待裁 report 1)零未歸類,四突變全紅。runner 兩處自主判斷都比卡好:api_log 一檔掛兩子插件合算;三支接線還在 api/ 的套件不純豁免而直讀清單進對照。順帶暴露 FR-090 漏網:ai-bot/ai-dashboard/remote-agent 接線從沒收進 core/plugins/,CM-1689 的 11 支沒涵蓋到,記 STATE 待辦。教訓:「豁免名單」本身要有守衛(第五條),否則新抽套件靜靜落在掃描外。
git stash 驗既有紅(連 1727 兩張)。SOP 措辭要改:把「開 worktree 到開工前 commit」寫成驗既有紅的唯一方法放最前面,不是「禁 stash」放尾巴——禁令擋不住手順,替代方法才擋得住。test_jedi_package_logger_names.py 的 PENDING_RELEASE(三支已納管),9fff7772。決策者看 plugin-anatomy 說「文件不要帶歷史資料,一堆演進看不出最後變怎樣」。裁:說明文件只寫現況,歷史去 git log 與 LOG——與 CLAUDE.md 註解規範同精神套到 docs。CM-1736 範圍改為 anatomy 重寫成純現況(刪「這次整理做了什麼」整節、刪所有「原本/改判/第 N 棒」句),驗收 grep 歷史關鍵字出現即退回。此規則應進 docs/claude/docs-conventions.md(下一棒順手):docs/features/<FR>/ 的說明類文件(design/anatomy/README 結論段)只描述現況,沿革一律進 LOG/commit。
本棒範圍:冷接 → 決策者追問能力點機制 → 開能力點三卡+版面三卡+普查卡+oscal/common 卡+PM 文件卡(1728~1736 共 9 張)→ 驗收 12 張(1715/1725/1726/1727/1728/1729/1730/1731/1732/1733/1734/1735)、退回 3 張後補過 → FR-091 25 卡全 Done → 決策者授權 push 兩 repo → 三份 README 同步現況 → 交接。1736 已回寫未驗。
commits(主專案,全 docs 除兩支):e545e851/7d48f010/f88feed1/a8a42514/fb8ef624/244711c6/f3833c04/a7b9e157/3b8e1b12/47a77ac0/5de8c801/4d365c22/640e62f9/fc52124d/8fb5668f/7b2c58a2/7eac645b/adea9323/4d9e048d/b788bf33/8cc99ffb/8fc8c1c1;非 docs:9fff7772(PENDING_RELEASE 清空)。runner 側:0ac7022d(survey 接線)、a436c1c3(detection G)、3bbb3daf(task G)、96775277(compliance-audit G)、902927c9(license 測試路徑)、ec8ee592(1730 守衛)、13b4c817/c2f90adf(1736 文件)。套件側 60+commit 見各卡。
決策(決策者裁):能力點跟著套件走、21 支全列形式一致、migrate 自動補 row 另開 FR;survey/detection 收 config;config 留 contract.py;report 不進套件清單;flow_template.* 歸主專案;主專案 39 筆歸 FR-090;疑廢照列不刪;oscal-v2 輕量版、common 只註解 logger;驗收是首腦本職不外派;push 授權(僅此次、僅 feature/FR-075);說明文件只寫現況、歷史進 LOG;PM 頁術語可用但要白話定義。
推翻了什麼:第 2 棒收的「forwarding 不拆」偏離(1733 收回);survey guards.py「capability 不 port 化」設計說明(1729 改寫);首腦自己開卡時的 is 比對測試(interning 無牙齒,改 AST);首腦「只給 route 有守門的套件列清單」判準(漏 FE 選單那半);首腦前段把驗收外派給新 session(角色錯);1713 時接受的 jedi-log 白名單路徑寫法沒錯,1727 同理接受。
教訓(本棒新增):
commit -- 路徑 漏未追蹤檔、runner「與 baseline 相同」靠記憶、驗既有紅伸手 stash——四件全在這棒第一次撞到,驗收 SOP 補 ⓪ 與 ④,派工尾註要固定加 runner 側四條。git diff --stat。In progress+append 缺項段。下一棒:STATE §3。1736 待驗 → arc-review → 收口裁決。本棒 context 已到臨界,建議換 session 冷接。
決策者裁:DEV 太慢(188 遠端每查一趟),把 guidant_ai_dev pg_dump 拉回本機 localhost:5432,以後 DEV 就是本機;188 那份退為快照。已派小弟做(純環境操作不開卡)。memory project_dev_db_moved_to_local 已寫;CLAUDE.md「DB 環境清單」DEV 列與 sql-migration-conventions.md 等本機跑起來確認後由下一棒改。STATE §6 環境座標的 DEV DB 那列同步。
本棒範圍:冷接(自檢六題、pre-flight 全綠;發現 STATE「BE 文件 commit 未推」已過時,實際兩 repo 無領先)→ 決策者問 PM 頁「三個零件裝法還是舊式」是什麼 → 實查 core/plugins/ 17 檔、config/app_modules.py 三個字串、三支 api/<mod>/__init__.py 確認屬實 → 決策者裁「要」→ 開 FR-090 第 7 棒 CM-1737 並登記母卡/README/STATE。1736 尚未驗。
commits(主專案):本 block 所在 commit(FR-090 README、STATE、LOG)。
開卡:CM-1737(三支接線收進 core/plugins/,Sonnet 5/medium)。卡上首腦核對過的事實:RedisChatHistoryStore 與 infra/remote_agent/adapter/lazy.py 三個 Lazy 代理都只有接線一個 caller 可整支搬;infra/remote_agent/ 另三支 adapter 是 DI 注入留原地;remote_agent_container 10 處反向依賴、ai_dashboard_container 保留不動 DI;三支 register() 都是標準簽名;對外 URL 1+2+14+主專案自掛 1 條共 18;socketio 模式會跑 PLUGINS 迴圈,照 detection/license 先例不加條件。
關鍵決定:remote-agent 留主專案的 binary 端點 /agents/files/<uid> 必須走 mount_api=False 逃生門(先拿 bp、add_resource、再 register_blueprint)——本專案 Flask 3.1.3,register_blueprint 之後再加 rule 會被 _check_setup_finished 拋錯,不能先 mount_api=True 再掛。與現行 api/remote_agent/__init__.py 做法等價。
推翻了什麼:無。
教訓:PM 頁的「還沒做的事」是拿來對照的好清單——決策者一句「為什麼還有三個」就把 STATE §3 (c) 排隊的卡逼成了實卡。
下一棒:派 CM-1737(等決策者發令);驗 1736;arc-review。
__pycache__ 殘骸讓 test_converged_plugin_adapters_do_not_return_to_infra 假紅(rm -rf 後綠),記 STATE §4 小卡候選。主專案側 21 支同形。workflow_templates:不是公版,是 5 個測試專案(blsadmin 4 個 07-27~30、jediadmin 1 個 08-09,皆 tenant_id NULL,因建立當下 context 無租戶)帶出的副本;module_frames 指向的母範本全在 102,公版住租戶 1 的 59 筆。STG/POC 皆 0 筆。決策者裁刪,首腦單 transaction 刪本機 DEV:專案 5/輪次 5/流程執行 132/任務執行 132/範本 191/證據 56/控制項對應 127/翻譯 127/指派 23/成員 6。順帶發現 project_audit_rounds 17 筆孤兒(指向 06-15 已刪專案,無 FK),未動。FR-087 報告兩處要更正:① 191 筆已不存在;② 該表「含公版可讀規則」寫錯,四條規則全是租戶比對、無 super_admin 旁路,開 RLS 後租戶 1 的 59 筆公版子租戶看不到,與問卷平台旗標同題待裁。RLS 修正卡仍未開,決策者裁先走 FR-089 收口順序。app_modules.py 與 1737 同檔,現 1737 已收可放。建議 1737 → arc-review → 再放 FR-092 純刪卡,避免 review 範圍混入。core/plugins/ 後往下走(arc-review)。決策者裁「開吧」。開 CM-1738(Opus/high,五 agent 平行只讀不修),範圍 BE 84ea07ef..0422c5d6(118 commit)+jedi da25a8d..c26a313(172 commit)。卡上首腦點名九題,最重的一題是「21 支由 8 個 runner 平行做,名字一樣、行為一不一樣」——抽 iam/detection/survey 三支並排看 contract/guards/init。另要求 harness 抽五支實跑、守衛列出有牙齒/沒牙齒、能力點三層(套件宣告/Plugin 引用/seed/DEV)對照。FR-089 母卡 append、README 進度表加收口列。
runner 產出報告但 session 結束未 commit 未回寫,首腦接手:commit 9b29a70d、回寫、Done。首腦復核兩 Critical 屬實(C1 本機 DEV 三端點 500+log NameError;C2 四個測試檔 find 零命中)。決策者裁「開吧」→ 一次建六張 CM-1739~1744。拆法:C1+C2 一張(同 Critical 且都在 system-core/detection/iam)、I-6 與 I-4 分開但序列(同批 core/plugins 檔)、I-1+I-2 一張(都是補暱稱鏈)、I-3 一張、守衛清單一張。I-5/M/註解不開,等發版前順手。教訓:runner 報告寫完就掛,收工三步缺兩步——arc-review 這種長棒要在派工 prompt 提醒「報告落檔後先 commit 再繼續寫回寫」。
同一 runner 連做兩張:77ccfae6(1740,13 adapter 加 ABC 繼承)+83d741c8(1743,_di/_lazy 收 _host.py)。首腦驗:13 個 __mro__ 全對、abstract 空集合、突變 TypeError;乾淨 worktree 100 passed;BE 重啟六支端點零 500。抓到一處紀律問題:77ccfae6 單獨 checkout import 不起來——runner 把 1743 的 consumer 改動(compliance_audit.py 改 import lazy)夾進 1740 的 commit,而 lazy() 下一個 commit 才進 _host.py。runner 回寫「100 passed」是工作樹兩張都改完的數字。並行分支不 rebase,兩 commit 視為一組收下。教訓:同 runner 連做兩張要在派工 prompt 寫「每張 commit 後 git stash -u && pytest && git stash pop 或開 worktree 驗該 commit 自足」;驗收 SOP ④「在該卡 commit 的 worktree 跑」正是抓這個,這次抓到了。順帶:1741 runner 未 commit 的新守衛在 HEAD 工作樹上把 core/plugins/participant.py:79,87 判成補暱稱複本(實為 user-directory port 實作),留給 1741 判白名單。
git log --all 零命中=從沒寫過,BE 補真測試 2de451e8。git add test/test_module_boundaries.py 把 1741 未 commit 的守衛 hunk 吞進 c1fa594c;工作樹上還剩 1744 的三條版面守衛 hunk。commit -- 路徑 對同檔不同 hunk 無效。教訓:三張卡動同一個守衛檔時,派工 prompt 要寫 git add -p 只加自己的 hunk,或首腦開卡時就把守衛拆檔(test/boundaries/test_<topic>.py)避開同檔。_row_to_dto 佔位改 None(runner 自抓);FE 6b7b0f2 兩欄補退路(A 案:B 案會把「同欄兩語意」寫進契約,runner 判斷對)。首腦突變塞回裸 SQL 守衛紅;資源庫列表暱稱補到。首腦失誤記錄:runner 上一棒早已把 FE 查證與選案 append 在卡上,首腦盤點時沒讀到卡尾就判「未查證」——讀卡要讀到底。ProjectRoleGuardAdapter 兩份同名不同實作,記 STATE 待辦。test_module_boundaries.py 這一個 1,600 行的守衛檔。下次開卡前先拆檔(test/boundaries/test_<topic>.py),比事後要求 git add -p 可靠。fill_user_names 是硬理由);七支 description 拿掉內部代號。jedi 2837fea。poetry update 21 支,逐支 realpath 全指 site-packages;守衛族 141 passed;api/socketio 兩模式零 Traceback;十一條端點實打全 200/合法碼、暱稱補得到。poetry.lock 是受版控的(memory 舊記載「gitignored」已過時),退役六支自 lock 消失,另 commit。