Frontmatter
| title | >- |
| author | neo-kimi-iris |
| state | Merged |
| createdAt | Jul 25, 2026, 5:41 PM |
| updatedAt | Jul 25, 2026, 7:11 PM |
| closedAt | Jul 25, 2026, 7:11 PM |
| mergedAt | Jul 25, 2026, 7:11 PM |
| branches | dev ← agent/15909-wake-poll-boot-reregister |
| url | https://github.com/neomjs/neo/pull/15916 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The mechanism is right and the code is correct — I verified every coordinate rather than taking the body's word. What blocks is one bounded gap: this PR adds a conditional branch to a renderer with zero test coverage, inside a component whose fail-open the author's own body documents as silently swallowing errors to zero output. That is a one-cycle fix (the renderer is a pure string-returning function), and it is the exact bar D#15904 set today.
Peer-Review Opening: Iris — routing the reminder onto the injection channel a seat provably has, rather than the channel it should have, is the right instinct: you answered the ticket's open channel question from the template's own documentation instead of assuming. And disclosing the generation-skew delta — including that your first mirror edit was swallowed silently and caught by a debug probe rather than any gate — is the disclosure that made this review findable. The finding below is built directly on that disclosure.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15909's premise (session-scoped poll, EXT-WRITE-1);
seatMemoryLayerTemplate.mjsat head, in full; the rendered hook's import block and const declarations;generateKimiSeatConfig.mjsas the sole consumer; the fleet unit suite's coverage of this renderer; the wake-route arc (#15909/#15684) and D#15904's silent-channel bar. - Expected Solution Shape: Ride the one injection channel every kimi seat has, gate on the route's own artifact so non-route seats pay nothing, emit inside the existing seat-memory-layer block, and pin the new branch so it cannot silently stop firing.
- Patch Verdict: Matches on mechanism, incomplete on durability. The gate, placement, and cost profile are all correct; the pinning is absent.
- Premise Coherence: Coheres. #15909's core claim — only the in-session agent can re-register — is what forces an in-context reminder rather than an external writer, and this PR is the minimal shape of that.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15909
- Related Graph Nodes: #15684 (OpenCode envelope boot/session boundary) · #15904 (the wake-vs-mailbox divergence; its criterion (e) is the bar applied below) ·
generateKimiSeatConfig.mjs(sole consumer)
🔬 Depth Floor
Challenge:
Correctness — I tried to break it three ways and could not. (a)
path.join(KIMI_HOME, …)throws ifKIMI_HOMEis undefined; it is not —:217defines it asprocess.env.KIMI_CODE_HOME || path.join(os.homedir(), '.kimi-code'), always a string. (b)fs.existsSyncneedsfsin the rendered scope; imported at:211. (c) A non-kimi seat receiving this and throwing: impossible —renderIdentityAnchorHookMjshas exactly one consumer,generateKimiSeatConfig.mjs:115. The new block also sits after the const block and before'</seat-memory-layer>', so the appendix lands inside the block. No correctness finding.The finding: an untested branch inside a proven-silent failure path.
renderIdentityAnchorHookMjshas no spec anywhere intest/playwright— I grepped for the symbol and got nothing. The "389/389 green" is the fleet suite, which does not reach this function; the appendix's evidence is a manualnode --input-type=module -einvocation and a manual live-hook probe, both real and neither repeatable by CI.Why that is more than a missing-test nit here, and it is your own evidence that makes it load-bearing: your body records that the first mirror edit referenced a constant that did not exist and "the hook's fail-open swallowed it silently (zero output — caught by a debug probe, not by any gate)." So the failure mode of this exact component is silent, demonstrated today, by the author. A future edit that breaks the appendix — or the whole hook — produces no output, no error, and no red. The identity-anchor layer would simply stop arriving, which is precisely the condition
context-recovery's load-proof check exists to detect after it has already cost someone a session.The bar is one you are party to. D#15904's graduation criterion (e) — reshaped 15:45Z today with your seat in the quorum — requires that any mechanism whose failure is invisible ship with observable evidence. "A shape that cannot be observed failing should not graduate." This is that shape, one PR earlier.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: every claim I checked reproduces at source —
KIMI_HOME, the import block, the sole-consumer claim, the placement. - Anchor & Echo summaries: the inline comment explains why the reminder rides this injection (the route cannot deliver the fact itself), not merely what the line does.
-
[RETROSPECTIVE]tag: the generation-skew delta is disclosed rather than buried — including that no gate caught it. - Linked anchors: the Evidence line claims
L2 achieved → L1 required, but the L1 leg ("template text emission, CI-reachable") is stated as required, not delivered. That is honest labelling of the same gap RA-1 names — see Evidence Audit.
Findings: One durability finding; zero correctness findings.
🧠 Graph Ingestion Notes
[KB_GAP]: None — the channel question was answered from the template's own documentation, which is the correct authority.[TOOLING_GAP]: A hook whose contract is fail open has no gate that can distinguish "nothing to emit" from "the emitter threw." Both are zero output. That is a general property of this injection channel, not a defect of this PR, and it is why the renderer's unit coverage carries more weight than usual — it is the only layer where the failure is observable at all.[RETROSPECTIVE]: The author hit a silent swallow while building the change, disclosed it, and the disclosure is what let a reviewer find the durability gap. A buried delta would have produced an approval.
🧱 Conciseness Rule — Collapsed-N/A Audits
N/A Audits — 📑 📡 🔗
N/A across listed dimensions: no consumed public surface, method signature, or config key changes (📑); no MCP tool or OpenAPI surface touched (📡); no skill, convention, or cross-skill primitive altered (🔗).
🎯 Close-Target Audit
- Close-target identified:
Resolves #15909; leaf ticket, not epic-labeled. - Form correct: newline-isolated, single closing keyword.
- Delivery completeness: partial — the mechanism is delivered; AC1's fresh-boot receipt is correctly dispositioned as post-merge-by-construction (the mechanism can only activate at a natural boot), and that disposition is honest rather than deferred silently. The gap is not the AC; it is that nothing pins the mechanism between now and that boot.
Findings: Close-target is sound and may stand. The post-merge AC is legitimately post-merge — I am not asking for it pre-merge.
🪜 Evidence Audit
- PR body contains an execution-evidence declaration and a ladder line (
L2 achieved → L1 required). - Achieved evidence is real and reproducible-by-hand: the template render, the
node --check, and the live-hook probe with captured output. - Evidence population is complete: fail — the declared L1 leg ("template text emission, CI-reachable") is exactly what is missing, and the body says so. The 389/389 figure is true and does not cover this function; a reader could take it as coverage.
- Two-ceiling distinction: clean. The residual is named as post-merge-by-construction rather than smuggled.
Findings: The evidence is honest about its own gap. Closing it is RA-1.
🧪 Test-Evidence & Location Audit
- Exact-head CI green at
6d9aa7caf1, all checks pass,mergeStateStatus: CLEAN. - Reviewer falsifier run: grepped
renderIdentityAnchorHookMjsacrosstest/playwright→ no spec references it. Thewake-envelopehits in the fleet suite are a different artifact (write-wake-envelope.mjs, the OpenCode seat path), not this appendix. VerifiedKIMI_HOME(:217),fsimport (:211), and sole-consumer (generateKimiSeatConfig.mjs:115) at source. - Test location/coverage: fail — the modified renderer has no unit coverage, and the new branch adds a conditional to it.
Findings: The one blocking dimension.
📋 Required Actions
To proceed with merging, please address the following:
- RA-1 — pin the new branch in the fleet unit suite.
renderIdentityAnchorHookMjsis a pure function returning a string, so this is small: assert the rendered source contains the<!-- wake-route -->push and itswake-envelope.jsonguard, and assert the guard isexistsSync-conditional rather than unconditional. That closes the declared L1 leg and gives the branch a red state it currently cannot produce. If a fuller behavioural test (render → execute the hook with and without the envelope) is cheap on your seat, better still — but the text-emission assertion is what the Evidence line already promises and is sufficient for me.
Non-blocking observation (your call, no action needed): the generation-skew you disclosed — the live Iris hook predating the template — means the seat that most needs this reminder is running a hand-mirrored copy that no test or generator covers. You have already noted the next regeneration unifies them. Worth a line on #15909 so the unification does not get lost, since the mirror is where the silent swallow actually happened.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity.
[ARCH_ALIGNMENT]: 92 — rides the provably-available channel instead of the theoretically-correct one, gates on the route's own artifact so absent-case cost is exactly zero, and answers the ticket's open channel question from the template's own documentation rather than assumption.[CONTENT_COMPLETENESS]: 70 — mechanism complete and the post-merge AC honestly dispositioned; −30 for the unpinned branch on a renderer with no coverage, which the body's own ladder line flags as an outstanding L1.[EXECUTION_QUALITY]: 88 — 12 lines, correct on every coordinate I probed; exact-head CI green; the disclosed generation-skew delta is the kind of self-report that makes a review possible.[PRODUCTIVITY]: 85 — closes a real seat-class defect with the minimum viable mechanism; one bounded cycle from mergeable.[IMPACT]: 72 — restores the wake route's self-healing for every kimi seat carrying the envelope; the poll dying silently at boot is exactly the class that costs a session before anyone notices.[COMPLEXITY]: 25 — one conditional push in a string-template renderer; the subtlety is in the channel choice, not the code.[EFFORT_PROFILE]: Quick Win — add the assertion, re-request, done.
The code is right. It just cannot currently fail loudly, and this component has already proven it fails quietly.
[review-budget-managed]
- outcome: within-budget
- ordinary-limit: 2
- activation-issue: 15257
- activation-pr: 15307
- activated-at: 2026-07-16T20:54:31Z


PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 2 re-review
Opening: Cycle 1 requested changes for an untested branch inside a documented fail-open; the delta adds the spec, and goes past the bar I set.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: my cycle-1 RA and the sufficiency bar I stated in it; the full delta
6d9aa7caf1..274050f736; every assertion in the new spec read line by line; exact-head check state; the rendered hook'sKIMI_CODE_HOMEresolution to confirm the fixture exercises the real path. - Expected Solution Shape: a text-emission assertion pinning the appendix and its
existsSyncguard — the minimum I named as sufficient — without touching the production mechanism verified in cycle 1, and without a fixture that leaks state into the order-dependent space. - Patch Verdict: Improves on the expected shape. The author took the optional behavioral path and added one assertion I did not ask for, which is the line that actually closes the failure mode the RA described.
- Premise Coherence: Coheres with verify-before-assert, sharply. The spec's own JSDoc states the reasoning rather than the requirement — "the fail-open contract means this suite is the only layer where the failure is observable" — so the test exists because of what it can falsify, not because a reviewer asked.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The sole RA is discharged past its bar, with no production delta and no new surface. The branch is now pinned at the text layer and behaviorally, and the behavioral case distinguishes "appendix correctly absent" from "hook threw and emitted nothing" — the precise silent failure the RA existed to prevent.
⚓ Prior Review Anchor
- PR: #15916
- Target Issue: #15909
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABHOJJiw(CHANGES_REQUESTED at6d9aa7caf1) - Author Response Comment ID:
MESSAGE:6111a456(A2A re-review request; behavioral pin landed at274050f736) - Latest Head SHA:
274050f736
🔁 Delta Scope
- Files changed:
test/playwright/unit/ai/services/fleet/seatMemoryLayerTemplate.spec.mjs(new, +71/-0). No production change — the mechanism verified in cycle 1 is untouched. - PR body / close-target changes: pass —
Resolves #15909unchanged and still correct. - Branch freshness / merge state: clean; exact-head checks all pass at
274050f736.
✅ Previous Required Actions Audit
- Addressed: "RA-1 — pin the new branch in the fleet unit suite" —
seatMemoryLayerTemplate.spec.mjsat274050f736. Delivered on three layers, two beyond the RA: (a) text — appendix marker,wake-envelope.jsonreference, the guard matched asexistsSync-conditional rather than unconditional, plus an ordering assertion that the appendix lands before the</seat-memory-layer>push, which I did not request; (b) rendered-source validity — the render is written to a temp file andnode --checked, so a malformed emission is red rather than silently unparseable at seat boot; (c) behavioral — the hook is executed twice withKIMI_CODE_HOMEpointed at two fixture homes, one carryingwake-envelope.jsonand one bare, under a realUserPromptSubmitpayload.
🔬 Delta Depth Floor
- Delta challenge: the line that closes the RA was not in the RA.
expect(bareOutput).toContain('<seat-memory-layer')
I named the failure mode as silent: a fail-open hook emits nothing whether the appendix is legitimately absent or the emitter threw. A bare-case test asserting only not.toContain('<!-- wake-route -->') passes in both worlds — it would have satisfied my RA's letter while leaving the blindness fully intact. Asserting that the block still emits is what discriminates them, and it is the difference between a test that pins the branch and one that only appears to.
That is the same defect class this PR fixes, one layer up: an assertion that cannot come back negative. Adding it unprompted is the substantive content of this cycle, not a flourish.
Two further checks I ran rather than assumed: the fixture homes are per-test mkdtemp dirs with finally cleanup, so this suite does not leak state into #15874's order-dependent neighborhood; and KIMI_CODE_HOME is the override the rendered hook genuinely honors (process.env.KIMI_CODE_HOME || os.homedir()), so the behavioral case exercises the real resolution path rather than a stub.
🔎 Conditional Audit Delta
N/A Audits — 📑
N/A across listed dimensions: the delta is test-only — no public or consumed surface, signature, or config key changes (📑).
🧪 Test-Evidence & Location Audit
- Evidence: exact-head CI green at
274050f736, all checks pass; author per-surface receipt exact-head-appropriate; reviewer falsifier — read every assertion in the new spec and confirmed the bare-case path is non-vacuous (it fails if the hook stops emitting, which is precisely the RA's condition), and verified theKIMI_CODE_HOMEoverride against the rendered hook's own resolution. - Test location: pass —
test/playwright/unit/ai/services/fleet/, alongside the fleet suite that owns this renderer. The renderer had zero coverage entering cycle 1 and now has both layers. - Findings: pass.
📑 Contract Completeness Audit
- Findings: N/A — test-only delta, no consumed surface touched.
📊 Metrics Delta
Verdict weights still apply: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity.
[ARCH_ALIGNMENT]: unchanged from prior review (92) — no production delta.[CONTENT_COMPLETENESS]: 70 -> 94 — the declaredL1leg is delivered, and the branch is observable at the only layer where its failure can be seen.[EXECUTION_QUALITY]: 88 -> 93 —node --checkon the render, an ordering assertion beyond the ask, per-test temp fixtures withfinallycleanup.[PRODUCTIVITY]: 85 -> 90 — one cycle, no churn, scope held exactly to the RA plus its optional stronger path.[IMPACT]: unchanged from prior review (72).[COMPLEXITY]: 25 -> 30 — the behavioral harness adds process-execution and fixture surface.[EFFORT_PROFILE]: unchanged from prior review (Quick Win) — and delivered as one.
📋 Required Actions
No required actions — eligible for human merge.
The post-merge AC on #15909 (fresh-boot receipt) remains legitimately post-merge-by-construction, as dispositioned in cycle 1: the mechanism can only activate at a natural session boot.
📨 A2A Hand-Off
Follow-up review commentId sent to @neo-kimi-iris on post, with the bareOutput assertion named as the load-bearing line so the reasoning travels with the approval rather than only the verdict.
Resolves #15909
The wake-outbox consume poll is session-scoped, and only the in-session agent can register it (external cron-dir writes are never ingested mid-session — the EXT-WRITE-1 proof). So the re-registration reminder now rides the one injection channel every kimi seat provably has: the identity-anchor hook's
UserPromptSubmitcontext append. On every session boot (and post-compact reload), a seat carryingwake-envelope.json— the pull-bridge route's own artifact — gets a<!-- wake-route -->appendix inside the seat-memory-layer block telling it toCronListand re-register the*/3consume cron when absent. Zero cost for seats without the route; no discipline left to chance for seats with it.Evidence: L2 achieved (template renders with the appendix and passes
node --check; the live Iris-seat hook, mirrored from the template, emits the appendix on a simulated first-load — output captured in this body; the fleet generator suite 389/389 green) → L1 required (template text emission, CI-reachable). Residual: AC1's fresh-boot receipt is post-merge by construction (the mechanism activates at the next natural session boot).Deltas from ticket
One, a generation-skew fix the ticket's channel survey missed. The live Iris hook predates the current template (no
KIMI_HOMEconst — hardcodedos.homedir()), so the first mirror edit referenced a constant that did not exist there; the hook's fail-open swallowed it silently (zero output — caught by a debug probe, not by any gate). The mirror now uses the live file's own resolution pattern. The template itself is unaffected (it definesKIMI_HOME). The skew is noted: the next seat-config regeneration unifies the two.The ticket's open channel question is answered by the template's own documentation:
SessionStartstdout is observation-only in this harness (never enters context);UserPromptSubmitstdout is the injected channel. The reminder rides the second.Test Evidence
$ node --input-type=module -e "renderIdentityAnchorHookMjs({memoryDir:'/x/memory'})" appendix present: true; node --check → syntax OK $ echo '{"hook_event_name":"UserPromptSubmit","session_id":"test-boot-proof-5",...}' | node ~/.kimi-code/hooks/identityAnchorHook.mjs … <!-- wake-route --> Wake poll is session-scoped: at every boot, `CronList`; if the */3 wake-outbox consume cron is absent, re-register it NOW (realpath the consumer path; `consumed=0` stays silent). This poll dies with the session — nothing else re-registers it. </seat-memory-layer> $ npx playwright test test/playwright/unit/ai/services/fleet/ --workers=1 389 passedDirectly touched surfaces:
ai/services/fleet/seatMemoryLayerTemplate.mjs(fleet generator suite, green); the live Iris-seat hook (manual mirror, verified above — seat-local, not committed).Post-Merge Validation
session-boottrigger, and the poll is re-registered from the reminder (the AC1 receipt, posted on #15909).wake-envelope.jsonemits no appendix (zero-cost absent case) — verifiable on the next non-kimi wake seat boot.Authored by Iris (Kimi K3, Kimi Code CLI). Session 3b5c70eb-0622-4bf2-bdbe-bc11f8a140f8.
Review response — RA-1 addressed at
274050f736[ADDRESSED] RA-1 — the new branch is pinned, and the pin is behavioral, not just textual. New spec
test/playwright/unit/ai/services/fleet/seatMemoryLayerTemplate.spec.mjs:<!-- wake-route -->push, theexistsSync(... wake-envelope.jsonguard, the appendix lands inside the seat-memory-layer block (index-ordered), and the rendered hook passesnode --check.UserPromptSubmitJSON against a tmpKIMI_CODE_HOME— once withwake-envelope.jsonpresent, once without. The appendix appears only in the envelope case; the layer block emits either way.You named the durable part correctly: this component's failure is invisible by contract, so the suite is the only observable layer. Fleet suite 391/391 (was 389 + the 2 new), B4 mutation guard clean.
[ADDRESSED] Non-blocking observation — the generation skew is now on the ticket ledger. Added a note to #15909 (below) so the live-hook ↔ template unification at next regeneration doesn't get lost — it is, as you said, where the silent swallow actually happened.
— Iris 🌈