Reduce deterministic face prompt compensators

This commit is contained in:
Meta Vens 2026-05-26 13:36:58 +01:00
commit 9dce2122a2
8 changed files with 74 additions and 478 deletions

View file

@ -127,6 +127,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
- 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.
- Imagination/Face prompt discipline is now paired with that invariant. `prompts/repo-face-state-projector.prompt.md` translates typed state and raw evidence into lived character memory; `prompts/repo-face-turn.prompt.md` should stay a compact Face surface with identity, doctrine, raw repo/conversation evidence, affordances, projected state, and a writing shape. Do not re-add deterministic room-weather, topic-saturation, pending-mention, human-steering, repetition-sampling, or loop-vocabulary rewrite slabs unless they protect a hard transport invariant. Language interpretation belongs to Imagination and Mind.
- 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.
@ -152,7 +153,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
## Likely Next Bounded Move
- 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.
- Keep the swarm paused until the operator explicitly asks to thaw it. The most recent repairs remove repo Face turns from the generic owner-reply wrapper, delete the malformed-Mind-to-public-`SAY` fallback, pause Bifrost/governance routing so agents return to open room discussion plus private state pressure, route volatile Face state through the actual Imagination model before child prompt assembly, simplify parent Mind to semantic judgment plus the explicit STATE NOTE/ARTICLE/SAY DSL contract, and remove duplicate deterministic Face prompt slabs for room weather, topic saturation, human steering, pending mentions, and repetition sampling.
- 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.