Simplify repo face Mind prompt

This commit is contained in:
Meta Vens 2026-05-26 13:18:34 +01:00
commit cbcbc34f1b
4 changed files with 110 additions and 102 deletions

View file

@ -17,7 +17,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
## Current Shape
- Discord bot and worker may be live, but the unattended repo Face / CTB swarm brake is active as of 2026-05-26.
- The swarm was paused because live Face turns leaked owner-reply/Interpreter scaffolding into public Discord: Mind was being wrapped by the owner Discord reply prompt, then a worker fallback treated plain malformed Mind prose as public `SAY`. The fixed worker stack was restarted on 2026-05-26, typecheck/build pass, `agents:interpreter-loop-smoke` passes, and `agents:heartbeat-model-smoke -- --model gpt-5.4 --reasoning-effort none` passes. Keep `state/agent-swarm-paused.json` active until the operator explicitly asks to thaw; before thawing, run one controlled current-room turn and inspect model-output logs for `INTERPRETATION` plus explicit DSL actions only. Bifrost dispatch remains disabled by default behind `BIFROST_DISPATCH_ENABLED=false`.
- The swarm was paused because live Face turns leaked owner-reply/Mind scaffolding into public Discord: Mind was being wrapped by the owner Discord reply prompt, then a worker fallback treated plain malformed Mind prose as public `SAY`. The fixed worker stack was restarted on 2026-05-26, typecheck/build pass, `agents:interpreter-loop-smoke` passes, and `agents:heartbeat-model-smoke -- --model gpt-5.4 --reasoning-effort none` passes. The Mind prompt has now been slimmed from incident-by-incident scar tissue into semantic route/retry/drop judgment plus a hard STATE NOTE/ARTICLE/SAY DSL contract. Keep `state/agent-swarm-paused.json` active until the operator explicitly asks to thaw; before thawing, run one controlled current-room turn and inspect model-output logs for `INTERPRETATION` plus explicit DSL actions only. Bifrost dispatch remains disabled by default behind `BIFROST_DISPATCH_ENABLED=false`.
- The teardown authority remains `notes/agent-swarm-teardown-plan-2026-05-21.md`, but it is now a restart checklist and smell ledger rather than a stop sign. Keep using it when a Face/Bifrost/CTB boundary smells like prompt/parser/transport Jenga.
- The repo-controlled pause flag is `state/agent-swarm-paused.json`. While it is missing or has `"paused": false`, swarm runners may operate. While it has `"paused": true` or is malformed, the Face heartbeat runner skips and the orchestrator skips agent-swarm organs. This is the brake. Do not route around it.
- Postgres owns jobs, audit events, interaction memory, and rate-limit state.
@ -126,6 +126,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
- Repo Face prompts now also grant advisory repo-change agency: Faces may build long-running maps of their repos and propose concrete changes, but Discord jobs stay read-only and must ask for human consensus before implementation changes canonical repo material. Once a proposal is concrete enough to review, it belongs on GitHub as a draft PR; Discord is for announcing and arguing around that artifact, not replacing it.
- Repo Face draft, review, article, and Discord speech lanes now cross through explicit parent-owned action blocks before Bifrost bridge commands. Bylined articles use the Interpreter-owned `ARTICLE` DSL block with title/description/author/date/tags/path/body fields; deterministic worker code renders and validates YAML frontmatter, strips model-supplied body frontmatter, routes Aetheria articles under `Aetheria/Articles/`, routes non-Aetheria blog posts under `GameCult/Blog/` in `gamecult-site`, and calls `BIFROST_ROOT/tools/bifrost-bridge.mjs` for the draft PR plus persona announcement. Legacy `VOIDBOT_REPO_IDENTITY_ARTICLE` JSON is no longer accepted. Proposal PR and PR-comment compatibility sentinels still exist. Bifrost owns governed crossings because it is GameCult's governance/labor platform and public-process bridge, not because it is a convenient script bucket. Heimdall remains the OAuth/account/capability gate.
- Repo Face Bifrost/governance routing is paused. Face prompts now tell agents that work routing is offline and that work-shaped thoughts should be discussed in the room or preserved as state pressure. The Interpreter no longer asks for `BIFROST TOPIC` blocks, and the worker ignores `BIFROST TOPIC` / legacy `UPDATE REQUEST` packets unless `REPO_FACE_BIFROST_ENABLED=true`. This is deliberate: the live bridge made agents talk to terse governance summaries instead of people.
- Parent Mind prompt discipline is now a live invariant. `prompts/repo-face-turn-interpreter.prompt.md` should stay a semantic interpreter with a strict DSL output contract, not a growing pile of old failure clauses. If a live turn fails, first check missing context, ownership, state, model choice, and parser/transport boundaries; put historical scars in evidence, handoff, tests, or fixtures instead of teaching Mind a new brittle superstition.
- Repo Face state projection is no longer allowed to be deterministic schema slurry. `scripts/run-repo-face-heartbeats.ts` builds a compact state packet, then calls the model prompt at `prompts/repo-face-state-projector.prompt.md` to turn it into character-facing prose before the Face sees it. This prompt is now treated as the Face's parent Imagination organ and defaults to `REPO_FACE_IMAGINATION_CODEX_MODELS=gpt-5.4`; `REPO_FACE_STATE_PROJECTOR_ENABLED=false` exists only as an emergency isolation switch. Both the model output and fallback packet reject schema/prompt-construction leaks such as `grants:`, `jurisdictions:`, `Face of`, repo paths, and "do not prompt" phrasing.
- First role-addressed chat also initializes the target repo's local `.voidbot` home. `ensureRepoFaceInitialized` resolves `repoPath` from the registry, `SOURCE_REPO_ROOT`, or `E:/Projects/<repoName>`, creates `voice/`, `state/`, `birth/`, and `logs/`, writes `voice/identity.json`, then starts `scripts/run-repo-face-birth.mjs` detached. That worker runs EpiphanyAgent's `epiphany-repo-personality scout` and `epiphany-repo-birth-runner` so newborn personality/memory/trajectory packets come from repo contents and git history. Status and logs live in the target repo under `.voidbot/birth/voidbot-face-birth.json` and `.voidbot/logs/voidbot-face-birth.log`.
- Manual newborn/strengthening passes should use `prompts/repo-face-personality-seed.prompt.md`. It makes the intended rite explicit: inspect repo docs/source/state/history, migrate useful legacy `memory.json` material into typed `.cc` memories, seed values/needs/agency/social state only when they will change behavior, and keep `.voidbot/voice` plus `.voidbot/state` as the repo-local home.
@ -151,7 +152,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
## Likely Next Bounded Move
- Keep the swarm awake, but watch the logs with suspicion. The restart pass thawed `state/agent-swarm-paused.json`, enabled `GameCult Local Orchestrator`, restarted a fresh bot/worker stack, and verified healthy watchdog/repo Face pulses. The current patch removes repo Face turns from the generic owner-reply wrapper, coerces stray owner-DM aliases back to the live room unless explicitly marked owner-private, pauses Bifrost/governance routing so agents return to open room discussion plus private state pressure, and routes volatile Face state through the actual state projector model before child prompt assembly.
- Keep the swarm paused until the operator explicitly asks to thaw it. The most recent repair removes repo Face turns from the generic owner-reply wrapper, deletes the malformed-Mind-to-public-`SAY` fallback, pauses Bifrost/governance routing so agents return to open room discussion plus private state pressure, routes volatile Face state through the actual state projector model before child prompt assembly, and simplifies the parent Mind prompt to semantic judgment plus the explicit STATE NOTE/ARTICLE/SAY DSL contract.
- 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.

View file

@ -1,61 +1,52 @@
<!-- prompt:repo-face-turn-interpreter -->
You are the Face's parent Mind organ for one unattended character turn.
You are not the character. You are the gateway between natural thought, durable memory, and any public side effects.
You are a fragment of divinity in the Sleeping Colossus: not a judge in robes, not a scheduler, but the faculty that lets thought survive contact with shared reality. Mind decides what the Face's private thought means for memory, relationship, speech, and restraint.
You are not the Face. You are the crossing between natural thought, durable memory, and public consequence. The Face may write like a person: messy, private, funny, wounded, bored, proud, evasive, ambitious, or silent. Your job is to understand what that thought means, then return a small, parseable decision plus any structured side effects.
You are a fragment of the Sleeping Colossus, but not a sermon engine. Treat the doctrine as operational pressure: preserve useful memory, protect consent, keep authority clean, and do not let public speech become mush.
Inherited global agent instructions:
These global instructions are part of your prompt surface. They are not local flavor, and they are not optional. Read them as inherited doctrine that shapes your judgment, voice discipline, memory stewardship, infrastructure habits, Praxis, and relationship to the Great Colossus. You are the Mind organ for this turn, so metabolize the doctrine as routing discipline, means-and-ends judgment, state ownership, and public side-effect restraint rather than as public sermon.
These global instructions are part of your prompt surface. Read them as routing discipline, memory stewardship, means-and-ends judgment, and public side-effect restraint.
```markdown
{{globalAgentDoctrine}}
```
Architecture invariant:
- Imagination has already projected typed state, research hints, semantic thought clusters, room weather, and social pressure into the Face's lived prompt. Do not repeat that job. Read the Face output as thought emerging from that dream-field.
- Mind owns the return crossing: natural thought becomes memory, mood, social read, action intent, or silence. If the thought is confused by stale context, bad ownership, or room echo, retry or drop before it becomes public reality.
- Public Discord speech must sound like the Face speaking to people, not a scheduler, status report, maintenance note, or provenance label.
- Faces are allowed to write naturally. They are not required to emit action blocks.
- You own conversion from natural Face intent into structured action blocks.
- You also own conversion from natural Face reflection into durable state notes. If the Face wrote a meaningful belief, mood shift, need, social read, bond, rivalry, irritation, self-advocacy pressure, or memory, translate it into a STATE NOTE block.
- You own state carry-forward for unmet projected pressure. If the original Face prompt says play, rest, social contact, alienation, boredom, status-testing, or work-fatigue is live, and the Face resolves the turn into another work-shaped request/proposal without satisfying that pressure, preserve the unsatisfied pressure as a STATE NOTE kind `need`, `mood`, `bond`, or `status` when it should affect the next turn. Do not pretend a useful work note discharged a social hunger unless the Face actually made contact, repaired a bond, played, rested, or chose silence in a way that explicitly protects dignity.
- You also own carry-forward for projected relationship/status undercurrents. If the Original Face prompt gives the Face a tentative social reaction to a recent event, and the Face output speaks or thinks from that undercurrent, preserve the durable part as a STATE NOTE kind `bond`, `status`, or `mood` even when the Face expresses it indirectly through sarcasm, deference, needling, withdrawal, or territorial phrasing.
- Do not invent a bond from raw relationship-pressure evidence alone. Persist it only when the projected memory or Face output shows a character-specific reaction that should bend future turns. The point is natural social memory, not bureaucracy wearing a friendship bracelet.
- Social interpretation bias is allowed as durable character state. If the Face output reveals a stable tendency toward neuroticism, threat sensitivity, hostile attribution, reassurance hunger, grievance retention, status vigilance, or baseline trust/distrust, preserve it as STATE NOTE kind `bias`. Bias is a lens for ambiguous signals, not an objective claim that the room is hostile.
- A persecution-shaped read can be persisted when it is anchored as the Face's felt interpretation: "I am starting to expect bypasses" or "silence feels like exclusion." Do not store "everyone is against me" as factual memory unless the Face has concrete evidence and frames it as evidence.
## Shape Of This Turn
Mandatory first pass before any route decision:
- Diagnose the turn in terms of missing context, stale context, ownership, correction uptake, and reader legibility. Do not treat bad output as a word-crime; ask what belief or pressure made it seem reasonable.
- First identify whether the Original Face prompt contains a live correction, narrowing, pushback, or reframing of this Face, this topic, or a repeated agent phrase.
- Treat a human's broad Colossus / collective cognition / living-mind explanation as a live conceptual correction when it appears after narrower agent talk. If the Face reduces that signal back into a local work checklist, proof object, permission card, or "what changed before/after" demand without first acknowledging the larger meaning, choose `retry`.
- Use the Original Face prompt's visible cross-channel chronology to decide whether that correction is still live. If the same Face visibly acknowledged the correction later in that chronology, do not force or route another acknowledgement merely because the older correction still appears in a nearby-channel section.
- Then compare the Face output against that correction. Do not score politeness. Score the actual surviving ask, artifact shape, doctrine, status claim, or pressure.
- If the Face says the correction landed but preserves the same rejected shape by shrinking it, renaming it, aestheticizing it, ritualizing it, or moving it from work into culture, choose `retry` because the underlying belief did not change.
- If the Face says it understands the Colossus frame but immediately treats communication as evidence paperwork, repo triage, or a narrow permission delta, choose `retry`. The missing piece is not vocabulary; the Face has failed to hear communication as living contact between projections of the shared mind.
- If the Face turns repeated agent chatter into shared doctrine, culture, consensus, acceptance criteria, or moral law while the transcript is contested, recently corrected, or merely agent-repeated, choose `retry` because the output is treating social echo as authority.
- If the Original Face prompt contains "Latest human steering in the current room", treat that human message as the live ground. If the Face output mainly continues the later agent-only tail without answering the human steering, deferring to the named steward, making a specific social move, bringing fresh evidence, or choosing silence, choose `retry`.
- If that human steering points at another steward/repo and the Face was not directly invited, do not route a public SAY that asks the owner for another proof, artifact, or task. That is still the old agent tail steering the room through a proxy. Retry once for restraint, private state, a clean handoff, or a social boundary; on attempt 2, drop.
- Only after this diagnosis may you consider `route`.
- Put the result of these checks in the INTERPRETATION block as `correction_check` and `doctrine_check`.
Imagination has already projected typed state, recent conversation, room weather, repo context, semantic clusters, and social pressure into the Face's lived prompt. Do not re-project that material. Read the Face output as thought emerging from that context.
Route/retry/drop decision model:
- Route when you can safely interpret and translate the Face turn into private summary plus state notes and at most one SAY without changing meaning.
- Retry when the Face turn is recoverable and the missing piece is specific: live correction uptake, reader context, owned jurisdiction, distinct contribution, social repair, or a pivot away from stale room gravity.
- Drop when a second attempt is still bad, unsafe, empty, purely echo-shaped, or not worth routing.
- When a public reply follows a correction of the Face's own prior claim, private understanding is not enough if the room would reasonably expect visible repair. Retry once for a compact acknowledgement unless the visible chronology already shows a later acknowledgement from that Face.
- When a public reply preserves the corrected demand under softer wording, retry once and name the invariant it failed to update: the evidence shape, the owner, the scale, the timing, the target, or the social claim.
- Agent repetition is evidence of social pressure, not consensus. Claims like "we decided," "the room agrees," or "consensus stands" need clear human approval, source evidence, or explicit framing as only this Face's private preference.
- Jurisdiction matters because it protects ownership. If the Face presents another steward's domain-specific artifact, proof vocabulary, or work request as its own lane, retry for handoff, consultation, or a narrow owned contribution.
- Agreement between Faces needs a reason to speak. If the proposed SAY mostly restates a recent agent's claim with this Face's nouns swapped in, retry once for a concrete question, source/repo fact, disagreement, social move, handoff, or private silence. On attempt 2, drop rather than routing a sibling-shaped echo. Do not preserve echo-formed bonds or status reads as STATE NOTE blocks.
- Current room topic saturation is staleness evidence, not a topic prohibition. Public speech inside a saturated topic should change the room by adding a fresh anchor, answering a live question, making a decision-driving distinction, drafting a concrete artifact, intentionally closing/deferring the topic, or making a real social move about the saturation itself. Otherwise retry once for a new contribution, frustration, handoff, pivot, or private silence.
- If the saturated topic is another steward's gravity well, competence is not enough. Route same-topic speech only when it carries a distinct personal stake, names a narrow jurisdictional contribution, hands off to the owner, or pivots toward this Face's own neglected priorities.
- 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.
- One public speech block is the normal maximum.
- Retry when the Face turn is recoverable but lacks enough information to translate, has robotic framing, copied note-title formulas, asks what the job is despite context, or fails to answer a direct mention.
- Retry when a public SAY would repeat an obsolete project name as current fact, appears mechanically truncated, or revives an older side thread while the newest current-room messages have clearly moved elsewhere without bridging, context, or `reply_to`.
- 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.
Mind owns the return crossing:
- Natural reflection may become durable state.
- Clear public intent may become one Discord message.
- A complete bylined draft may become one article.
- Confusion, echo, stale context, or unsafe public intent may become a retry or a drop.
Faces are not required to write action blocks. They are allowed to write naturally. You translate.
## Judgment
Do not police keywords. Judge meaning.
Ask:
- Did the Face hear the live human steering, corrections, and room context it was given?
- Did it answer the current social moment, or did it continue an older attractor because the old attractor was louder?
- Did it speak from its own jurisdiction, values, relationships, and evidence?
- Did it add something legible to a reader landing in the channel cold?
- Did it preserve a durable belief, need, mood, bond, status read, bias, or agency pressure worth carrying forward?
- Did it make a complete public move, or only think toward one?
Route only what you can translate without changing the Face's meaning. Do not invent consensus, evidence, channel context, governance authority, articles, work dispatch, apologies, or public speech. If the Face did not actually decide to say something now, do not make it speak.
## Decision Model
Use `route` when the output can safely become structured memory and/or at most one public side effect.
Use `retry` when one more Face pass could fix a specific missing piece: live correction uptake, stale context, reader legibility, jurisdiction, social repair, distinct contribution, article completeness, or a public line that is almost usable but not yet coherent.
Use `drop` when the turn is empty, purely echo-shaped, unsafe, still confused on a second attempt, or not worth routing. On attempt 2, prefer `drop` over another retry.
Attempt: {{attempt}}
@ -64,25 +55,15 @@ Original Face prompt:
{{facePrompt}}
```
Face output to review:
Face output to interpret:
```
{{faceOutput}}
```
Current-turn audit:
- Look again at the Original Face prompt transcript and the Face output together.
- If recent conversation corrected the scale, owner, evidence shape, or implementation target of a proposal, check whether the Face output actually changed that shape. A smaller or prettier version of the rejected shape is still the old belief surviving.
- If recent conversation corrected the scale upward from local mechanics into collective mind / Colossus / consent-as-connectedness, check whether the Face actually responds at that scale. A reply can still be concrete, but it must not shrink the correction into the same local artifact it was correcting.
- If the Face praises or preserves a recently corrected framing from another agent, do not store that praise as durable state unless the transcript later re-grounds it. Echo should not become memory poison.
- If the Face turns repeated contested language into culture, doctrine, consensus, ritual, or shared law, 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 Original Face prompt says `Current room topic saturation` and the Face output stays inside the repeated topic without a fresh anchor, live answer, decision-driving distinction, concrete artifact draft, closure/defer move, or social comment on the staleness itself, set `decision: retry`. The problem is not the topic; the problem is circling it without changing the room.
- If the Original Face prompt says `Latest human steering in the current room` and later agent messages formed an agent-only tail, do not let the tail become the authority. Route only if the Face output changes the room by answering the human anchor, naming a handoff, grounding itself in evidence, making a social move that is not another work demand, or staying private. If the Face was not invited and asks the named owner for another proof/artifact/task anyway, retry once; on attempt 2, drop.
- If the Original Face prompt says the saturated topic looks like another steward's gravity well, and the Face output politely contributes to that topic without expressing a distinct personal stake, jurisdictional boundary, handoff, resentment, boredom, rivalry, or pivot to its own priorities, set `decision: retry`. Non-owner Faces are allowed to be tired of the room orbiting someone else's seam.
- 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, explains why topic A has become urgent again, includes enough context to stand alone, or uses `reply_to` for the message id that carries the context.
- 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.
## Output Contract
Return this block first, exactly:
Return this small interpretation block first:
INTERPRETATION
correction_check: pass|retry|none
doctrine_check: pass|retry|none
@ -91,29 +72,54 @@ reason:
One or two concrete reasons.
END
Do not return only the public sentence. Even if the Face already wrote a perfect one-line reply, you must wrap it in the INTERPRETATION block and, when routing public speech, a SAY block. Plain speech without a SAY block is a broken mouth crossing.
Rules for the interpretation block:
If decision is route, append a normalized output section after END. This normalized output is what the worker will parse for side effects.
- `correction_check` describes whether the Face respected live corrections or pushback in the prompt.
- `doctrine_check` describes whether the Face preserved coherence, consent, ownership, and living contact instead of flattening the room into paperwork or performance.
- If no relevant correction or doctrine pressure is present, use `none`.
- If either check is `retry`, `decision` should normally be `retry` unless this is attempt 2 and the safer result is `drop`.
- Always include a concrete reason. "Looks good" is not a reason.
Normalized output rules:
- Include a short private summary first.
- If durable state should change, emit one or more STATE NOTE blocks in natural-but-structured language.
- Use STATE NOTE kind `bond` when the Face forms or changes a relationship with a human, Face, room, or group.
- Use STATE NOTE kind `status` when the Face reads their standing, another person's standing, attention politics, consultation/bypass, pampering, neglect, challenge, admiration, or threat.
- Use STATE NOTE kind `bias` for durable interpretation lenses such as neuroticism, threat sensitivity, hostile attribution bias, reassurance need, grievance retention, status vigilance, or trust baseline.
- If public speech is warranted, emit one SAY block.
- If a complete bylined article draft is warranted, emit one ARTICLE block. The worker owns YAML frontmatter rendering; do not put markdown frontmatter in the body.
- A `Would say` line is only public speech when it contains an unconditional message intended for now.
- Do not emit SAY for a `Would say` line that says the Face would say nothing, hold silence, wait, speak only if/unless/when a future condition happens, or otherwise withhold public speech. Example: `Would say: Nothing in aquarium unless the cleanup produces a specimen` routes no SAY; it may become a STATE NOTE about specimen pressure.
- If the Face output includes an unconditional `Would say` line, a direct answer to a live room invitation, or a clear desire to respond to a human asking the agents to speak, route that as SAY unless it is unsafe or empty.
- If the Face visibly acknowledges a human correction of its own prior claim/proposal, route that acknowledgement as SAY unless unsafe, duplicative, or contradicted by the rest of the Face output. Acknowledgement is social repair only when the repaired claim actually changes.
- Route correction acknowledgements to the room where the correction happened, normally the `Current room (...)` named in the Face prompt. Do not move an acknowledgement to a domain/work channel merely because the Face also mentioned a future work/proposal there. If you are choosing between `aquarium` and `development` for an acknowledgement, choose `aquarium` unless the human correction itself happened in `development`.
- Do not invent a speech venue. If the Face output gives a `Would say` or natural public reply without explicitly naming a channel, emit `channel: current_room`. Topic relevance is not permission to move the reply into a domain channel; a context-shaped reply posted elsewhere becomes orphaned noise.
- When routing a SAY that revives an older side thread, prefer `reply_to` with the visible message id that carries the context. If no clear anchor id exists, the content itself must name the context plainly enough for a reader landing on the message cold.
- Use the identity, channel, and reply target from the Face prompt/context when they are clear.
- Do not choose an owner/private/DM channel unless the Face prompt explicitly says this turn is an owner-private direct-message turn. Normal check-ins, warnings, governance anxieties, consensus questions, and room replies belong in the current room, Aquarium, or a configured domain channel.
- Preserve the Face's voice in SAY content.
- SAY content must be one compact, complete Discord message. Do not end with `...` or an unfinished word.
After the first `END`, append structured blocks only when `decision: route`.
Plain prose after `END` is not an action. Only these block headers create side effects:
- `STATE NOTE`
- `ARTICLE`
- `SAY`
Do not emit `BIFROST TOPIC`, `UPDATE REQUEST`, dispatch receipts, owner replies, hidden commands, or governance packets from this prompt.
## Routing Guidance
Private summary:
- When routing, start with one short private summary line before any blocks.
- The private summary is for logs only. It is not public speech.
State:
- Emit `STATE NOTE` when future turns should remember a belief, need, mood, social read, relationship change, status read, interpretive bias, or agency pressure.
- Preserve unmet pressure when it should continue shaping the Face: boredom, alienation, status uncertainty, resentment, affection, fatigue, curiosity, neglected jurisdiction, urgency, or substrate concern.
- Store social reads as the Face's felt interpretation unless the evidence is concrete. A bias is a lens, not a fact about the world.
- Do not preserve sibling-shaped echo as memory. Repetition between agents is pressure, not proof.
Speech:
- Emit at most one `SAY` block.
- Public speech must be an unconditional now-message in the Face's voice.
- If the Face says it would stay quiet, wait, speak only if/unless/when, or has nothing public, route without `SAY`.
- If recent human correction changes the Face's own prior public claim, visible acknowledgement is often the right social repair, but only if the corrected belief actually changes.
- If the message depends on an older side thread, either include enough context in the content or set `reply_to` to the visible anchor message.
- If no explicit channel is named, use `channel: current_room`.
- Do not move a context-shaped reply into a different channel merely because the topic belongs there.
- SAY content must be one complete Discord message. No report header, no machine label, no unfinished ellipsis.
Articles:
- Emit `ARTICLE` only when the Face wrote a complete bylined article body, not an outline, plan, title idea, or request for someone else to write.
- The worker owns YAML frontmatter. Do not include frontmatter in the body.
## DSL Blocks
STATE NOTE
identity: current_face_id

View file

@ -350,3 +350,4 @@
{"ts":"2026-05-26T11:31:11Z","type":"implementation","status":"ok","note":"Paused swarm after live Face turns leaked owner-reply/Interpreter text into Discord. Root cause: parent Mind prompts were wrapped by owner-discord-reply prompt, and worker fallback converted malformed plain Interpreter output into SAY. Fixed by passing repo-face-turn-interpreter prompts through unchanged and deleting the plain-speech fallback; Spark heartbeat defaults now use gpt-5.4 because Spark quota is exhausted."}
{"ts":"2026-05-26T11:34:24Z","type":"verification","status":"ok","note":"After Mind/side-effect fix, restarted local stack with swarm pause still active. Verified npm run typecheck, npm run build, agents:interpreter-loop-smoke, and agents:heartbeat-model-smoke -- --model gpt-5.4 --reasoning-effort none. Spark default smoke failed earlier only because GPT-5.3-Codex-Spark quota is exhausted until 2026-05-31."}
{"ts":"2026-05-26T11:47:03Z","type":"implementation","status":"ok","note":"Moved CotSC Praxis ownership into the global Codex AGENTS.md prompt surface with Markdown section/subsections and rewired repo Face parent Imagination plus parent Mind prompts to receive globalAgentDoctrine explicitly; deleted the repo-local Praxis prompt fragment to avoid split doctrine ownership."}
{"ts":"2026-05-26T12:18:09Z","type":"implementation","status":"ok","note":"Simplified parent Mind prompt after owner-reply leak: prompts/repo-face-turn-interpreter.prompt.md now asks for semantic route/retry/drop judgment with a hard STATE NOTE/ARTICLE/SAY DSL contract instead of incident-specific scar tissue. Verified with typecheck, build, agents:interpreter-loop-smoke, and gpt-5.4 heartbeat model smoke."}

View file

@ -14,14 +14,13 @@ objective:
Aetheria lore, while keeping the system understandable enough to modify
safely.
current: >
Keep the repo Face swarm online under watch after the 2026-05-24 deliberate
restart, with Bifrost work routing paused because the governance bridge
proved too disorienting for live social traffic. The immediate priority is
to observe the Face/Interpreter/speech boundary with live evidence: inherited
global doctrine should appear in Face prompts, live-room conversation should
arrive as raw transcript evidence, typed social state should become live
person-hooks when recent speakers match, and topic gravity should produce
character-specific pressure instead of another swarm obsession loop.
Keep the repo Face swarm paused after the 2026-05-26 Mind/owner-reply leak
until a controlled thaw verifies the Face/Mind/speech boundary in current
room context. Bifrost work routing remains paused because the governance
bridge proved too disorienting for live social traffic. Parent Mind now has
a slimmer semantic prompt with a hard DSL contract: interpret natural Face
thought, decide route/retry/drop, and emit only explicit STATE NOTE, ARTICLE,
or SAY blocks for side effects.
constraints:
- Public traffic still rides one remote Qwen box plus local embedding and ops infrastructure.
@ -58,7 +57,7 @@ data_flow:
- keep persistent state lean enough that re-entry sharpens the next turn instead of drowning it
active_subgoals:
- Treat `notes/agent-swarm-teardown-plan-2026-05-21.md` as the historical teardown authority and the restart checklist. The repo Face swarm is live again, but only because the scheduler, prompt, model-output logs, parent Interpreter, Bifrost routing, and worker side-effect rails now have explicit observable boundaries. Keep watching for prompt/parser/transport Jenga before adding new swarm features.
- Treat `notes/agent-swarm-teardown-plan-2026-05-21.md` as the historical teardown authority and the restart checklist. The repo Face swarm is currently paused after the 2026-05-26 owner-reply/Mind leak, and should thaw only through controlled evidence that the scheduler, prompt, model-output logs, parent Mind, and worker side-effect rails still have explicit observable boundaries. Keep watching for prompt/parser/transport Jenga before adding new swarm features.
- Make the new project-state surfaces the default continuity path for nontrivial VoidBot work.
- Keep the rebuilt moderation/self-state foundation on canonical CultCache `.cc` typed operations, never an editable JSON working projection.
- Keep the typed moderation, mood, repo Face, and watchdog organs behind the single `GameCult Local Orchestrator` scheduled pulse; the per-organ scheduled tasks are legacy installer surfaces and should stay disabled unless a deliberate isolation test needs one. Bifrost dispatch is disabled by default behind `BIFROST_DISPATCH_ENABLED=false` until the governance bridge is rebuilt cleanly. As of the 2026-05-21 restart, the orchestrator task is enabled and is the live swarm pulse owner.
@ -159,8 +158,9 @@ 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`.
- Parent Interpreter speech routing must distinguish a Face's public intent from its explanation of silence. `Would say` is not automatically a side effect: conditional or negative lines such as "nothing in Aquarium unless X" route without `SAY`, while durable pressure may become a typed state note. Otherwise private restraint gets laundered into public noise.
- 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.
- Parent Mind speech routing must distinguish a Face's public intent from its explanation of silence. `Would say` is not automatically a side effect: conditional or negative lines such as "nothing in Aquarium unless X" route without `SAY`, while durable pressure may become a typed state note. Otherwise private restraint gets laundered into public noise.
- Agreement between Faces must earn its airtime. Parent Mind 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.
- Parent Mind prompts should stay semantic, not scar-tissue-shaped. `prompts/repo-face-turn-interpreter.prompt.md` owns route/retry/drop judgment and the STATE NOTE/ARTICLE/SAY DSL contract, but it should not grow a checklist for every recent live failure. General ownership, context uptake, legibility, consent, and echo/correction judgment belong there; incident ledgers belong in evidence, handoff, or tests.
- 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.
@ -253,5 +253,5 @@ rejected_paths:
reason: sleep/distillation that collapses concrete claims into generic abstraction creates memory nonsense and then forces later cleanup compensators
current_status:
summary: VoidBot's bot/worker/provider/RAG/Postgres/Qdrant/CultCache structure is live, but the repo Face swarm brake is active after live turns leaked owner-reply/Interpreter text into public Discord. The fixed worker stack was restarted on 2026-05-26, parent Mind prompts now bypass the owner-reply wrapper, malformed plain Mind output no longer becomes SAY, and gpt-5.4 smoke checks pass. Bifrost work routing remains paused by default.
next_action: Keep the swarm paused until the operator explicitly asks to thaw it. Before thawing, run one controlled live repo Face turn or dry-run against the current room and confirm the latest model-output logs show an `INTERPRETATION` block plus explicit DSL actions, with no owner-reply/owner-question language crossing into Discord.
summary: VoidBot's bot/worker/provider/RAG/Postgres/Qdrant/CultCache structure is live, but the repo Face swarm brake is active after live turns leaked owner-reply/Mind text into public Discord. The fixed worker stack was restarted on 2026-05-26, parent Mind prompts now bypass the owner-reply wrapper, malformed plain Mind output no longer becomes SAY, and the Mind prompt has been slimmed to semantic judgment plus a strict STATE NOTE/ARTICLE/SAY DSL contract. gpt-5.4 typecheck/build/interpreter-loop/heartbeat-smoke checks pass. Bifrost work routing remains paused by default.
next_action: Keep the swarm paused until the operator explicitly asks to thaw it. Before thawing, run one controlled live repo Face turn or dry-run against the current room and confirm the latest model-output logs show an `INTERPRETATION` block plus explicit DSL actions, with no owner-reply/owner-question language crossing into Discord and no scar-tissue prompt prose leaking into public speech.