這批 10 件裡有 8 件據報密碼/金鑰已撤銷換發(決策者原則九),剩下的工作是把版控裡那些字串清乾淨(含對話紀錄、腳本、交接文件);另外 2 件(M03-9 派工表明文殘留、M23-3 Google 金鑰)本身還沒處理完,需要多一步程式修正或金鑰重設。這批現在就能開,不依賴其他批——清字串是收尾動作,跟前面批次的程式修正互不阻擋。
座標全部補齊了(每件的檔案清單、grep 指令、命中檔數都寫進各卡),但查證同時翻掉幾個前提:
.env 完全一致,也就是很可能根本沒換:
.env 的 DB_PASSWORD =版控殘留值,而這個帳號是 BYPASSRLS、四處通行docs/claude/memory/reference_dev_login.md 現行那組.env 的 GOOGLE_API_KEY =版控殘留值 所以這幾件的性質可能不是「打掃」而是「洞還在」。 已寫成 D-b4-2 與各件的 ⚠️ 註記,清字串前要先實查換沒換。docs/features-site/site/search/search_index.json(MkDocs 搜尋索引,憑證原文在裡面)、docs/claude/memory/ 下 6 份 memory(每個 session 都會讀)。TURNSTILE_SECRET_KEY(30 檔)是 Cloudflare 官方公開的測試 dummy key、glpat-fake…(6 檔)是範例值——標記為假陽性,免得下次掃描再撈一次。git grep 就是正確的範圍。本棒另跑過一次「整個工作目錄」的 grep 對照,資料庫密碼從 250 檔(受版控)變成 547 檔——多出來的 297 檔全部是 gitignored 的本機產物,已逐項確認 git check-ignore 都通過,不會被 commit、不在本批範圍:
.claude/ 250 檔(本機 session 暫存)CLAUDE-SECURITY-*/ 的掃描產物 20 檔(RESULTS.jsonl / .sarif / .md)—— ⚠️ 這是掃描工具自己把撈到的憑證原文寫進報告檔,雖然沒進版控,但那些目錄躺在 repo 根目錄下、每跑一次掃描就多一份。建議順手回報決策者「掃描產物要不要定期清」(屬本機衛生、不是本批工作)reports/allure-results/ 21 檔(測試報告)、.env / .env.bak / .env.bak-20260814-pre1g / docker/production/.env / docker/production/guidant.env(設定檔本體,本來就該有值、不要動) 驗收一律用 git grep,不要用 grep -r——後者會把上面這些算進來,永遠驗不到零命中。| 卡 | 卡名(做什麼,不寫代號) | repo/套件 | 涵蓋 SUMMARY # | 建議 model/effort | 序列組 |
|---|---|---|---|---|---|
| 4-1 | 清掉版控裡的憑證殘留字串(外部平台通行證/AI服務金鑰/系統管理員密碼/交接文件帳密,共 5 件) | BE 主專案(docs/conversation-history/、scripts/、docs/analysis/、docs/features/FR-039*/handoff/、docs/claude/memory/;套件側全部零命中,已查證) |
#10、#11、#72、#73、#122 | sonnet/medium | A |
| 4-2 | 資料庫管理員密碼(250 檔殘留+堵住還在寫入的那 1 支產生器) | BE 主專案(已查證無套件側) | #12(含其中的 M16-7、M17-8 兩個具體實例) | sonnet/medium | A |
| 4-3 | 移除掃描派工資料表裡的明文帳密殘留(程式修正,不是清字串) | jedi-detection 套件(寫入只有 1 行,兩條路徑共用) | #70 | sonnet/medium | B |
| 4-4 | Google 雲端硬碟金鑰:清殘留字串+(等決策)金鑰重設 | BE 主專案(14 檔全在 docs/conversation-history/;套件側零命中,已查證) |
#74 | sonnet/medium | A |
| (沿用) | 打包前端映像檔腳本內嵌 Nexus 帳密 | — | #75 | — | — |
(#75 直接沿用既有卡 CM-1998,不重開、不寫小節;序列組欄位留空。)
docs/conversation-history/、scripts/、docs/analysis/、docs/features/FR-039*/handoff/、docs/claude/memory/、docs/features-site/;套件 monorepo 對五件的憑證特徵字串全部零命中,不需開套件側 worktree);worktree 名建議 wt-fix-b4-cred-strings;涵蓋 #10、#11、#72、#73、#122🔴 本節所有清單都是「用 key 名或憑證前 4 碼 grep」查出來的路徑與檔數,計畫檔內不寫任何憑證值。runner 開工時自己從
.env(或報告內位置)取值再 grep,不要把值貼進 commit message、Notion 卡或回報。 ⚠️ 本棒查證的一個共同發現:這批「已撤銷」的憑證裡,有幾把與現行.env的值一模一樣(見各件的 ⚠️ 註記)。所以清字串前要先確認該值到底換過沒有——若沒換,清版控只是打掃,洞還在。
git grep -lIE 'glpat-[A-Za-z0-9_-]{15,}'(GitLab personal access token 的固定前綴)docs/conversation-history/2026-04-28-to-04-30-survey-answer-arc/part-verbatim-01-of-03.md docs/conversation-history/2026-04-28-to-04-30-survey-answer-arc/part-verbatim-03-of-03.md docs/conversation-history/2026-05-06-my-tasks-completion-gate/part-01-of-05-bug-fix-handover-and-standards-audit.md docs/conversation-history/2026-05-08-project-flow-engine-arc/part-01-of-11-m0-spike-and-spec-amend.md docs/conversation-history/2026-05-13-spec2-phase-e-decision/part-01-of-01-phase-e-defer-and-phase-f-kickoff.md docs/conversation-history/2026-05-14-to-05-15-full/part-04-of-09-37cd69d1-prompt-session.md docs/conversation-history/2026-05-22/ssp-edit-in-project/25ad9e8d-docs-features-ssp-edit-in-project-handof.md docs/conversation-history/2026-05-22/ssp-import-export-phase2/7bed5ff9-session-docs-features-ssp-import-ex.mdglpat-fake…(這把是假值/範例,不是真憑證,6 個檔)、一個前綴 glpat-raUg…(2 個檔,這把才要清)。runner 用 git grep -hoIE 'glpat-[A-Za-z0-9_-]{15,}' | sort -u 自己取出兩個值比對。git grep -lIE 'ghp_[A-Za-z0-9]{30,}|github_pat_[A-Za-z0-9_]{30,}|gho_[A-Za-z0-9]{30,}' → 0 檔;glrt- / gldt- 亦 0。所以「4 把」裡至少 2 把在本 repo 找不到——可能在套件 monorepo 或已被清掉。⚠️ 套件 monorepo 也查了:glpat- 零命中。 建議開卡時註明「4 把只找到 1 把真值+1 把假值,其餘 2 把查無,請 M15 報告作者或 CM-1607 工單補位置」。GITLAB_PRIVATE_TOKEN 152 處、GITHUB_PRIVATE_TOKEN 195 處)——那是變數名不是值,不必清。.env.test 已刪(commit 5746cef1,2026-09-08)——要清的是對話紀錄裡的殘留。git grep -lIE 'sk-ant-[A-Za-z0-9_-]{20,}|sk-proj-[A-Za-z0-9_-]{20,}|AIza[A-Za-z0-9_-]{30,}'docs/conversation-history/2026-04-28-to-04-30-survey-answer-arc/part-verbatim-01-of-03.md(B2 報告點名的精確位置是此檔 :3651) docs/conversation-history/2026-05-19/ssp-import-export-phase2-A0.1/e500cf61.md docs/conversation-history/2026-05-27/participant-picker-framework-drive-fixes/0043-617066cd-session-projectplannin.md docs/conversation-history/2026-05-29/conversation-history-housekeeping/1035-c5c2e417-5-28.md docs/conversation-history/2026-05-31/evidence-classify-reports/1029-d0b63dd1-feature-ai-analysis-result-landing.md docs/conversation-history/2026-06-02/db-erd-tooling-convergence/2024-d2a67903.md docs/conversation-history/2026-06-04/erd-db-diagram/2024-d2a67903-db-db-diagram-mcp.md docs/conversation-history/2026-06-14/fr038-oscal-redesign-wave1/2034-3fc2f2b1-oscal-v1-2-2-schema-c.md docs/conversation-history/2026-06-14/fr038-oscal-redesign-wave1/2034-6219587d-oscal-v1-2-2-schema-c.mdsk-ant-…,1 個 distinct)/OpenAI(sk-proj-…,1 個)/Google(AIza…,1 個)/LangChain LangSmith(lsv2_pt_…,本棒未單獨 grep,runner 補跑 git grep -lIE 'lsv2_(pt|sk)_[A-Za-z0-9]{20,}')AIza… 那把與現行 .env 的 GOOGLE_API_KEY 完全一致(本棒比對過,命中 9 檔)——Google 這把很可能沒真的換。B2 報告也寫「commit 5746cef1 宣稱已撤銷,但那次只刪了 .env.test,撤銷與否無法從程式碼查證」。開卡務必寫「清字串前先到 Google Cloud Console 實查這把還有效嗎」。Anthropic/OpenAI 那兩把與 .env 不同(.env 內的值在版控零命中),這兩把可信已換。scripts/migrate_2026-08-09_fr062_existing_tenant_licenses.py:80 取那個 12 字元的預設值(前 4 碼 Bill),再 git grep -lIF -- '<該值>'scripts/migrate_2026-08-09_fr062_existing_tenant_licenses.py:80 — SEED_PASS = os.getenv("FR062_SEED_PASS", "<真密碼>")(B2 報告 F14 點名的就是這支;:127 拿它去打真的 /login)scripts/seed_2026-08-01_fr059_detection_profiles.py:65 — SEED_PASS = os.getenv("FR059_SEED_PASS", "<真密碼>")(:150 同樣打 /login)scripts/e2e_test_module_frame_with_docx.py:38 — TEST_PASS = "<真密碼>"(連 env var 都沒有,純寫死)scripts/smoke_test_ssp_docx_parser.py:34 — TEST_PASS = "<真密碼>"(純寫死)scripts/smoke_test_ssp_docx_preselect.py:34 — TEST_PASS = "<真密碼>"(純寫死)os.getenv 的第二個參數,未設時 raise 並印「請設 FR0xx_SEED_PASS」;後三支改成 os.environ["..."](缺就自然炸)或同樣 getenv+raise。docs/conversation-history/ 63 檔/docs/features-site/ 39 檔/docs/features/ 38 檔/docs/claude/ 4 檔/docs/system-design/ 2 檔/scripts/ 5 檔(即上面那 5 支) docs/claude/ 那 4 檔要逐一改(是 memory,會被每個 session 讀): docs/claude/memory/reference_dev_login.md:11/:12(登入帳密對照表) docs/claude/memory/feedback_playwright_screenshot_for_blind_fe.md:17 docs/claude/memory/project_fr039_distributed_file_agent.md:16 docs/claude/memory/reference_architecture_quick_notes.md:36docs/claude/memory/reference_dev_login.md 就是現行對照表,帳號 blsadmin / blsit)——「已換發」的說法對不上。開卡要寫「清字串前先確認 DEV 這組帳密換過沒有」。docs/features-site/ 那 39 檔是 MkDocs 產出的副本與 HTML——不要手改,改完來源 md 重跑 build 即可(M23 報告「網頁版不用手改」講的就是這個)。docs/features/FR-039-2606-distributed-file-agent/handoff/2026-06-18-FR039-handoff.md:89(Nexus 私有 PyPI 帳密,admin/<pw> 形式)+ 同檔 :59(一條 UPDATE public.… 指令裡嵌著 MinIO 的 access key / secret key / endpoint 192.168.50.171:9002)git grep -lIF -- 'admin/<那個密碼>' → 6 個檔: docs/features/FR-039-2606-distributed-file-agent/handoff/2026-06-18-FR039-handoff.md(來源) docs/features/FR-039-2606-distributed-file-agent/handoff/2026-06-18-FR039-handoff.html(同目錄產出的 HTML) docs/features-site/docs/FR-039-2606-distributed-file-agent/handoff/2026-06-18-FR039-handoff.md(站台鏡射副本) docs/features-site/site/FR-039-2606-distributed-file-agent/handoff/2026-06-18-FR039-handoff/index.html(站台產出) docs/features-site/site/search/search_index.json(MkDocs 搜尋索引,憑證原文也在裡面——最容易漏的一個) docs/conversation-history/2026-06-19/fr039-agent-auth-v2/2331-5f8f5906-session-docs-features-fr-039.mdadmin/ 前綴)→ 13 個檔(多出來的 7 檔是那組密碼單獨出現的地方,runner 要一起看)docs/features/…handoff.md 來源 → 重跑 doc-site-build 產 HTML 與 features-site(含 search_index.json)→ 最後清 conversation-history。只改 md 不重 build,HTML 與搜尋索引裡的原文還在。jedi-common),若查出還沒換發要立刻回報。.env 的 JWT_SECRET_KEY 取值(36 字元,前 4 碼 b542)→ git grep -lIF -- '<值>' → 30 個檔,全在 docs/conversation-history/(與 FR-079 B2 F12 報的「34 處」一致——那是行數,檔數 30)。B2 點名的精確位置:docs/conversation-history/2026-05-20/ssp-import-export-phase2/1802c4fb-a3-writing-plans.md:6908 ⚠️ 與現行 .env 完全一致、是還在用的金鑰(B2 已確認,本棒複核仍一致)。決策者裁「DEV 這把不換」的理由是 scripts/installer/install.sh:1252 每套安裝各自跑 openssl rand -base64 32(gen_key 在 :211),外流的只是我們開發機那把、不會跟著出貨。cmmgr/cm_app),不要在這張卡重複清——4-2 卡負責。.env 的 TURNSTILE_SECRET_KEY(前 4 碼 1x00)→ 30 個檔(28 檔在 conversation-history、config/ 1 檔、repo 根 1 檔)。⚠️ 1x00… 是 Cloudflare 官方公開的測試用 dummy key(永遠通過),不是真憑證 —— 本件不必清,但開卡要註明「查到但判定非憑證」,免得 runner 白做或下次掃描再撈出來當假陽性。ANTHROPIC_API_KEY(版控 0 檔)/DETECTION_TOOL_ENCRYPTION_KEY(0 檔)/AI_PROVIDER_ENCRYPTION_KEY(0 檔).env 與部署文件裡還在用,只清版控對話紀錄裡的殘留、不要動 .env(動了所有人當下的登入 token 全失效)。git grep -c -I -F -- '<值>' 零命中(值自己從 .env 或報告位置取,不要寫進卡片或 commit message)docs/features/FR-039*/handoff/*.md → 重跑 doc-site-build → 再 grep 一次,確認 .html、docs/features-site/docs/、docs/features-site/site/ 與 search_index.json 四處都乾淨docs/claude/memory/ 那 6 份(#72 的 4 份+#12 的 2 份)逐一開檔確認密碼改成「請查 .env」而非整段刪掉(那些是還在用的操作說明)git filter-repo 之類改寫 history)還是只清「現存檔案」?改寫歷史風險較高(會動到所有人的 commit hash)。我的建議:這批只清現存檔案的殘留字串,不改寫 git 歷史(憑證本身已失效,改歷史的成本與風險不成比例)。wt-fix-b4-db-admin-pwd;涵蓋 #12(M23-1 主案,合併 M16-7=M17-8 兩個具體實例).env」的占位字樣,照 CLAUDE.md 憑證規範);② 清掉既有檔案裡的殘留字串。.env 的 DB_PASSWORD(9 字元,前 4 碼 jedi)。REDIS_PASSWORD 與它是同一組值(M23 報告說「這組密碼同時也是快取服務的密碼」,本棒比對確認兩者相同)——所以清一次就兩件一起解決。git grep -lIF -- '<該值>' → 250 個受版控檔案(M23 報告說 249,本棒重數 250,差 1 檔屬正常漂移)docs/conversation-history/ 112 檔/docs/features/ 67 檔/docs/features-site/ 65 檔/docs/issues/ 2 檔/docs/claude/ 2 檔/docs/system-design/ 1 檔/docs/analysis/ 1 檔 (行數層級:git grep -c -I -F -- '<值>' 加總 2,012 行)docs/system-design/scripts/generate_db_schema_docx.py:34 — user="cm_app", password="<真密碼>" 直接寫死在連線參數裡。這支是產生資料庫結構 DOCX 的產生器,每跑一次就把密碼帶進產出。這就是 M16 第 7 條「一支產生文件的腳本把完整資料庫連線資訊寫死」那支。 修法:改讀 os.environ(缺就 raise),或沿用 repo 既有 .env 讀法。docs/claude/ 那 2 檔(memory,每個 session 都會讀,優先清): docs/claude/memory/project_drive_sync_test_data.md:18(192.168.50.188:25432 / guidant_ai_stg / cm_app / <pw>) docs/claude/memory/project_ssp_doc_parser_progress.md:101(cm_app + cmmgr 同密碼 <pw>)docs/analysis/2026-05-28-poc-db-migration-plan.md:73(export PGPASSWORD='<pw>')+ :95/:99(另兩處文字描述)。FR-079 B2 F1 也是指這一檔一行,優先處理。docs/features-site/ 那 65 檔不要手改——MkDocs 產出的鏡射副本與 HTML(含 docs/features-site/site/search/search_index.json,憑證原文也在搜尋索引裡)。改完來源 md 重跑 doc-site-build 即可。docs/features/ 下的 .html 同理。188:25432 / guidant_ai)、以及兩座「已退役但還連得進去」的舊庫(188:25432/guidant_ai_stg、189:25432/guidant_ai_poc)。換密碼與關掉舊庫屬環境異動,要決策者明示,不在本卡。generate_db_schema_docx.py 後要實跑一次產生 DOCX 的流程,確認只是密碼來源換了、產出內容不變。git grep -c -I -F -- '<該值>' 零命中(含 docs/features-site/site/search/search_index.json)docs/system-design/scripts/generate_db_schema_docx.py 實跑一次(有設環境變數的正常路徑),確認 DOCX 產得出來且內容不變;再跑一次「沒設環境變數」確認會明確報錯而不是靜默用預設doc-site-build 後再 grep 一次(驗 features-site 與 HTML 都乾淨).env 現值與版控殘留值完全一致——若沒換,清版控只是打掃、洞還在(而且這個帳號是 BYPASSRLS、四處通行)。建議:先確認換沒換再決定這張卡的性質(打掃 vs 堵漏);換密碼本身屬環境異動(要動出貨基線庫與兩座舊庫),必須決策者明示放行,不在本卡。jedi-detection(M03);worktree 名建議 wt-fix-b4-detection-plaintext;涵蓋 #70jedi-detection/jedi_detection/app/service/detection_orchestration_service.py:480
params["_credentials"] = creds
在 _dispatch_one()(:438-517)內,緊接在 :478-479 的 source_file 處理之後、:485-493 的 create_task() 之前。params 整包被塞進 agent_tasks.params(JSONB),所以明文帳密就落在那張表裡。:215-217 呼叫 _resolve_credentials()(定義在 :1397-1430,:1429 是 json.loads(self._crypto.decrypt(config.credentials_encrypted)))。另一條路徑 :942-947(start_assignment_now 那支重跑流程)也拿了 creds 並在 :980 傳進同一個 _dispatch_one → 同樣會經過 :480。🔴 所以是「一行寫入、兩條路徑都會走到」,刪那一行兩條一起解決;不要以為要改兩處。cd ~/Projects/Jedicogy/module/jedi-python-package && grep -rn '_credentials' --include="*.py" . | grep -v /.venv/ | grep -v /.claude/worktrees/ | grep -v credentials_encrypted → 命中只有::215/:218/:480(寫入側)+:603/:605/:799/:2273 四處註解提到它+:1370/:1391/:1395 的 _tool_requires_credentials(不同東西)。沒有任何地方讀 params["_credentials"]。 BE 側 grep -rn '"_credentials"' --include="*.py" . → 0 命中。infra/remote_agent/adapter/detection_task_payload_provider.py:68
"credentials": self._resolve_tool_credentials(t.detection_tool_id, tenant_id),
→_resolve_tool_credentials() 定義在同檔 :109-125,:124 自己做一次 json.loads(self._crypto.decrypt(config.credentials_encrypted))。這是心跳組裝時當場重新解密的第二份,與 agent_tasks.params._credentials 無關。 套件 :799 的註解也寫明「改由心跳組裝時當場注入(與 _credentials 同時機…)」——設計上早就分開了,:480 那行是舊的殘留。既有測試 test/test_agent_enrollment_service.py:376 test_heartbeat_attaches_pending_tasks_with_decrypted_credentials 測的就是這條活路徑。agent_tasks 的 params JSONB 欄(model 在 jedi-remote-agent/jedi_remote_agent/infra/agent_task/model/agent_task.py:45)。清法:UPDATE ... SET params = params - '_credentials' WHERE params ? '_credentials'(JSONB 刪 key,不動其他欄位)。先在 DEV 跑;STG/POC 要決策者明示放行(屬寫入類環境異動)。SELECT count(*) FROM agent_tasks WHERE params ? '_credentials'; 在 DEV 跑,把數字寫進 Notion 卡當驗收基準。:480 前確認 agent 走的是 detection_task_payload_provider.py:68 那條(上面已證實)——手測要含「DEV 正常跑一次掃描,代理程式仍能正確拿到主機帳密並執行完成」。agent_tasks.params 不再出現 _credentials key:SELECT count(*) FROM agent_tasks WHERE params ? '_credentials'; 應為 0(新單)start_assignment_now → 同一個 _dispatch_one),確認也乾淨pytest test/test_agent_enrollment_service.py(心跳帶憑證那支,驗活路徑沒被弄壞)docs/conversation-history/,套件 monorepo 零命中);worktree 名建議 wt-fix-b4-gdrive-keys;涵蓋 #74.env 的三個 key
GOOGLE_DRIVE_OAUTH_CLIENT_SECRET(35 字元,前 4 碼 GOCS)→ 12 檔DRIVE_TOKEN_ENCRYPTION_KEY(前 4 碼 0JGh)→ 10 檔GOOGLE_DRIVE_OAUTH_CLIENT_ID(前 4 碼 1051,嚴格說是識別碼不是密鑰,但它與 secret 成對、一起清比較乾淨)→ 14 檔git grep -lIF -- '<各值>'docs/conversation-history/,清單: 2026-04-21-google-drive-integration/…-part-03-of-14.md 2026-04-21-google-drive-integration/…-part-05-of-14.md 2026-04-21-google-drive-integration/…-part-08-of-14.md 2026-04-21-google-drive-integration/…-part-09-of-14.md 2026-04-28-to-04-30-survey-answer-arc/part-verbatim-01-of-03.md 2026-05-19/ssp-import-export-phase2-A0.1/e500cf61.md 2026-05-22/ssp-import-export-phase2/7bed5ff9-session-docs-features-ssp-import-ex.md 2026-05-27/participant-picker-framework-drive-fixes/0043-617066cd-session-projectplannin.md 2026-05-29/conversation-history-housekeeping/1035-c5c2e417-5-28.md 2026-05-31/evidence-classify-reports/1029-d0b63dd1-feature-ai-analysis-result-landing.md 2026-06-02/db-erd-tooling-convergence/2024-d2a67903.md 2026-06-14/fr038-oscal-redesign-wave1/2034-3fc2f2b1-oscal-v1-2-2-schema-c.md 2026-06-14/fr038-oscal-redesign-wave1/2034-6219587d-oscal-v1-2-2-schema-c.md (client_id 另外多 3 檔,runner 用 git grep -lIF 自取)cd ~/Projects/Jedicogy/module/jedi-python-package && git grep -lIF -- '<各值>' → 0。所以是 BE 主專案獨有,落點確定。docs/conversation-history/ 底下的對話紀錄,沒有一個是現行正式設定檔。程式實際讀值走的是 .env → config/(GOOGLE_DRIVE_OAUTH_CLIENT_ID / _SECRET / DRIVE_TOKEN_ENCRYPTION_KEY 三個環境變數),清對話紀錄完全不會動到執行期路徑,風險極低。.env 現值完全一致(本棒比對)——這把確實還沒換,與 M23 第 3 條「未修」狀態相符。所以這張卡只是「打掃」,洞還在,要等金鑰重設那半(見 D-b4-3)。.env、不要動 config/ 下讀取那三個環境變數的程式(金鑰本身沒換,執行期要維持能讀到)。git grep -c -I -F -- '<值>' 零命中docs/features-site/site/search/search_index.json 這個 MkDocs 搜尋索引裡有多把憑證原文。它是產出物,只要重跑 doc-site-build 就會乾淨,不需要改寫 git 歷史。同理 docs/features/*/*.html 與 docs/features-site/ 下 100 多檔鏡射副本都是「改來源 md + 重 build」就好。所以「只清現存檔案」的成本比原估低很多。.env 完全一致,到底換過沒有?(資料庫管理員密碼、系統管理員登入密碼、Google AI 服務金鑰) 若沒換,這三件就不是「打掃」而是「洞還在」,清字串只解決一半。建議:開卡前先各實查一次(資料庫那把試連一次即知;Google 那把到 Cloud Console 看;系統管理員那把用 DEV 登入試一次),再決定卡片性質與優先序。換密碼本身屬環境異動(要動出貨基線庫與兩座舊庫),必須決策者明示放行,不在這批。.env 現值一致),且 14 檔殘留全在對話紀錄、沒有一個是現行設定檔,所以「清字串」那半風險極低、可以先做;「重設金鑰」那半照原建議另開卡。glpat-fake… 範例值,其餘 2 把在 BE 與套件 monorepo 都零命中,GitHub 系列的 token 前綴也全零命中)。要不要請 M15 報告作者或 CM-1607 工單補出另 2 把的實際位置?建議:先照查到的 1 把清掉,另 2 把標「查無、待補位置」,不要為了湊數字擋住這張卡。