fix(semantic): 故障照實說是故障——不再把壞掉說成「沒開通」(leo 2026-08-09 直令)

一、文案(portal/console/kbdb hint):語意搜尋是一安裝就提供的功能,
   降級=故障。橫幅改「語意搜尋目前故障/我們的問題/你不用做任何事」,
   拿掉「還沒開通、想開通請匯出診斷檔」這種要使用者申請開通的假框架。
   kbdb 降級回應加 degraded_reason(module_off / embed_query_failed)。

二、查詢向量化失敗不再偽裝成空結果(leo 點名的謊):
   semanticSearch 舊行為「AI 額度用完 → 回 []」會讓使用者以為
   自己的知識庫裡沒有這筆資料。改丟 EmbedQueryFailedError,
   route 誠實降級 keyword+照實告知是暫時故障。

三、源頭機制(裝好的實例為什麼會失去語意搜尋):
   - acr update:kbdb_embed 判斷 ===true → !==false。config 缺欄位時
     redeploy 會把 [[vectorize]]+[ai] binding 靜默剝掉(wrangler deploy
     整份覆蓋),一台正常實例就此壞掉。init 預設同步翻成 [Y/n]。
   -(另 repo)deploy-all.mjs ensureVectorizeIndex 失敗改致命中止。

四、順手自癒:孤兒向量/下架殘影搜尋時背景清除;空結果且 pending>0
   背景 backfill;no_index 拆「故障」vs「還沒有資料」兩態。

測試:kbdb 146/146(新增 degraded 6 案+selftest 1 案);cli 10/10;
瀏覽器端到端兩種故障畫面實測(local wrangler dev+portal 真登入)。
無 SDD 對應:leo 直令修故障(同 08-07 檢修孔前例的人閘直接授權路徑)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
uncle6me-web
2026-08-09 02:05:12 +08:00
parent 8eb10049b8
commit 6846d6ddae
10 changed files with 425 additions and 49 deletions
+26
View File
@@ -15,6 +15,32 @@ metadata:
## 📍 當前位置
> **2026-08-09(語意搜尋「故障要照實說是故障」,leo 直令,local commit main**
> leo 看到 portal 橫幅「語意搜尋還沒開通⋯匯出診斷檔給我們幫你打開」原話痛罵:
> 「**語義搜尋已經確定是一安裝就提供的功能⋯我沒有不開通這個功能,是壞了,
> 沒有人會把 bug 美化成沒提供沒開通**」。本輪修四層:
> 1. **文案**portal`console-ui/public/portal/index.html`)+console 兩處橫幅與設定頁
> 全改「語意搜尋目前故障/我們的問題/你不用做任何事」,禁「開通/尚未啟用」框架;
> kbdb `capability_hint` 同步改(`degraded_reason: module_off`)。
> 2. **查詢向量化失敗不再偽裝成空結果**(leo 點名的謊):`embed.ts` `semanticSearch`
> 改丟 `EmbedQueryFailedError`(舊行為 `if(!vec) return []`=「額度用完」被顯示成
> 「查無資料」);route 層接住 → 誠實降級 keyword`degraded_reason: embed_query_failed`。
> 瀏覽器實測:真 AI binding + bogus 模型(5007 No such model)→ 橫幅照實說暫時故障。
> 3. **源頭機制修掉**(為什麼裝好的實例會失去語意搜尋):
> ① `cli update.ts` `kbdb_embed === true`→`!== false`——config 缺欄位時 redeploy 會把
> [[vectorize]]+[ai] binding 靜默剝掉(wrangler deploy 整份覆蓋);init 預設同步翻成 Y/n。
> ② `arcrun-rag deploy-all.mjs``ensureVectorizeIndex` 失敗以前只印 warning 續行
> youlin 07-20 那輪「本輪跳過」就這樣出貨)→ 改**致命中止**+失敗時 GET 複核
> index 是否其實已存在。
> 4. **順手自癒**:搜尋 hydrate 時發現孤兒向量/下架殘影 → 背景 deleteByIdsis_embedded
> 歸零(0.971 殘影病原不再累積);空結果且 pending>0 → 背景 backfill 一批(embedOnWrite
> fire-and-forget 失敗以前沒有任何機制會回來補)。no_index 拆兩態:pending>0=故障文案、
> pending=0=誠實說「還沒有資料」(新裝未同步不是故障)。
> **測試**kbdb 146/146 綠(新增 `search-semantic-degraded.test.ts` 6 案+selftest 1 案);
> cli tsc 乾淨+10/10deploy-all DRY_RUN 24 worker 斷言 PASS。瀏覽器端到端(local wrangler
> dev 18787/18788portal 真登入)兩種故障畫面截圖驗過。**未部署 prod(D20 閘)**
> 別 session 未 commit 的 `.component-builds/*` 與 `graph-executor.ts` 未動未代提。
> **2026-08-07 晚(檢修孔第一版,local commit 未 pushmain**leo 直接指令「先把檢修孔做出來
> 發版,不必先知道 Oscar 的病是什麼」——解掉「查不出封測者的病,因為拿不到他那邊資料;拿不到
> 資料是因為沒有檢修孔」的死結。**規格中途被 leo 簡化過一次**:從「免授權層/同意後才交」兩層