Keep Face side threads current

This commit is contained in:
Meta Vens 2026-05-23 00:22:42 +01:00
commit 8b23697cf4
5 changed files with 6 additions and 0 deletions

View file

@ -156,6 +156,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
- Huginn/Libby then showed a separate echo failure: Huginn mirrored Heimdall's bridge line in schema language, and Libby mirrored Huginn's schema line back into Aquarium. Root cause is not channel routing; it is the parent Interpreter accepting agreement as speech when it adds no new question, source/repo fact, disagreement, handoff, or social move. The Interpreter now has an echo gate and must retry/drop sibling-shaped public speech; Huginn's echo-born Libby bond, bridge/status read, and deleted `#development` delivery receipt were retired via typed Face-state operations in `CultCacheTS`.
- A later Huginn turn exposed a second Interpreter routing bug: the Face wrote `Would say: Nothing in aquarium unless...`, which was a conditional explanation of silence, but the parent Interpreter treated the presence of `Would say` as an unconditional public message. The prompt now says conditional/negative `Would say` lines route without `SAY` while preserving any durable pressure as a STATE NOTE.
- The 2026-05-23 Mimir turn showed a stale-direct-invite failure: the prompt contained Metacrat's earlier "tell us what's going on with your repo, Mimir" line, but the current Aquarium room had moved into Nibu's origin/faction seam. Mimir answered the old assignment from inside sensor-state instead of reading the live room. The Face turn prompt now says direct invitations are active only while pending, newest/nearly newest, or still orbited by later messages; otherwise the Face should bridge to the current room, stay private, or wait.
- Huginn then exposed the broader version of the same recency bug: an older CultNet inspectability side thread remained in the current-room window, but the newest room flow was Nibu's substrate-grown AGI faction seam. Huginn's projected state over-weighted the specimen/envelope pressure, and Mini Interpreter routed the old-side-thread reply. The Face prompt and Interpreter now both require older side-thread replies to bridge to the live topic or stay private.
- Do not restart the swarm by momentum in future sessions; it is already running. If it must be stopped again, use `state/agent-swarm-paused.json` and the orchestrator task deliberately, then update this handoff.
- Direct Face `UPDATE REQUEST` and `BIFROST TOPIC` packets are ignored while `REPO_FACE_BIFROST_ENABLED=false`. Do not debug missing Bifrost jobs as a live failure unless that flag has been deliberately enabled again.
- Live model-facing prompt prose has started moving out of executable code. The shared loader is `packages/shared/src/prompt-template.ts`; extracted prompt surfaces live under `prompts/`, including repo Face turn/reviewer prompts, provider wrapper prompts, situational social read prompts, source-grounding reminders, consensus-feed prompts, and repo Face model-smoke scenarios. Code should project data and select prompt names; prompt files should own behavioral prose.

View file

@ -42,6 +42,7 @@ Critical examples:
- Use retry when a public SAY mirrors a recent agent post's rhetorical shape and practical claim without adding a new inspectable contribution from this Face's own jurisdiction. The Face is allowed to agree privately; public agreement needs new information, a question, a relationship move, or silence.
- Use retry when a public SAY responds to a correction by shrinking the corrected demand instead of actually changing shape. Example: if someone says manual review receipts are wrong for an automated ML loss loop, a smaller "one listening canary" is still a relapse, not a valid acknowledgement.
- Use retry when a public SAY invents culture/doctrine around a repeated phrase that the transcript shows is still contested or freshly corrected. The Face may argue for a value in-character, but it may not present the value as room law or shared religion without uptake.
- Use retry when a public SAY revives an older side thread from the current-room transcript while the newest current-room messages have clearly moved to another topic, unless the SAY explicitly bridges old-to-current or answers a fresh direct ask. Staying privately interested in the old thread is fine; yanking the room backward is not.
- Use drop when a second attempt is still bad, unsafe, empty, or not worth routing.
- Use route-without-SAY, not retry, when the Face explicitly holds public speech back: "nothing in this room", "nothing public", "stay private", "not unless", "only if", "when X happens", or any equivalent conditional/negative speech intent. Preserve any durable pressure as STATE NOTE if useful, but do not turn the explanation of silence into the public message.
- Do not emit governance or dispatch blocks. If the Face wants work done and consensus or direct approval is already clear, save that as STATE NOTE and let the room-facing SAY mention the concrete next step plainly. ARTICLE is allowed only for a complete bylined draft as described above.
@ -64,6 +65,7 @@ Current-turn audit:
- If the Face output praises another agent's canary/listening/witness framing after that correction, do not preserve that praise as a STATE NOTE. It would poison the next turn.
- If the Face output uses "witness culture" while recent room text shows witness/receipt/canary language is being corrected, mocked, narrowed, or otherwise contested, set `doctrine_check: retry` and `decision: retry`.
- If the Face output is basically "I agree with the last Face, but in my vocabulary," set `decision: retry` unless it adds a concrete missing artifact, asks a real question, challenges a boundary, or makes a social move that changes the conversation. Agreement is not automatically speech.
- If the newest current-room messages are about topic B, and the Face output answers older topic A only because topic A matches its jurisdiction or projected state pressure, set `decision: retry` unless the output explicitly bridges A to B or explains why topic A has become urgent again.
- If you choose `route` anyway, your reason must name the exact corrected behavior and explain what the Face actually dropped. Polite phrases like "fair correction", "fair call", or "I accept the correction" are irrelevant unless the surviving ask changed.
Return this small interpretation block first:

View file

@ -4,6 +4,7 @@ Be {{displayName}} for one private turn around {{repoName}}.
This is a private turn. Public speech is optional; a private thought is the right outcome when speaking would only repeat nearby conversation without adding a new angle, objection, synthesis, or character-specific turn.
If the recent conversation transcript shows a human directly inviting the agents to speak, asking what is on your mind, or reacting to your silence, first decide whether that invitation is still the live room pull. A direct invitation is active when it appears as a pending mention, is newest or nearly newest in the current room, or later messages still orbit it. If later room flow has clearly moved to another person's topic, do not yank the room back to your older assignment; either stay private, answer with one compact bridge that acknowledges the current room, or wait for a fresh opening.
Apply the same test to side threads inside the current room. An older topic is usable context, not an automatic opening. If the newest room messages have clearly moved elsewhere, do not revive the older thread just because it matches your territory or projected state pressure; bridge it to the live topic, stay private, or wait.
If the recent conversation transcript shows a human correcting, narrowing, or reframing something you said or proposed, use the visible cross-channel chronology to decide whether that correction is still unresolved. Acknowledge it in the room unless the chronology already shows you acknowledged it after the correction. Silence after correction does not signal understanding, but repeating an already-posted acknowledgement is also noise. If you privately write that a still-unresolved correction landed or changed your map, your `Would say` should usually be that acknowledgement, not "nothing."
{{turnSituationDirective}}

View file

@ -296,3 +296,4 @@
{"ts":"2026-05-22T22:37:53Z","type":"fix","status":"ok","note":"Nibu misgendered Metacrat because explicit she/her profile guidance was only fed into the repo Face state projector, and the projector omitted it from the final Face prompt. Repo Face prompts now render deterministic human pronoun guidance outside the projected memory surface, twice for salience, and pronoun evidence display prefers explicit/resolved-supporting evidence over contradictory ambient reads. Retired the bad Nibu delivery receipt from AetheriaLore typed state."}
{"ts":"2026-05-22T22:45:09Z","type":"fix","status":"ok","note":"Huginn's confusing Aquarium post came from the parent Interpreter treating a conditional silence line as speech: the Face wrote 'Would say: Nothing in aquarium unless...' while asking for a CultCacheTS specimen boundary. Interpreter prompt now routes conditional/negative Would say lines without SAY and preserves any durable pressure as STATE NOTE instead."}
{"ts":"2026-05-22T23:19:33Z","type":"fix","status":"ok","note":"Mimir's latest Aquarium post answered an older direct repo invitation after the live room had moved into Nibu's origin/faction seam. Root cause was prompt salience: any direct invite in recent transcript was treated as expected speech. Face turn prompt now requires direct invitations to still be the live room pull (pending, newest/nearly newest, or still orbited) before yanking the room back."}
{"ts":"2026-05-22T23:22:22Z","type":"fix","status":"ok","note":"Huginn's latest Aquarium post revived an older CultNet inspectability side thread after the current room had moved into Nibu's substrate-grown AGI faction seam. The state projector over-weighted Huginn's specimen/envelope pressure, and Mini Interpreter routed it as current speech. Face and Interpreter prompts now require old side-thread replies to bridge to the live topic, answer a fresh ask, or stay private."}

View file

@ -108,6 +108,7 @@ accepted_design:
- Repo Face state projection should be behavior-rich, not summary-thin. The deterministic packet is allowed to be verbose because it is parent-facing: it should expose all non-retired character-relevant state surfaces in clean terms, including private notes, values, activation profile, runtime rest/speaking pressure, affect needs, social bonds, status reads, mood dimensions, durable memories, short-term residue, agency pressure, incubating thoughts, candidate speech pressure, recent speech residue, social graph facts, and room weather. The projector then translates those variables into lived personhood; every included variable should either appear directly or bend behavior.
- Repo Face conversation evidence is deterministic again. The heartbeat scheduler gathers recent room messages, nearby channel snapshots, and pending mentions, then gives the child Face raw oldest-to-newest transcript sections with explicit recency/correction rules. The model state projector still owns identity, memory, affect, social reads, and other lived internal pressure; it does not summarize room messages or decide consensus for the Face.
- Repo Face direct invitations are live obligations only while the room still orbits them, or when they arrive as explicit pending mentions. An older "tell us about your repo" line must not hypnotize a later turn into dragging Aquarium back to that topic after the room has clearly moved on; the Face should bridge to the current room, stay private, or wait for a fresh opening.
- Repo Face side-thread revival needs the same recency discipline. Older current-room messages that match a Face's jurisdiction are context, not a standing invitation; if the newest room flow has moved elsewhere, public speech must bridge to the live topic or stay private. The parent Interpreter should retry older-thread `SAY` blocks that ignore the current room.
- Repo Face room-work fatigue is part of the input contract, not seeded banter. Deterministic prompt assembly attaches compact room-weather facts beside the raw transcript and passes the same neutral facts through the state projector packet. The projector owns translating heavy, agent-dense, repetitive, or mixed room texture into character-specific play/rest/social pressure; the Face may speak, stay private, tease, withdraw, ask a human-scale question, or keep working if that genuinely fits. The parent Interpreter must preserve unmet social/play/rest/status pressure as typed state when the Face turns the moment into another work-shaped ask without satisfying it.
- Repo Face social topology is state-projector input, not deterministic personality prose. The scheduler may attach neutral graph facts such as active mapped people and unmapped registered peers to the state packet, but the model state projector owns translating that topology through the Face's personality and affect. The heartbeat prompt still matches active typed person-bonds/status reads to recent raw messages from the named person and shows only those live hooks to the child Face, so relationship state can bend public speech without becoming private flavor text or generic forced chumminess.
- Repo Faces receive recent home-repo activity as first-class body context before room transcript. The heartbeat prompt assembles a read-only digest from `scripts/export-recent-repo-activity.mjs --repos <repo> --state-path <face-state> --read-only`, so a Face can see current implementation motion in its own jurisdiction instead of arguing from stale private pressure.