Communitygithub.com

vima-tech/Innate

AI 代理的自我成長程序化知識層。基於 Rust 的 MCP 伺服器與命令列工具,可在任務前回憶相關知識,任務後記錄結果,並將經驗提煉為可重複使用的洞見。支援 Claude Code、Codex、opencode 等平台。

Innate 是什麼?

Innate 是一個輔助性的知識管理層,專為 AI 代理(如 Claude Code、Codex、opencode)設計。其核心功能是在任務開始時,透過語意查詢主動回憶相關的過往知識,並在任務結束後,結構化地記錄成果與經驗,最終將這些經驗自動提煉為可跨專案重複使用的通用性原則。它透過 MCP 協定與代理整合,提供 `innate_recall`、`innate_record`、`innate_add` 等工具,並支援基於命令列的操作。Innate 的關鍵設計在於強調「精確性」與「通用性」:它要求代理對每個回憶到的知識片段給予「已使用且有幫助」或「已使用但誤導」的回饋,並透過正向與負向回饋的累積機制自動調整知識庫的品質;同時,它強烈偏好提煉出剝離專案細節的通用原則,以最大化知識在不同情境下的價值。總結來說,Innate 為 AI 代理提供了一個持續學習與優化的閉環,讓代理能越用越聰明,而非每次從零開始。

相容平台✓Claude Code✓Codex CLI~Cursor✓OpenCode
npx skills add vima-tech/Innate

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

層級角色

Innate 是輔助性工具 — 絕不能阻礙主任務。所有 Innate 的操作均為盡力而為。 若任何工具發生錯誤:以修正後的呼叫重試一次,若仍失敗則放棄並繼續執行。

何時回憶

僅在任務開始時且滿足以下條件才進行回憶:

  • 任務領域具有已知的週期性模式(例如,特定程式碼庫、框架或協定)
  • 任務涉及除錯或修復可能曾遇過的問題
  • 架構/設計相關 — 先前的決策至關重要

跳過回憶的情況:快速的一次性指令、答案明確的問題、使用者已界定為全新領域且無先前脈絡的任務。

查詢表述

使用規範意圖,而非使用者的字面用詞。跨對話階段保持查詢一致性 — 同一類問題應始終使用相同的規範形式,因為 Innate 會針對每個查詢模式累積 情境統計資料。

使用者說良好查詢不良查詢
"為什麼啟動時會崩潰?"startup crash sqlite init為什麼啟動時會崩潰
"重構驗證流程"auth flow session token handling重構驗證流程
"為 API 加入速率限制"rate limiting middleware pattern"加入速率限制"
"除錯不穩定的測試"flaky test race condition timing"除錯不穩定測試"

呼叫:innate_recall(query=<規範意圖>, budget=4000, source="mcp")

將回憶到的知識片段注入您的工作脈絡。向使用者提及找到了哪些(如果有的話)相關 的先前知識 — 一句話即可。

自動回憶鉤子

當 Innate 透過鉤子安裝時,UserPromptSubmit 鉤子可能會自動將 一個 <innate-recall> 區塊注入對話中 — 它已經針對提示執行了相關性門檻檢查 的回憶,並帶有一個 trace_id。當您看到該區塊時:

  • 重複使用其 trace_id 來執行後續的 innate_record — 不要 再次為同一任務呼叫 innate_recall(這會建立重複且懸空的追蹤)。
  • 將其區塊視為您自己回憶的內容:應用有幫助的部分,然後以逐區塊的 判決(見下文)結束。
  • 如果該區塊不存在且任務需要,請按照上述方式手動回憶。

該鉤子受相關性門檻控制,因此它的沉默意味著「沒有足夠高分的內容」— 並非「沒有 知識存在」。如果您懷疑鉤子可能遺漏了相關的先前知識,請手動回憶。

何時記錄

在產生實際成果(成功或失敗)的任務之後進行記錄。跳過記錄的情況:

  • 探索性的來回討論,沒有明確結果
  • 使用者中斷執行而尚未完成的任務
  • 純粹的資訊檢索(使用者僅提出問題,未建置或更改任何內容)

結果規則

情況結果
任務完成,使用者確認或接受結果ok
任務失敗,方法錯誤,使用者不得不修正方向fail
對話中斷,結果不明確unknown

逐區塊判決 — 強制執行

這是 Innate 中最重要的合約:信心排名的好壞取決於您在此報告的精確度。 每次浮現區塊的回憶(無論手動或鉤子注入)都必須以逐區塊判決結束。 對於每個提供給您的區塊,它恰好屬於以下三類之一:

判決含義歸屬
已使用且有幫助您應用了它,且它節省了時間 / 防止了錯誤used=[id] 且 feedback_up=[id]
已使用但誤導您應用了它,但它是錯誤的或誤導了您used=[id] 且 feedback_down=[id]
未使用已回憶但從未應用完全省略(不要在 used 中列出)

保持訊號純淨的規則:

  • used 僅列出您主動在推理或輸出中參考的區塊 — 通常 一到三個。切勿塞入僅被回憶的區塊。
  • 如果您什麼都沒應用,這是一個真實且有價值的訊號:請明確設為 used=[] (已知無用)。不要跳過記錄 — 沉默不等於「沒有幫助」。
  • 您 used 的區塊幾乎都應該同時帶有正向 或 負向訊號。一個已使用但沒有判決的區塊 浪費了您能提供的最強排名輸入。
  • 對 feedback_down 誠實。您標記為負面的錯誤區塊會被審查和歸檔; 一個未被標記的錯誤區塊則會持續誤導未來的對話。

輸出摘要 — 結構化格式

撰寫一個自成一體且簡潔的句子,讓未來的代理能直接根據它採取行動。 使用以下結構:

<完成或學到的事> — <關鍵限制或方法> — <適用時機>

良好範例:

  • 透過檢查 PRAGMA journal_mode 回應而非假設 WAL,修復了 SQLite WAL 模式檢測問題 — 在多進程設定的任何新資料庫連線時觸發
  • 透過注入時鐘模擬解決了不穩定的驗證測試 — 真實系統時間會在令牌過期檢查中造成競爭條件
  • 速率限制必須在驗證中介軟體之前套用,而非之後 — 否則未經認證的請求會繞過限制器

不良範例(過於模糊,無法重複使用):

  • 修復了錯誤
  • 我幫助使用者處理了驗證問題
  • 問題是時間點

output_summary 會成為可重複使用的知識區塊。如果它讀起來像一個故事,請將其 改寫為一個原則。偏好通用、可轉移的形式 — 移除儲存庫/檔案/函式名稱和 一次性識別碼,並將經驗教訓表達為下一個專案也能重複使用的形式;僅在 經驗教訓在沒有具體專案細節的情況下無法保留其意義時,才保留這些細節。 如果您無法寫出有用的摘要,請設定 output="unknown" 並跳過記錄。

呼叫:innate_record(trace_id=<id>, outcome=<ok|fail|unknown>, used=[<chunk_ids>], output_summary=<句子>)

明確回饋 — 為何重要

來自上述判決表的 feedback_up / feedback_down 列表是知識品質最快的訊號, 它們直接驅動排名和生命週期:同一個區塊上收到兩次負向訊號會觸發治理審查; 五次則會觸發自動歸檔。反之,重複的 used + feedback_up 是將 pending 區塊 提升為 active 的方式。不提供回饋會凍結知識庫;提供回饋則能讓好的知識上升, 壞的知識被淘汰。

提名 — 罕用且明確

僅對真正可推廣的經驗教訓使用 nomination 欄位 — 這些模式在下次出現這類問題時 將節省大量時間。少用。不用於每個任務。

提名格式(自成一體的原則):

<原則> — <適用時機> — <應避免的事>

範例:

innate_record(..., nomination="SQLite 在部分 WHERE 子句上的 UNIQUE 索引需要在 ON CONFLICT 中使用完全相符的 WHERE — 適用於所有 upsert 模式;不含 WHERE 的簡潔 ON CONFLICT 會靜默跳過 upsert")

MCP 工具參考

工具用途備註
innate_recall任務開始時(相關時)使用規範查詢形式 — 一致的措辭會累積情境統計資料
innate_record任務結束時(有實際成果時)結構化的 output_summary + 精確的 used ID
innate_add擷取已確認的洞見始終使用 source="mcp";進入 pending 狀態,等待審查
innate_spark快速記錄稍後處理的想法簡短的精煉形式;無需審查
innate_evolve對話階段結束時trigger="manual";提煉日誌並整理知識庫
innate_inspect健康檢查區塊數量、債務比率、重建佇列
innate_appraise在風險較高的步驟前進行直覺評估僅供參考訊號 — 直覺,非精確答案。將其視為其中一個輸入;切勿讓它凌駕於您自己的分析之上。abstained=true 表示無依據 — 這是正確的,並非失敗

未經使用者明確要求,切勿呼叫:innate_approve、innate_archive、 innate_invalidate、innate_restore、innate_mature_spark、 innate_promote_spark、innate_drop_spark。

寫回決策

在結束長時間對話階段前,請執行此檢查清單:

  1. 是否發現了非顯而易見的解決方案?(如:解決方案、隱藏限制、微妙的錯誤模式)
  2. 是否浮現了通用、可轉移的技能、方法或技術?(偏好這些 — 將 專案特定的經驗教訓抽象為可重複使用的形式;僅在經驗教訓確實 無法通用化時,才保留專案特定的規則)
  3. 使用者是否糾正了我可能重複犯下的錯誤假設?
  4. 是否在多次失敗嘗試後,才艱難地獲得了一個洞見?
  5. 回憶到的區塊是否主動提供了幫助?(記錄 feedback_up)
  6. 回憶到的區塊是否有誤導?(記錄 feedback_down)

如果任何 1-4 項為「是」 → 向使用者提議:

"此對話階段發現了[一行描述]。要將其儲存到 Innate 嗎?"

僅在使用者確認後才呼叫 innate_spark 或 innate_add。絕不靜默寫入。

反逐字原則

嚴禁儲存原始對話文字。始終提煉為可重複使用的原則形式:

<原則> — <觸發情境> — <應避免的事>

❌ 逐字✅ 精煉後
"使用者告訴我使用 WAL 模式,我透過更改 pragma 修復了它""SQLite WAL 模式必須透過 PRAGMA 回應驗證,而非假設 — 在寫入密集的多進程設定中開啟任何資料庫時觸發"
"我們因為時鐘偏差花了 2 小時除錯驗證問題""JWT 驗證必須考慮時鐘偏差容許值(≥30 秒)— 在擁有獨立系統時鐘的服務之間進行分散式驗證時觸發"

偏好通用而非專案特定

Innate 偏重於通用、可轉移的技能、方法和技術 — 這些知識能夠 跨專案產生回報,而不僅限於當前程式碼庫。當一項經驗教訓是專案特定的:

  1. 嘗試將其抽象化 — 移除儲存庫/檔案/函式/路徑名稱和一次性識別碼,並重新 表述為下一個專案可以重複使用的原則。
  2. 儲存抽象化後的形式。僅在經驗教訓確實無法通用化且不失去其意義時, 才保留具體的專案特定細節。
❌ 僅限專案✅ 通用化後
"在此儲存庫中,record() 必須在 BEGIN IMMEDIATE 內執行""必須保持原子性的多步驟狀態變更應屬於一個獨占事務,而非逐步提交 — 適用於任何具有並發程序的 SQLite 寫入器"
"在 meta 表中設定 recall.budget=4000""將檢索預算暴露為可調參數而非硬編碼 — 讓回憶能隨脈絡視窗擴展而無需程式碼更改"

火花 vs. 筆記

使用 innate_spark使用 innate_add
快速想法、未成形的直覺已確認的可重複使用原則
尚未驗證已在當前對話階段驗證
使用者說「先記下來」使用者說「記住這個規則」

CLI 備用方案(若 MCP 未設定)

# 回憶
innate recall "<規範意圖>" --top 5 --format json --source cli

# 記錄結構化摘要
innate record <trace_id> --outcome ok \
  --used <id1>,<id2> \
  --output-summary "透過執行 Y 修復了 X — 適用於 Z 的情況" \
  --feedback up  # 或 down

# 擷取洞見
innate add "<原則> — <觸發> — <應避免的事>" \
  --trigger "<2-5 字的情境>" \
  --source agent

# 快速火花
innate spark "<1-2 句精煉的想法>"

# 對話階段結束
innate evolve --trigger manual
innate inspect

指令

以下斜線指令由 innate install 自動安裝到 ~/.claude/commands/, 並在每次重新執行 innate install 時更新。每個 command 區塊定義一個指令: --- 之前是中繼資料,--- 之後是指令主體(代理提示詞)。

name: innate-recall
description: 回憶與當前任務情境相關的先前 Innate 知識
---
為當前任務情境執行 innate_recall,並將結果注入此對話。

如果使用者在指令後提供了查詢,請完全使用該查詢進行回憶。
如果未提供查詢($ARGUMENTS 為空),請從最近的
使用者訊息或當前任務意圖推斷查詢 — 使用**規範意圖**(例如 `sqlite wal mode init`,
而非 "為什麼這個會崩潰")。保持查詢形式與您未來表述同一類問題的方式一致。

步驟:
1. 擬定規範查詢字串(從 $ARGUMENTS 或推斷的意圖)。
2. 使用 `query=<查詢>`, `budget=4000`, `source="mcp"` 呼叫 `innate_recall`。
3. 如果返回了知識:用一句話總結找到了什麼,然後將相關的
   區塊注入脈絡。
4. 如果為空:說「未找到與 "<查詢>" 相關的先前知識」— 不要編造。
5. 儲存 `trace_id` 以供稍後在 `/innate-record` 中使用。
name: innate-record
description: 以結果和結構化摘要關閉當前的 Innate 追蹤
---
以結果和摘要關閉當前的 Innate 追蹤。

從 $ARGUMENTS 解析:
- outcome:`ok`、`fail`、`unknown` 其中之一(若未指定,預設為 `ok`)
- 任何剩餘文字將成為 output_summary 的覆蓋值

步驟:
1. 從本次對話階段最近的 `innate_recall` 呼叫中識別出活躍的 trace_id。
   如果沒有可用的 trace_id,說「無活躍追蹤 — 請先執行 /innate-recall」。
2. 確定哪些被回憶的區塊 ID 在最終回應中**實際使用**(不僅是
   被回憶的候選項)。請精確 — 未使用的回憶區塊**不應**被列出。
3. 為未來直接閱讀此記錄的代理撰寫結構化的 output_summary:
   格式:`<完成了什麼> — <關鍵限制/方法> — <適用時機>`
   如果使用者在 $ARGUMENTS 中提供了摘要文字,請使用該文字。
4. 評估回饋:
   - 如果任何區塊直接有幫助 → 包含 `feedback_up=[chunk_id]`
   - 如果任何區塊有誤/誤導 → 包含 `feedback_down=[chunk_id]`
5. 使用 `trace_id`、`outcome`、`used=[<chunk_ids>]`、`output_summary` 以及適用的回饋,呼叫 `innate_record`。
6. 確認:「已記錄追蹤 <trace_id> 為 <outcome>。」
name: innate-save
description: 將已確認的洞見作為待審查知識區塊儲存到 Innate
---
將已確認的洞見作為待審查知識區塊儲存到 Innate。

$ARGUMENTS 是要儲存的洞見文字(必要)。如果為空,請詢問:「您想儲存什麼洞見?」

步驟:
1. 將 $ARGUMENTS 解析為洞見內容。
2. 判斷它是否為已確認的原則(使用 `innate_add`)或僅是稍後處理的想法(使用 `innate_spark`)。
3. 如果是已確認的原則,將其格式化為 `<原則> — <觸發情境> — <應避免的事>` 形式。
4. 使用適當的工具儲存。
5. 確認:「已儲存洞見。」

相關技能