Files
ewoooc/docs/memory/claude_inventory_validation_20260513.md
OoO c021945047
All checks were successful
CD Pipeline / deploy (push) Successful in 1m4s
fix: route telegram vision through ollama first
2026-05-18 14:07:49 +08:00

22 KiB
Raw Permalink Blame History

Claude Code 盤點驗證記憶2026-05-13

用途:接續 V1/V2 全棧盤點整改時,先看這份,避免把已修或已過期的項目重複當成阻擋。

已驗證並修補

  • rag_query_log.saved_call:已改為只有高信心 RAG 命中且跳過 LLM 時寫 true,並補測試。
  • ai_calls.rag_hitlogger API 原本可寫但缺回歸測試;已補 set_rag_hit(True) 寫入測試。
  • SSH_JUMP_* / SSH_TARGET_*Python caller 已不存在;已從 config.py.env.example 範例移除,執行路徑以 ELEPHANT_ALPHA_JUMP_* 為準。
  • filesystem-mcpMCP_BASE_HOSTS 與 health check 已存在;已補 ops_diagnostics 唯讀工具白名單,並測試 read_file 可通、write_file 被拒。
  • mcp_calls.status:已補 ok/cache_only/timeout/rate_limited/error 細分,早退結果也會帶 status='error'
  • Telegram cat_ callback主 OpenClaw route 不是問題polling bot helper 的預設 cat 才是潛在漏 handler。已改預設為既有 handler trend 並補測試。
  • Scheduler 觀測任務BGE-M3 embedding consistency 不一致、host health probe、AI error spike、觀測台日報與 cleanup 例外都已接 _notify_scheduler_failure()
  • AutoHeal Telegram inlineobs_heal 已用 _CURRENT_USER_ID_CTX 記錄實際 Telegram userwebhook request 開頭會清空 stale user context。
  • 匯入檔名日期 helperroutes/import_routes.py 已改用 utils.text_helpers.extract_snapshot_date_from_filename() 單一來源,並用真實日期解析拒絕 20261399 這類不可能日期。
  • monthly_summary_analysis 匯入已守住「刪同年月後 append」路徑tests/test_import_service_sql_params.py 會防止該月結匯入區塊退回整表 if_exists='replace'
  • ROI 月報 feedback 區塊:反饋趨勢查詢失敗仍不阻擋月報,但已改為 warning + stack避免完全靜默。
  • Elephant Alpha short-circuitlog_ai_call 遙測失敗仍不阻擋省成本 return但已改為 warning + stack。
  • Claude cost throttle成本節流檢查失敗仍維持 Claude 可用,但已改為 warning + stack避免成本保護失效無跡可查。
  • ai_call_logger caller registryregistry 匯入失敗仍不阻擋 LLM 遙測,但已改為 warning + stack。
  • Observability routepromotion review RAG 相似查詢、PPT audit history 缺表、host health probe 寫入、MCP 24h summary 缺表等 fail-safe 區塊已改成 debug/warning log不再完全靜默。
  • Google Drive importservices/import_service.py 的日期 IN (...) 刪除/驗證查詢已改為 SQLAlchemy bind params不再把 DataFrame 日期值拼進 SQL 字串。
  • OpenClaw Bot中文字型下載、趨勢同期 DB 查詢、匯入格式業績預覽解析等 best-effort 區塊已補 debug/exception/warnings避免真正錯誤完全無跡可查。
  • Telegram polling bot舊 callback 正規化失敗、空 momo:eig: event_id 回覆失敗仍保持 fail-safe但已補 debug log。
  • ai_call_logger._write_to_db 不是死函數:它是 _async_write() 的 daemon thread targetinfer_caller_from_stack() 確認無 caller 後已移除。
  • cache_manager.FingerprintCache 與 dashboard shared cache 清理維持 fail-open / best-effort但已補 debug log避免 cache fingerprint 或檔案清理失敗完全沉默。

已驗證為已修或過期

  • migration / ORM032 已入庫,033 host label、034 embedding_signature、035 business baseline、036 incidents 雙欄、037 action_plans guardrails 均已存在。
  • migrations/031 權限已是 644
  • app.pySYSTEM_VERSION 已從 config.py importapp 內只留版本註解。
  • V2 提到的 app.py 死 import 與 scheduler.py import schedule 已不成立;app.py 仍使用 schedule.run_pending() 等呼叫。
  • tests/test_phase3f_cleanup_contracts.py 已補 guardV2 點名的舊 app imports 不得回來,且 app.py 的 active schedule 用法不可被誤刪。
  • V2 點名的 3 個 silent failure 點位已不是 except: passOpenClaw 趨勢圖暫存檔清理與 Notification public_url 讀取失敗都會記 log並由 tests/test_phase3f_cleanup_contracts.py 守住。
  • Cron 盲區清單多數已補 _notify_scheduler_failure()ROI 月報已避開 09:00 改 09:05AI smoke 已是 09:10。
  • V2 指出的 9 個 cron 盲區已補回歸守門8 個 run_scheduler.py wrapper 必須呼叫 _notify_scheduler_failure()scheduler.py::run_promo_event_task 必須呼叫 notify_failure()
  • 09:00 排程衝突已有回歸守門:daily_report=09:00roi_monthly_report=09:05ai_smoke_daily_summary=09:10 必須保持錯開。
  • AutoHeal inline host transition 告警已有 DB transition dedup 守門:run_host_health_probe() 只在健康狀態翻轉且 1h 內沒有同方向 transition 時推送。
  • CD migration 全範圍冪等已有回歸守門:.gitea/workflows/cd.yaml 必須維持 024-099 pattern、sort | uniqfor m in $V5_MIGRATIONS apply loop。
  • CD Observability production smoke 已補 timeout 守門:quick_review.sh --observability-smoke 必須帶 --timeout 12
  • 0-byte database/momo*.db 迷惑檔已不存在;真實 SQLite 僅在 data/momo_database.db
  • .gitignore 已涵蓋 .claude/worktrees/.tmp_*tmp_*.pngMOMO Pro/、root/uploads/screenshots 與 MOMO Pro uploads/screenshots並由 tests/test_gitignore_contracts.py 守住。
  • cache_service.py 已成為 cache_manager.py 的相容 shim_SALES_CACHE_TTL 單一來源有測試鎖住。
  • aiops-core/requirements.txt 已不存在,aiops-core/README.md 已標記此目錄只保留歷史 stub不應安裝或部署。
  • V2 提到的「死依賴」不可整批刪:beautifulsoup4 用於多個 crawler、google-api-python-client 用於 Google Drive、google-generativeai 用於 Gemini paths、python-pptx 用於 PPT generator、matplotlib 用於 Telegram/圖表/PPT。
  • tests/test_requirements_pinning.py 已鎖住上述被 V2 誤列的 runtime dependencies套件需留在 requirements.txt,且至少一個 runtime import 證據仍存在。
  • paramiko 已確認沒有 runtime importADR-013 現行實作改以 utils/ssh_helper.py 組 CLI ssh,因此已從 requirements.txt 移除並補測試防止依賴殘影回來。
  • pgvector Python package 與 matplotlib-inline 已確認不是 runtime 依賴pgvector 走 PostgreSQL extension + 本地 SQLAlchemy Vector typeJupyter inline backend 不屬 production path兩者已從 requirements.txt 移除並補測試。
  • tests/test_pg_sync.py 已改為 opt-in integration test預設不再連 localhost PostgreSQL 或建立/刪除測試表,需 RUN_PG_SYNC_INTEGRATION=1 且提供 POSTGRES_PASSWORD 才執行。
  • services/pg_sync_service.py 是顯式 opt-in legacy CLI不是生產自動同步路徑tests/test_pg_sync_contract.py 已守住預設 OFF 與 runtime paths 不自動 import。
  • qwen3:14b 不是未使用 Ollama 模型OpenClaw QA、NemoTron dispatch 與 LLM model router 仍有現役路徑;tests/test_qwen3_runtime_usage.py 已守住,不能只因體積大就三主機移除。
  • Ollama host env 已加白名單護欄:OLLAMA_HOST* / EMBEDDING_HOST 只接受 GCP-A、GCP-B、111 或 110 proxy誤設 188/localhost 會回到核准主機。
  • Hermes intent 與批量 analyst 已從單次 resolve_ollama_host() + raw requests.post('/api/generate') 改為 OllamaService.generate(),同一請求會依序 retry GCP-A → GCP-B → 111並保留 HERMES_KEEP_ALIVE 與實際 provider 回寫測試。
  • NemoTron qwen3 dispatch 的 /api/chat tool-calling 路徑已補同一請求三主機 retryhost 失敗會 mark_unhealthy() 後再 resolve 下一台GCP-A 失敗可在同次 dispatch 接 GCP-B/111三台都失敗才 fallback NIM。
  • PPT vision、PPT 文案 final fallback 與 MCP 離線 final fallback 已改走 OllamaService.generate()OllamaService.generate() 支援 optionskeep_alive 與 vision images,特殊 /api/generate 路徑同樣取得三主機 retry。
  • OpenClaw QA / daily Hermes template / NemoTron qwen3 的 flag 文件與測試已對齊 Ollama-first 預設 ON顯式 false 才是 Gemini/NIM legacy 緊急退路。OpenClaw QA 已移除單一 OPENCLAW_QA_OLLAMA_HOST 主機覆寫,_call_qwen3_qa() 改走 OllamaService 的 GCP-A → GCP-B → 111 retry 並回寫實際 provider。
  • Code Review pipeline 已對齊 Ollama-first_hermes_scan()_openclaw_assess() 都先走 OllamaService 的 GCP-A → GCP-B → 111 retryGemini 僅在 Ollama與可選 Claude失敗後以 code_review_openclaw_gemini caller 記錄備援,不再以 code_review_openclaw 直接 Gemini-first。
  • Telegram 圖片商品辨識已對齊 Ollama-firstroutes/openclaw_bot_routes.py 會先用 OPENCLAW_IMAGE_VISION_MODEL 透過 OllamaService retry GCP-A → GCP-B → 111Gemini 只以 openclaw_bot_image_gemini caller 作為圖片辨識備援。
  • .env.example 已補齊 Python runtime 實際讀取的環境變數,tests/test_phase3f_cleanup_contracts.py::test_env_example_documents_runtime_os_env_keys 會掃 app.py/config.py/scheduler.py/run_scheduler.py/routes/services/utilsos.getenv() / os.environ.get();只允許 PYTEST_CURRENT_TESTMOMO_ALLOW_INSECURE_CONFIG_FOR_TESTS 兩個測試內部 key 不進範例。
  • docker-compose*.yml 使用的 ${VAR} 也已納入 .env.example 契約,包含 MCP compose 的 TAVILY_API_KEYEXA_API_KEYMCP_POSTGRES_PASSWORDFIRECRAWL_AUTH_KEY,以及 image tag / Grafana / pgAdmin / Metabase / Grist 變數;test_env_example_documents_docker_compose_variables 會守住。
  • Market Intel seed_writer_cli_status route 已補 API 層回歸:即使 execute=true 且環境有 MARKET_INTEL_SEED_WRITE_APPROVALAPI 仍不得回吐 token / approval_token_hint / 固定 token 文案,且不得 ready 或寫入;tests/test_market_intel_skeleton.py::test_seed_writer_cli_status_route_never_leaks_approval_token 會守住。
  • Docker 主 compose 的 momo-app / scheduler / telegram-bot 已有 mem_limithealthcheck,並由 tests/test_docker_compose_runtime_mounts.py 守住V2 提到的 nginx / nginx-monitor / metabase / grist healthcheck 缺口需先看 profiles這些服務分別被鎖在 local-devdeprecatedbi,不是 default production path。
  • MCP compose 安全邊界已有 tests/test_mcp_compose_contracts.pypostgres/omnisearch/firecrawl healthcheck、Firecrawl/Playwright/Redis/filesystem memory guardrails、filesystem-mcp read-only mount 與不接 docker socket 都會被測試守住。
  • _navbar.html 已移除 V1 點名的 --momo-legacy-accent 與舊 hex #d96f52/#a95846/#9f4f3e,改用 --momo-nav-accent*--momo-page-accent* warm tokenstests/test_frontend_v2_assets.py::test_legacy_navbar_uses_warm_token_accent_aliases 會守住。
  • routes/price_comparison_routes.py 的 MOMO crawler TODO 已接到既有 services.momo_crawler.search_momo_products();未手動上傳 MOMO 商品時會自動抓 MOMO再交給比價服務。
  • 未引用的根層 templates/list.html Phase 4 placeholder 已刪除,真實缺貨清單 route 使用 vendor_stockout_list_v2.html(或 ui=legacy 時的 vendor_stockout/list.htmltests/test_phase3f_cleanup_contracts.py 會防止根層 placeholder 回來。
  • AI 觀測台 V3 排版規範已補強:scripts/check_responsive_overflow.js 會把視覺 overflow offenders 視為失敗,並允許表格/圖表在 .obs-table-shell.obs-chart-frame 等局部容器內滾動;observability-system.css / web/static/css/observability-system.css 已同步新增 bounded table/chart/mobile containmentCSS mirror 與 quick_review.sh --observability-qa --skip-production 均通過。
  • app.py/BP 路由雙寫已完成收斂active @app.route 為 0USE_MODULAR_ROUTES 與舊 routes registry shim 已不存在;tests/test_phase3f_cleanup_contracts.py::test_app_py_stays_blueprint_only_for_routes 會防止 route decorator 回到 app.py
  • app.py 開頭的歷史「重開機後請依序執行」TODO banner 已移除;入口治理以 AGENTS.md / CONSTITUTION.md / ADR / memory 索引為準,tests/test_phase3f_cleanup_contracts.py::test_app_py_does_not_start_with_stale_restart_todo_banner 會防止 stale 操作清單回流。
  • docs/guides/devops_handbook.md 已移除活躍手冊中的舊 K8s command 區塊,並把 app 操作改為 Gunicorn HUP 熱重載、Docker Compose 精準 force-recreate、momo-app service buildtests/test_phase3f_cleanup_contracts.py::test_devops_handbook_uses_current_docker_runtime_commands 會防止 kubectldocker restart momo-pro-system 與錯誤 compose service name 回流。
  • /cicd legacy dashboard 已停用舊叢集副作用rollback 會回 410restart_pods action 會被拒絕diagnosis 不再 SSH 執行叢集探測;tests/test_cicd_legacy_cluster_disabled.py 會防止 kubectl / rollout command 回到 routes/cicd_routes.py
  • AI 觀測台 badge/chip 對比規範已補強:.momo-observability-mode 內的 badge、pill 與 nested surface 會改走亮底、8px radius、無負字距、可換行且不再殘留低對比 legacy dark-hero 樣式CSS mirror、quick_review.sh --observability-uiquick_review.sh --observability-qa --skip-production 均通過。
  • AI 觀測台 rendered visual contract 已入庫:scripts/check_observability_visual_contract.sh 會用 Playwright 檢查 10 頁 × desktop/tablet/mobile 的 title typography、surface radius/background、chip contrast、hero height 與水平 overflowV10.116 main 版 local server 驗證 30 項 PASS。測未部署變更時必須帶 localhost --base-url,打 production fail 可能只是正式站尚未部署該版。
  • V10.117 已把 AI 觀測台背景語彙收斂為 tokenized dot-matrix合約會要求 hero/signal/panel surface 的 computed background-imageradial-gradient,並拒絕 legacy linear-gradient / background-image: none 回流;終端 dot-matrix layer 必須留在 CSS 檔尾以贏過舊 neutralizer。
  • /observability/host_health 在 SQLite local QA 下已略過 host_health_probes persistence避免 BIGINT autoincrement drift 造成 warning正式 Postgres session 仍維持 probe history 寫入,tests/test_admin_observability_routes.py::test_host_health_skips_probe_persistence_on_sqlite 會守住。
  • Telegram momo:eig:<event_id> callback 已在 routes/openclaw_bot_routes.pyservices/telegram_bot_service.py 實作並有 webhook 測試覆蓋,不是未實作缺口。
  • Telegram date_* / goal_* 不是死 callback handler按鈕先送 await:* 進入輸入等待狀態,使用者下一則文字才由 pending action 消費;tests/test_openclaw_bot_menu_keyboards.pytests/test_openclaw_bot_routes_webhook.py 已覆蓋。
  • services/ai_automation_smoke_service.py 不是死 servicerun_scheduler.py 每日 09:10 掛 run_ai_smoke_daily_summary_task(),該 task 會呼叫 send_smoke_daily_summary()tests/test_ai_automation_smoke_service.pytests/test_ai_automation_metrics.py 已覆蓋。
  • mcp_calls.status CHECK 已接受 ok/error/timeout/rate_limited/cache_only,與 services/mcp_router.py 的細分狀態一致。
  • DB migration / ORM 覆蓋已有 tests/test_migration_metadata_coverage.py 守門,Base.metadata.tables - migrations CREATE TABLE 必須為空;tests/test_ai_observability_models.py 也鎖住 v5 observability ORM stub。
  • V2 BLOCKED migration 守門已補:031-037 必須存在且 group/world-readabledatabase/momo.db / momo_data.db / momo_database.db 迷惑檔不得回來。
  • host_health_probes.chk_host_label_029 不一致已有 migration 033 修補並補測試:必須重建 CHECK且接受 GCP-SSDGCP-SSD-2111 備援 與兩個 110 Nginx proxy runtime labels。
  • rag_query_log / learning_episodesembedding_signature 已由 migration 034、ORM 欄位、RAG/learning 寫入路徑與 migration metadata 測試覆蓋。
  • incidents 雙欄相容與 action_plans source/status guardrails 已在 migration 036/037、migration metadata 測試與 tests/test_auto_heal_safety.py 覆蓋。
  • services/agent_actions.py 不是死碼:services/event_router.py 透過 SAFE_ACTIONS registry 動態執行 ADR-012 L2 actionstests/test_agent_actions.py 已鎖住 L2 SAFE_ACTIONS 與 L3 OPS_ACTIONS 邊界,防止 HITL ops 動作誤進自動白名單。

不可盲動

  • services/agent_actions.py 不能只看靜態 caller 清理;已確認它是 SAFE_ACTIONS 動態 dispatch 入口,未來改動必須同步更新 registry 與 EventRouter 測試。
  • logo_circle.svg / logo_navbar.svg / logo_transparent.png 不能只因 runtime rg 無引用就刪;設計文件仍規劃品牌頁、登入頁、錯誤頁使用。
  • 多個永遠 OFF feature flag 屬產品/上線策略決策,不應在清債時直接全部改 ON 或刪除。
  • ai_calls.rag_hit 不等同 rag_query_log.saved_call:跳過 LLM 的 RAG 命中應記在 rag_query_log.saved_call;有實際 LLM 呼叫且 caller 明確用了 RAG context 時才適合標 ai_calls.rag_hit

本輪已推 commits

  • 36d0e5d 標記 RAG 命中節省 LLM 呼叫
  • 20cab6e 補上 RAG hit logger 回歸測試
  • 6817f64 移除舊 SSH jump 設定殘影
  • 44eb369 補上 MCP filesystem 唯讀白名單
  • 2068a37 修正 Telegram 分類按鈕預設 callback
  • bdb74b1 告警 BGE embedding 一致性異常
  • d15b221 細分 MCP 呼叫遙測狀態
  • 34db2db 修正 scheduler 合成告警 trace
  • 5785a58 補齊 scheduler 觀測任務失敗告警
  • a335ab5 修正 AutoHeal Telegram 觸發者審計
  • d7ae243 清空 Telegram webhook 使用者上下文
  • ba8510e 補齊 MCP 早退狀態
  • 317ff1b 共用匯入檔名日期解析
  • c300e49 記錄 ROI 月報反饋區塊失敗
  • f49413e 記錄 EA short-circuit 遙測失敗
  • 0a75d11 記錄 Claude 成本節流檢查失敗
  • 5625032 記錄 AI caller registry 匯入失敗
  • 0bc6f18 更新 Claude 盤點修補記憶
  • 3cb091f 記錄 Observability fail-safe 區塊失敗
  • e29529f 校正 Observability 修補記憶 hash
  • 4e6e9bf 綁定自動匯入日期查詢參數
  • 47c59fd 更新自動匯入修補記憶
  • ae79cdd 記錄依賴盤點驗證結果
  • 2b1174a 移出誤入的本地變更
  • adfcccf 補齊盤點修補 commit 清單
  • 4256a04 記錄 Telegram 與 MCP 缺口驗證
  • 5285abe 記錄 DB migration 覆蓋守門
  • f9d3da5 記錄 AutoHeal DB guardrail 驗證
  • 7e92850 記錄 Agent Actions 動態入口驗證
  • 89c400d 補上 OpenClaw best-effort 區塊紀錄
  • ec5a22d 記錄 Telegram pending action 驗證
  • f44c429 補強 AI logger best-effort 診斷
  • 8a36856 補強 Telegram callback 診斷
  • 5b52af9 補強 cache best-effort 診斷
  • 497c376 記錄 AI smoke service 入口驗證
  • b22cbb2 守住 scheduler 失敗告警覆蓋
  • 8026b93 守住 scheduler 早晨排程錯開
  • eb6886e 同步 scheduler 排程摘要
  • b24241f 守住 migration blocker 修補
  • 6c86839 守住盤點誤判依賴
  • 2e2b775 守住 V2 import 清理狀態
  • 58ba95b 守住月結匯入 append 路徑
  • 4079f1c 守住 CD migration 全範圍執行
  • 81aa424 守住 Observability smoke timeout
  • dc99bab 移出誤入的本地變更
  • 546c63f 守住 V2 silent failure 修補
  • c165081 守住 host label migration 對齊
  • 4921275 守住 RAG embedding signature migration
  • 035b88c 守住 AutoHeal migration guardrails
  • 5b6b35f 守住 AutoHeal inline 告警去重
  • 749eace 移除未使用 Paramiko 依賴
  • 3c65034 移除未使用 runtime 依賴

後續補推 commits3c65034 之後)

  • 2ac751f 補齊盤點修補 commit 清單
  • 6c236eb 快取當日業績頁面內容
  • 0d68f3e 快取商品看板比價總覽
  • c306fb6 隔離 PG sync 整合測試
  • 8099bb6 守住 qwen3 現役模型路徑
  • 49c576b 標定 PG sync 為 opt-in 工具
  • 1aeb4a4 移除 AI logger 未用 stack 推斷
  • d02b712 標明 cache service 相容角色
  • 72daa53 快取業績分析頁面資料
  • 8b5a4a3 接上 MOMO 自動比價爬蟲
  • 5942e39 守住本機產物忽略規則
  • ce20892 限制 Ollama host 只能走核准節點
  • 6313fdd 對齊 Ollama-first flag 語義
  • d6e8a4f 忽略本地截圖暫存檔
  • 0c9f927 啟用 Market Intel seed writer CLI gate
  • 2130c4f 守住 AI provider Ollama-first
  • b65a319 固化 Ollama 三主機路由紅線
  • 0380d4c 接上 responsive overflow quick review
  • 86fc9c9 避免商品看板冷快取阻塞
  • ec93d09 收緊模組化治理掃描範圍
  • b2ab03f 入庫 responsive overflow guard 腳本
  • 5ee7fd9 忽略未確認設計審計 dump
  • f8b9b1a 共用業績分析頁面快取
  • d384c35 快取業績分析頁面 context
  • d8c7f6f 快取當日業績頁面 context
  • 2f67e16 共用當日業績頁面快取
  • ab612cb 補 OpenClaw 選單複核報告
  • c78bb1d 記錄 Market Intel 正式端只讀複核
  • 9ec7713 補 AiderHeal 靜默失敗診斷
  • 28c9555 修正挑品 Agent SQLite fallback
  • c227bb4 補競品 Feeder 搜尋詞 fallback 診斷
  • dd8ccdf 共用業績分析引導頁快取
  • e8497d0 補業績分析引導頁快取測試
  • f4883b4 保留 PPT Vision 主機標記失敗診斷
  • bff8c49 補 Code Review 失敗通知診斷
  • 0bdb993 補 OpenClaw 報表資料解析診斷
  • 25e0570 補齊 AI runtime 環境範例
  • 2b2233d 補齊 OpenClaw 與 DeepSeek 環境範例
  • acef0fa 守住 runtime 環境變數文件契約
  • ae1895f 守住 compose 環境變數文件契約
  • 73bbc45 更新 Claude 盤點驗證記憶
  • 490336a 守住 Market Intel seed token 不外洩
  • dc6fc69 守住核心容器資源與健康檢查
  • 7766e35 守住 MCP compose 安全邊界
  • 621c9f2 守住 optional compose profile 邊界
  • 353295a 移除舊 Navbar accent 色票殘影
  • ca97840 守住 Agent Actions 動態白名單邊界
  • ba140f1 移除未引用缺貨清單佔位模板
  • 9af9592 修正 AI 觀測台 V3 排版規範
  • a305b26 記錄觀測台 V3 排版守門
  • 830661b 守住 app.py 不再新增路由
  • c50180f 補齊 AI 觀測台 badge 對比規範
  • b7ba54a 更新 ADR-017 模組化現況
  • b6e6573 收斂觀測台手機字體與視覺契約
  • c10e6a4 記錄觀測台視覺契約守門
  • 5a21e23 略過 SQLite host probe 寫入
  • f947469 融合觀測台點陣視覺語彙
  • 60b73e1 固定觀測台點陣層覆蓋順序