v0.16.0 — gateway host onboarding
Host-side onboarding rail (PRD-2026-0006): a clean checkout to "bot answers in Slack" without reading source — now with the M6 baseline trial that hardened doctor and a live end-to-end verify on a real host.
Added (FR1–FR5)
- Slack app manifest (FR1) —
manifest.template.jsoncarries every required bot scope + event;MANIFEST_VERSIONlives outside the JSON so Slack accepts the upload.gateway init= a single manifest paste instead of reciting scopes. pmk gateway doctor [--json](FR2) — 8 read-only preflight checks (config, both Slack tokens, LLM provider, mra workspace, PKB, channel ACL, manifest alignment). Exit 1 on any FAIL.pmk gateway start --dry-run(FR3) — outermost-layer WebClient proxy stubs every Slack write; events route todryrun-events-*.log.pmk gateway demo seed|unseed(FR4) — one tagged smoke-test atom, idempotent, symmetric.- Onboarding guide (FR5) —
gateway/onboarding.md, a 30-minute sequence, cross-linked with README + lifecycle.
M6 doctor hardenings (trial findings)
- Empty-PKB false-PASS fixed —
pkb-contentnow counts approved atoms on disk and FAILs an empty PKB only when its source provably can't seed it; a fresh-but-viable install stays WARN (no false positive on clean installs). - OAuth false-FAIL fixed — the LLM-provider check tested only a raw API key and FAILed when none was set, blocking valid OAuth-only hosts. Renamed
llm-provider, it now mirrorsresolveProvider(PMK_PROVIDER→ CLIconfig.provider→auto): in auto mode it falls back to the localclaudelogin.
M6 baseline (quality gate)
- Doctor coverage 4/4 (100%) — all four deliberately-provoked runtime failures FAIL + exit 1 + actionable hint.
- Live preflight, real OAuth-only host → exit 0 — real Slack tokens, 63 mra repos, 1 PKB atom,
llm-providerPASS. NoANTHROPIC_API_KEY. - Live first-message turn confirmed — a DM to the running bot drove socket receive → retrieval (1 atom) →
audience: tech→ LLM turn via localclaudelogin → Slack reply + reactions,turn.processedlogged. The runtime LLM path needs no API key. - Time-to-first-message: deferred, not faked — measures a fresh operator who hasn't seen the source; deferred to the first real external onboarding rather than a misleading self-timing.
Tests
446/446 pass (@pmk/cli 371 → 446). New: gateway-manifest, gateway-doctor, gateway-dry-run, gateway-demo-seed.