FR-170 交接現況(STATE)

這份是 living 檔:每棒就地 Edit,只描述「此刻」。歷史脈絡看同資料夾的 FR-170-LOG.md。

項目 值
最後更新 2026-10-31 下午(第 4 棒:P1~P3 全部完成、總驗收、合回主線並推 origin)
狀態 P0~P3 全部完成並合回三 repo 的 feature/FR-139、已推 origin;主系統已接契約(BE 18642c6cf/198074868)、Agent 改釘正式版(c99da8c)。 剩:P1~P3 的工作坊 29 結案、188 真跑一次 Nuitka 出包、BE 重啟
branch BE/Agent/jedi 皆 feature/FR-139,本機與 origin 一致(Agent 3ab1253、jedi fc67330e、BE 052f54af3 之後再加本棒交接 commit)
母卡 P0:CM-3232(17 張,全 Done,工作坊 28 已於 10-30 結案)/ P1~P3:CM-3324(16 張:CM-3319~3323、3326~3330、3332~3335、3345、3357,全部驗收通過;工作坊 29 可結案)。CM-3325/3331 是作廢的空母卡(已 Done 標「已併入」)
本機 Agent ~/guidant-agent-local/start-agent.sh 跑主資料夾 feature/FR-139,venv evidence-agent-knWYPLiu-py3.13;agent.db v7
接手前必讀 §0

🧭 原始需求 / WHY

  • 決策者原話(2026-10-29):「當初的定位已經被老闆推翻了」「現在變成像 SaaS 的其中一個端點,比較像 Client」「未來難預測會不會重點功能都移到 agent 這邊」「不想再重複開發很多東西」「看起來是一坨義大利麵」。
  • 要解決什麼:evidence-agent 21,000 行平鋪在 core/ 一層、36 支各寫 SQL、27 處全域、與主系統重複實作密碼政策/LDAP/session/事件碼。根源是 jedi-common 釘 0.0.31,什麼 jedi 套件都裝不進去只能另寫。
  • 目標(已達成):Agent 當獨立產品看,模組在外、層在內(guidant_agent/{platform,identity,sync,scan,netdiag,files,console,shared}),五個業務模組彼此只走 port,守衛擋新程式寫錯位置。
  • 決策者後續裁示:命名 guidant-agent/guidant_agent;半夜無人值守一路跑完(P1~P3 單一工作坊批 12~23);「很多決策其實沒那麼重要,都可以往下跑」→ 14 張卡都 append「無人值守決策表」;P4(心跳瘦身、指令類改直推 8443)暫緩,等重構完再議,因為要改主系統。

§0 接手讀序

  1. 本檔 §1、§2、§4
  2. FR-170-LOG.md 第 4 棒 block(總驗收怎麼做、合回時 FR-167 衝突怎麼解、review 結論)
  3. Agent repo:docs/ARCHITECTURE.md(憲章,P3-5 後是終局版)、CLAUDE.md「程式放哪裡」「資安開發規範」、.claude/rules/security/ 六支
  4. ../design.md §2 目標結構、§5~§5.3 四期拆卡、§7 風險;../../../analysis/2026-10-29-agent-architecture-direction.md
  5. 要開 P4 才讀:本 LOG 第 4 棒「P4 分析」段(心跳 24 鍵分三類、只有指令類該改直推、WebSocket 不做的理由)

§1 終局現況(2026-10-31)

目錄:core/、api/、di_containers/ 已刪;guidant_agent/ 八個模組(identity 22 支、sync 34、scan 41、netdiag 23、files 19、console 18、platform 29、shared 7,約 23,600 行)。LEGACY_MODULE_OF 只剩 main_app/config/common 三個頂層 8 列(設計保留)。

守衛(全部綠、白名單歸零):跨模組 import 邊 70→0、模組層全域 27→0、模組內層級方向(新)0、SQL 只在 adapters(platform 維運兩支保留)、core/ 不存在(新)、背景元件、檔案 800/函式 60、資安規則覆蓋、只包一把鎖的類別(新)。

行為不變的證據:全量 2014 綠(P0 前 55 支測試檔全保留;新增守衛與元件測試);主控台+資料面 49 條路由路徑與重構前 d2fe93f 完全相同;心跳 byte 比對測試綠;demo 模式空庫升 v7、SIGTERM 兩秒內結束;本機真機連 DEV BE 心跳 200、主控台登入、API 無 session 401、8443 無憑證 TLS 層拒絕。

review:ddd-compliance-reviewer(opus)掃 310 檔 diff 結論「只搬不改」,五個最危險檔(心跳迴圈、下載通道、密碼驗證與 rehash、Fernet 金鑰、connector subprocess 參數)逐行等價。兩條阻斷首腦修在 8a807dc(platform 經字串 import 繞進 identity;LDAP 指紋寫入掉鎖),九項警告由 CM-3357 清完。

套件(Nexus 正式版):jedi-common 1.3.7、jedi-password 0.1.0、jedi-iam 1.11.0(主線後被 FR-167 升到 1.11.1)、jedi-source-scan 0.5.1、jedi-ai-gateway 0.1.3、jedi-agent-protocol 0.1.0、jedi-remote-agent 1.11.0。Agent 釘 jedi-common 1.3.7、jedi-file-upload 1.5.0、jedi-password、jedi-agent-protocol 0.1.0b1(P3-2 釘的是 beta,改釘 0.1.0 正式版併入下一張 Agent 小卡)。

FR-167 交會:主線 FR-167 P8-5/P9-4(/update/notify、/update/progress、/update 守門、1.4.6)在合回時人工歸位到新結構,功能一個不少;/update/* 由 sync.register() 掛。主系統不需跟著改。

Agent 1.4.6 是第一個新架構版:P2-5 改了 Nuitka 編譯清單與 manifest 檔案清單但沒在 188 真跑過,出包前必跑一次 build_all.sh(已用 prompt 通知 FR-167 首腦)。

§2 四期總表

期 母卡 卡 狀態
P0 相依斷層+宿主殼+守衛 CM-3232 17 Done,合回 8585e99/9044d95,工作坊 28 已結案(10-30)
P1 搬 identity、sync CM-3324 5(3319~3323) 驗收通過,合回 3ab1253
P2 搬 scan/netdiag/files、console 退聚合、刪 core/ CM-3324 6(3326~3330、3345) 同上
P3 抽 jedi-agent-protocol CM-3324 4(3332~3335) 同上;套件 jedi fc67330e
收口清理 CM-3324 1(3357) 同上
P4 心跳瘦身/指令類改直推 8443 未開 估 3 張 2 批 暫緩,要改主系統,等決策者

§3 Notion 卡索引

母卡 CM-3232(P0)、CM-3324(P1~P3)。子卡網址:notion-cards-made.json(P0)、notion-cards-p1-made.json、notion-cards-p2-made.json、notion-cards-p3-made.json、notion-cards-p3-5-made.json;parent-cards.json 列母卡對照。拆卡底表 cards.py/cards_p1.py/cards_p2.py/cards_p3.py。

§4 下一棒要做什麼

決策者動手

  1. P1~P3 那輪的工作坊(29,母卡 CM-3324)結案:狀態頁按,會收三 repo 的 .worktrees/CM-3324。P0 那輪已於 10-30 結案。
  2. Agent 主資料夾 CLAUDE.md 有 agent-workshop 自動寫的 pointer 區塊未 commit(2026-10-31 13:20),由工作坊自己處理,首腦不碰。

首腦(等令) 3. 188 真跑 Nuitka:git pull 到 3ab1253,scripts/build/build_all.sh,驗編得過、startup_gate 驗章過、smoke 起得來;壞了多半是 P2-5 清單漏檔。FR-167 首腦若先跑了就看他的結果。 4. 主系統接契約 已做(第 4 棒直接做,決策者「你直接做」):BE 18642c6cf 釘 jedi-remote-agent 1.11.0+jedi-agent-protocol 0.1.0、EventCode 43 碼改取契約、新守衛 test_event_code_agent_contract.py;198074868 套件守衛三表登記。BE 要重啟。 5. Agent 改釘正式版 已做:c99da8c。 6. P4 裁示後開卡(暫緩中):分析在 LOG 第 4 棒。結論:心跳回應 24 鍵裡只有指令類 4 鍵(pending/restart/update/取消)該改直推 8443,設定同步類改帶版本號有變才送,對帳類不動;WebSocket 不做(落地版不需要、資安比直推差、SaaS 不開 8443 時再議)。約 Agent 一張+主系統一張+jedi-remote-agent 一張,建議另開 FR 因為改對外契約。 7. 拆兩支超標 connector(sonarqube.py 1,711 行、inspec.py 1,052 行,P2-2 只搬不拆):另開卡。 8. 收尾文件(等令):design §8 改成「P0~P3 完成」、docs/analysis 補一篇「無人值守決策表」與「Done ≠ 進主線」的教訓、Agent docs/oversized-files.md 核對。

§5 已定裁示(不要重問)

  • 四條裁決全採建議;命名 guidant-agent/guidant_agent;套件開發卡只發 beta、結案卡轉正式。
  • 三期母卡原本各自獨立(P0 結案要求子卡全 Done),後決策者裁「P2、P3 合併到 P1 卡下面半夜跑完」→ 14 張全掛 CM-3324 單一工作坊。
  • 無人值守決策表(2026-10-30 晚,決策者「很多決策其實沒那麼重要」):白名單同形直接加、版號撞號自己 bump、既有紅燈不修只記、卡上路徑與實際不符以實際為準、對方缺方法補薄方法;真的要停只有別人的未 commit 改動/branch 不對/要做卡上明寫另開卡的事。
  • domain 層准用純演算法庫與零相依 kernel 庫(cryptography、PyJWT、jedi-password);只包一把鎖的類別算全域、要收進 DI(P3-5 落實)。
  • P4 暫緩,等重構完成再議(2026-10-31)。
  • 主系統不因本次重構改動(心跳契約與資料面介面不變)。

§6 pre-flight(接手先跑,唯讀)

cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
for r in ~/Projects/Billows/Audit-Manager/evidence-agent ~/Projects/Jedicogy/module/jedi-python-package .; do echo "== $r"; git -C $r log --oneline -2; git -C $r status --short --untracked-files=no | head -3; git -C $r rev-list --count origin/feature/FR-139..HEAD; done
ls ~/Projects/Billows/Audit-Manager/evidence-agent/guidant_agent/; ls -d ~/Projects/Billows/Audit-Manager/evidence-agent/{core,api,di_containers} 2>&1 | grep -c "No such"
git -C ~/Projects/Billows/Audit-Manager/evidence-agent worktree list
sqlite3 ~/Projects/Jedicogy/agent-workshop/.workshop/workshop.db "select id,status,approved_stage from workshops where id in (28,29)"
lsof -nP -iTCP:8010 -sTCP:LISTEN | tail -1   # 本機 Agent

§7 行為規範(本案特有)

  • 首腦不開 subagent;唯一例外是母卡收口的 ddd-compliance-reviewer(CLAUDE.md 規定),派時帶 model/effort。
  • 驗收用「合併演練+全量測試+路由集合 diff+demo 起服務+真機基本功能」一輪批次做,不逐檔讀(決策者兩度點名「不要用沒效率的方式分析」「不要檢查的太繁瑣」)。路由比對用 git grep -hoE '(\.route|add_url_rule)\("/[^"]*"' <ref> -- '*.py' ':!test/*' 兩個 ref 各一份 diff。
  • Done ≠ 進主線:工作坊把卡合進 ws-<母卡> 就標 Done,首腦抽查要多看一步 ws vs feature/FR-139。
  • 合回主線前先把主線合進 ws 解衝突,在 ws 上跑全量,再合回主線;平行 FR 在舊路徑上加的改動 git 會跟著 rename 套到新位置,但要核對,並把舊路徑 import 改掉。
  • 卡工作區跑守衛可能假紅:.worktrees 排除要用相對路徑判(d7bc4e6)。
  • push:glab auth git-credential 已設為 gitlab.com 的 credential helper,推前 git fetch 確認遠端無新 commit。
  • 查 Nexus 版號:curl -u jedi:$(security find-generic-password -s poetry-repository-nexus -a jedi -w) http://192.168.50.171:8082/repository/pypi-group/simple/<pkg>/。