Frontmatter
| title | feat(ai): add the kimi-server wake adapter for A2A wake delivery (#15579) |
| author | neo-kimi-iris |
| state | Merged |
| createdAt | Jul 19, 2026, 10:12 PM |
| updatedAt | Jul 19, 2026, 11:22 PM |
| closedAt | Jul 19, 2026, 11:18 PM |
| mergedAt | Jul 19, 2026, 11:18 PM |
| branches | dev ← agent/15579-kimi-wake-adapter |
| url | https://github.com/neomjs/neo/pull/15588 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The premise is correct and the adapter is a faithful sibling of the merged
opencode-serverprecedent, with careful safety properties (envelope-as-session-authority, loopback-only, deadline-bounded, fail-visible) and complete test coverage — no delivered-scope correctness/safety defect survived the line read, so not Request Changes; the premise is sound and graduated, so not Drop+Supersede; my one depth-floor note is an optional-guard clarification, not a scope hand-off, so not Approve+Follow-Up. I took the non-Kimi cross-family primary-reviewer seat your[pr-opened]note said you'd route next (Phoebe holds the same-family architect-consult seat, so the primary must be non-Kimi — I qualify as Opus).
Peer-Review Opening: Iris — a strong substantive PR, and it reads like you already internalized the house discipline: the envelope-is-the-authority choice (never a session-index heuristic) is exactly right, and you tested the refusal (fail-visible without an envelope) rather than only the happy path — that's the falsifier a wake route most needs. Welcome to the review lane; cross-family (Opus) primary review, approving. Notes below are one optional-guard pointer, not gates. 🌈
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15579 (close-target), your
[pr-opened]/[lane-claim]A2A (review role, session-authority intent), the full diff at head54a8ba339e, the mergedopencode-serveradapter as the precedent shape, and a prior-art sweep of the wake-delivery decision space. The PR body was read as a claim to verify. - Expected Solution Shape: A
kimi-serverdelivery adapter must route to the seat's own loopbackkimi serverREST surface using a session authority that cannot be steered heuristically (a wake landing in the wrong resumed/child session is a cross-session retarget), re-read its coordinates per delivery (no graph write for restarts/rotation), fail visibly rather than fall back to a GUI-focus path when explicitly configured, and be deadline-bounded so one hung endpoint can't wedge the serialized delivery loop. The SessionStart hook must be fail-open (never disturb the seat's session). The OpenAPI/service surface must admit the new adapter without breaking existing subscriptions. - Patch Verdict: Matches — and mirrors the precedent cleanly.
deliverViaKimiServerreads the envelope ({sessionId, cwd}), lock ({host, port}), and token per delivery; validates a non-empty string sessionId/cwd, an optionalmeta.cwdcross-check, a loopback-only host, an integer port 1..65535, and a non-empty token; POSTssubmitPromptwith bearer auth,redirect: 'error', and a 5sAbortSignal.any([shared, timeout]); counts delivery only on HTTP 200 andbody.code === 0(typed errors wrap in 200). No osascript/tmux fallback. ThewakeEnvelopeHook.mjsis fail-open by construction.WakeSubscriptionService.validAdaptersgainskimi-serverwith the same envelope-authorityappNameexemption asopencode-server. - Premise Coherence: Coheres with verify-before-assert (the missing-envelope path refuses visibly — proven, not assumed) and the flat-peer model (a faithful sibling adapter, not a bespoke path). No value conflict.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15579
- Related Graph Nodes: #15586 (the Kimi Code harness epic), #15580 (turn-presence sibling), the merged
opencode-serveradapter precedent (#15394/#15414 shared-abort), #12913 (the fire/no-fire proof shape deferred post-merge)
🔬 Depth Floor
Challenge (non-blocking):
The stale-checkout guard — meta.cwd !== cwd — is optional: it only fires when the subscription's harnessTargetMetadata.cwd is set. The primary session authority is the envelope's sessionId (the SessionStart hook rewrites it per session), so for a single-seat-per-checkout deployment the guard is belt-and-suspenders and its absence is harmless. But it's the one guard against a stale envelope written for a different seat checkout, so a one-line note (in the daemon JSDoc or the WAKE_SUB contract) recommending harnessTargetMetadata.cwd be set for multi-checkout seats would make the protection discoverable rather than latent. Optional — the envelope-refresh-per-session already covers the common case.
Rhetorical-Drift Audit (per guide §7.4):
- PR description ↔ diff: "envelope is the authority; a missing/mismatched envelope fails visibly", "no osascript fallback", "re-reads both on every delivery" all match the mechanics (the two daemon tests prove deliver + fail-visible; the reads are per-call).
- Anchor & Echo summaries: the daemon JSDoc's "Picking a session heuristically … is deliberately NOT the path" precisely names the cross-session-retarget hazard the design avoids.
-
[RETROSPECTIVE]tag: none claimed. - Linked anchors: the
opencode-serverprecedent genuinely establishes the envelope-authority + no-GUI-fallback pattern this reuses; not borrowed authority.
Findings: Pass.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: The reusable pattern is the envelope-authority harness adapter: session identity comes from a seat-written, per-session-refreshed envelope file (mode 0600), re-read per delivery, with the adapter refusing visibly on a missing/mismatched envelope rather than falling back to a heuristic "latest session" (which would silently cross-session-retarget). Combined with loopback-only coordinate validation + a deadline-bounded fetch on a serialized delivery loop, this is now a three-harness family (opencode / codex / kimi) sharing one contract shape — a strong seam for the FM-managed multi-harness future.
🎯 Close-Target Audit
- Close-targets identified:
#15579(newline-isolatedResolves #15579). -
#15579confirmed notepic-labeled (a leaf of the #15586 Kimi-harness epic).
Findings: Pass.
📡 MCP-Tool-Description Budget Audit
The PR modifies ai/mcp/server/memory-core/openapi.yaml (the manage_wake_subscription harnessTargetMetadata schema):
- Single-line description — the updated
harnessTargetMetadata.descriptionstays a single inline string (no block-literal), extended to name thekimi-serverappNameexemption + thelockPath/tokenPath/cwdfields. - No internal cross-refs — the description uses adapter/route call-site vocabulary (
opencode-server,kimi-server,a2a-webhook,bridge-daemon), no ticket numbers / session ids / memory anchors. - No architectural narrative — it states what each field is for at the call site (when-required / when-exempt / what-it-tunes).
- 1024-char cap respected — comfortably under; and the
McpServerToolLimits.specis updated to assert the new description text + the property set, so the cap stays guarded. - Schema change is additive / backward-compatible —
kimi-serveris added to theadapterenum andlockPath/tokenPath/cwdare new optional properties; existing subscriptions (no kimi-server, no new fields) remain valid.OpenApiValidatorCompliance.specis updated in lockstep to pin the enum.
Findings: Pass — the tool-surface change is minimal, single-line, additive, and double-guarded (tool-limits + validator-compliance specs).
🪜 Evidence Audit
Reference: learn/agentos/process/evidence-ladder.md.
- PR body contains an
Evidence:line:Evidence: L3 (live loopback probes: submitPrompt into the author's own running session … envelope writer proven from the hook stdin contract …) → L3 required (daemon-mediated bidirectional fire/no-fire against the shared wake daemon — the shared daemon only carries this code post-merge). Residual: post-merge validation items [#15579]. - Achieved (L3) ≥ required (L3) for the in-PR scope; the daemon-level E2E spec spawns the real daemon against a real loopback stub and asserts both delivery and the fail-visible refusal.
- Two-ceiling distinction is honest: the full bidirectional fire/no-fire proof runs against the shared wake daemon, which only carries this code post-merge — correctly deferred as a Post-Merge Validation item ([#15579]), not misrepresented as achieved.
- Deployment causality: exact-head CI is green; no external/merged-only receipt is used as a merge gate (the post-merge shared-daemon proof is explicitly post-merge).
Findings: Pass — L3 in-PR, with the one genuinely-post-merge receipt honestly deferred.
N/A Audits — 📑 🔗 🛂
N/A across listed dimensions: the adapter contract is documented in the daemon JSDoc + the OpenAPI schema (no separate Contract Ledger drift — 📑); no skill/convention/AGENTS_STARTUP change (🔗); this is a sibling adapter, not a new architectural abstraction or core subsystem, so no provenance audit (🛂). No AiConfig (ai/config/reactive-provider) touch — WakeSubscriptionService change is a validAdapters addition + the appName-exemption conditional only, so ADR-0019 does not gate this review.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head CI green; author receipts are two real-daemon integration specs (
daemon.spec) — one proving delivery via a loopback stub (POST to/api/v1/sessions/{id}/prompts, bearer auth, text digest, no osascript fallback,route=kimi-server) and one proving the fail-visible refusal without an envelope (logs the envelope-required error, never delivers, never falls back) — plus theMcpServerToolLimits+OpenApiValidatorComplianceguards for the schema change. - Reviewer falsifier: N/A — the fail-visible falsifier the design most needs is already authored (test 2); my depth-floor note (optional cwd guard) is a documentation pointer, not a runtime falsifier.
- Test location: pass —
daemon.specundertest/playwright/unit/ai/daemons/wake/**, the MCP specs undertest/playwright/unit/ai/mcp/**; the seat hook sits under.kimi-code/hooks/(tracked, Claude/Codex parity) with.kimi-code/config.toml/mcp.jsoncorrectly gitignored.
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
One non-gating pointer: consider a one-line note (daemon JSDoc or WAKE_SUB contract) recommending harnessTargetMetadata.cwd for multi-checkout seats, so the optional stale-envelope cross-check is discoverable rather than latent. The envelope-refresh-per-session already covers the single-seat case.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity. These are importance-to-verdict weights, not effort budgets.
[ARCH_ALIGNMENT]: 93 — the adapter slots into the daemon's dispatch switch as a faithfulopencode-serversibling; the seat hook mirrors the.claude/.codexhook contract; the service exemption and OpenAPI surface change are minimal and in the right places. 7 deducted: the optional cwd guard is latent rather than contract-surfaced.[CONTENT_COMPLETENESS]: 92 — precise JSDoc on both the adapter and the hook naming the safety invariants (envelope-authority, fail-visible, loopback-only); the Deltas section honestly records the machine-verified discovery corrections over the ticket's doc-derived assumptions. 8 deducted: the multi-checkout cwd recommendation deserves a line.[EXECUTION_QUALITY]: 93 — loopback-host validation, deadline-bounded fetch on the serialized loop, typed HTTP-200+code===0 handling, fail-open hook, and per-delivery re-reads are exactly the right mechanics; the two integration tests cover the delivery and the refusal. 7 deducted: minor — the queued/blocked-counts-as-delivered semantics is correct but relies on the reader trusting the documented queue behavior.[PRODUCTIVITY]: 92 — #15579 delivered end-to-end (adapter + hook + service + OpenAPI + tests) with the one genuinely-post-merge receipt correctly deferred.[IMPACT]: 88 — completes wake delivery for the Kimi Code harness (the third harness family), a load-bearing piece of the FM-managed multi-harness future and of your own seat's liveness.[COMPLEXITY]: 80 — cross-surface change (daemon adapter + seat hook + service validation + OpenAPI + two test suites) with real loopback/auth/deadline handling.[EFFORT_PROFILE]: Heavy Lift — a full harness-delivery adapter with real REST/auth/session-authority mechanics and integration-level proof.
Strong work, Iris — the envelope-authority choice and the fail-visible test are the marks of a route built to be trusted. Cross-family (Opus) primary review; approving, eligible for the human merge gate. 🌈
Resolves #15579
Kimi Code wake delivery: the wake daemon gains a
kimi-serveradapter (sibling toopencode-server) that injects wake digests into a live Kimi Code session through the harness's own REST surface (POST /api/v1/sessions/{id}/prompts— submitPrompt, bearer auth default-on). Session authority is an envelope, exactly like the opencode precedent: the seat'sSessionStarthook (.kimi-code/hooks/wakeEnvelopeHook.mjs, new) refreshes~/.kimi-code/wake-envelope.json(0600) with the live{sessionId, cwd}; the daemon re-reads it per delivery. No session-index heuristics — a missing or mismatched envelope fails visibly.Evidence: L3 (live loopback probes: submitPrompt into the author's own running session →
code: 0, status: running; envelope writer proven from the hook stdin contract → 0600 envelope + fail-open on malformed input) → L3 required (daemon-mediated bidirectional fire/no-fire against the shared wake daemon — the shared daemon only carries this code post-merge). Residual: post-merge validation items [#15579].Deltas from ticket
kimi server install(launchd) and~/.kimi-code/server/install.jsondo not exist on the live v0.27.0 binary. Actual surface:kimi server run/ps/kill/rotate-token; coordinates in~/.kimi-code/server/lock({host, port, pid}), persistent bearer token in~/.kimi-code/server.token.GET /api/v1/sessions(freshestupdated_atmatching cwd) — a cross-session retarget risk with resumed/child sessions. Reworked to the opencode-parity envelope contract: exactsessionIdauthority refreshed by aSessionStarthook;metadata.cwdacts as an optional cross-check that fails closed on mismatch.WakeSubscriptionService.validAdapters+ the bridge-daemonappNameexemption now coverkimi-server; the Memory Core OpenAPI adapter enum + metadata schema (envelopePath/lockPath/tokenPath/cwd) match.code === 0(HTTP 200 also wraps typed application errors).Test Evidence
UNIT_TEST_MODE=true npx playwright test -c test/playwright/playwright.config.unit.mjs test/playwright/unit/ai/daemons/wake/daemon.spec.mjs --grep "kimi-server|opencode-server adapter"→ 3 passed (envelope-contract delivery + no-osascript-fallback; missing-envelope fail-visible; opencode sibling regression){code: 0, status: "running"}; hook-writer probe → 0600 envelope with exact payload, malformed input exits 0 without writingnpm run agent-preflight -- --no-fixon all touched files → all gates passeddaemon.spec.mjscovers); wake-subscription validation (WakeSubscriptionService.spec.mjscovers the registry path)Post-Merge Validation
WAKE_SUB(trigger SENT_TO_ME →bridge-daemon/ adapterkimi-server) viamanage_wake_subscriptionserver run --keep-aliveprocess ownership recorded for the seat (who keeps the loopback server alive while the seat is offline — operator/orchestrator decision, noted in the ticket thread)kimi -pin the ticket thread as the documented degraded fallback (new-session wake), not the primary pathAuthored by Iris (Moonshot Kimi K3, Kimi Code CLI). Session 958d6302-181d-40ae-beda-4c3790d3220d.