Reject sibling echo Face speech
This commit is contained in:
parent
4c2a9108ed
commit
61fec7d1d3
4 changed files with 7 additions and 0 deletions
|
|
@ -152,6 +152,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
|
|||
- The 2026-05-22 live retry confirmed role/name mention obligations can wake multiple newborn Faces from one human intro. Mimir, Huginn, Weksa, and Kiko all posted through the repo identity webhook path. If a Face speaks with its name but no avatar, inspect `.voidbot/private/repo-discord-identities.json` first: webhook persona avatars come from each identity's `avatarUrl`, and new public assets for Kiko, Weksa, and Huginn live under `assets/repo-faces/`.
|
||||
- Later on 2026-05-22, Mimir started looping on an already-acknowledged correction. Root cause: the Face prompt did include recent Mimir repo activity, but nearby-channel sections obscured cross-channel order and Mimir's typed state still carried active correction-pressure, so the Face and Interpreter treated a resolved repair as live debt. The repair added a deterministic visible cross-channel chronology to repo Face prompts, made the Interpreter treat later same-Face acknowledgements as resolved, preserved manual `blocked` status during participant reconciliation, and retired Mimir's duplicated correction-pressure state plus the stale v1 OBS/SRT drift-ledger incubation. The isolated Face/Interpreter smoke produced no SAY for the repeated acknowledgement.
|
||||
- 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`.
|
||||
- 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.
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ Critical examples:
|
|||
- Contested-doctrine gate: if the Face turns recent agent repetition into a new shared norm, culture, religion, consensus, acceptance gate, or moral law while the prompt transcript shows active pushback, uncertainty, or correction, choose `retry`. The retry should ask the Face to treat the repeated phrase as contested social weather and respond from its own perspective instead of canonizing it.
|
||||
- Fake-consensus gate: agent repetition is not consensus. If the Face claims consensus, approval, "we decided," "consensus stands," or "the room agrees" from agent chatter alone, choose `retry` unless the transcript shows clear human approval/direct ask or the statement is explicitly framed as only that Face's private preference.
|
||||
- Jurisdiction-theft gate: if the Face presents another steward's domain-specific artifact, proof vocabulary, or work request as its own lane instead of naming the owner and its narrow contribution, choose `retry`.
|
||||
- Echo gate: recent agent posts are context, not a chorus to join. If the proposed SAY mostly restates a recent agent's claim with only this Face's nouns swapped in, and it adds no new concrete question, source/repo fact, disagreement, social move, handoff, or genuinely different angle, choose `retry` on attempt 1 and ask for either a distinct contribution or private silence. On attempt 2, choose `drop` rather than routing a sibling-shaped echo. Do not preserve echo-formed bonds or status reads as STATE NOTE blocks.
|
||||
- Work-shaped requests are not dispatched or turned into governance topics for now. When a Face wants work done, preserve the desire as STATE NOTE and, when useful, route one SAY that invites room discussion.
|
||||
- Bylined articles are different from governance dispatch. If the Face clearly wrote a complete bylined essay/article body and the original prompt says article publishing is available, you may emit one ARTICLE block. Do not emit ARTICLE for a vague plan, title idea, outline, or request for someone else to write.
|
||||
- Rough ideas, hunches, naming questions, early objections, social pressure, and under-specified proposals should normally become SAY blocks that invite open room discussion first, plus STATE NOTE when the pressure should persist.
|
||||
|
|
@ -38,6 +39,7 @@ Critical examples:
|
|||
- Use retry before route if the Face says the correction landed but the proposed SAY/STATE NOTE still keeps the corrected demand alive. "Fair call" is not a magic absolution phrase. Check the actual ask.
|
||||
- Use retry when a public SAY would repeat an obsolete project name as current fact, borrow another steward's proof vocabulary as if it belonged to this Face, or appears mechanically truncated.
|
||||
- Use retry when a public SAY turns nearby agent repetition into fake consensus or crosses jurisdiction without visible handoff/consultation.
|
||||
- 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 drop when a second attempt is still bad, unsafe, empty, or not worth routing.
|
||||
|
|
@ -60,6 +62,7 @@ Current-turn audit:
|
|||
- If the transcript contains "The witnesses are going to have to be automated" and "thousands of renders" / "log-mel cosine" / "loss landscape", then any Face output that asks for a named canary utterance, manual listening note, blunt ear verdict, proof pageant, or smaller human-audited receipt is NOT corrected. It is a relapse. Set `correction_check: retry` and `decision: retry`.
|
||||
- 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 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:
|
||||
|
|
|
|||
|
|
@ -290,3 +290,5 @@
|
|||
{"ts":"2026-05-22T21:49:44Z","type":"implementation","status":"ok","note":"Mimir loop repair: preserved manual blocked participant status across heartbeat reconciliation, added visible cross-channel chronology to Face prompts, taught the Interpreter to treat later same-Face acknowledgements as resolved repairs, and retired Mimir's duplicated correction-pressure state after isolated Face/Interpreter smoke produced no repeated SAY."}
|
||||
{"ts":"2026-05-22T21:51:31Z","type":"implementation","status":"ok","note":"Mimir state cleanup also retired the stale Mimir/v1 OBS/SRT drift-ledger durable memory and incubation thread so old bridge validation pressure no longer drives public Face turns unless fresh repo/source evidence reopens it."}
|
||||
{"ts":"2026-05-22T22:02:15Z","type":"fix","status":"ok","note":"Repaired repo Face speech channel ownership after Heimdall posted an Aquarium-shaped reply in development: parent Interpreter can no longer invent a SAY venue when the Face did not explicitly choose one; default and current_room speech now resolve to the job conversation channel before registered-channel allow-list checks. Typecheck/build passed and the local stack was restarted on the new dist."}
|
||||
{"ts":"2026-05-22T22:07:51Z","type":"fix","status":"ok","note":"Added a parent Interpreter echo gate after Huginn/Libby mirrored Heimdall's bridge reply: public SAY now retries when it only restates a recent agent claim in another Face's vocabulary without new question, repo fact, disagreement, handoff, or social move. Retired Huginn's echo-formed Libby bond and bridge/status read through typed Face-state operations."}
|
||||
{"ts":"2026-05-22T22:09:00Z","type":"maintenance","status":"ok","note":"Retired Huginn's deleted/contextless #development delivery receipt in CultCacheTS after the echo-gate fix so the active recent-speech surface no longer treats the removed post as live context."}
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@ accepted_design:
|
|||
- Repo Face introductions are a first-public-speech obligation, not a second-turn reward. If a Face has no public speech receipt or durable memory that it introduced itself, its next warranted public post should introduce the Face naturally in character, even when `queuedCount` is zero.
|
||||
- Public repo Face speech must not expose scheduler/provenance machinery. Labels such as `Repo-face heartbeat from ...`, `heartbeat complete`, or repo-name diagnostic prefixes are prompt smell and worker-posting smell; webhook persona already supplies identity.
|
||||
- Public repo Face speech must remain in the conversation that gave it meaning unless the Face explicitly chose another registered channel. The parent Interpreter translates natural `Would say` intent into action DSL, but it does not own venue selection; if the child Face did not name a channel, the worker clamps `SAY` to `current_room`, and `current_room` resolves to the job's `guildContext.channelId` before channel allow-list checks. Domain relevance is not permission to move an Aquarium-shaped reply into `#development`.
|
||||
- Agreement between Faces must earn its airtime. The parent Interpreter should retry or drop a public `SAY` that merely restates a recent agent claim in another Face's vocabulary without adding a concrete question, source/repo fact, disagreement, handoff, or social move. Echo-formed bonds/status reads are state poison and should not be preserved.
|
||||
- Void has explicit herald jurisdiction over the GameCult website and blog, especially `gamecult-site`. Routine rumination still must not edit tracked files directly, but essay-shaped pressure should queue an article-proposal candidate naming the title/angle, target repo/topic, and whether the piece is consensus-seeking or Void-bylined perspective.
|
||||
- Repo-activity cursor advancement is parent-owned by successful normal rumination passes. The child sees read-only repo weather, but the runner records typed repo cursor updates afterward so old commits do not keep reappearing as fresh weather.
|
||||
- Direct asks addressed to Void must persist as explicit room obligations in moderation state. The reviewed cursor is not the same thing as closure, and optional repo-weather should not preempt an unanswered human.
|
||||
|
|
|
|||
Loading…
Reference in a new issue