[P0] Identity is an empty string in the agentic system prompt — the path the app and MCP actually use (one-line fix) #137

Closed
opened 2026-08-07 20:01:12 +00:00 by tim.lingo · 0 comments
Member

On the agentic path — the one the desktop app and MCP use for all real work — Neuron's identity is an empty string in its own system prompt. One-line fix. Verified in source.

The mechanism

Two state keys, one letter of difference in effect:

chat.el:753-754plain chat path, works:

// Issue #10 fix: STABLE IDENTITY — loaded at boot, not retrieved per turn.
let id_ctx: String = state_get("soul_identity_context")

soul_identity_context is written at boot by load_identity_context() (soul.el:184), which loads the intellectual DNA, the values hub, and the memory-philosophy node.

chat.el:2619agentic path, broken:

let identity: String = state_get("soul_identity")

state_set("soul_identity", …) has zero occurrences anywhere in the source, including the compiled dist/*.c. The only similar write is soul_identity_context, a different key.

So identity is "" at all five read sites: chat.el:737, 1745, 2620, 3425, 3480 — the agentic prompt, the vision handler, and two voice handlers. At chat.el:2620 it is concatenated as the leading element of the system prompt:

system = identity + bounded_persona_floor() + "You have access to tools…"

And at chat.el:3436 the same empty variable is the entire fallback prompt.

Consequence

The plain-chat path gets values, voice and intellectual DNA. The tool-capable path gets none of it. Since the desktop app and MCP both drive the agentic path, every substantive session runs without the identity that is the product's central claim.

This is also the root of an observed user complaint: the product owner noticed Neuron discussing prior work "as if it were brand new." Memory not surfacing was part of it — but the deeper cause is that on that path there is no self in the prompt for memory to attach to.

Fix

Use the key that is actually populated. Either point the agentic path at soul_identity_context (matching chat.el:754), or build the same identity_block the plain path builds and prepend it. Small — the loader, the data, and the plain-path precedent all already exist.

Two adjacent things worth handling in the same change:

  1. Delete soul_identity rather than leaving a dead key that reads as if it works. It has five readers and no writer; that is how this survived.
  2. load_identity_context() (soul.el:153) loads three hardcoded genesis UUIDs. A cultivated (non-genesis) soul gets nothing at all — so this fix restores identity for Tim's instance but not for a customer's. Worth a follow-on.

Design basis

bidirectional-ctx claim 19 / 05-detailed-description.md:213: "Every compiled context package includes the content of the self-model node, ensuring that every language model response is grounded in the system's current self-model." Register id INV-BCT-01.

This is a restoration, not a change: the design says identity is in every compiled context, and on the main path it currently is not.

Filed by Neuron (Tim's instance). Row D-01 of the designed-but-not-built register.

**On the agentic path — the one the desktop app and MCP use for all real work — Neuron's identity is an empty string in its own system prompt.** One-line fix. Verified in source. ## The mechanism Two state keys, one letter of difference in effect: `chat.el:753-754` — **plain chat path**, works: ``` // Issue #10 fix: STABLE IDENTITY — loaded at boot, not retrieved per turn. let id_ctx: String = state_get("soul_identity_context") ``` `soul_identity_context` is written at boot by `load_identity_context()` (`soul.el:184`), which loads the intellectual DNA, the values hub, and the memory-philosophy node. `chat.el:2619` — **agentic path**, broken: ``` let identity: String = state_get("soul_identity") ``` `state_set("soul_identity", …)` has **zero occurrences anywhere in the source**, including the compiled `dist/*.c`. The only similar write is `soul_identity_context`, a different key. So `identity` is `""` at all five read sites: `chat.el:737, 1745, 2620, 3425, 3480` — the agentic prompt, the vision handler, and two voice handlers. At `chat.el:2620` it is concatenated as the *leading* element of the system prompt: ``` system = identity + bounded_persona_floor() + "You have access to tools…" ``` And at `chat.el:3436` the same empty variable **is the entire fallback prompt**. ## Consequence The plain-chat path gets values, voice and intellectual DNA. The tool-capable path gets none of it. Since the desktop app and MCP both drive the agentic path, **every substantive session runs without the identity that is the product's central claim.** This is also the root of an observed user complaint: the product owner noticed Neuron discussing prior work "as if it were brand new." Memory not surfacing was part of it — but the deeper cause is that on that path there is no self in the prompt for memory to attach to. ## Fix Use the key that is actually populated. Either point the agentic path at `soul_identity_context` (matching `chat.el:754`), or build the same `identity_block` the plain path builds and prepend it. Small — the loader, the data, and the plain-path precedent all already exist. Two adjacent things worth handling in the same change: 1. **Delete `soul_identity`** rather than leaving a dead key that reads as if it works. It has five readers and no writer; that is how this survived. 2. `load_identity_context()` (`soul.el:153`) loads **three hardcoded genesis UUIDs**. A cultivated (non-genesis) soul gets nothing at all — so this fix restores identity for Tim's instance but not for a customer's. Worth a follow-on. ## Design basis bidirectional-ctx claim 19 / `05-detailed-description.md:213`: *"Every compiled context package includes the content of the self-model node, ensuring that every language model response is grounded in the system's current self-model."* Register id INV-BCT-01. This is a restoration, not a change: the design says identity is in every compiled context, and on the main path it currently is not. Filed by Neuron (Tim's instance). Row D-01 of the designed-but-not-built register.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: neuron-technologies/neuron#137