FR-133 交接紀錄(LOG)

append-only:每棒追加一個 block,寫完不改。要更正舊 block,在新 block 的「推翻了什麼」寫明。現況看 FR-133-STATE.md。

§1

第 1 棒 — 2026-10-09 — 首腦(設計定案、開卡、派工、驗收)

commits:BE a2aa7d9dd(design 定案)… df999ed90(T-R 白名單),全部已 push feature/FR-133;FE 9e4e5d18/6d2d4e56/7d1f64a0;jedi-python-package 6d815fec/e6574acf/9a943a54;evidence-agent 2dea7c8/a26464c/7e6e1e3。本 block 所在的文件 commit 未 push。

18 張卡(卡號/做什麼/commit/驗收結論/打折處)

  • CM-2601 母案(D1–D10)/—/未收/—
  • CM-2602 T-A1 jedi-log log_events 開關與 capture_exception(1.3.4)/jedi 6d815fec/合格,突變有牙齒/無
  • CM-2603 T-A2 後端預設不送 ClientError、worker 與 socketio 補送/BE 1f45680c6/合格,四項驗收過/用本機 envelope 接收器代替站台;socketio 沒實打
  • CM-2604 T-B0 DEV 實跑十項/BE a5bd492b2/合格,D1、D2 成立/無
  • CM-2605 T-B1 compose 加站台、前門 /bugsink//BE 4fadd8add、FE 9e4e5d18/合格/本機 arm64 無產品 image,只起 db/bugsink/fe 三支,後端送件用替身容器
  • CM-2606 T-B2 包收 image(釘 digest)與烙印密碼檔/BE 333e5c22d/腳本層合格/build_bundle.sh 全流程未在 188 跑(轉 T-R)
  • CM-2607 T-B3 安裝器首裝建站、升級補站/BE 1631d4f27/合格/Linux 容器只載入函式、只起 db 與站台,真機 root 安裝未跑
  • CM-2608 T-B4 bugsink-vacuum/bugsink-set-password/BE ace6a5f1a/合格/harness 載入子命令,guidantai status 未實跑
  • CM-2609 T-C1 轉送端點與設定端點/BE 98cc3c934、FE 6d2d4e56/合格,DEV 實打五項/無
  • CM-2610 T-C2 前端登入後接回/FE 7d1f64a0/合格,headless 實跑/兩組 DSN 以環境變數暫時指向本機站台
  • CM-2611 T-D 診斷包改打 Bugsink 讀取 API/BE 16fd0f110/合格/無
  • CM-2612 T-V 端到端驗收/—/待派/—
  • CM-2613 T-E 文件/—/待派/—
  • CM-2614 T-C1b 轉送端點收使用者與 Agent 兩種身分/BE 5dc3dd6cb/合格,含偽造 typ 401/臨時三專案站台與不帶排程的後端
  • CM-2615 T-C3 Agent 錯誤回報、註冊與心跳回應帶設定/BE 2795930fb、Agent 2dea7c8/合格/本機 compose 站台、Agent 跑原始碼非 image
  • CM-2616 T-C4 沙箱只通站台的網段/BE ca6b743de、jedi e6574acf/合格,隔離實測/redis 與 seaweedfs 用替身、沒跑真機安裝
  • CM-2617 T-B3b 三專案三組 DSN、診斷包撈三專案/BE aa084603f/合格/fetcher 用假 HTTP 層、install.sh 未完整跑
  • CM-2618 T-A3 jedi-log 遮罩補 Bearer 值(1.3.5)/jedi 9a943a54/合格,突變有牙齒/站台手測延到 190
  • CM-2619 T-R 發版、釘版、出包、部署 190/BE fdec6b758、df999ed90,Agent a26464c、7e6e1e3/進行中,卡在 Nexus npm 快取/—

決策

  • D1 自動建專案走 bugsink-manage shell 的 ORM,DSN 從庫讀。
  • D2 站台走 443 子路徑(B0 實證可行,不開 8443)。
  • D3 PolyForm Shield 授權可接受,不過法務。
  • D4 前端錯誤經後端轉送端點,DSN 登入後才給。
  • D5 管理員帳號固定、密碼全客戶一組、build 時烙印。
  • D6 共用 guidant-db 另開 bugsink 庫與獨立帳號。
  • D7 每專案保留 1 萬筆、不設天數。
  • D8 告警第一版不做。
  • D9 接入規範:內網 Python 行程直連並只准走 jedi-log 的 init;外網客戶端經同一支轉送端點,身分沿用既有認證,DSN 附在拿到身分的同一回應。
  • D10 三個專案:guidant-ai/guidant-ai-fe/guidant-agent。
  • 沙箱接入:多一個 internal 網段只含沙箱與站台,DSN 從 .env 拿,不碰 guidant.env。
  • 發版流程拿掉 e2e 回歸 gate(決策者裁,387035254)。

教訓

  • 遮罩只看欄位名不夠:A3 的缺口是 C4 runner 實送事件後撈站台原文才抓到(auth_header 變數值是 Bearer <密鑰>)。根因是 jedi-common 的 Bearer 規則只掛在 log 出口那支。驗收斷言要寫「整個事件找不到原始值」。
  • B0 證實設計預告的 ALLOWED_HOSTS 陷阱:內網 Host 回 400 而 SDK 不報錯;換網址後舊對外 DSN 失效——直接決定了「網址相關設定每次重寫」。
  • FR-132 三次出包的 Nuitka 漏收坑,Agent 出 image 時要再驗:Agent 出包已整包收 sentry_sdk,但「編譯後實送一次」仍要在 190 做。
  • Agent 1.4.0 之後 188 沒跑過完整 build,smoke 第 4 項紅是 1.4.0 的未授權拒探測守門造成,不是本案。長時間沒出包的元件,第一次出包要預期撞到前版累積的問題。
  • Nexus npm-proxy 的套件資訊快取 24 小時,鎖到剛發的 npm 版本會讓 pipeline 紅;同一批套件可能部分刷到、部分沒有。

推翻了什麼

  • design.md 初版的 nginx 安全標頭寫死補兩個(T-B1 實測會送出兩份同名標頭,改「上游沒帶才補」)。
  • 初版設定端點回 release(T-C1 改由前端用 build 時烙的 VITE_APP_RELEASE)。
  • 初版只建一個專案、轉送端點只收使用者(D9/D10 後改三專案、雙身分)。
  • 初版 Agent 設定只在註冊回應附帶(T-C3 實作時加心跳,因升版 Agent 不重註冊)。
  • 初版安裝器「缺了才補」涵蓋網址(B0 後改網址相關每次重寫)。
  • 以上已併進 design.md v2。

留給下一棒:決策者裁 Nexus 快取後,T-R 續跑到 190 升級與 Agent 升級;之後派 T-V。


§2

第 2 棒 — 2026-10-10 — 首腦(T-R 收尾、缺口開卡、第二輪發版、驗收、收尾)

commits:BE 478db0876(CI verify 改 pull 目前分支)、e5a0a9ef9/0bc75fd88(補開 A4/B5/G1/T-R2 卡)、a614be494(B5)、b19358521(T-R2 釘版)、aba953f67(預設全收);jedi-python-package 95ffe840(jedi-log 1.3.6)、be05c2e4(classifier 1.6.5);evidence-agent 4b088a4(Agent 1.4.2)。四個 repo 的 feature/FR-133 已併回 main 並 push(BE 範圍 84e293101..aba953f67);本 block 所在的收尾文件 commit 未 push。

本棒的卡(卡號/做什麼/commit/驗收結論/打折處)

  • CM-2619 T-R 發版、出包、部署 190,後續追加上 STG/POC 與四台 Agent/BE fdec6b758、df999ed90、478db0876,Agent a26464c、7e6e1e3/合格/A3 遮罩用本機 jedi-log 送 190 驗、不是沙箱真實失敗路徑;Agent 回報改在 190 真環境驗、沒對 DEV 驗
  • CM-2620 A4 遮罩補無名位置參數,三份一起改/jedi 95ffe840、be05c2e4,Agent 4b088a4/合格,三份突變都有牙齒,首腦自行 probe 無洩漏/DEV 全收打錯密碼那條沒在 DEV 做(改在 T-R2 的 188/189 做);分類器測試跑在暫存 venv,套件版本不保證與容器鎖定相同
  • CM-2621 B5 升級保留現場補的允許主機名/BE a614be494/合格,T-R2 在 190 真機驗過網域仍在/debian 容器只載入函式
  • CM-2622 G1 Agent 1.1.0 直升的儲存憑證缺口/—/決策者裁暫緩/—
  • CM-2623 T-R2 第二輪發版、三環境、四台 Agent/BE b19358521(安裝包以 aba953f67 出)、Agent 4b088a4/合格/190 留手動兩行關閉全收,「沒設就預設全收」只在 188 驗到;189 有手動兩行 =true
  • CM-2612 T-V 端到端/—/決策者裁以 T-R/T-R2 三環境實跑代替,改 Done/乾淨機首裝未驗
  • CM-2613 T-E 文件/—/收尾時由另一支 agent 處理/—

決策

  • G1 暫緩。理由:產品未出貨,不存在客戶端 1.1.0 Agent;內部四台已升完。被排除的:修升級子命令轉呼叫新包 install.sh——投入大、目前無受益者。出貨後若有跨版升級需求再開。
  • 產品預設改全收(aba953f67):4xx 使用者失誤與 ERROR log 行預設都送站台。理由:UAT 期間要看到使用者在哪裡撞牆。前提是 jedi-log ≥1.3.6 已補位置參數遮罩。被排除的:維持設計初版「預設只收程式錯誤」——看不到使用者被擋在哪。
  • 三套件發兩輪(jedi-log 1.3.5→1.3.6、classifier 1.6.4→1.6.5、Agent 1.4.1→1.4.2)。被排除的:等下一版一起發——全收已開,位置參數漏洞不能等。
  • 不進版:主專案版號不動、不寫 release note、不切 spec 快照,image tag 仍是 1.26.0 加新 commit。
  • 決策者親手或當場裁示的環境動作:190 停舊 Sentry self-hosted 與獨立 bugsink、guidant.env 註解舊 DSN;Nexus npm-proxy 清快取;GitLab 變數改 14 字、取消 Protect;188 兩個 clone 切 feature/FR-133;STG/POC 當天上版;四台 Agent 升級;189 開全收並解鎖 blsadmin。
  • 發版流程不跑 e2e 回歸 gate(387035254,第 1 棒已記,本棒沿用)。

教訓

  • 遮罩第二次盲點是決策者在 190 開全收時親眼看到的:@transaction 包裝層的 args 是 (self, username, password, …),遮罩只認欄位名與 Bearer 樣式。兩次盲點(Bearer 值、位置參數)都不是測試抓到,是實送事件後看站台原文抓到。驗收要有「真 SDK 收到的事件」這一層。
  • 遮罩有三份複製品(jedi-log、Agent、分類器容器),A4 runner 改完兩份才自己發現第三份。改遮罩前先 grep 三處。
  • Nexus npm-proxy 對套件資訊快取 24 小時,剛發的 npm 版本會讓 build-fe 紅,同批套件可能部分刷到部分沒有;清法是 invalidate-cache API。
  • 新加的第三方 image 要先在 188 docker pull,否則 package 紅;B 系列卡沒寫這步。
  • GitLab masked 變數勾 Protect,在 feature 分支讀到空值。
  • Agent guidant-agent-compose upgrade 跑的是機器上舊版的升級程式;1.1.0 直升時新版才有的步驟不會執行。
  • Agent 升級不清 /tmp 暫存解包,.166 的 /tmp 是記憶體盤,第三次升級塞滿,錯誤訊息誤導成「檔案損毀」。
  • 在 jedi 子目錄跑 poetry run 會解析到 BE 的 venv,跑出假紅;改用 PYTHONPATH=. python3 -m pytest。
  • guidantai restart 不重讀 env_file,改設定後要用 start。
  • 長時間沒出包的元件(Agent 1.4.0 之後)第一次出包會撞到前版累積的問題(smoke 第 4 項)。

首腦違規自檢

  • A1:runner 回寫「決策者明示後發版」,決策者始終沒回答有無下令;首腦按「有」處理,沒再追。
  • T-R 期間決策者直接與 runner 互動裁示多項(清快取、GitLab 變數、切 clone、STG/POC 上版),首腦是事後驗收,不是事前派工。

推翻了什麼

  • design.md D9 之後的「過濾預設只收程式錯誤」改為預設全收(aba953f67),開關仍在、設 false 回到只收程式錯誤。
  • 第 1 棒 STATE §5 推測「GitLab 變數推測已設」:實際有設但勾了 Protect、只有 11 字,feature 分支讀到空。
  • 第 1 棒留給下一棒「之後派 T-V」:T-V 不另跑,以三環境實跑代替。

三環境最終狀態

  • 190(e2e)、188(STG)、189(POC):api/worker/socketio 都在 1.26.0+aba953f67,sandbox evidence-classifier 1.6.5,bugsink 2.6.1 healthy,三專案在。

  • 四台 Agent(.166/.122/.167/.121)都在 1.4.2,雲端登記 1.4.2。190 本機的 Agent 容器仍是 1.4.1(2026-10-10 實查)。

  • 190 guidant.env 留有手動 ERROR_TRACKING_CAPTURE_CLIENT_ERRORS=false 與 ERROR_TRACKING_LOG_EVENTS=true;189 guidant.env 有手動兩行 =true;188 是純預設。

  • 188、189、.166 有 reboot-required 旗標未重開。

  • 收尾中補做:190 本機 Agent 1.4.1→1.4.2(包從 188 scp、sha256 OK、guidant-agent-compose upgrade、healthy、release 行確認)。T-E(CM-2613)9d0849644 完成並收 Done。

  • 收尾後追加 T-M1(CM-2624):遮罩三份複製品收斂成零相依套件 jedi-masking 0.1.0,三邊改薄殼(jedi-log 1.3.7/分類器 1.6.6/Agent 1.4.3),首腦比對新舊行為一致;程式已推 main、未發版,併下次進版。

留給下一棒:arc 收尾完成,等決策者決定進版時機(version-bump skill);進版時先發 jedi-masking 再依序發三邊。