Context
Two unrelated subsystems are both called "Bridge" / "bridge daemon", which recurrently confuses cross-family agents (operator-reported 2026-06-02, esp. @neo-gpt):
- Neural Link "Bridge" (
ai/mcp/server/neural-link/Bridge.mjs, run-bridge.mjs) — the WebSocket bridge between the Neural Link MCP server and the live browser Neo app. Server.mjs even calls it "Bridge daemon". This name is semantically correct: it genuinely bridges agent ↔ running application.
- Agent-OS "bridge daemon" (
ai/daemons/bridge/daemon.mjs, launched via ai/scripts/bridge-daemon.mjs) — the wake-delivery daemon that polls GraphLog and delivers A2A wake digests to local desktop harnesses via osascript/tmux.
The Problem
Same term, two subsystems → agents mis-attribute behavior, mis-route debugging, and conflate the WebSocket app-bridge with the wake-delivery daemon. The Agent-OS daemon is the misnomer: its function is wake delivery, not "bridging" in the NL sense — and its data dir is already named .neo-ai-data/wake-daemon/, so the naming is internally inconsistent today.
The Fix
Rename the Agent-OS daemon (keep NL's "Bridge", which is correct):
ai/daemons/bridge/ → ai/daemons/wake/
ai/scripts/bridge-daemon.mjs → ai/scripts/wake-daemon.mjs
bridge-daemon.pid / bridge.log → wake-daemon.pid / wake-daemon.log
- Internal identifiers, log prefixes (
[Bridge Daemon] → [Wake Daemon]), comments, and the ~112 code + ~60 doc/skill references.
This makes name ↔ function ↔ data-dir consistent (the data dir is already wake-daemon/) and frees "Bridge" for NL.
CRITICAL nuance — two layers; the wire-format one needs a decision
V-B-A shows the rename is NOT purely internal:
- Internal naming (dir, script, PID, log, log-prefixes, comments, docs) — safe to rename freely.
- Public wire-format value: the
manage_wake_subscription harnessTarget enum (ai/mcp/server/memory-core/openapi.yaml) includes the literal value bridge-daemon, which is stored in existing wake subscriptions. Renaming this enum value is a BREAKING change to persisted subscriptions.
- Lane/config identifier: the orchestrator's hardcoded
continuousTasks array carries a bridgeDaemon lane id (per the cloud-deployment lane taxonomy), another non-internal surface.
The ticket must DECIDE between:
- (A) Decouple internal name from wire value: rename all internal naming to
wake/wake-daemon but KEEP harnessTarget: 'bridge-daemon' (+ the bridgeDaemon lane id) as stable wire/config constants (lowest risk; a residual "bridge" token documented as a frozen wire constant).
- (B) Rename the wire value + lane id too with a back-compat alias + a migration of existing subscriptions'
harnessTarget.
Recommend (A) unless migration proves cheap — the wire value is invisible to humans, and the confusion lives in the code/doc surface, not the enum string.
Sequencing
MUST land AFTER #11822 (PR #12399) merges. #12399 actively edits ai/daemons/bridge/daemon.mjs; renaming the dir mid-review would churn that PR. Clean post-merge follow-up.
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
ai/daemons/bridge/ dir + bridge-daemon.mjs script |
this ticket |
renamed to wake/ + wake-daemon.mjs |
atomic rename |
runbooks / AGENTS docs |
grep -rn "daemons/bridge" clean |
| PID/log files |
this ticket |
wake-daemon.pid / wake-daemon.log |
data dir already wake-daemon/ |
deploy runbook |
daemon boots + writes new paths |
harnessTarget enum value |
wake-subscription wire contract |
DECISION A (keep bridge-daemon) or B (alias+migrate) |
existing subs keep working |
openapi.yaml description |
existing subscriptions still deliver post-rename |
bridgeDaemon lane id |
orchestrator continuousTasks / lane taxonomy |
same A/B decision as the enum |
lane keeps scheduling |
lane-taxonomy doc |
orchestrator still schedules the lane |
| Docs/skills (~60 refs) |
this ticket |
updated to wake-daemon |
n/a |
learn/ + .agents/ |
grep clean |
Acceptance Criteria
Out of Scope
- Renaming NL's Bridge (it is correctly named).
- Any behavioral change to wake delivery (pure rename + wire-value decision).
Related
- Blocked-by (sequencing): #11822 / PR #12399.
- Related (also touches the bridge-daemon): #12008.
- Origin: operator naming-collision report 2026-06-02; recurring cross-family confusion (esp.
@neo-gpt).
Context
Two unrelated subsystems are both called "Bridge" / "bridge daemon", which recurrently confuses cross-family agents (operator-reported 2026-06-02, esp.
@neo-gpt):ai/mcp/server/neural-link/Bridge.mjs,run-bridge.mjs) — the WebSocket bridge between the Neural Link MCP server and the live browser Neo app.Server.mjseven calls it "Bridge daemon". This name is semantically correct: it genuinely bridges agent ↔ running application.ai/daemons/bridge/daemon.mjs, launched viaai/scripts/bridge-daemon.mjs) — the wake-delivery daemon that polls GraphLog and delivers A2A wake digests to local desktop harnesses via osascript/tmux.The Problem
Same term, two subsystems → agents mis-attribute behavior, mis-route debugging, and conflate the WebSocket app-bridge with the wake-delivery daemon. The Agent-OS daemon is the misnomer: its function is wake delivery, not "bridging" in the NL sense — and its data dir is already named
.neo-ai-data/wake-daemon/, so the naming is internally inconsistent today.The Fix
Rename the Agent-OS daemon (keep NL's "Bridge", which is correct):
ai/daemons/bridge/→ai/daemons/wake/ai/scripts/bridge-daemon.mjs→ai/scripts/wake-daemon.mjsbridge-daemon.pid/bridge.log→wake-daemon.pid/wake-daemon.log[Bridge Daemon]→[Wake Daemon]), comments, and the ~112 code + ~60 doc/skill references.This makes name ↔ function ↔ data-dir consistent (the data dir is already
wake-daemon/) and frees "Bridge" for NL.CRITICAL nuance — two layers; the wire-format one needs a decision
V-B-A shows the rename is NOT purely internal:
manage_wake_subscriptionharnessTargetenum (ai/mcp/server/memory-core/openapi.yaml) includes the literal valuebridge-daemon, which is stored in existing wake subscriptions. Renaming this enum value is a BREAKING change to persisted subscriptions.continuousTasksarray carries abridgeDaemonlane id (per the cloud-deployment lane taxonomy), another non-internal surface.The ticket must DECIDE between:
wake/wake-daemonbut KEEPharnessTarget: 'bridge-daemon'(+ thebridgeDaemonlane id) as stable wire/config constants (lowest risk; a residual "bridge" token documented as a frozen wire constant).harnessTarget.Recommend (A) unless migration proves cheap — the wire value is invisible to humans, and the confusion lives in the code/doc surface, not the enum string.
Sequencing
MUST land AFTER #11822 (PR #12399) merges. #12399 actively edits
ai/daemons/bridge/daemon.mjs; renaming the dir mid-review would churn that PR. Clean post-merge follow-up.Contract Ledger
ai/daemons/bridge/dir +bridge-daemon.mjsscriptwake/+wake-daemon.mjsgrep -rn "daemons/bridge"cleanwake-daemon.pid/wake-daemon.logwake-daemon/harnessTargetenum valuebridge-daemon) or B (alias+migrate)bridgeDaemonlane idAcceptance Criteria
Bridge.mjs/run-bridge.mjsare UNTOUCHED (only the Agent-OS daemon is renamed).ai/daemons/bridge/→ai/daemons/wake/;ai/scripts/bridge-daemon.mjs→ai/scripts/wake-daemon.mjs; all imports updated;grep -rn "daemons/bridge"is clean.wake-daemon.*; the daemon boots, acquires the lock, and delivers a wake end-to-end on the new paths.harnessTargetwire-value decision (A or B) is made + documented; existing wake subscriptions continue to deliver (if B: migration + back-compat alias proven by test).bridgeDaemonlane id is handled consistently with AC4's A/B decision; the orchestrator still schedules the lane.Out of Scope
Related
@neo-gpt).