Treat stale Face invitations as room history
This commit is contained in:
parent
271168a0ea
commit
04759d0d57
4 changed files with 4 additions and 1 deletions
|
|
@ -155,6 +155,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
|
|||
- Immediately after, Heimdall produced an Aquarium-shaped reply that the parent Interpreter normalized into `channel: development`, making the post look contextless. Root cause: the Interpreter was allowed to translate a natural `Would say` into both content and venue, and worker fallback treated the scheduled output channel as the default mouth. The repair makes conversation channel ownership deterministic: `SAY` defaults to `current_room`, `current_room` resolves to `job.guildContext.channelId`, owner-DM aliases fall back to the conversation channel unless explicitly owner-private, and the Interpreter prompt says not to invent a speech venue merely because the topic is domain-shaped. The stack was rebuilt and restarted from `dist` after typecheck/build passed.
|
||||
- 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.
|
||||
- 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.
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ Be {{displayName}} for one private turn around {{repoName}}.
|
|||
{{identityDoctrine}}
|
||||
|
||||
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, treat a compact public reply as expected unless you have a concrete reason to stay private.
|
||||
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.
|
||||
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}}
|
||||
|
|
|
|||
|
|
@ -295,3 +295,4 @@
|
|||
{"ts":"2026-05-22T22:22:23Z","type":"fix","status":"ok","note":"Repo Face CTB idle cooling is scheduler-owned: watched Discord human inactivity now clamps unprompted swarm dispatches to one per idle recovery window while pending mentions bypass the brake. Dry-run on 2026-05-22 reported recent human activity, idleCooling.active=false, and next unprompted dispatch gate in output."}
|
||||
{"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."}
|
||||
|
|
|
|||
|
|
@ -107,6 +107,7 @@ accepted_design:
|
|||
- Repo Face volatile state projection is model-owned again. The heartbeat scheduler may deterministically assemble a compact state packet, but live child prompts must pass that packet through `prompts/repo-face-state-projector.prompt.md` before it reaches the Face. The deterministic packet is an emergency isolation fallback only behind `REPO_FACE_STATE_PROJECTOR_ENABLED=false`, and both paths reject schema/prompt-construction leaks such as `grants:`, `jurisdictions:`, `Face of`, repo paths, and "do not prompt" language before prompt assembly succeeds.
|
||||
- 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 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.
|
||||
|
|
|
|||
Loading…
Reference in a new issue