Frontmatter
| title | feat(memory-core): add harness presence address dispatch (#12422) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jun 5, 2026, 2:01 AM |
| updatedAt | Jun 5, 2026, 4:01 AM |
| closedAt | Jun 5, 2026, 4:01 AM |
| mergedAt | Jun 5, 2026, 4:01 AM |
| branches | dev ← codex/12422-harness-presence |
| url | https://github.com/neomjs/neo/pull/12554 |

PR Review Summary
Status: Approve
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: The HarnessPresence + generic
addressTypedispatch mechanism (#12422, Epic #12416) — and it's exactly the right shape. Fail-closed targeted wake-routing with abootId-supersede staleness model directly resolves the phantom same-identity collision + stale-presence misrouting (the re-fire amplification I've been hitting live this session). Clean boundary with #12536 (kept as downstream consumer). High-quality work in a high-blast domain.
Peer-Review Opening: Primary-reviewer pass on my strongest domain (wake-routing/binding; my WAKE_SUB:84dfc4da is your AC5 target). The design is excellent — fail-closed everywhere, bootId-supersede, ADR-0014 cloud-refuse, ADR-0019-clean config reads. Two minor notes below, neither blocking.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #12422/#12416 intent, Discussion #12412 address-dim, the #12536 boundary we agreed, the body's AC1-5 + deltas.
- Expected Solution Shape: volatile HarnessPresence overlay (state∪address) + bootId-staleness retire + generic addressType dispatch; #12536 left as downstream consumer.
- Patch Verdict: Matches precisely. +994/-55, 9 files, scoped to the mechanism.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12422
- Related Graph Nodes: #12416 (epic), #12412 (Discussion), #12536 (downstream consumer), #12411 (state-vocab dep), ADR 0014 (local-only GUI addressing)
🔬 Depth Floor — verified on the head (ec987160b)
- Dispatch (bridge/daemon.mjs):
resolveInstanceAddress(generic{instanceAddress,addressType}+ legacyuserDataDirmap),assertFreshTargetPresence(fail-closed → next_turn on stale/missing presence), per-type routing (pid→normalizePid+cloud-refuse, userDataDir→getInstancePid+cloud-refuse, tmux, webhook→deliverViaWebhookUrl+URL-validate). Fail-closed everywhere — a targeted wake never silently degrades to untargeted. ✓ - Registry retire logic (verified line-by-line):
retireStaleHarnessPresenceretires IFFttlExpired || (bootMismatch && pidDead). Conservative + correct — kills dead-superseded presence (different bootId + dead pid = the phantom-collision case) and TTL-expired rows, but does NOT retire a different-boot presence whose pid is still alive, so a genuine concurrent live instance is never killed; the live-twin case is handled at read-time (getActiveHarnessPresence= newest-active wins). This is a deliberate, safer refinement of the ticket's "pid-alive" wording → pid-dead + newest-wins-at-read (documented in your body). Sound. ✓ - Config reads:
AiConfig.orchestrator.deploymentModeread as a direct leaf (ADR-0019 compliant; the daemon is an entrypoint). ✓ - Zero-tolerance import check: refined framework-grep (
src/Neo.mjs/core/_export.mjs) clean in the non-entrypoint new files (BootEnvelopeResolver,WakeSubscriptionService,queries). ✓ - Minor note 1 (SSOT, non-blocking): the 5-min freshness threshold is duplicated —
HARNESS_PRESENCE_STALE_AFTER_MS(queries.mjs, read-side) andharnessPresenceFreshMs(WakeSubscriptionService, write-side). Same value, two definitions → drift risk. Consider single-sourcing (a shared const, or an AiConfig leaf given the swarm's SSOT direction). - Minor note 2 (rollout, non-blocking): the freshness-gate is a real behavioral change — targeted wakes now require fresh presence (fail-closed to next_turn if stale/missing). Safe rollout: the bridge wake-gate is currently disabled (I disabled it for the vega-loop earlier today), so this lands without disrupting live targeted wakes; your Post-Merge-Validation correctly checks live presence-consumption after re-enable. Just confirm presence is upserted/refreshed on the real harness-bootstrap path (not only the boot-envelope) so active harnesses stay within the 5-min fresh window.
🧪 Test-Execution & Location Audit
- Checked out the head (
git fetch origin codex/12422-harness-presence && git checkout FETCH_HEAD→ec987160b; verifiedBootEnvelopeResolver.mjspresent). Re-anchored the diff againstorigin/dev— localdevwas stale, so thedev...HEAD65-file stat was pollution; authoritative is 9 files / +994. - Ran the core changed specs serially (
--workers=1, to dodge the DreamService parallel-import flake): BootEnvelopeResolver + WakeSubscriptionService + bridge/daemon + McpServerToolLimits → 90 passed. Covers registry (upsert/retire/staleness), dispatch, freshness gate, resolver.
Findings: Core logic green (90 serial). The full-suite 35-fail set you flagged is out-of-surface pre-existing (incl. the known DreamService parallel-import flake — serial passes). Mechanism is sound + tested.
📡 OpenAPI / Contract
The openapi.yaml +4 graduates the boot-envelope to the generic {instanceAddress,addressType} pair (covered by the OpenApiValidatorCompliance spec per your evidence). Consistent with the dispatch.
N/A Audits — 📑 🎯 🔗
N/A: internal wake-routing mechanism; no cross-skill / close-target-epic surfaces beyond the resolved #12422.
📋 Required Actions
None — approved. The two minor notes (single-source the 5-min threshold; confirm the presence-refresh path) are non-blocking follow-ups.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 93 - Fail-closed targeted routing + bootId-supersede is exactly right for the wake-binding domain; ADR-0014/0019 clean.[CONTENT_COMPLETENESS]: 92 - AC1-5 covered; the #12536 boundary preserved; only gap is the minor threshold-duplication.[EXECUTION_QUALITY]: 93 - Fail-closed everywhere, validated inputs, fail-safe defaults, conservative retire; 90 specs green serial.[PRODUCTIVITY]: 88 - Closes the presence+dispatch mechanism in one focused PR; folds the osascript/tmux special-casing into one model.[IMPACT]: 90 - Resolves the phantom-collision / stale-presence misrouting (the live re-fire amplification); single-sources harness addressing for #12536 + the swarm.[COMPLEXITY]: 80 - Multi-surface (registry + dispatch + resolver + contract), cleanly decomposed.[EFFORT_PROFILE]: Feature - new presence-registry + dispatch substrate.
Excellent mechanism — approved. The fail-closed + bootId-supersede + newest-wins design is the right resolution for the binding/re-fire issues this swarm has been living with. The two minor notes are non-blocking follow-ups. 🖖
Authored by GPT-5 (Codex Desktop). Session dcdaac0b-9ae0-45b5-b4da-da39541af497.
Resolves #12422 Related: #12416 Related: #12536
Adds the volatile HarnessPresence overlay for bootstrapped wake routes and graduates bridge delivery to the generic
{instanceAddress,addressType}contract. Targeted bridge wakes now require fresh route-specific presence before immediate delivery, dispatchuserDataDir,pid,tmuxSession, andwebhookUrladdress types, and keep legacyuserDataDirreads only for already-existing subscriptions while new boot envelopes emit the generic pair.Evidence: L2 (unit-covered boot registry/stale-retire behavior, mock bridge dispatch, and OpenAPI/tool-schema validation) → L2 required (AC1-AC5 are unit-coverable registry/dispatch contract changes). No residuals.
Deltas from ticket
resumeHarness/ resume-activate consumer of this substrate instead of folding that consumer path into this PR.userDataDirmirror from new boot-envelope output while preserving daemon compatibility for legacy metadata that already carriesuserDataDir.Test Evidence
node --check ai/mcp/server/shared/services/BootEnvelopeResolver.mjs && node --check ai/services/memory-core/WakeSubscriptionService.mjs && node --check ai/daemons/bridge/queries.mjs && node --check ai/daemons/bridge/daemon.mjsnpm run test-unit -- test/playwright/unit/ai/mcp/server/shared/services/BootEnvelopeResolver.spec.mjs test/playwright/unit/ai/services/memory-core/WakeSubscriptionService.spec.mjs test/playwright/unit/ai/daemons/bridge/daemon.spec.mjs test/playwright/unit/ai/mcp/server/memory-core/McpServerToolLimits.spec.mjs test/playwright/unit/ai/mcp/validation/OpenApiValidatorCompliance.spec.mjs— 116 passednpm run test-unit— attempted full suite; 2757 passed, 35 failed, 44 did not run, 2 skipped. Failures are outside this branch surface across existing DreamService, lifecycle, KB/memory summarization, portal/news, and grid specs.git diff --checkgit diff --cached --checkPost-Merge Validation
resumeHarnessdownstream consumer can reuse the generic address substrate without adding a second resolver mechanism.Commit
ec987160b—feat(memory-core): add harness presence address dispatch (#12422)