pmk gateway — 30 分鐘 host onboarding
1. Executive Summary
PRD-2026-0005(gateway slack PRD)證明了 Slack 是非 CLI stakeholder 的
正確入口;落地之後的痛點換了一條:host 自己拉起 gateway 的門檻仍重。
今天 pmk gateway init 已把 5 個 Slack scope / event subscription 印在
螢幕上要 host 手動點完,但沒有 manifest、沒有預檢、沒有 dry-run;任何
一個 token / scope / mra workspace / Anthropic key 弄錯,都是在第一次
真的有人 @bot 時才會炸。
這份 PRD 把目標縮成一句:乾淨機器上、不讀 source code、30 分鐘內
host 能讓 gateway 回完一個訊息。對應
2026-05 product priorities plan
的 P1,是放在 brief apps/docs/docs/_briefs/2026-05-product-narrative-brief.md
(repo-only,未發佈在 Docusaurus)R2 之前的最大槓桿。
2. Problem Definition
Current pain
- Slack app 設定靠人眼複製:
gateway.ts:118-146把 5 個 OAuth scope、 3 個 event subscription 印成文字,host 必須一條一條去 api.slack.com 點 完。任一條漏掉,要等到 runtime 才會出現missing_scope錯誤。 - 沒有預檢:
gateway init寫完~/.pmk/gateway.json後直接結束, 不檢查 token 是否能登入、Anthropic key 是否生效、mra workspace 是否 存在、PKB 是否有任何 ingestible 內容。 - 沒有 dry-run:第一次驗證 = 真的開 socket、真的有人在 channel @bot;錯了之後 stakeholder 看到的就是 bot 在 channel 裡沉默或丟錯。 Host 不敢拿 production channel 試,於是停留在「弄好但不敢推給人用」 的灰色地帶。
- 沒有 smoke-test seed:host 想驗 retrieval → atom → escalation
整條鏈,必須自己 seed atom,靠
gateway atoms add手刻;新 host 沒有信心知道 atom schema 長怎樣。
Desired outcome
| 階段 | 從 | 到 |
|---|---|---|
| Slack app 設定 | 手動點 5 個 scope + 3 個 event | 上傳 1 份 manifest JSON |
| Token / env 驗證 | runtime 才知道有沒有錯 | pmk gateway doctor 一次列出所有失敗 |
| 第一次驗證 | 用 production channel + 真人 @bot | pmk gateway start --dry-run 全程不發訊息 |
| Seed 知識 | 自己手刻 atom | pmk gateway demo seed 寫入 1 顆已知能被 retrieval 命中的 atom |
3. Goals & Success Metrics
Goals
- G1:乾淨機器上,host 從
git clone到「@bot 收到第一個回覆」≤ 30 分鐘。 - G2:所有可預先驗證的失敗模式都在 runtime 之前被
gateway doctor攔下。 - G3:Host 在不發任何訊息到 Slack 的前提下,可以重現整條 retrieval → LLM → escalation 路徑。
- G4:新 host 不必讀 source code、不必查 README 以外的文件。
Metrics
| Metric | 量法 | 目標 | v0.16 baseline |
|---|---|---|---|
| Time-to-first-message | 從 git clone 計時,到 host 自己 @bot 收到回覆 | ≤ 30 min | 未量(defer,見下方說明) |
| Doctor coverage | 已知 runtime failure 在 doctor 中有 check 的比例 | 100% | 4/4(100%) |
| Dry-run 真實度 | dry-run 跑過後,再切真實模式時新增的 surprise failure 數 | 0 | 未量(需真實 LLM key 跑完整 turn) |
v0.16 M6 baseline note:
- Doctor coverage 已達 100%。 4 種已知 runtime failure(過期 App Token、不存在 mra workspace、空 PKB、舊版 manifest)皆 FAIL + exit 1 + 印可操作 hint;trial 中發現空 PKB 原本只給 WARN(3/4),已補
pkb-contentatom-count check 升為 FAIL,補滿至 4/4。trial 另抓到並修掉一個 false-FAIL:anthropic-keycheck 只認 raw API key,對走 claude-agent OAuth 的 host 誤報 FAIL 擋啟動;已改成llm-providercheck 對齊 runtimeresolveProvider(auto 下沒 key 但有本地claude→ PASS)。對真實 OAuth-only 環境跑真doctor結果:Slack teamslack-webhook、63 個 mra repo、1 顆 PKB atom、llm-providerPASS(本地 claude login)→ 7 pass / 1 warn / 0 fail,exit 0,不需任何 secret。 - Time-to-first-message 刻意 defer,不填假數字。 此 metric 量的是「沒看過 source 的新手」耗時——由 maintainer 自計會是被污染的樂觀下限,由自動化 agent 跑則速度不具代表性,兩者都無法誠實回答。Baseline defer 至首位真實外部 host onboard 時量測;屆時若中位數 > 30 min,依本文件 Risk 4(30 分鐘目標太樂觀)先判斷是 Slack 教學還是 pmk 端可省步驟,不為硬達 30 min 而省 doctor 檢查。
- Dry-run 真實度需真實 Anthropic key 跑完整 retrieval → LLM → escalation turn 才能量,留待同一輪外部 onboard 一併取得。
4. Non-Goals
- 不做 hosted / SaaS:與 ADR-0006 host-run 模型衝突,永遠不在 scope。
- 不讓 mra 變 optional:base value 與 mra-enhanced value 的分流在 P3
做(
intro.md改寫),不在這份 PRD。 - 不做 polished AcmeAds demo bundle:那是 plan P5。本 PRD 的 smoke-test seed 只要 1 channel + 1 atom 能讓 host 自驗,不做 guided walkthrough、不做多份 seed PRD。
- 不擴 Slack OAuth 分發:仍走 Socket Mode + 單一 workspace 安裝。