專案解說 · Answer Me(repo2 快照)
Answer Me 是什麼、實際怎麼運作
Answer Me 是一份給 agent 讀的解說技能,不是會自己執行的程式。它的「運作」發生在 agent 載入 SKILL.md 之後:agent 依指示判斷理解目標、決定交付格式、組織內容、附上證據,最後驗證並交付。
核心說明
專案分成兩半。技能本體在 skills/answer-me/:一份行為規則(SKILL.md)、一份 HTML 樣式指引、兩個可離線開啟的 HTML 起始模板,以及顯示用 metadata。維護工具在其餘目錄:scripts/check.py 檢查 metadata 與文件連結,pre-commit hook 對暫存內容跑同一檢查,tests/answer-me/ 保存演練材料與離線瀏覽器檢查。
兩半之間沒有程式呼叫關係。自動檢查只能證明「技能檔案格式正確、連結沒斷、保存的 HTML 仍能離線運作」;技能是否產生好的解說,要靠人工語意演練判斷。
它由哪些檔案組成?
真正被安裝到 agent 的只有 skills/answer-me/ 這個資料夾;README 的手動安裝說明也要求保留其中的 SKILL.md、agents/、references/ 與 assets/。其他目錄只服務 repository 的維護。下圖是包含關係,不是執行順序;執行順序見下一節。
repo2/
├── skills/answer-me/ ← 技能本體(安裝的就是這個資料夾)
│ ├── SKILL.md 行為規則:目標、格式、組織、用詞、證據、製作、驗證、交付
│ ├── agents/openai.yaml 顯示名稱與簡介(display_name / short_description)
│ ├── references/html-style.md HTML 預設樣式、版型選擇與從模板到成品的步驟
│ └── assets/
│ ├── article.html 文章式起始模板(預設)
│ └── slides.html 簡報式起始模板(明確要求逐頁時)
├── README.md / CONTEXT.md / AGENTS.md 使用說明、領域用語、agent 指引
├── docs/adr/0001–0005 已接受的設計決策
├── docs/checks.md 檢查命令與驗證範圍
├── scripts/check.py 快速檢查(metadata + 相對連結)
├── scripts/install-hooks.sh 啟用 .githooks
├── .githooks/pre-commit 以 --staged 模式呼叫 check.py
├── tests/test_checks.py 檢查器與 hook 的單元測試
├── tests/answer-me/ 演練輸入、歷史輸出、離線瀏覽器檢查
└── .scratch/ 規劃票與各次變更的驗證紀錄來源:README.md「手動安裝」「技能內容」「文件導覽」;技能目錄與 repo 內 skills/answer-me/ 經 diff -r 比對內容相同。
一次請求怎麼走?
以下沿 SKILL.md 的章節順序,追一次「幫我理解」請求。每一步的執行者都是 agent;技能本身只提供規則與模板。為了讓流程具體,每步附上這份文件本身的實際走法:你的請求是「把 Answer Me 做成可離線開啟的文章式 HTML,附檔案位置,完成後只給連結」。
-
觸發與載入
技能 frontmatter 的
SKILL.md 第 1–4 行。平台如何比對 description 不在本 repo 內,屬推論。description寫明用於「幫我理解」「解釋如何運作」「看懂這次變更」,並說單一事實查詢直接簡短回答。agent 平台依此決定是否載入技能。本次:你明確寫了「使用 answer-me」,不依賴自動觸發。 -
找出理解目標
分成兩種用途:概念學習(陌生概念、文章、系統)與成果審視(agent 的方案、diff、測試結果)。探索 repo 時要沿一條代表流程追到負責的程式,不能只列目錄;審視成果時要區分「測試檔存在」「測試曾執行」「測試通過」。
SKILL.md「找出理解目標」第 10–15 行;用語定義見 CONTEXT.md。本次:屬概念學習。因為技能沒有可執行的請求路徑,代表流程改為「agent 處理一次請求」的規則鏈,也就是本節。 -
確認交付格式
對話尚未指定格式時,主動問一次要 HTML、Markdown 文件,還是直接在對話中回答,並推薦其中一項。已指定就沿用,不再問。
SKILL.md「確認交付格式」第 17–21 行。本次:已指定 HTML、文章式,所以沒有詢問。 -
依理解障礙組織內容
先整理核心答案、子問題與各自依據,每節回答一個子問題。再依關係選形式:步驟與分支用流程圖,包含關係用樹狀圖,方案比較用對齊的比較表;只有在操作確實有助理解時才做互動。
SKILL.md「依理解障礙組織內容」第 23–41 行的選型表。本次:目錄用樹狀圖、處理步驟用本流程、分支用比較表;沒有參數可調,所以不加互動。 -
寫清楚、保留證據
沿用來源術語、寫出動作主體、短句但保留「可能」「建議」等強度;在關鍵主張旁附檔案位置或測試紀錄,並區分來源事實、推論、示意數據與實際觀測值。
SKILL.md「寫清楚技術解說」第 43–52 行、「保留證據」第 54–60 行。 -
製作成品
選 HTML 時先讀樣式指引,把模板複製到交付位置再替換內容,保留技能包內的原始模板。CSS、JavaScript、SVG 與資料全部內嵌;Google Fonts 是唯一允許的外部載入,失敗時退回本機字型。
SKILL.md「製作與可選能力」第 62–82 行;references/html-style.md「從模板到成品」。show-me、archify等製作能力可選,不是必要依賴。本次:從 assets/article.html 起步,沿用預設配色與元件,示例內容全部替換。 -
驗證與交付
HTML 要實際以本機檔案開啟,在離線或封鎖網路的情況下檢查呈現;有互動時要操作主要控制項。驗證後在桌面自動開啟一次(macOS 用
SKILL.md「驗證與交付」第 84 行起。open),除非使用者要求不要開,或沒有桌面環境。開啟成功不等於驗證通過。本次:以 headless Chrome 離線開啟本檔檢查桌面與 390 px 版面;依你的要求沒有自動開啟,只交付連結。
格式與開啟有哪些分支?
第 3 步與第 7 步的行為取決於使用者怎麼說。下表把 SKILL.md 的規則和演練說明裡對應的驗收情境對齊;「驗收情境」是人工演練的條件,不代表每個分支都已自動測過。
| 使用者的說法 | 格式處理 | 交付與開啟 |
|---|---|---|
| 未指定格式 | 問一次 HTML/Markdown/對話並推薦一項;等待時可先給核心摘要。 | 依選擇產檔;無回覆且無法再取得回覆時,說明假設並製作文件,不默默改成純文字。 |
| 指定 HTML | 直接製作,不問格式,也不問樣式(未指定外觀時用預設)。 | 離線驗證後在桌面 open 一次。 |
| HTML,但「不要自動開啟」 | 同上。 | 仍須離線驗證(可用 headless 瀏覽器);只給連結。 |
| HTML,但沒有桌面環境 | 同上。 | 交付檔案並說明無法開啟,不重試、不聲稱已開啟。 |
| 指定對話回答 | 直接回答,不產檔。 | — |
| 單一事實查詢 | 簡短、附來源回答,不問格式。 | — |
| 交由 agent 決定 | 說明選用的文件格式並產檔。 | 提供路徑。 |
來源:SKILL.md「確認交付格式」「驗證與交付」;tests/answer-me/README.md「Output-format evaluations」表格。自動開啟規則於 2026-10-04 加入,見 .scratch/html-auto-open/verification.md;該紀錄自述「不要開啟、無桌面與命令失敗分支已做文字核對,尚未逐一執行」。
維護端如何把關?
技能是文字規則,所以專案用三層檢查,各自只能證明一部分事情。越往右,越接近「技能會不會產生好答案」,也越依賴人工判斷。
快速檢查與 pre-commit
check.py 對每個 skills/*/SKILL.md 跑外部驗證器,檢查 openai.yaml 的兩個顯示欄位非空,並掃描文件中的相對連結是否存在。
離線瀏覽器檢查
以 headless Chrome 透過 DevTools Protocol 開 file://,模擬離線,記錄所有 HTTP(S) 請求與執行期例外,再對保存的 HTML 斷言數值與版面。
語意演練
只給新 agent 技能、提示與原始材料,重新產出答案;審查者持有驗收條件,比對語意而非文字。
快速檢查的實際範圍
check.py 的 check() 會在缺 PyYAML 或找不到驗證器時直接回報失敗,不會略過。驗證器預設是 Codex 安裝中的 skill-creator/scripts/quick_validate.py,可用 SKILL_VALIDATOR 覆寫。連結掃描會跳過程式碼區塊、行內程式碼、外部網址與絕對路徑。
scripts/check.py 第 14–20 行(依賴檢查)、第 23–43 行(frontmatter 與 metadata)、第 45–68 行(相對連結)、第 77–78 行(驗證器路徑)。
pre-commit 為什麼要用「暫存快照」?
hook 執行 check.py --staged。這個模式先用 git checkout-index --all 把 Git index 匯出到暫存目錄,再對該目錄檢查。結果是:工作目錄中尚未 git add 的修正,不能掩蓋即將提交的錯誤;未追蹤的檔案也不能讓已暫存的連結「看起來存在」。
scripts/check.py 第 79–88 行;.githooks/pre-commit 第 4–8 行(優先用 ANSWERME_PYTHON,其次 .venv/bin/python,最後 python3);對應測試 tests/test_checks.py 第 72–93 行。
安裝 hook 時會保留什麼?
install-hooks.sh 只設定本 repository 的 core.hooksPath。若已設定其他 hooks 路徑,或預設 hooks 目錄已有可執行的 hook,它會保留原設定並以非零狀態結束。
scripts/install-hooks.sh 第 5–22 行;測試見 tests/test_checks.py 第 106–123 行。
瀏覽器檢查怎麼判定「離線可用」?
withOfflinePage() 啟動 headless Chrome、停用快取、呼叫 Network.emulateNetworkConditions 設為離線,並等到 location.protocol === "file:"。結束時回傳兩份清單:Runtime.exceptionThrown 事件,以及網址以 http/https 開頭的請求。verify.mjs 要求兩個最終頁面的這兩份清單都為空;模板檢查 verify-templates.mjs 則只允許那一個 Google Fonts stylesheet 請求。
tests/answer-me/browser/cdp.mjs 第 24、70–78、87–88 行;verify.mjs 第 58–61 行;verify-templates.mjs 第 14、104 行。
為什麼瀏覽器檢查通過不代表技能沒問題?
演練說明明寫:保存的 HTML 通過檢查,只確認那份歷史成果仍如紀錄般運作,不能驗證新產生的答案或目前的技能指示。技能行為改變時,要用 tests/answer-me/ 下的原始輸入重新演練,再依表中的語意條件審查。
tests/answer-me/README.md 第 3、17–31 行;docs/checks.md「行為與瀏覽器驗證」。
哪些設計是刻意的?
五份 ADR 都是 status: accepted,沒有待決(proposed)的決策。每份都寫了「Falsified if」條件,指出哪些檔案的改變會讓決策失效。
| 決策 | 內容 | 理由(ADR 所述) |
|---|---|---|
| 0001 核心獨立 | 核心自行負責選型、組織、證據與檢查;show-me 等只在可用時選用。 | 固定路由會讓簡單解說也背上依賴,單一整合失效會拖垮整個技能。 |
| 0002 單檔離線 HTML | CSS、JS、SVG、資料全內嵌;唯一例外是 Google Fonts。 | 使用者要能保存、轉寄並在無網路時閱讀與操作。 |
| 0003 不做旁白影片 | 被要求影片時提出腳本或分鏡,並標明實際成果類型。 | 製作成本、工具依賴與驗證方式遠高於其他形式;是範圍上的「不做」。 |
| 0004 借用 STE、不追符合度 | 不設句長上限、禁詞比例或自動檢查器。 | 機械規則容易把「可能」改成「一定」,或刪掉讓結論反轉的條件。 |
| 0005 維持繁體中文 | SKILL.md 不改寫成英文。 | 作者的盲評 A/B:中文版 84/86、英文版 85/86 項驗收條件,ADR 判定在雜訊範圍內打平。 |
0005 的數字是 ADR 引述的作者紀錄(.scratch/skill-language-ab/verification.md),本文未重跑該評估。
驗證與限制
以下是製作本文時,在 2026-10-05 對 repo2 快照實際執行的檢查(實測):
python3 scripts/check.py:輸出PASS: skill frontmatter, display metadata, and relative documentation links,結束碼 0。python3 -m unittest discover -s tests -p 'test_checks.py':10 個測試全部通過。node tests/answer-me/browser/verify.mjs(Node v24.21.0、本機 Google Chrome):結束碼 0,保存的兩個互動頁在離線下沒有遠端請求或執行錯誤。
未執行的部分:模板檢查 verify-templates.mjs、所有語意演練,以及在真實 Git 倉庫中實際提交觸發 hook。repo2 快照本身不是 Git 倉庫,hook 行為只經 test_checks.py 在臨時倉庫中測過。
推論與缺口:agent 平台如何依 description 決定載入技能,不在本 repo 內,本文第 1 步屬推論。.scratch/ 中的驗證紀錄是過去的執行紀錄,本文引用時視為作者紀錄,不當成本次結果。快速檢查依賴 Codex 安裝中的驗證器;在沒有 Codex 的環境,需另以 SKILL_VALIDATOR 指定。