AI 一連上就知道「這裡有主人的知識庫」+「讀不到」不再講成「不存在」 #118

Open
Leo wants to merge 0 commits from fix/instructions-knowledge-entrypoint into main
Owner

leo 2026-08-13:「它應該是你的知識來源⋯⋯沒有它你是瞎的。」

驗收題(leo 定的):新 session 問「Arcrun 是什麼」要查得到真答案。

病灶一:指路的話被綁在一個會無聲消失的段落上

mcp-handler.ts 必定出現的靜態段(startHere)只講工作流/零件/recipe/邊的語法——kbdb_searchkbdb_get_map 一個字都沒有。唯一提到知識的是 buildLibraryMapInstructions() 拼上去的【藏書地圖】,而那段是選配的(1500ms 逾時、catch { text = null }、失敗完全無聲)。

實害:同一天一條 portal 連線的 session 為了回答「Arcrun 是什麼」去讀了 682 行原始碼——而 kbdb_search(q="Arcrun 是什麼") 當下回得出 33 筆真答案。

  • 新增 KNOWLEDGE_FIRST 靜態段(與 startHere 同級,KBDB 掛了照樣出現),排在最前:這條連線有主人的知識庫/第一個動作是 kbdb_search/工具怎麼呼叫/「知識庫裡沒有・我沒查・地圖沒取到」三件事不可以講成同一句。
  • 地圖失敗不再靜默:印【藏書地圖:這次沒取到】;stale token 另印身分版(請使用者重新連線)。鐵律不變——失敗仍然不擋連線,只是不再無聲。
  • 抽出 buildServerInstructions(env, identity) 讓測試能印出完整字串。

病灶二:一個 401 被逐字翻譯成「不存在」

arcrun_get_skill('write_intent_workflow') 回「skill ... 不存在」,但 kbdb_search 撈得到 page_name: "skill-write_intent_workflow"entry_type: agent-skillsource: installer-seed)——與該工具查的鍵逐字相符。真兇:kbdbGetByPageNameif (!resp.ok) return null;

401 的來源是該實例的 arcrun-mcp 沒有 KBDB_INTERNAL_TOKENkbdb-client 沒 token 就匿名送出)=部署面的事;但這支 code 把它講成了假話。

  • 非 2xx 一律拋 KbdbAccessError(帶真 status)→ kbdb_unauthorizedkbdb_unreachable,訊息明說「這是讀不到,不是不存在」,並交出還走得通的那條路(kbdb_search)。
  • not_found 只留給「KBDB 正常回應但真的沒這張卡」,並說明是「這台實例沒 seed」。
  • 五支工具吃 identity:stale → identity_missing;portal 撞 401 時額外說明「是這批工具還走服務憑據,不是你的帳號讀不到」。
  • instructions 步驟 4 不再指名 arcrun_get_skill('INDEX')(leo21c 實測根本沒 seed 這支)→ 改成先 arcrun_list_skills() 看這台實例真的有哪幾支。

  • mcp 測試 130 passed(新增 mcp-instructions.test.ts 7 項+skills-examples-honesty.test.ts 10 項),tsc --noEmit exit 0。
  • 三種情境(地圖抓得到/抓不到/舊 token)各印一份完整 instructions,三份的開場都指向 kbdb_search
  • 與 PR #117 相容:本地試合併零衝突,合併後 137 passed、tsc exit 0(本 PR 不動 renderLibraryMapLineskbdb_map.tskbdb/)。

尚未做(誠實標)

  • ⚠️ 未部署(leo 的手動閘)。上線後才會到用戶手上。
  • ◐ skills/examples 尚未改走 portal 資料面:portal 沒有 by-entry_type 的 listing 端點,要接得補 API/portal/data/entries?entry_type=),不是在薄殼層拼裝(rule 07 §3.1);且那需要 cypher 一起部署,否則 MCP 先上會打到 404。本 PR 只把話講對。
  • INDEX skill 在 leo21c 沒被 seed——本 PR 改成不指名該 slug,但沒補 seed
leo 2026-08-13:「它應該是**你的知識來源**⋯⋯**沒有它你是瞎的**。」 驗收題(leo 定的):**新 session 問「Arcrun 是什麼」要查得到真答案。** ## 病灶一:指路的話被綁在一個會無聲消失的段落上 `mcp-handler.ts` 必定出現的靜態段(`startHere`)只講工作流/零件/recipe/邊的語法——`kbdb_search`/`kbdb_get_map` 一個字都沒有。唯一提到知識的是 `buildLibraryMapInstructions()` 拼上去的【藏書地圖】,而**那段是選配的**(1500ms 逾時、`catch { text = null }`、失敗完全無聲)。 實害:同一天一條 portal 連線的 session 為了回答「Arcrun 是什麼」去讀了 682 行原始碼——而 `kbdb_search(q="Arcrun 是什麼")` 當下回得出 33 筆真答案。 **修**: - 新增 `KNOWLEDGE_FIRST` **靜態**段(與 `startHere` 同級,KBDB 掛了照樣出現),排在最前:這條連線有主人的知識庫/第一個動作是 `kbdb_search`/工具怎麼呼叫/「知識庫裡沒有・我沒查・地圖沒取到」三件事不可以講成同一句。 - 地圖失敗**不再靜默**:印【藏書地圖:這次沒取到】;stale token 另印身分版(請使用者重新連線)。鐵律不變——**失敗仍然不擋連線**,只是不再無聲。 - 抽出 `buildServerInstructions(env, identity)` 讓測試能印出完整字串。 ## 病灶二:一個 401 被逐字翻譯成「不存在」 `arcrun_get_skill('write_intent_workflow')` 回「skill ... **不存在**」,但 `kbdb_search` 撈得到 `page_name: "skill-write_intent_workflow"`(`entry_type: agent-skill`、`source: installer-seed`)——**與該工具查的鍵逐字相符**。真兇:`kbdbGetByPageName` 的 `if (!resp.ok) return null;`。 401 的來源是該實例的 `arcrun-mcp` 沒有 `KBDB_INTERNAL_TOKEN`(`kbdb-client` 沒 token 就匿名送出)=**部署面的事**;但這支 code 把它講成了假話。 **修**: - 非 2xx 一律拋 `KbdbAccessError`(帶真 status)→ `kbdb_unauthorized`/`kbdb_unreachable`,訊息明說「這是讀不到,不是不存在」,並交出還走得通的那條路(`kbdb_search`)。 - `not_found` 只留給「KBDB 正常回應但真的沒這張卡」,並說明是「這台實例沒 seed」。 - 五支工具吃 `identity`:stale → `identity_missing`;portal 撞 401 時額外說明「是這批工具還走服務憑據,不是你的帳號讀不到」。 - instructions 步驟 4 不再指名 `arcrun_get_skill('INDEX')`(leo21c 實測根本沒 seed 這支)→ 改成先 `arcrun_list_skills()` 看這台實例真的有哪幾支。 ## 驗 - `mcp` 測試 **130 passed**(新增 `mcp-instructions.test.ts` 7 項+`skills-examples-honesty.test.ts` 10 項),`tsc --noEmit` exit 0。 - 三種情境(地圖抓得到/抓不到/舊 token)各印一份**完整 instructions**,三份的開場都指向 `kbdb_search`。 - **與 PR #117 相容**:本地試合併零衝突,合併後 137 passed、tsc exit 0(本 PR 不動 `renderLibraryMapLines`/`kbdb_map.ts`/`kbdb/`)。 ## 尚未做(誠實標) - ⚠️ **未部署**(leo 的手動閘)。上線後才會到用戶手上。 - ◐ skills/examples **尚未**改走 portal 資料面:portal 沒有 by-`entry_type` 的 listing 端點,要接得**補 API**(`/portal/data/entries?entry_type=`),不是在薄殼層拼裝(rule 07 §3.1);且那需要 cypher 一起部署,否則 MCP 先上會打到 404。本 PR 只把話講對。 - ◐ `INDEX` skill 在 leo21c 沒被 seed——本 PR 改成不指名該 slug,但**沒補 seed**。
Leo added 1 commit 2026-08-13 06:10:42 +00:00
leo 2026-08-13:「它應該是**你的知識來源**⋯⋯**沒有它你是瞎的**,
從你對 Arcrun 的認知就知道你的內建 Memory 是沒用的。」

## 病灶一:指路的話被綁在一個會無聲消失的段落上

instructions 裡唯一提到「這裡有知識可查」的,是 buildLibraryMapInstructions
拼上去的【藏書地圖】——而那段是**選配的**(1500ms 逾時、catch 回 null、失敗無聲)。
必定出現的那段靜態文字(startHere)從頭到尾只講工作流、零件、recipe、邊的語法,
`kbdb_search`/`kbdb_get_map` 一個字都沒有。

實害:同一天,一條 portal 連線的 session 為了回答「Arcrun 是什麼」去讀了 682 行
原始碼——而 `kbdb_search(q="Arcrun 是什麼")` 當下回得出 33 筆真答案。

修法:
- 新增 `KNOWLEDGE_FIRST` 靜態段(與 startHere 同級,KBDB 掛了照樣出現),
  排在最前面:這條連線後面有主人的知識庫、第一個動作是 kbdb_search、
  工具怎麼呼叫、以及「沒查到/沒查/地圖沒取到」三件事不可以講成同一句。
- 地圖失敗**不再靜默**:拿不到就印【藏書地圖:這次沒取到】,
  stale token 另印身分版(要使用者重新連線)——「沒取到」與「這裡沒有知識」
  不可以長得一樣(Arcrun#109 同族)。鐵律不變:失敗仍然不擋連線。
- 抽出 `buildServerInstructions(env, identity)` 供測試印出完整字串。

## 病灶二:一個 401 被逐字翻譯成「不存在」

`arcrun_get_skill('write_intent_workflow')` 回「skill ... 不存在」,
但 `kbdb_search` 撈得到 `page_name: "skill-write_intent_workflow"`
(entry_type: agent-skill、source: installer-seed)——**與本工具查的鍵逐字相符**。
真兇是 `kbdbGetByPageName` 的 `if (!resp.ok) return null;`。
而 401 的來源是該實例的 arcrun-mcp 沒有 KBDB_INTERNAL_TOKEN
(kbdb-client 沒 token 就匿名送出)=部署面的事,但這支 code 把它講成了假話。

修法:
- 非 2xx 一律拋 KbdbAccessError(帶真 status)→ kbdb_unauthorized/kbdb_unreachable,
  訊息明說「這是讀不到,不是不存在」,並交出還走得通的那條路(kbdb_search)。
- `not_found` 只留給「KBDB 正常回應但真的沒這張卡」,並說明是「這台實例沒 seed」。
- 五支工具吃 identity:stale → identity_missing;portal 撞 401 時額外說明
  「是這批工具還走服務憑據,不是你的帳號讀不到」。
- instructions 步驟 4 不再指名 `arcrun_get_skill('INDEX')`(leo21c 實測根本沒 seed
  這支)——改成先 `arcrun_list_skills()` 看這台實例真的有哪幾支。

## 驗

- `mcp` 測試 130 passed(新增 mcp-instructions 7 項+skills-examples-honesty 10 項),tsc exit 0。
- 三種情境(地圖抓得到/抓不到/舊 token)各印一份完整 instructions 實測,
  三份的開場都指向 kbdb_search。

⚠️ 未部署(部署是 leo 的手動閘)。上線後才會到用戶手上。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This branch is already included in the target branch. There is nothing to merge.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin fix/instructions-knowledge-entrypoint:fix/instructions-knowledge-entrypoint
git checkout fix/instructions-knowledge-entrypoint
Sign in to join this conversation.