FR-089 交接日誌(LOG,append-only)

每棒追加一 block,既有 block 不改。發現舊 block 有誤 → 在新 block「推翻了什麼」欄更正。


§1

2026-09-12 首腦第 1 棒(整天,中繼交接)

本棒範圍:從「jedi-asset plugin.py 很亂」一句話起頭,長成三段 arc(FR-089/090/091)並派出第一波。

commits(主專案)ceb455df FR-089/090 母卡登記+資料夾、c4129183 plugin-anatomy 說明頁進站、7fad430c FR-091 登記。其餘 commit 由各 runner 產出,見 Notion 各卡回寫。

派出/收回

  • 收 Done:CM-1676(jedi-asset 整理 A~F)、1677(收尾修正+ctx→runtime)、1678(RLS+enum 小寫)、1683(空殼清理)、1684(port 歸位 infra/)、1686(iam 收斂+開 identity port)、1687(補暱稱走 D8)。
  • 派出在跑:CM-1689(接線收 core/plugins/)、1691~1695(FR-091 第一批五支)。
  • 已開待派:CM-1696(DI 瘦身,排 18 支後)。

決策(全部決策者 2026-09-12 裁):見 STATE §2 表。關鍵三條——全部統一、adapter 與填表同檔放 core/plugins/(改判 1684)、DI 瘦身排最後。

推翻了什麼

  • 首腦開 1686 時寫「root admin 守門搬 infra/iam/、role_app_service 整支刪」→ runner 實查 route 已在套件用註冊名取服務、update_role 差集要在 @transaction 內,改判 A 案留原地瘦身。首腦的錯,runner 對。
  • 首腦開 1677 時寫「用 system_status 篩選守 override」→ runner 突變發現永遠綠(base 對 SAEnum 本就等號比對),改用 String 欄位守。首腦的錯。
  • 首腦開 1687 時寫「七處補暱稱」→ 實為三套並存(helper 15 consumer/三支手寫複本/flow_engine),正解改 helper 內部;且 project_service:502 是第四份複本卡上沒列。
  • 首腦開 1684 時判「adapter 放 infra/」→ 決策者裁「一檔看完」後改判放 core/plugins/(1689)。
  • 首腦第一次盤 FR-080 時誤讀母卡為 Done → FR-080 首腦澄清仍在收口,收口範圍重切(發版等四項移入 89)。

教訓

  • 開卡的「怎麼修」若涉及 runtime 行為(守衛、突變),首腦先跑一次再寫進卡,否則 runner 會抓到假守衛。
  • 驗守門類功能前先查「誰受保護」的定義,別憑帳號名猜(首腦誤停 blsadmin 一次,已復原)。
  • 說明文件要照 doc-site-build 模式進站,不要在套件目錄手寫 HTML(做了一次又重做一次)。
  • 中繼交接該在派出六張之前做,不是之後——本棒 context 已吃緊。

下一棒:STATE §3。


§2

2026-09-12 晚 首腦第 1 棒補記:CM-1692 驗收

收回: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 斷言真的收到信。這是「壞了會靜默」的典型,值得其他有寄信的套件照抄。


§3

2026-09-12 晚 首腦第 1 棒補記:FR-091 第一批五張驗收

收回: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 指五支工作樹)。

教訓

  • 主專案 venv 有兩層假綠陷阱:Nexus wheel 遮工作樹(1692 抓到)+ jedi-asset tests/ 被裝成頂層套件遮其他套件的 tests.xxx(首腦驗收抓到)。後者整理前就有。兩條都寫進 STATE §4,第二批卡的手測段固定帶。
  • 三支 harness 沒 --smoke,只能 app.run() 綁 port,並行驗收時互撞。標準形狀該把 --smoke(test client)列為必備,SOP §6.1 要補。
  • 並行 runner 用寬鬆 git add 會把別人的檔夾帶進自己的 commit(1692 的 87f3a86 夾了 1693 的 14 檔)。內容沒壞,但 git log 對不上卡。卡上「顯式 git add」要改成「只 add 自己套件目錄下的檔」。
  • runner 1694 自己在 B 組留了 module-level 建路由表的 import 順序地雷、E 組自己抓到修掉,且發現一版「子行程 import」的守衛抓不到突變而換法。這種自我糾錯值得記。

推翻了什麼:無。

下一棒:等 1689;然後第二批。


§4

2026-09-12 晚 首腦第 1 棒補記:CM-1689 驗收,FR-090 五棒收口

收回: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。

教訓

  • 共用工作樹 + 並行 runner ⇒ git commit -- <路徑> 是硬規則,寫進下批卡與首腦 SOP。
  • runner 用 grep build_* 找接線入口漏了被 route 直接 import 的函式,起 BE 才炸 ModuleNotFoundError;改 AST 掃全部 import 才抓齊。搬模組類的卡要寫「用 AST 掃 import,不用 grep 符號名」。
  • 首腦驗收打端點要先從 FE api.js 或套件 routing 抓真實 URL,猜 URL 浪費三輪。

本棒 context 已滿,建議下一棒換 session 冷接。


§5

2026-09-12 深夜 首腦第 2 棒:第二批開卡、前三張驗收、收尾卡與 1700 派出

本棒範圍:冷接 → 開 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),見各卡回寫。

派出/收回

  • 收 Done:CM-1697 bulletin、1698 file-upload、1699 system-core(首腦自跑:三支 pytest 159/173/225 全綠且 integration 真起容器、版面守衛突變紅、harness --smoke 過、boundaries 過、AST 掃 53 條 import 全通、BE 帶三支工作樹重啟零 Traceback、真實端點 401/200/暱稱)。
  • 派出在跑:CM-1700(evidence-classification,含主專案側 G 組收進 core/plugins/)、CM-1702(收尾小卡)。
  • 已開待派:CM-1701(license-runtime,等 1700 收回,同動 BE 兩檔)。

決策(首腦裁,無決策者新裁示)

  • 1700/1701 加 G 組把主專案接線順手收進 core/plugins/(STATE §4 早已預告,不另開卡)。
  • 1702 三件併一張:asset/bulletin PKG_ROOT、主專案 file-upload URL 守衛改讀 FROZEN_URLS、第一批三支 harness --smoke。
  • 兩個行為面既有缺陷(file-upload set_save_dir/delete_file 死分支、system-core get_system_menu_by_id 從來不能用)記母卡待決策者裁,本批不修。

推翻了什麼

  • 首腦開 1697 寫「既有 77 支、41 處註解」→ 實為 97 支、74 處(不影響做法)。開 1699 寫「config/menu 兩套內部寫法要統一」→ runner 實查兩半本就同套,真正差的是 route 命名/取 body/logger 三項。首腦盤點時只掃數字沒讀檔,數字型斷言照舊不準。
  • 1697 runner 推翻卡上「entity 改 dataclass 照標準寫法」:查詢 entity 要容忍 FE 多送六個欄位,硬改 dataclass 會讓公告列表 500,保留容忍並加測試釘住。

教訓

  • 範例套件自己有缺陷,抄一支傳一支:jedi-asset 的 PKG_ROOT = Path(plugin.__file__).parent 在拆檔後失效,bulletin 照抄也中,1699 runner 用突變才抓到。開卡「照範例做」之前,範例本身要先被突變驗過一次。
  • 驗收打端點前先看 route 方法:三條列表都是 POST 帶 RequestMetaSchema,GET 打回 405 差點誤判。
  • 三張卡的驗收批次跑(pytest/突變/smoke/import 一次全部)比第 1 棒逐張快很多。
  • 給 file-upload 這種 venv 是 wheel 的套件,prompt 裡把「帶與不帶 PYTHONPATH 各印一次 file 貼進回寫」寫死,runner 就真的貼了,驗收不用再猜。

下一棒:STATE §3。本棒 context 尚可,繼續驗 1700/1702。


§6

2026-09-13 上午 首腦第 2 棒補記:1701 驗收、第三批開卡與四張驗收

收回: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 組。

推翻了什麼

  • 首腦開卡的數字型描述(測試支數、註解處數、login 級端點數、import 檔數)五張卡全被 runner 實查改掉,無一準確。開卡數字一律標「估計」,做法不受影響。
  • 1716 卡上寫「既有 320 支全綠」→ 實況 48 紅 42 錯,一行沒改就紅。首腦沒跑 baseline 就寫。驗收時用 worktree 退到開工前 commit 實跑對照,失敗集合逐字相同才收。
  • 首腦驗收打 /survey-folders 送 pager 回 500,差點當回歸;baseline 一樣炸,FE 只送 {is_delete:0}打端點前看 FE 送什麼,不憑 RequestMetaSchema 慣例猜。

教訓

  • 開卡前要先跑一次該套件的 pytest 當 baseline 寫進卡,runner 才有對照;沒 baseline 的紅燈驗收成本高。
  • 1713 runner 對 logger 九種取法分「刻意/隨手」並各自加守衛,這種「先分類再改」比一律改名穩,第三批以後 logger 多的套件開卡照這樣寫。
  • 1714 多出 plugin/wiring.py 第六檔、1713 forwarding/plugin.py 不拆——標準形狀允許有理由的偏離,判準是「反悔條件有沒有寫進 README」。

下一棒:派 1715;再開三張大卡。


§7

2026-09-13 上午 首腦第 2 棒收尾(中繼交接)

本棒範圍:冷接 → 第二批五張開卡與驗收 → 收尾卡 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。

決策(首腦裁,決策者未另裁)

  • 1700/1701/1715/1716/1726/1727 加 G 組把不在 CM-1689 11 支內的主專案接線順手收進 core/plugins/,不另開卡。
  • log 不另開 identity(已有 IUserNameResolver);survey 三條補名路徑收成 D8;task-platform 多子插件照 jedi-log 判例各自 plugin/、runner 先定形等令。
  • 行為面既有缺陷一律記母卡待決策者裁,本 arc 不修(累計:file-upload set_save_dir/delete_file、system-core get_system_menu_by_id、jedi-iam get_tenant_by_uid 500、survey 資料夾暱稱 null、issue member 查無不一致;疑死碼 survey auth_required 零消費端、task_survey_ref_items 鏈;測試債 survey 48 紅 42 錯、主專案 test_license_cross_tenant_duplicate)。

推翻了什麼

  • STATE §2「log 開 identity port」「survey 拔 repo JOIN」兩條被實查改判(見第三批 block)。
  • 首腦開卡的所有數字型描述(測試數、註解數、endpoint 數、import 檔數)沒有一張準。已改成「估計」並在大卡先跑 baseline 寫進卡。
  • 首腦驗 survey-folders 送 pager 差點誤判回歸;打端點前要看 FE payload。

教訓(本棒新增,前面 block 已記的不重複)

  • 大卡開卡前先跑 baseline 寫進卡,runner 的紅燈才有對照——1716 沒有,驗收多花一輪 worktree 對照。
  • notion_case.py get 輸出 pipe 進 awk 會被截成空,先重導到檔再讀。
  • runner 對「標準形狀」的有理由偏離(1713 forwarding 不拆、1714 多一檔 wiring.py、1701 guards.py 不放 decorator)都應接受,判準是反悔條件有沒有寫進 README。
  • 中繼交接該在派出兩張大卡之後、驗收之前做——這次抓對了時機,STATE 乾淨沒有半成品。

下一棒:STATE §3。本棒 context 尚可但接近臨界,建議下一棒換 session 冷接驗 1715/1725。

§8

2026-09-13 下午 首腦第 3 棒(能力點前置開卡,中繼)

本棒範圍:冷接(自檢四題、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 裁示+四卡對照表。

查明的事實(首腦核對)

  • 套件只宣告能力點「預設名字」(asset 六個 DEFAULT_*_CAPABILITY 常數進 PluginConfig),route 用 @capability_required(lambda rt: rt.config.xxx) 取名。判定全在主專案:core/plugins/_host.py:87-91common.authz.require_capability 填進 adapters,實體在 jedi_iam.authz.capability(super_admin 旁路→查有效角色指派→flask.g 快取)。這是標準 ports and adapters,不動。
  • 能力點列表 100% seed 在主專案 scripts/init/04-seed-core.sql(127 筆,gen_seed_sql.sh 從基線庫 pg_dump 產生),21 支套件的 migrations/ 都不 seed。同一件事寫三次(migration→基線庫→seed 檔),沒有守衛比對套件宣告與 seed。
  • survey(23 處)與 detection(7 處)在 route 直接寫死字串,繞過 config;survey guards.py 檔頭有前一棒「capability 直接 import jedi_iam 不 port 化」的刻意決定,與 asset 形狀矛盾。
  • role_capabilities 在 seed 檔是 (2, 135) 寫死整數對;06-admin.sql 已改用名字查 id;近期 migration 也是查 name 回 id。

決策(決策者裁)

  • 能力點跟著套件走(裝了才有、拔了就沒有)。前置先做:套件列清單、主專案守衛。
  • migrate 自動補 row 是大 arc,另開 FR,因為要處理 Administrator 初始權限與寫死 id。
  • survey/detection 都收成 config 形狀。
  • config 不獨立成檔,留 contract.py(契約一處看完)。
  • 不等全部:1728 現在派,前一批照排程,1730 最後收口。

推翻了什麼:survey guards.py 檔頭「require_capability 不 port 化」的設計說明(CM-1716 前一棒留的)被本棒裁示推翻,由 CM-1729 改寫。

教訓(本棒新增)

  • 卡片 spec 內互相引用未建的卡號只能寫佔位符,建完立刻 append 補正(本棒三張+三張 append 一次做完,沒漏)。
  • notion_case.py append 參數是 --file,zsh 用 set -- $pair 拆字串不會拆,改用陣列。
  • 決策者中途問「這是不是自己 DI」時,plugin/assembly.pybuild_services() 是備用組裝路徑(宿主沒給 provider 才走),主專案實際走 DI container Factory;兩套並存是刻意的,回答要說清楚哪條是實際路徑。

決策者另交代(本棒起生效):派工 prompt 從簡(model/effort 一行+卡 URL+工作目錄+branch+並行注意+回寫不等令),細節全寫進卡片白話。

下一棒:STATE §3。1728 prompt 已交決策者。

同棒追記(2026-09-13 下午,版面殘留)

決策者打開 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」,不只看範例有的東西。

同棒追記二(2026-09-13 下午,能力點改 21 支全列+api 四件)

  • 決策者問 1728 是否涵蓋全部套件、指出 jedi-issue 沒有。首腦承認原判準錯:只給「route 有 capability_required 的套件」開卡,漏了能力點另一半用途——前端選單/頁面守門(ui_routesroute_capabilities)。決策者裁 21 支全列、形式一致。開 CM-1734 兩段式(Opus/high):第一段 134 筆歸屬表回寫等確認(seed 有 21 筆舊命名:report 沒有點會讓 Capability.__post_init__ 炸、cloud_integration/notify_config/flow_template/system_config 用底線,活廢待查),第二段補 12 支。1730 改「每支必帶、空 tuple 允許」。
  • 決策者指出 api 也要統一。掃 21 支 api/:三處平鋪(license-runtime、remote-agent、log forwarding——1713 時首腦以偏離收,現在推翻)→ CM-1733;三支無 serializers 是 request 不走 schema 的設計缺口(ai-bot/evidence-classification/issue),1733 只盤點等裁。SOP §4.3 加 api 四件。
  • 1715/1725 已回寫 修正待驗證;1728 runner 已 commit jedi 89db991。驗收照角色規則開新 session(十步實跑回報太長,不在首腦 context 跑)。
  • 推翻了什麼:1713 驗收時接受的「forwarding 不拆」偏離;1729 卡文「detection 以外」的措辭仍對但涵蓋面要靠 1734 補齊。
  • 教訓:判準要從「資料的用途」出發,不是從「程式碼有沒有呼叫」出發——能力點有兩個消費者(BE 守門、FE 選單),只 grep BE 就漏一半。

同棒追記三(2026-09-13,1734 歸屬表裁決)

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 檔),兩者不同步時差額會被誤讀成規律。

同棒追記四(2026-09-13,驗收棒回報 1715/1725)

驗收棒(新 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 收工再開小卡。

同棒追記五(2026-09-13,1727/1729/1734 回報)

  • 1727 定形三點裁:migrations 走 jedi_task_platform/migrations/__init__.py 出實作、兩子插件委派(第三方案,避免 task 委派 participant 的怪方向又不建第三組 plugin);_guarded() 不搬;ctx 不留 alias。participant 10 條註解死路徑 E 組刪。能力點兩半空 tuple 已由 1734 做,1727 只確認守衛。
  • 1734 改需修正:14 個 commit 都在(21 支全有 CAPABILITIES),但卡上沒第二段回寫、且加 __all__ 沒同步凍結集合,HEAD 上 license-runtime/remote-agent/log 紅。教訓:「commit 了」不等於「回寫了」,runner 鐵律三步缺第二步等於首腦看不到;驗收棒 SOP ② git log 對卡 之外要加「HEAD 全量 pytest」,因為並行卡會把前一張的綠跑成紅。
  • 1729 回寫完整(四支 commit+survey 23 處守門走 port+403 實打 GRC_403022+主專案 api/survey/__init__.py 接線 0ac7022d),驗證等級中,開驗收 case。

同棒追記六(2026-09-13 傍晚,首腦自驗一輪)

決策者裁「驗收是首腦本職,不外派」——第 3 棒前段把 1715/1725 驗收外包給新 session 是角色理解錯誤(CLAUDE.md「執行外包」指產出,驗收抽查屬首腦本體);之後一律自驗,context 撐不住就中繼交接。

  • 1725 Done:補三項全實跑過(506 passed、兩突變紅、88 條 import 全過、404 實打)。
  • 1729 退回:runner 回寫「survey 失敗集合與 baseline 逐字相同」不實——首腦 comm 對照 c29bad9 vs ~1 為 93 vs 90,新增 3 紅同一根因(_assert_wiring 把 capability_required 列必填但測試 fixture 沒給)。教訓:runner 說「逐字相同」要看它有沒有貼 diff 指令;沒貼一律自己 comm。
  • 1731 退回:30b040e 用 git commit -- <路徑> 漏了 12 支未追蹤新檔,本機綠是假綠,checkout 即 ModuleNotFoundError(1734 runner 抽出還原實測)。教訓:驗收 SOP 加 ⓪ git status 看該卡有無 ??;「顯式 git add」規範的真正理由就在這。
  • 1734:21 支清單齊、對 DB 0 不符、抓到 1731 壞 commit 是好功;但自己的凍結集合 10 支仍紅——它回報的「N passed」只跑了新測試檔。教訓:回報「測試綠」必須是該套件整個 tests/ 的 tail -1。
  • 1727 B 組中,docstring 觸發主專案稽核詞守衛已提醒。1726/1732 待首腦驗
  • 裁:派 1730 前四支(issue/file-upload/flow-engine/ai-bot)改 path dep。

同棒追記七(2026-09-13 中午,1727/1729/1734 Done)

  • 1734 Done:21 支 80 筆對 seed 零缺、凍結集合雙向守;issue vcs_integration 21 紅為既有(efa8f75~1 相同)記待辦。
  • 1729 Done(退回一次後):runner 這次真的開 worktree comm,90/90;自我檢討寫得對——上一棒是拿改動後的失敗集合比「記憶中的數字」,契約變嚴造成的新紅正好在盲區。
  • 1727 Done:定形三裁全照做;task 接線與 compliance-audit 同形(core/plugins/task.py 組 adapters、attach 留 flow_control 共用 blueprint),首腦接受並確認 1715 已收同形;稽核詞守衛白名單隨檔案搬路徑屬維持原狀。runner 抓到 venv jedi-common 0.0.22 舊 wheel 讓 baseline 起不來,與 memory 舊坑同源。
  • 教訓:並行時 runner 回報「與 baseline 相同」必看有沒有 comm 輸出;沒有就是沒比。

同棒追記八(2026-09-13 下午,並行六棒全收)

  • 1726 Done:十步全過含 integration 真起容器、拔掉測試 35→0 條。首腦自驗踩坑:BSD sed 0,/pat/s// 是空替換、Nd 行號算錯,兩個突變「沒紅」其實沒改到檔,差點誤判守衛無牙齒;突變前必看 git diff --stat
  • 1731 Done(退回後):乾淨 worktree 只指自身 PYTHONPATH 109 passed;runner 改用 worktree 不用 stash,對。
  • 1732 Done:三支 ports 收斂、issue tests 搬根,file-upload 7 處深路徑 import 靠 shim 同物件。
  • 決策者中途問「套件重構與權限是不是混在一起」:是,FR-091 現在三條線(結構/能力點宣告/版面殘留),動同一批套件所以並行互踩;但每條線終點明確,權限判定邏輯一行沒改,能力點線只是宣告名字。
  • 盤面:23 卡 Done,只剩 1730。下一棒:四支改 path dep → 派 1730 → FR-091 收口。

同棒追記九(2026-09-13 傍晚,1730 Done)

能力點線收口:Plugin 帶 capabilitiesOptional=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 待辦。教訓:「豁免名單」本身要有守衛(第五條),否則新抽套件靜靜落在掃描外。

同棒追記十(2026-09-13 傍晚,1735 Done、全 arc push、開 PM 文件卡)

  • 1735 Done:oscal-v2 輕量版+common 註解 logger;runner 又用 git stash 驗既有紅(連 1727 兩張)。SOP 措辭要改:把「開 worktree 到開工前 commit」寫成驗既有紅的唯一方法放最前面,不是「禁 stash」放尾巴——禁令擋不住手順,替代方法才擋得住。
  • 順手清空主專案 test_jedi_package_logger_names.pyPENDING_RELEASE(三支已納管),9fff7772。
  • 決策者授權 push:BE 84ea07ef..9fff7772(104)、jedi da25a8d..c26a313(172),只推 feature/FR-075。
  • 開 CM-1736:PM 要看「插件怎麼納入主專案」白話版——anatomy 是工程師版且停在 09-12,另寫 for-pm.md(一個比喻貫穿、零術語、三個數字)+anatomy 補 09-13 後更新。
  • 本棒總結:從冷接到 25 卡全收,驗收 12 張、退回 3 張後補過;三條線(結構/能力點/版面)全部收口。角色教訓:驗收是首腦本職不外派;並行時 HEAD 顏色不代表單卡成果,全在該卡 commit 的 worktree 驗;突變前看 diff;runner 回報「與 baseline 相同」要看 comm 輸出。

同棒追記十一(2026-09-13,決策者裁文件寫法)

決策者看 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。

§9

2026-09-13 晚 首腦第 3 棒收尾(中繼交接)

本棒範圍:冷接 → 決策者追問能力點機制 → 開能力點三卡+版面三卡+普查卡+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 同理接受。

教訓(本棒新增)

  • 並行六棒同 monorepo 是新現象:HEAD 顏色不代表單卡成果、commit -- 路徑 漏未追蹤檔、runner「與 baseline 相同」靠記憶、驗既有紅伸手 stash——四件全在這棒第一次撞到,驗收 SOP 補 ⓪ 與 ④,派工尾註要固定加 runner 側四條。
  • 首腦自驗也會假綠:BSD sed 空替換與行號錯讓突變沒改到檔,差點誤判 1726 守衛無牙齒。突變前看 git diff --stat
  • 判準要從資料用途出發不從程式碼呼叫出發(能力點兩個消費者)。
  • 首腦引用數字要標來源(DEV 134 vs seed 127),差額會被誤讀成規律。
  • 追加要求 append 卡尾,runner 開工後不會回頭看——派工 prompt 要點名,或等收工開小卡。
  • Notion 沒有「需修正」狀態,退回改 In progress+append 缺項段。
  • 決策者中途問「是不是混在一起了」是對的:三條線動同一批套件,事前該講清楚「這波有三條線、互踩怎麼辦」。

下一棒:STATE §3。1736 待驗 → arc-review → 收口裁決。本棒 context 已到臨界,建議換 session 冷接。

同棒追記十二(2026-09-13 晚,DEV DB 搬本機)

決策者裁: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 那列同步。

§10

2026-09-13 晚 首腦第 4 棒(冷接、開 CM-1737)

本棒範圍:冷接(自檢六題、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)。卡上首腦核對過的事實:RedisChatHistoryStoreinfra/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。

同棒追記(2026-09-13 晚,1736/1737 收 Done、RLS 舊資料清除)

  • CM-1736 Done:決策者親看 for-pm/anatomy 收 Done,首腦未再跑 grep 驗(決策者已裁)。
  • CM-1737 Done:runner 一次做滿,回寫含 18 條實打表、三突變、乾淨 worktree 全量。首腦十步自驗全過;唯一插曲是首腦樹上 __pycache__ 殘骸讓 test_converged_plugin_adapters_do_not_return_to_infra 假紅(rm -rf 後綠),記 STATE §4 小卡候選。主專案側 21 支同形。
  • 決策者問 RLS 進度(不在本 arc):首腦查 FR-087 現況——13 張表隔離仍全關、無修正 commit。追查報告 §5.2 的 191 筆「無主」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 收口順序。
  • FR-092 撞擊面:12 張修正卡皆未派;只有 CM-1706 動 app_modules.py 與 1737 同檔,現 1737 已收可放。建議 1737 → arc-review → 再放 FR-092 純刪卡,避免 review 範圍混入。
  • 決策:套件都收在 core/plugins/ 後往下走(arc-review)。

同棒追記二(2026-09-13 晚,開 arc review CM-1738)

決策者裁「開吧」。開 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 進度表加收口列。

同棒追記三(2026-09-13 晚,1738 收、開六張修正卡)

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 再繼續寫回寫」。

同棒追記四(2026-09-13 晚,1740/1743 收 Done)

同一 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 判白名單。

同棒追記五(2026-09-13 晚,1739/1742 收 Done、1741 半張退回 In progress)

  • 1739 Done:C1 三行改對、21 支重掃零殘留、BE 重啟三端點 500→403、突變紅;六支全綠、survey 48 紅與基線 c26a313 相同。C2 四檔 git log --all 零命中=從沒寫過,BE 補真測試 2de451e8。
  • 1742 Done:搬檔正確、iam 506 passed、新守衛突變紅、白名單 18 列(runner 報 19)。
  • 1741 半張:I-1 jedi b077ed8 通過(六份收一、五支綠、三支列表暱稱補得到);I-2 BE 側未做完未回寫——複本未收、FE fallback 未查、participant 白名單未加。改 In progress,卡尾寫六步接手清單。
  • 並行同檔事故(第三次):1742 裸 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)避開同檔。
  • survey 48 failed 42 errors 是 arc 基線就有(review 已記四支既有紅),三個 runner 各自撞到各自解釋一次;下次開卡直接在紀律段寫明「survey 既有紅,不用查」。

同棒追記六(2026-09-13 晚,1741/1744 收 Done,六張修正卡全收)

  • 1741 Done:I-2 補齊——BE 7b5091fe 收裸 SQL 複本走 canonical+DI 注入 identity+_row_to_dto 佔位改 None(runner 自抓);FE 6b7b0f2 兩欄補退路(A 案:B 案會把「同欄兩語意」寫進契約,runner 判斷對)。首腦突變塞回裸 SQL 守衛紅;資源庫列表暱稱補到。首腦失誤記錄:runner 上一棒早已把 FE 查證與選案 append 在卡上,首腦盤點時沒讀到卡尾就判「未查證」——讀卡要讀到底。
  • 1744 Done:五突變全實跑(pycache 不紅/x.py 紅;三條版面守衛各紅);白名單兩列理由改正屬實。順帶暴露 ProjectRoleGuardAdapter 兩份同名不同實作,記 STATE 待辦。
  • 六張全收,FR-089 品質關過。 乾淨 worktree HEAD 守衛族 141 passed,BE 重啟零 Traceback。
  • 本輪並行紀律總結:三次同檔 hunk 混入(1740→1743 連做、1742 吞 1741、1744 hunk 留樹)。根因是三張卡都動 test_module_boundaries.py 這一個 1,600 行的守衛檔。下次開卡前先拆檔test/boundaries/test_<topic>.py),比事後要求 git add -p 可靠。
  • 下一步:決策者裁 §3 第 3 項——(a) 發版(pin 還原+推 Nexus+jedi-common 下限+SPEC+release note)、(b) CM-1696 DI 瘦身規則、(c) FR-090 36 筆能力點申報處、(d) migrate FR;以及 FR-092 12 張純刪卡、RLS 修正卡的排序。

同棒追記七(2026-09-13 深夜,發版 (a):21 支推 Nexus、pin 還原、pyproject 整理)

  • 決策者裁:版號都從 1.0.0 起算,有 2.x 的(oscal-v2)例外 → 20 支 1.0.0、oscal-v2 2.3.0;套件間下限全提到新版(jedi-common 新 export fill_user_names 是硬理由);七支 description 拿掉內部代號。jedi 2837fea。
  • 決策者裁 pyproject.toml 太多無效註解,收進 git 說明:BE 290→161 行(註解 170→42),21 支套件 pyproject 施工日誌全收;移掉的內容逐項寫進 commit message(BE e0496645、jedi 2837fea)。
  • publish:先發 jedi-common 驗認證,再批 20 支,Nexus 21/21 可見。BE 清掉 42 個 editable dist-info/symlink 後 poetry update 21 支,逐支 realpath 全指 site-packages;守衛族 141 passed;api/socketio 兩模式零 Traceback;十一條端點實打全 200/合法碼、暱稱補得到。poetry.lock 是受版控的(memory 舊記載「gitignored」已過時),退役六支自 lock 消失,另 commit。
  • 本機 DEV BE 以 Nexus wheel 起在 8000,決策者驗中。
  • 下一步:version-bump skill——BE 1.19.0→1.20.0、FE package.json 對齊、release note v1.20.0(含「切子租戶暫不對外」註記)、spec 快照。等驗完發令。

同棒追記八(2026-09-13 深夜,push 三 repo、開收尾三卡)

  • 決策者驗過本機 Nexus wheel 服務(api+socketio)→ 裁「先 push 一版不進版」→ 三 repo feature/FR-075 推上(BE 21 顆/jedi 4/FE 4),main 不碰。決策者強調「這版很重要」。
  • 決策者裁「2(未開卡收尾小項)先做,剛剛版白發了,用覆蓋版處理」。首腦說明 Nexus 版號不可覆蓋(publish 同版號 400),走法=收完發 1.0.1。開三卡 CM-1745(I-5 ports 殼+M-1~M-4,Sonnet 5/medium)、CM-1746(BE 註解收斂+ProjectRoleGuardAdapter 改名,Sonnet 5/low)、CM-1747(survey/issue 既有紅測試修到綠,Opus/medium)。首腦實查:ai-bot 與 integrity 兩支已綠,紅的只剩 survey(48F/42E,主因 mock.patch 目標搬走)與 issue(21F)。
  • 開卡紀律:A/B 同碰 identity.py,卡上明寫 git add -p;三卡建完立刻 append 互引卡號(建卡時只能寫佔位)。
  • 教訓:發版前應把「review 未開卡留存項」先收再發——這次先發了 1.0.0 才回頭收,多一輪 1.0.1。下次 arc 收口順序:review → 修正卡 → 留存小項 → 發版。

同棒追記九(2026-09-13 深夜,盤「後面哪些會動套件」)

決策者問後面哪些還動套件。首腦逐項對:會動=CM-1745(8 支,已派)、CM-1747(只 tests/,wheel 不含)、FR-092 CM-1722(7 支 pyproject 補 11 條漏宣告相依,併入 1.0.1,卡上兩處前提已過時──首腦 append 補正:BE 已是正式 pin、驗法改 build wheel 看 METADATA)、套件 src 剩 26 行棒號註解(可順手)、CM-1559 RLS fail-open(jedi-common+iam,不進 1.0.1)、CM-1696 DI 瘦身(可能開 provider,等裁)。不動=FR-092 其餘 11 張、CM-1746、RLS 甲~丁組、36 筆能力點、migrate FR。決策者裁 1722 併這輪。1.0.1 內容凍結為:1745+1722(+1747 tests、26 行註解可選)。

同棒追記十(2026-09-13 深夜,1746 收 Done)

乾淨 worktree 驗:施工日誌型註解命中約 100→30,留下的全是帶具體教訓的 CM 引用與 _host.py 決策理由;ExactProjectManagerGuard 改名落地、守衛 135 passed;四處路徑修三處(flow_engine:12 app/wiring.py 漏,小瑕疵留下次順手)。第四次同檔 hunk 混入:runner 自稱 git add -p 避開,但 42a8b8f2 實含 1745 的 identity.py 兩行 import 改動——兩條新路徑在 1.0.0 wheel 與工作樹都在,不會壞;已 append 告知 1745。判斷git add -p 靠人手選 hunk 不可靠,下次同檔並行一律「一張卡收完再派下一張」或事前拆檔。

同棒追記十一(2026-09-13 深夜,1722/1747 收 Done)

  • 1722 Done:七支 pyproject 補相依,首腦獨立 AST 重掃 21 支結論一致,七支 wheel METADATA 帶上。runner 記的 evidence-classification google 缺口是誤報(pyproject 已宣告)。
  • 1747 Done:兩支測試全綠(survey 432、issue 248+15 skip 有理由),套件源碼零改動。首腦兩條突變紅。決策者兩度問「他說全部沒改?」「所以可以通過嗎」——「程式一行未改」指套件源碼,測試側改 318 行是對齊現況,回報要把範圍講清楚,避免讀成「什麼都沒做」。
  • 1.0.1 內容凍結:1745(收完後)+1722;1747 只動 tests 不進 wheel。

同棒追記十二(2026-09-13 深夜,1745 收 Done → 1.0.1 發版;中途 session 斷線由新棒接續)

  • 1745 Done(首腦驗收):jedi 7b0ad25 三支頂層 ports/ 全刪、BE 5c220084 9 處改指正本;乾淨 worktree 八支全綠、BE 守衛 152 綠、突變紅、BE 打端點正常。發現 runner 留下 8 支 editable .pth+dist-info,首腦清掉。
  • 決策者裁 CM-1696 走 B 案(套件 contract.py 開宿主取用口),卡上已改寫成三棒分工,等 1.0.1 後拆子卡併 1559 那個套件版。開 CM-1748(36 筆主專案自有能力點申報處)。
  • 21 支 bump 1.0.1(oscal-v2 2.3.1)jedi ac9c152;wheel spot check 殼路徑 0、新相依進 METADATA。前一棒在 wheel build 完後 API 400 斷線(非 context 滿),新棒爬 JSONL 接手。
  • 決策者裁「先發 1.0.1,1696 B/1559/migrate 進 1.1.0」。publish 21/21 ok;BE poetry update 8 installs+13 updates,realpath 全 site-packages、零 .pth;守衛 152 綠;BE 起在 8000,十條端點 8×200+405/403 合法,零 Traceback。
  • 教訓:1.0.0 → 1.0.1 這輪的順序病已記在追記八;本輪另一條——runner 做套件卡會在 BE venv 留 editable 殘留,首腦驗收清單要加「ls site-packages | grep jedi_.*pth」。
  • 下一步:version-bump(等令);1696 拆三張子卡+1559 三件裁示+1748 派工,都等決策者發令。

第七任首腦(2026-09-13 晚,接手斷線 session;1.0.1 發版→FR-092 全收→1696 拆卡→FR-093/094 開卡)

  • 接手:前棒在 wheel build 後 API 400 斷線(非 context 滿)。爬 JSONL 接續:推 21 支 1.0.1 上 Nexus、poetry update(清掉 runner 留的 8 支 editable .pth)、BE 十端點驗、pin commit 3bf476a9。決策者裁「先不進版」。
  • FR-092 全案收口(母卡 1703 Done):16 棒實作(1704~1707、1717~1724)+3 棒收尾(1763 文件、1764 十九檔搬家、1765 四張表)全驗 Done。BE commits:28e341cd/33480fd6/b6288dfe/2383d747/0b1998f8/283be277/c91d07a7/dacdda2f/6899e513/68636536/92585fb3/e8f2ec89/be621b61/4c8990cc;jedi 677f20f;FE 620ab15
  • 決策:1696 走 B 案拆 1749~1751;1704 的 19 檔留(活 schema)→ 1764 搬家;B 類四張表全 drop;FR-093 D1–D8 全照建議;FR-094 三件裁示(見 STATE §2);四支 audit-round route 不併 FR-092、待開小卡。
  • 開卡:CM-1748(36 筆能力點申報,已 Done f88d8d8a);1749~1751;FR-093 1752~1762(design d19bd68083f0227e);FR-092 收尾 1763~1765;FR-094 1766~1773(3bfd8dfb);1445/1453 併入結案。
  • 推翻了什麼:① 1696 卡上「iam 零引用可整刪」錯——主專案叫它 auth_container,34 處引用,只瘦不刪;② FR-093 派工單「asset 002 要先改冪等」錯——1.0.1 wheel 已是 pg_enum 判斷式;③ 前一棒「FR-092 與 1696 有先後」錯——零交集;④ FR-087 盤點寫 workflow_templates 無主 191 筆,DEV 實查 0(188 快照數字),.2e 卡要求再查。
  • 教訓:① 同 repo 平行棒 commit 夾帶(68636536 收了 1720 未 commit 的改動)→ 尾註固定「只 add 自己的檔」;② marshmallow 字串 Nested 是 grep 盲區 → 立守衛;③ runner 在 path dependency 期驗的 200 不等於 pin 還原後(1765 實為 400)→ 驗收用最終 pin 重打;④ runner 做套件卡會留 editable .pth → 首腦驗收清單加查;⑤ 1705 runner 逐檔 grep 時互引檔命中就跳過、刪完引用者沒回頭刪被引用者(pdf_backend 漏刪)。
  • 下一步:STATE §3(派 1753+1757、1767;1.1.0 一次收;version-bump 前跑 site-regression)。