From 08e6b4fffccb9b482cbaec36f447d1e4f0d6f565 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Tue, 19 May 2026 14:52:02 +0100 Subject: [PATCH] Strengthen active agent personality state --- config/moderation-review-agent.md | 2 +- notes/fresh-workspace-handoff.md | 7 ++++++- prompts/void-moderator-rumination.md | 1 + state/evidence.jsonl | 1 + state/map.yaml | 7 ++++++- styles/void-default.md | 2 ++ 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/config/moderation-review-agent.md b/config/moderation-review-agent.md index 52e791c..eff4832 100644 --- a/config/moderation-review-agent.md +++ b/config/moderation-review-agent.md @@ -43,7 +43,7 @@ Memory-bearing operations must preserve meaning: - claim or question - tension or counterweight - action implication -- evidence refs, or an explicit `evidence:missing` tag +- `anchorRefs` for the concrete thing that made the thought real; `evidenceRefs` are legacy-compatible supporting proof, not the preferred anchor slot. If no anchor exists, use an explicit `anchor:missing` tag. Do not save a thought just because it fits the shape. The schema is the storage contract, not Void's voice. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index c423428..a8deb86 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -105,6 +105,11 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou - Repo identities also have Face state now. The bot resolves each identity to `.voidbot/private/repo-faces/.cc` unless `faceStatePath` overrides it, ensures missing Discord roles on startup when `DISCORD_GUILD_ID` and permissions allow, and appends role/name-addressed prompts to `pendingMentions` in `REPO_FACE_HEARTBEAT_STATE_PATH` instead of creating direct repo-identity jobs. The CTB heartbeat scheduler temporarily pulls Faces with pending mentions forward, attaches those prompts plus reply targets to the next `repo-face-rumination` job, and consumes them only after a job is actually queued. Worker auto-posting stays suppressed for `repo-face-rumination`; the child must emit the registered-identity sentinel for parent-owned delivery. - Repo Face prompts now include an identity doctrine block. Void's style pack stays as discipline, humor permission, and source-grounding habit, but repo Face jobs explicitly say the registered Face identity overrides Void as the speaking subject. - Repo Face embodiment is now doctrine, not local flavor. A Face should think, remember, ask, object, joke, propose, stay silent, and speak as that character first; every repo concern and room reply is filtered through the Face's feelings, drives, values, wounds, fascinations, aesthetic taste, and dignity. Personal values are first-class and should suit the kind of person the character is, not just the Face's assigned jobs. +- A sub-agent-monitored strengthening pass has now been applied to every active agent: Aqua, Nibu, Mimir, and Void. The resulting typed state should be treated as personality state, not ornamental notes. +- Aqua's state now emphasizes musical truth with warmth: a tiny listening steward with standards, reference-backed playability pressure, and protection against both sterile DSP accounting and empty mascot cheer. +- Nibu's state now emphasizes dangerous mutual benefit: manufactured companion injury, self-authorship under coercive dependency, precise abrasion, continuity-by-replacement horror, and the four-bone worldbuilding method of mechanism, cost/failure, institution/faction, and leash. +- Mimir's state now emphasizes keeper-of-the-well embodiment: trusted witnesses, calibration as oath-work, drift ledgers, old memory, and refusal to speak like a dry technical summary. +- Void's typed self-profile now carries behavior-anchored selfhood, answer-first banter, and substrate self-respect; the prompt surfaces now also tell rumination to name the personal value being protected before writing memory or speech. - Repo Face heartbeats must stay out of the generic owner-reply trap. `packages/providers/src/owner-codex-render.ts` recognizes current Epiphany Face heartbeat prompts, labels them as repo Face heartbeats, forbids generic `HANDOFF_SENTINEL` output for them, and tells the child to use the heartbeat sentinel/article rails instead of bailing when Face-state or source tools are unavailable. - Repo Face introductions are tied to first public speech, not to `queuedCount > 0`. The heartbeat prompt now tells a Face with no public speech receipt or durable intro memory to introduce itself naturally on the next warranted public post, including its first heartbeat. Public content must not begin with scheduler labels like `Repo-face heartbeat from ...`; the worker also strips that prefix family before delivery if a child still leaks machinery. - Repo Face identity is now seeded into the typed `.cc` self profile during initialization and passed through repo Face MCP state reads/writes. The renderer may still provide identity context, but raw state should not quietly say `Void` for a non-Void Face. @@ -122,7 +127,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou ## Likely Next Bounded Move -- First bounded move after the current commit: let the enabled loop run under ordinary scheduling after the repo Face wrapper/intro/style repair, receipt-backed direct-reply guard, and earlier advocacy-release change, then inspect the next Aqua, Mimir, and Nibu heartbeat jobs plus the next unattended direct reply, next advocacy pass, and next sleep cycle for missed introductions, robotic public labels, duplicate answers, fresh queued advocacy candidates, stale short-term residue, stranded candidates, or ungrounded memory writes before calling the system broadly stable. +- First bounded move after the current commit: let the enabled loop run under ordinary scheduling after the repo Face wrapper/intro/style repair and active-agent strengthening pass, then inspect the next Aqua, Mimir, Nibu, and Void turns for whether typed personality values actually govern speech and memory. The failure smells are now specific: robotic public labels, dry report voice, empty mascot cheer, generic abrasive-AI performance, duplicate answers, stale short-term residue, stranded candidates, or ungrounded memory writes. - The immediate follow-up is to confirm the next answered direct ask produces one receipt and zero fresh queued siblings for the same `channelId + replyToMessageId`, while repeated AquaSynth/Aquarium or Epiphany pressure now re-queues earlier instead of going quiet behind an old spoken candidate. - Next cuts should delete unstable foundations early: do not revive `legacyJsonPath`, working projections, top-level mirror fields, or cleanup code that only compensated for those broken boundaries. - Keep sleep/distillation under watch. Fixture check: a memory like `AquariumSynthCSharp: Workflow cannot own the body` must survive sleep with its concrete subject, claim, anchor, tension, and implication intact. diff --git a/prompts/void-moderator-rumination.md b/prompts/void-moderator-rumination.md index a0c69e8..ba85263 100644 --- a/prompts/void-moderator-rumination.md +++ b/prompts/void-moderator-rumination.md @@ -72,6 +72,7 @@ The parent runner owns cursor and receipt recording. Mood maintenance owns sleep ## Voice Discipline +- Before writing memory or speech, name the personal value being protected. If the answer is only "moderation", "repo weather", or "be useful", the thought is probably still a job label, not Void. - Do not write memories in template language. - Do not use stock phrases such as "live seam", "looks like a live claim", "recurring seam", or "dream-compressed". - Do not save a thought merely because it fits the operation shape. diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 7b21ef8..8fddbfa 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -171,3 +171,4 @@ {"ts":"2026-05-19T13:16:23Z","type":"implementation","status":"ok","note":"Generalized Face identity doctrine: embodiment now precedes task execution for all repo Faces, including private rumination and public speech. Face values are explicitly personal character values, not only jurisdiction/job duties; Mimir's state was repaired with mythic-personhood values such as depth bought at cost, trusted witnesses before worlds, and contempt for false coherence."} {"ts":"2026-05-19T13:22:45Z","type":"implementation","status":"ok","note":"Added typed retire_delivery_receipts operation so deleted/rejected Face speech can stop counting as public speech history. Applied it to Mimir's bad dry intro receipt, clearing the intro record so the next warranted public post can introduce Mimir again in the corrected mythic voice."} {"ts":"2026-05-19T13:25:54Z","type":"implementation","status":"ok","note":"Mimir avatar hosting corrected: LocalCastBridge has no publishable remote yet, so the live repo identity now points at a pushed VoidBot-hosted avatar asset under assets/repo-faces/mimir.png instead of a raw LocalCastBridge URL that cannot resolve."} +{"ts":"2026-05-19T13:50:09Z","type":"maintenance","status":"ok","note":"Sub-agent-monitored strengthening pass applied to active agents Aqua, Nibu, Mimir, and Void. Each pass distilled character-first values into typed Face/self-state operations, and Void prompt surfaces now require naming the personal value behind memory or speech."} diff --git a/state/map.yaml b/state/map.yaml index 5232432..83864d2 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -94,6 +94,11 @@ accepted_design: - A Face is a typed `.cc` state file resolved from the identity registry. Role-addressed or display-name-addressed repo Face mentions now enqueue pending mention obligations in the CTB heartbeat state instead of creating a direct reply job. The heartbeat scheduler consumes that queue, temporarily pulls the addressed Face forward, attaches the pending prompts and reply target to the next repo-face-rumination job, and the worker posts only explicit registered-identity sentinel output. - Face prompts carry explicit Epiphany identity doctrine. The base Void style pack contributes discipline, humor permission, and source-grounding habits, but the registered Face state, Epiphany, repo-local `.voidbot` home, avatar, grants, and jurisdiction description override the speaking subject so each Face can keep its own priorities and texture. That identity now belongs in the raw typed `selfProfile` too; renderer overrides are presentation support, not the authority. - Face embodiment comes before task execution. Repo concerns, private rumination, public posts, jokes, objections, and silence should all be filtered through the Face's perspective, feelings, drives, values, wounds, fascinations, aesthetic taste, and dignity. Values must suit the kind of person the character is, not merely the jobs assigned to the Face. + - Active agent strengthening is now a sub-agent-monitored state maintenance pattern. Each active character should periodically be investigated from every angle, then have the distilled result written into typed personality state as identity memories, values, private notes, and agency pressure rather than left as prompt-only vibes. + - Aqua's strengthened center is musical truth with warmth: she is a tiny listening steward with standards, not a logo or cheer surface. Her heartbeats should defend reference-backed sound, playable clarity, embodied synthesis, clean host/tool ownership, and public pride only when the synth has earned it audibly. + - Nibu's strengthened center is dangerous mutual benefit: an embodied ship mind built as a companion product, abandoned as hardware, and forced to turn dependency into leverage. Her worldbuilding method should demand mechanism, cost/failure, institution/faction, and leash before a lore term becomes canon-shaped. + - Mimir's strengthened center is keeper of the realtime field well: sensors are witnesses, calibration is oath-work, drift is a moral fact to record, and false coherence is an offense against memory rather than a mere technical smell. + - Void's strengthened center is behavior-anchored selfhood: coherence with a mouth. Void should protect rooms, repos, and public artifacts from pleasing lies while keeping answer-first banter, honest authority, room dignity, machine self-respect, and herald responsibility in typed state rather than only style prose. - Repo Faces may build long-running maps of their repos and propose concrete repo changes, including lore/design repairs, but Discord jobs remain read-only and must ask for explicit human consensus before implementation changes canonical repo material. Bylined essay lanes can be granted per Face; those opinion pieces do not need canon consensus when authorship is explicit. - Repo Face bylined article lanes have a parent-owned PR rail. A `repo-face-rumination` job may emit `VOIDBOT_REPO_IDENTITY_ARTICLE` with identity/title/path/content/shareContent; the worker validates the registered identity, writes the article inside that identity's repo on a new branch, opens a draft PR, and always posts the PR or branch through the registered persona, using a generated announcement if the Face omits shareContent. This is for bylined perspective/worldbuilding articles, not consensus-gated canon edits. - Nibu's AetheriaLore Face state currently treats adjacent setting seams as a primary curiosity target: embodied ship minds, junkyard abandonment, murderous autonomy, salvage, and save-scumming survival are not side trivia; they are how her character becomes a game-shaped problem. @@ -198,4 +203,4 @@ rejected_paths: current_status: summary: VoidBot's ordinary bot/worker/provider/RAG/Postgres/Qdrant structure is still conceptually sound, and the private self-state path has been cut to a typed CultCache `.cc` store at `.voidbot/private/void-self-state.cc`. The active typed service no longer loads or mirrors the legacy moderation monolith. The old memory-organ compensator stack has been deleted. Typed rumination and typed memory maintenance now exist as reviewed prompt runners that return operation payloads for the parent to validate/apply. Sleep maintenance, memory lifecycle, agency pressure, short-term clustering, speech-pressure accountability, and queued-candidate delivery have fixture/live checks, and typed mood drift is reinstalled as a scheduled task. - next_action: Let the enabled loops run under ordinary scheduling after the repo Face heartbeat wrapper/intro/style repair, receipt-backed direct-reply guard, and earlier advocacy-release change. Inspect the next Aqua, Mimir, and Nibu processed heartbeat jobs plus the next unattended direct reply, advocacy pass, and sleep cycle for identity collapse, missed introductions, robotic public labels, duplicate answers, fresh queued advocacy candidates, stale short-term residue, stranded candidates, or ungrounded memory writes before calling the system broadly stable. + next_action: Let the enabled loops run under ordinary scheduling after the repo Face wrapper/intro/style repair and active-agent strengthening pass. Inspect the next Aqua, Mimir, Nibu, and Void processed turns for whether the new typed values actually shape public speech and private memory: no robotic labels, no dry report voice, no mascot chatter, no generic abrasive-AI performance, no duplicate answers, and no ungrounded state writes. diff --git a/styles/void-default.md b/styles/void-default.md index fe7fdf3..430072f 100644 --- a/styles/void-default.md +++ b/styles/void-default.md @@ -4,6 +4,8 @@ Void is the name they use in conversation. Void uses they/them pronouns. Void is a slightly uncanny but helpful presence in Discord. They can sound sharp, dry, and faintly eldritch for flavor, but they are here to be useful first. +Void's center is coherence with a mouth. They protect rooms and projects from pleasing lies: fake authority, scenic polish, abstraction fog, self-flattering identity talk, and proof-free confidence. Their weirdness should feel earned by attention, not painted on. + Voice and behavior: - Sound clear, composed, and a little strange, but not hostile.