companion_persona.md
Version. v0.1
Date. 2026-06-25
Author. Claude Code (CC), surfaced during CR-2026-122 Step 0 (S0-4), under Operator direction.
Status. Standing note — a verified architectural fact and an open follow-on. No build authorized by this note.
Relates to. Scoping note loomworks-conversational-fidelity-scoping-note-v0_1 (c60f565); CR-2026-122 (change-requests/cr-2026-122-conversational-fidelity-v0_1.md, 933d74b).
The Companion composes operator-facing conversational replies through two separate prompt paths, and only one of them loads companion_persona.md:
operator_converse. general_conversation (and every intent that falls through to the responder) → route_intent returns None → converse.py responder branch → assemble_prompt(...) → generate_response(...). assemble_prompt opens unconditionally with companion_persona.md (prompt.py:897, the sole load_persona() call site). generate_response has exactly one source caller (converse.py:1082).seed_conversation.py. The seed/creation converse route (POST /engagements/{eid}/seed/converse) composes its turn from CREATION_CONVERSATION_PROMPT (src/loomworks/api/routers/seed_conversation.py:83 import, :639 use), defined at src/loomworks/prompts/creation_conversation.py:26. This path does not load companion_persona.md and does not go through assemble_prompt.
CREATION_CONVERSATION_PROMPT carries no state-fidelity instruction and none of the persona's vocabulary discipline (no occurrence of saved / held / committed / waiting / persona reference in creation_conversation.py).
CR-2026-122 fixes the conversational fidelity defect ("a held draft described as 'saved' / 'in the record'") by adding a state-to-word mapping to companion_persona.md (D1). That fix reaches voice #1 only. The creation-conversation voice (#2) is not governed by the persona, so:
assemble_prompt / the operator_converse responder path).
This is outside CR-2026-122's scope — the observed defect (2026-06-25, E0060) was on the operator_converse general-conversation voice, and the CR is correctly scoped to it. This note records the second voice so it is not mistaken for already-covered, and flags the follow-on.
Check whether the creation-conversation voice (CREATION_CONVERSATION_PROMPT) needs the same state-fidelity discipline — i.e. whether, mid engagement-creation, it can claim work is "saved" before the Operator has committed it. If so, that is a separate fix on creation_conversation.py, parallel to CR-2026-122's persona change, with its own grounding and authorization.
src/loomworks/orchestration/prompt.py:897 — load_persona() (sole loader of companion_persona.md), inside assemble_prompt.src/loomworks/orchestration/routers/converse.py:1082 — sole generate_response(...) caller (voice #1).src/loomworks/api/routers/seed_conversation.py:83, :639 — CREATION_CONVERSATION_PROMPT import + use (voice #2).src/loomworks/prompts/creation_conversation.py:26 — CREATION_CONVERSATION_PROMPT definition; no state-fidelity / persona-vocabulary content.Standing note. A verified second conversational surface; recorded so the CR-2026-122 fix is not mistaken for covering it. Follow-on check only — no build authorized.