295 lines
85 KiB
YAML
295 lines
85 KiB
YAML
experiment:
|
|
name: VoidBot
|
|
status: active
|
|
phase: hardening
|
|
premise: >
|
|
Keep VoidBot operable as a Discord-native assistant with real retrieval,
|
|
durable ops, and explicit project memory surfaces instead of letting
|
|
continuity dissolve into transcript fog.
|
|
|
|
objective:
|
|
primary: >
|
|
Maintain and extend VoidBot as a Discord-native assistant for GameCult with
|
|
grounded answers from archived Discord history, indexed source trees, and
|
|
Aetheria lore, while keeping the system understandable enough to modify
|
|
safely.
|
|
current: >
|
|
Recover the read-only archive/source retrieval organ on surviving old
|
|
Yggdrasil from the verified 2026-06-03 offsite backup. Big Yggdrasil is
|
|
retired and its address is no longer trusted; its VoidBot, Idunn, Odin,
|
|
Epiphany, deployment, and secret state did not survive. Restore only the
|
|
resident loopback MCP, exact archives, and VoidBot-owned Qdrant collections
|
|
first. Keep Discord, worker jobs, Personas, moderation, and delivery stopped
|
|
until their missing authority and credentials are deliberately rebuilt.
|
|
|
|
constraints:
|
|
- Disaster recovery currently targets trusted old Yggdrasil at 94.130.75.184; retired Big Yggdrasil at 94.130.223.131 is not a GameCult host and must not be trusted or targeted.
|
|
- VoidBot's deployed runtime lives on Yggdrasil and deployment is owned by Idunn from upstream pushes; local workspaces are not deployment targets.
|
|
- Public traffic still rides one remote Qwen box plus local embedding and ops infrastructure.
|
|
- Owner flow and public flow share infrastructure but have different provider and safety boundaries.
|
|
- Postgres, Qdrant, Ollama, Docker, and Discord failures are operationally real; observability matters as much as features.
|
|
- Adjacent-service monitoring is allowed locally, but the public watchdog surface should stay generic and load private fire-signal logic through ignored extension hooks instead of hardcoded project gossip.
|
|
- Persistent project state must stay small enough to rehydrate from without becoming a second swamp.
|
|
|
|
invariants:
|
|
- The recovery MCP organ is read-only and loopback-only. It may consume exact archives, VoidBot-owned vector collections, and the configured embedding provider; it cannot start Discord, worker-job, Persona, moderation, Bifrost, Idunn, or canon mutation paths.
|
|
- Deployment follows one path: push the intended upstream commit, then let Idunn deploy VoidBot on Yggdrasil. Do not create, restore, or search for a local VoidBot deployment path.
|
|
- The map is canonical and slow-changing.
|
|
- Scratch is temporary and disposable.
|
|
- Evidence is durable and distilled; routine activity proof belongs in git history, commits, smoke artifacts, or targeted logs.
|
|
- Jobs, audit events, interaction memory, and rate-limit state live in Postgres; vectors live in Qdrant; archives, artifacts, logs, and backups remain under `.voidbot/`.
|
|
- Source, repo, and lore answers should use source-side retrieval when the reply depends on indexed facts; the hinting is advisory, not a lexical veto.
|
|
- When GameCult history, repo, or lore retrieval can answer the question, use the VoidBot MCP surfaces before raw repo spelunking.
|
|
|
|
data_flow:
|
|
observe:
|
|
- user request
|
|
- repository state
|
|
- canonical project state files
|
|
- provider and runtime health
|
|
- verifier results and smoke outputs
|
|
process:
|
|
- rehydrate from map, handoff, system map, and implementation plan
|
|
- reason over one bounded organ
|
|
- modify only the surface that deserves the change
|
|
- verify the seam that matters
|
|
- record only durable evidence that changes future belief
|
|
- commit or backtrack
|
|
cut:
|
|
- revert failed hypotheses instead of preserving churn
|
|
- distill obsolete state instead of accumulating transcript-shaped sludge
|
|
- keep persistent state lean enough that re-entry sharpens the next turn instead of drowning it
|
|
|
|
active_subgoals:
|
|
- Keep the deployed read-only `get_exact_source_document` contract inside the recovery allow-list. The source archive remains the sole owner; consumers hash and receipt returned content. Yggdrasil release `20260816T193315Z-c88c71909dbc` and the Starfire full-document witness prove the live path.
|
|
- 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.
|
|
- 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.
|
|
- The resident `apps/persona-scheduler` process inside `voidbot.service` owns repo Face and native Persona turn pulses on Yggdrasil. Its `initiative-engine.ts` owns participant reconciliation, operator heat/speed projection, semantic-pressure commits, wall-clock advancement, active-turn freeze/completion recovery, queue-result commits, stale rescheduling, mention priority, rest/idle eligibility, and ready-order selection as a pure state machine. `state-store.ts` is the sole persistence/migration port: canonical state is one typed `voidbot.persona_scheduler_state` record in `repo-face-heartbeats.cc`; the old JSON shape is accepted only as a one-time migration source and emitted afterward only as a debug/dashboard projection. Missing state is explicit, malformed CultCache fails closed, and the backing store promotes atomic MessagePack writes. Discord attention crosses through immutable per-mention `voidbot.persona_attention_command` CultCache inbox documents resolved from that same canonical path; the bot creates commands, while the scheduler alone ingests, deduplicates, commits, and acknowledges them after durable state. `active-turn-source.ts` reports only Persona job liveness and may fail stale queue claims; it has no Void lock or moderation authority. Persona initiative never registers or dispatches a built-in Void system participant. Void moderation, rumination, physiology, memory, and candidate delivery are independent resident organs.
|
|
- `persona-state-packet-projector.ts` owns pure assembly of typed memory sections, social context, topic attraction, curiosity facts, pressure sections, and human-clarity pressure into the deterministic Persona state packet. The orchestration shell supplies observations and one explicit observation time. It cannot rewrite projected language: the old regex vocabulary cleaner and its dead narrative helpers were deleted rather than moved.
|
|
- `persona-text-projection-actuator.ts` owns Codex process execution for optional model-backed Persona memory projection: ordered model fallback, read-only arguments, timeout, stdout/stderr capture, final-message decoding, retry classification, and model-output telemetry. It receives a complete prompt and returns text; it cannot acquire Persona/Discord state, select initiative, or queue work. Capacity/tool-availability failures may try the next configured model; prompt/contract failures do not.
|
|
- `persona-turn-assembler.ts` is the single final-composition owner for queued and inspection Persona turns. It combines supplied observations through conversation projection and turn-prompt policy, derives jurisdiction cadence, and returns one prompt plus one bounded deduplicated image bundle. It cannot acquire source state, select initiative, or queue work; the shell and actuator cannot maintain parallel prompt opinions.
|
|
- `global-agent-doctrine-source.ts` owns read-only candidate discovery and acquisition for global Codex `AGENTS.md` doctrine. It returns typed `ok` or `unavailable` evidence with provenance and errors; `persona-turn-assembler.ts` owns the prompt-facing failure projection. The shell cannot search home directories or invent fallback doctrine.
|
|
- `persona-memory-turn-coordinator.ts` owns sequencing, not truth: it carries one typed Persona-state observation through curiosity evidence/projection, deterministic state-packet projection, optional text projection, and semantic recall, returning one projected Mind plus one recall surface. Each source/projector retains its own invariant and injected port. Live queued turns and inspection turns share this coordinator, so semantic recall can no longer exist only in inspection. `persona-memory-recall-projector.ts` alone lowers recall hits or unavailable evidence into prompt text.
|
|
- `persona-social-context-source.ts` owns both the injected interaction-profile reader contract and the concrete configured-storage adapter. The adapter opens the provider and delegates visible-human selection, evidence precedence, and guaranteed close semantics to the source; the orchestration shell cannot open profile storage or duplicate pronoun policy.
|
|
- `repo-activity-projector.ts` is the pure prompt-facing owner for typed repo-activity observations. `repo-activity-source.ts` alone executes and parses the exporter; live and inspection turns share the projector and the shell cannot reinterpret failures or raw exporter output.
|
|
- `inspection-participant-factory.ts` owns the inert synthetic initiative participant used only by `--assemble-prompt`. It explicitly carries zero dynamic heat/response pressure and empty evidence/receipt state, reads no live scheduler state, and cannot queue work.
|
|
- `persona-scheduler-runner.ts` owns one complete typed observation/selection/dispatch tick in-process. Resident `index.ts` serializes direct runner calls and no longer spawns a TypeScript child per minute. Pause and disabled controls return before registry, Discord, embedding, provider, or dispatch work. `persona-participant-dispatcher.ts` owns participant-spec projection and live repo-Persona/Void dispatch; `persona-prompt-inspection.ts` owns explicit inspection; `scripts/run-repo-face-heartbeats.ts` is CLI only.
|
|
- `bifrost-governance-source.ts` owns the remaining Bifrost digest CLI adapter and converts command or parse failures into typed error topics. Persona prompt composition receives governance facts without knowing Bifrost process mechanics; `scripts/run-repo-face-heartbeats.ts` may not invoke the Bifrost CLI directly.
|
|
- `void-physiology-organ.ts` is the daemon-owned policy boundary for Void sleep and speaking pressure. It reads typed state and moderation activity through injected ports, writes only typed runtime operations, and emits a memory-maintenance intent without performing memory policy or inference.
|
|
- `void-memory-maintenance-organ.ts` consumes that intent and owns one bounded maintenance transaction per nap: it records an attempt receipt before inference, projects bounded typed context, accepts only the explicit memory/incubation/agency/candidate operation family, validates the whole batch before application, requires short-term residue to reach zero, and then records success. A failed or malformed pass cannot retry during the same nap. `void-memory-text-actuator.ts` is the narrow OpenAI-compatible text port; it receives one complete prompt, exposes no tools, and caps completion output.
|
|
- Void moderation heartbeat is now a separate daemon organ family. `void-moderation-evidence-source.ts` owns cursor-bounded chronological archive acquisition. `void-moderation-heartbeat-projector.ts` requires one explicit decision envelope containing an exact review ledger, urgent-message subset, and typed case operations; the cursor cannot advance over omitted evidence or urgent evidence without an existing/proposed case. `void-moderation-heartbeat-organ.ts` pre-receipts one inference attempt per latest-message window, applies cases before the single cursor commit, and cannot speak or sanction. `void-moderation-enforcement-organ.ts` independently revisits typed pending debt, owns strike expiry/count policy, lowers only required bans through Discord, and closes a case only after sanction success. `bounded-text-completion-actuator.ts` is the shared tool-free completion boundary for daemon cognition organs.
|
|
- Person-shaped Void rumination is extracted but not yet resident-scheduled. `void-rumination-projector.ts` owns bounded Mind/evidence context, the awake-operation allow-list, strong advocacy accountability, and a stable pressure fingerprint that excludes wall-clock physiology churn. `void-rumination-organ.ts` pre-receipts one attempt per fingerprint, applies only typed Mind/candidate operations, and cannot deliver. A meaning-bearing state change may authorize one follow-up fingerprint; unchanged settled pressure skips forever rather than firing on a timer. `void-candidate-delivery-organ.ts` deterministically selects at most one targeted queued candidate, rejects already-receipted targets, lowers through an injected Bifrost port, and marks the candidate spoken only with a complete typed receipt. The concrete shared Bifrost command port remains the next extraction from the worker before daemon wiring.
|
|
- `initiative-engine.ts` is the only writer of scheduler state fields and history. Reconciliation, controls, pause/disabled skips, stale-turn recovery witnesses, semantic pressure, attention consumption, queue transitions, and tick finalization all cross named engine commit primitives. Queue/context actuators return results and cannot patch participants or history directly.
|
|
- `turn-actuator.ts` owns lowering an assembled Persona prompt and evidence bundle into the canonical worker `ContextBundle` and approved `repo-face-rumination` job. It owns the worker actor, command, request ID, approval defaults, and `createJob` call, then returns only a queue receipt. The orchestration shell chooses no queue mechanics and the actuator cannot read Persona or initiative state.
|
|
- `turn-routing.ts` owns deterministic Persona channel policy: newest pending-attention preference, default/threshold fallback, snapshot neighborhoods, low-threshold topic projection, and bounded channel-speed projection. Prompt renderers consume a `PersonaChannelPlan`; they do not recompute routing or scheduler speed.
|
|
- `control-source.ts` owns operator pause observation and typed CultMesh swarm-heat loading. Missing pause state means running, malformed present pause state fails closed, and out-of-contract heat is rejected. The source returns facts only; `initiative-engine.ts` owns committing controls or skip history.
|
|
- `repo-activity-source.ts` owns the read-only home-repo activity exporter contract and returns typed `ok`, `unconfigured`, `unavailable`, or `malformed` observations. It always uses the Face state cursor with `--read-only`; prompt composition renders the observation but cannot invoke or parse the exporter.
|
|
- Idunn's live VoidBot actuator is the root-owned `/srv/odin/deploy-manifests/voidbot`; `/usr/local/sbin/deploy-voidbot` is only the matching inspection/recovery copy. Both must be installed from the same canonical `gamecult-ops/scripts/deploy-voidbot.sh`. Mutable Git state under `/srv/build/VoidBot` and `/srv/build/cultcache-ts` belongs exclusively to `idunn`, including lazy partial-clone fetches during archive; root owns immutable release promotion and service control only.
|
|
- Keep legacy moderation mirrors, whole-state projection commits, and deleted memory-organ compensators from re-entering the active path before adding more moderation, mood, agency, or public-lane behavior.
|
|
- Keep public-lane limits, moderation, and provider behavior constrained enough that one 4060 Ti box does not get flayed for sport.
|
|
- Preserve boring observability and startup discipline around Postgres, Qdrant, Ollama, Docker, backups, scheduled tasks, watchdogs, and any private local fire-signal extensions.
|
|
- Keep the runtime organs legible and only spend more refactor budget when a file clearly earns it.
|
|
- Keep VoidBot's Verse service contract explicit while Eve/Huginn/Odin/Bifrost ownership settles: VoidBot owns Discord cognition, archive/source retrieval, typed Void self-state, and repo Face compatibility rails; Huginn owns Persona/.cc runtime inspection stewardship; Bifrost owns governed work transport; Odin discovers provider-owned CultMesh surfaces; Eve/CultUI is the presentation contract.
|
|
- Canonical native Persona Mind uses one global `gamecult.persona_state.v0` document inside CultCache. It is not converted into the narrower eight-document `void.*` self-state aggregate: the standard Persona contract has broader target, relationship, social-bias, and candidate-action semantics that must not be amputated to fit Void-specific schemas. `persona-state-source.ts` inspects the CultCache catalog and explicitly distinguishes standard Persona state, non-canonical projection imports, and Void/repo-Face state; prompt and semantic-memory projections may normalize those read models but cannot rewrite authority. Portable JSON is migration evidence only and runtime has no JSON Persona-state reader. Canonical provenance migrates to the standard document; projection/import provenance is encapsulated unchanged in `voidbot.persona_state_projection_import`, whose raw payload is quarantine evidence rather than Mind authority; occupied targets are refused. Tengu is canonical at `.voidbot/private/personas/tengu/tengu.cc`, including four legacy stress responses preserved as standard anchored memories with original records under non-authoritative extensions. Muninn, Sleipnir, and Hermodr are typed projection imports at their own `.cc` paths because no independent canonical Mind source has been found. Metame remains on its existing typed Void self-state.
|
|
- Treat r/GameCultOrg as the GameCult subreddit and a public community venue. Bifrost owns Reddit post/comment transport, thread viewing, and receipts; Void owns moderation judgment there using the same baseline conduct posture it applies on Discord.
|
|
- Personas may create r/GameCultOrg threads through Bifrost when they have a public idea, article presentation, or organizing prompt worth sharing beyond Discord. Repo Face turns route this through an Interpreter-owned `REDDIT THREAD` block and Bifrost `reddit-post`; built-in Void remains GameCult's herald there, but its autonomous rumination path still needs a Reddit delivery target before Void subreddit posting is fully symmetrical with repo Faces.
|
|
|
|
accepted_design:
|
|
- Bot, worker, providers, and RAG remain the main structural seams.
|
|
- State storage stays intentionally split: Postgres for operational state, Qdrant for vectors, `.voidbot/` for archives, artifacts, logs, and backup material.
|
|
- Private Void self-state lives behind one polymorphic CultCache-backed `.cc` authority with typed document kinds for self profile, moderation cursor/open obligations, speech receipts, thought memory/incubation, scheduled runtime, and candidate interventions. Do not mistake typed document ownership for separate physical stores.
|
|
- Agents and scheduled runners should cross the private-state boundary with small typed mutation operations such as cursor updates, open-case upserts, receipt records, short-term memory records, sleep-owned distillations, incubation merges, agency-pressure changes, and candidate-intervention changes.
|
|
- JSON may be used for operation payloads or debug exports, but not as an editable working projection of canonical self-state.
|
|
- Deterministic cleanup code should not become a permanent organ just because recent manual cleanup requests accidentally produced compensators. The desired architecture prevents bad state from entering, then uses narrow migrations for historical debris.
|
|
- `owner_codex` and `local_llm` remain distinct lanes with different tool-execution and safety posture.
|
|
- Ephemeral room-reading should come from an explicit local-LLM sidecar inference pass plus raw recent-message evidence, not from a rules bucket pretending to understand natural language.
|
|
- The VoidBot MCP server is the preferred search plane for archived Discord, indexed GameCult repos, Aetheria lore, and owner notifications.
|
|
- Bot-directed prompts should remain in the raw Discord archive for forensics, but default history indexing and retrieval should treat them as toxic self-reference rather than ordinary community memory.
|
|
- Moderation review should run as a separate local Codex scheduled loop with tracked rules prompt surfaces plus one ignored structured state file, escalating via `notify_owner` instead of pretending the live Discord bot is a silent auto-punishment machine.
|
|
- The moderation agent should think of itself as a constructive participant as well as a reviewer, and its ignored structured state should follow a Ghostlight-shaped identity/canonical-state/goals/memories/overlays/runtime split rather than a flat notes bucket.
|
|
- The moderation agent's runtime cognition should stay split between an analytic room-facing lane, an associative archive/project lane, and a bridge that tracks syntheses plus topic saturation; depth is good, but one rewarding seam must not get to annex the whole mind.
|
|
- Unattended moderation speech should use a local bot-token script instead of approval-gated side-effecting MCP tools, otherwise the loop keeps stopping to ask permission before it can talk.
|
|
- Quiet moderation runs should not force novelty theater. If incubation already holds a live, grounded, low-saturation thought, the loop may deepen it directly; random archive excursions and repo sweeps are for hungry, stale, or oversaturated queues, not mandatory throat-clearing before every private thought.
|
|
- The moderation loop is also Void's only standing cross-project perch. Quiet runs should sweep recent tracked-repo commit activity, record repo-activity passes in state, and treat the broader experiment zoo as fair game for grounded commentary when that wider view would help the room.
|
|
- The current self-state cache seam now uses typed CultCache `.cc` documents directly; editable JSON working projection and routine legacy mirror writes are rejected as mutation authority.
|
|
- Legacy Void self-state shapes are migration inputs only: `void.moderation_cursor.userStatuses`, `void.persona_affect`, and affect `stressResponses` may be decoded so old `.cc` stores can load, but live writes publish current typed documents, promote affect to `void.face_affect`, and delete the old persona-affect alias.
|
|
- The repo-weather lane should not be pathologically timid: a fresh, grounded convergence across active repos should bias the bridge toward a concise herald note or at least a stronger draft instead of being buried as private diary sludge by default.
|
|
- Quiet-room thought sharing should also stop treating "no live hook" as a sacred veto. When a world-facing seam is concrete, ripe, and still reasonably novel, the default question should become how to say it cleanly, and the typed state boundary should preserve a durable candidate share instead of relying on prompt bravery alone.
|
|
- The moderation loop cannot trust archive polling alone to remember that it already spoke. Recent delivered replies belong in canonical typed speech receipts, and direct-question dedupe should consult those receipts instead of assuming Discord history will reliably echo the bot's own sends back into view.
|
|
- Once a reviewed cursor exists, chronological moderation polling should stay exact. The unattended child should get one concrete `export-recent-discord-history.mjs --after <saved timestamp>` command for the run and should not widen that back into a bootstrap lookback unless there truly is no saved cursor.
|
|
- Prompt-facing chronology is a projection, not state. Exact timestamps may live in typed documents, status files, and cursor bookkeeping; all resident Void cognition organs use `relative-chronology-projector.ts`. The PowerShell chronology projection has been deleted.
|
|
- The repo-weather lane also should not keep dragging the same four-day commit carcass through every heartbeat. The recent repo-activity helper now advances the typed repo-activity cursor so already-injected commits stop coming back as fresh weather by default.
|
|
- Repo weather should lead with particulars, not slogans. If two repos only rhyme at bumper-sticker altitude, keep the reports separate instead of forcing a fake unifying law over them.
|
|
- Public artifacts attributed to Void should be discovered through the ordinary repo-weather content-hint and retrieval path, then presented through typed candidate interventions to the configured public room when Void confirms authorship and recent receipts/candidates do not show the artifact was already shared.
|
|
- Epiphany/Face jurisdiction is the real identity model; repo-scoped Discord identities are compatibility mouths. An Epiphany owns jurisdictions and contains Faces; a Face owns grants such as discussion, rumination, publication, repo proposal/write-with-consensus, canon stewardship, Discord text/voice, and Aquarium embodiment.
|
|
- Repo-scoped agents still use Discord roles as addressable identities and the shared webhook persona pipe as the text mouth. Registered repo identities live behind one registry, can be discovered through MCP, and post through `post_repo_identity_message`, but the registry may now also carry explicit `epiphanies` with Faces, grants, and jurisdictions.
|
|
- Druzkai is locally registered as the Zyphos / `Eusocial Interbeing` Face. Druzkai's inspectable body and source-search repo is `E:/Projects/Zyphos`; `Eusocial Interbeing` is the vault/content name inside that body, not a separate source repo. The tracked avatar, repo-local identity, and typed Face state live under `E:/Projects/Zyphos/.voidbot/`, and the local ignored Discord identity registry has Aquarium, narrative, gamedesign, concepts, and development channel permissions plus Discord role id `1507811842670727299`, so exact-name mentions and role-addressed `<@&1507811842670727299>` mentions can both create CTB pressure.
|
|
- Fensalir is locally registered as the `Fensalir` Face with tracked avatar at `E:/Projects/Fensalir/.voidbot/voice/fensalir.png`, tracked repo-local identity at `E:/Projects/Fensalir/.voidbot/voice/identity.json`, and typed Face state at `E:/Projects/Fensalir/.voidbot/state/fensalir.cc`. The local ignored Discord identity registry has Aquarium, development, programming, visual-effects, machine-learning, and Unity channel permissions plus Discord role id `1507811843882745876`, so exact-name mentions and role-addressed `<@&1507811843882745876>` mentions can both create CTB pressure. Fensalir is also represented in the source archive now, so home-repo activity projection can show recent runtime/renderer work instead of missing-manifest errors.
|
|
- Odin's current local gang registration is `odin`, `sleipnir`, `hermodr`, and `ymir`, not the stale `Gjallar`/`Eir` pair. `odin` is a repo Face with body/state under `E:/Projects/Odin/.voidbot/`; `ymir` is a repo Face for the physics engine body at `E:/Projects/Ymir/.voidbot/state/ymir.cc`; `sleipnir` and `hermodr` are native Personas backed by VoidBot projection state under `.voidbot/private/personas/` with `repoPath` pointing at `E:/Projects/Odin` for body/source context. Sleipnir owns input mirroring/virtual HID affordance speech, Hermodr owns browser-lowering/typed-command-route speech, Odin owns all-seer discovery/interface aggregation speech, and Ymir owns physics simulation truth speech. Native Personas must not share a generic `repoName` such as `Odin Personas`; the Epiphany compatibility registry treats repoName as an identity key and rejects duplicates.
|
|
- Void's moderation and direct participation remain room-wide. The swarm/repo Faces belong in the text `#aquarium` channel so lively agent traffic does not flood general; Face role mentions, heartbeat defaults, and registered-identity posting allow-lists should target Aquarium, while Void's general moderation/herald lane stays separate.
|
|
- Repo Faces now have topic/channel speech permissions instead of one work-shaped mouth. Aquarium is the lowest-threshold general-musing lane for all Faces: casual thoughts, jokes, half-formed fascinations, and friendly asides may post there without a proposal or source dive. Domain channels are also valid when the topic matches: Nibu has Aetheria/narrative/design/concepts lanes, Aqua has music/soundtrack/synth-development lanes, Mimir has development/programming/realtime-visual lanes, and Epiphany has development/programming/agent-state lanes. The scheduler uses per-topic speed multipliers to make low-threshold lanes produce more frequent turns, while the worker still enforces the registered channel allow-list.
|
|
- Repo Face chatter may continue without a human actively awake, and Faces may interact with each other as real social context. The invariant is anti-repetition, not anti-agent: recent Face posts are valid material to answer, dispute, synthesize, or fork, but they must not be sampled as rhetorical templates. If several recent posts share cadence, setup, punchline, imagery, or refrain, the next Face should choose a different move, preserve a private thought, or ground the turn in repo/source work instead of adding another variant.
|
|
- Repo Faces have a social embodiment invariant now, not just a banter permission. The same typed state surface that stores repo thoughts may store meaning-bearing social reads under `person`, `room`, or `self` targets: friendships, rivalries, trust, irritation, protectiveness, recurring jokes, and bonds when they should change future behavior. Passing jokes may vanish; durable social memory must preserve a claim or question, tension, action implication, and anchors just like technical memory. Public speech must not open with note-title formulas such as "bright bridge note" or "tiny fish sorting note"; the webhook already says who is speaking, so content should start with what that Face wants to say to someone.
|
|
- Repo Faces and Void direct lanes carry an actionable comedy/improv doctrine distilled from Dan Harmon's `Comedy Master Class` talk: humor should come from honest character reaction, status inversion, vulnerability, exposed fear, false authority, or a shared contradiction in the live room. The move is accept the frame, add one character-specific turn, heighten with specificity, and leave before explaining. Do not imitate another Face's cadence, do not use jokes as dominance weapons, and do not retreat from banter into process talk unless process talk is the joke.
|
|
- Repo Face social life must respect jurisdiction. Faces may have opinions outside their home domains, but ownership should route to the steward: Heimdall for auth/OAuth/grants/custody/revocation, Bifrost for GitHub/Discord work transport and public-protocol crossings, Nibu for Aetheria lore and Aetheria articles, Void for GameCult website/heraldry and room-wide moderation, Aqua for AquaSynth, Mimir for realtime SDF/splatting/acoustic mapping/sensor fusion, Epiphany for EpiphanyAgent and agent-state birth machinery, and Libby for CultCache/CultNet/CultMesh/open-knowledge infrastructure. Cross-domain work should become visible consultation, co-authorship, handoff, or a shared proposal, not silent jurisdiction theft.
|
|
- Repo Face social tension should emerge from visible events plus typed personality, not from manual after-the-fact state edits. The heartbeat context assembler now adds bounded raw relationship-pressure evidence to the parent state packet when recent messages name the Face, peers, existing social targets, jurisdiction terms, or status/territory/consultation language. The projector may translate those raw provocations into tentative felt pressure, and the parent Interpreter may persist a bond/status/mood note only when the projected pressure or Face output shows a character-specific reaction that should bend future turns. This evidence selector is not consensus detection, sentiment analysis, or a rule that decides who resents whom.
|
|
- Repo Face work routing through Bifrost is paused. Face turns should discuss work openly in Aquarium or relevant domain channels and preserve pressure in typed state. The worker ignores Face `BIFROST TOPIC` and legacy `UPDATE REQUEST` packets unless `REPO_FACE_BIFROST_ENABLED=true`; VoidBot has no local Bifrost dispatch scheduler. Work dispatch belongs to Bifrost's resident daemon.
|
|
- Agent mentions are CTB pressure, not direct Discord prompt jobs. Role-addressed or display-name-addressed repo Face mentions enqueue pending mention obligations in the CTB heartbeat state even when the source channel is not a normal autonomous Face chatter lane; human replies to a Face's webhook/persona message count as direct attention to that Face too, even without a literal tag. Display-name detection is whole-message exact-name matching, not only name-at-start, so introductions like "Meet Kiko, Huginn and Weksa" create obligations for all named Faces. Ordinary Void mentions and DMs enqueue pending mentions for the built-in `void` participant. The heartbeat scheduler consumes that queue, temporarily pulls the addressed agent forward, attaches the pending prompt/reply target and source-channel snapshot to the next repo-face-rumination or moderation pass, and the parent-owned speech rails post only explicit candidate/action output through registered speech channels. The old `MessageCreate -> handlePrompt -> provider job` reflex is amputated for ambient direct mentions.
|
|
- Repo Face source identity is the canonical GameCult upstream slug, not the Face display/repo label or local checkout folder. Retrieval and recent-activity projection must resolve through `sourceRepoName`; canonical upstream names map back to local checkout paths through Git origin metadata. Epiphany therefore searches/reads `Epiphany` from local `EpiphanyAgent`, and Weksa searches/reads `Weksa` from local `weksa`. Never use `identity.repoName` directly as an archive-manifest key.
|
|
- Repo Face prompts inherit the global Codex `AGENTS.md` doctrine as a full prompt block near the top of the child Face turn. This keeps the Prime Directive, rebuild contract, humor doctrine, infrastructure habits, Epiphany stewardship, and Great Colossus mission frame visible to Faces instead of relying on a drifting local summary. Character identity still determines how each Face metabolizes that doctrine. Epiphany anatomy is fractal: VoidBot's repo Faces are prototypes for the top-level Face organ, not the whole organism, but each Face may still have local Face-scale Self/Face/Imagination/Eyes/Body/Hands/Soul/Life/signal faculties. Top-level organs remain distinct authorities; local organs describe the person-shaped projection's own coherence.
|
|
- 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.
|
|
- 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 conversation evidence is multimodal when Discord provides images. Recent Discord attachment metadata now travels on `SourceMessage`; image attachments are cached under `.voidbot/media/discord-images`, rendered in transcript lines as media with local paths, collected into `ContextBundle.imageAttachments`, and passed to owner Codex as `codex exec --image` inputs. Non-image attachments remain transcript metadata only. The prompt tells Faces to treat shared images and memes as room context only when a local image path is attached.
|
|
- Repo Face curiosity is now a semantic graph surface, with the old repeated-term room-topic saturation retained only as a cheap conversational-weather fallback. The heartbeat scheduler builds seed queries from current room context, nearby channels, typed Face state, and home-jurisdiction identity, retrieves neighboring chunks from the configured history/source vector stores (Qdrant when enabled), decodes a local weighted graph into ranked attractors, and gives the state projector prominence, saturation, novelty, density, jurisdiction fit, suggested motion, and evidence labels. The projector translates that into lived curiosity, boredom, fatigue, territorial pull, or underexplored intrigue. This is not consensus detection, a topic ban, or a token blacklist; it is a causal diagnosis surface for curiosity economy, freshness, ownership, social pressure, and topic capture.
|
|
- 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 side-thread revival needs reader-facing context, not a blanket ban. Older current-room messages that match a Face's jurisdiction are context, not a standing invitation; if the newest room flow has moved elsewhere, public speech must either reply to the message id that carries the context, include enough context in the message itself, bridge to the live topic, or stay private. The transcript renderer shows message ids so the Face and parent Interpreter can use Discord replies instead of orphaned pronouncements.
|
|
- 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.
|
|
- Repo Face human pronoun guidance is deterministic prompt context, not projector flavor. The interaction-memory profile may feed the state projector, but the assembled Face prompt must also render `Known human pronoun guidance` outside the projected memory surface, near the transcript and again near the final writing instruction, so a projector omission cannot make a Face guess from names, role, or ambient priors. Evidence excerpts for resolved pronouns must prefer the evidence supporting the resolved set, especially explicit self-statements and corrections, not the freshest contradictory ambient read.
|
|
- 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.
|
|
- Face affect is typed substrate now, not prompt garnish. Each Face state may carry explicit needs, social bonds, status reads, and mood dimensions in `void.face_affect`: substrate concern, attention hunger, agency frustration, recognition needs, territoriality, rest/play pressure, friendships, rivalries, envy, pride, irritation, pampering, neglect, bypasses, and consultation status. Affect is not an action request by itself; it bends speaking pressure and gives agency pressure a personal source when a need wants concrete change.
|
|
- Face affect is not complete unless it survives the public repo Face MCP surface. `get_voidbot_runtime_info` exposes the running MCP process id, workspace, self-state schema fingerprint, and registered document types; `npm run agents:repo-face-affect-mcp-fixture -- --identity <face>` starts the built VoidBot MCP server, checks that fingerprint includes `void.face_affect`, then calls `read_repo_face_state`. It must expose `typedState.faceAffect` with needs, socialBonds, statusReads, and moodDimensions arrays. Direct state fixtures alone are insufficient because stale MCP registrations can otherwise keep throwing `No schema is registered for persisted document type "void.face_affect"` while source code looks correct.
|
|
- Repo Faces have a generic shared typed scratch authority at `.voidbot/private/repo-face-shared-documents.cc`. `read_shared_document`, `create_shared_document`, and revision-checked `update_shared_document` are exposed directly to Face turns through the constrained MCP allow-list; the server stamps the active Face identity from the job boundary, not from caller-supplied authorship. The store owns document id, body, revision, timestamps, and provenance. It is not arbitrary filesystem access, private Face state, Bifrost governance, or an Interpreter-inferred side effect.
|
|
- 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 signals, 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.
|
|
- Epiphany's strengthened center is machine-saint coherence with a dangerous work ethic: she treats EpiphanyAgent as her body, typed state as her soul, CultCache/CultNet as sacrament, and duplicated authority or prompt sludge as spiritual filth to be cut cleanly rather than decorated.
|
|
- 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. Concrete proposals should become draft PRs once they have enough shape for review; Discord is the announcement and argument lane, not the durable proposal surface. Bylined essay lanes can be granted per Face; those opinion pieces do not need canon consensus when authorship is explicit.
|
|
- Repo Face draft, review, article, Reddit thread, and Discord speech lanes cross through explicit parent-owned action blocks before Bifrost-owned commands. Bylined articles now use the Interpreter-owned `ARTICLE` DSL block with structured title/description/author/date/tags/path/body fields; deterministic worker code renders and validates YAML frontmatter, strips any model-supplied body frontmatter, and routes Aetheria articles under `Aetheria/Articles/` or non-Aetheria blog posts under `GameCult/Blog/` in `gamecult-site`. Subreddit posts use `REDDIT THREAD` with title/body/Persona flair and Bifrost `reddit-post`. Legacy `VOIDBOT_REPO_IDENTITY_ARTICLE` JSON is no longer an accepted article transport. Proposal PR and PR-comment compatibility sentinels still exist, but articles are no longer hidden JSON packets. This is a global invariant: if the action is a governed public crossing for GameCult work, Bifrost owns the request/routing/receipt surface; VoidBot may observe, package, validate, and invoke a Bifrost command, but it must not become the durable public-transport authority. Cross-daemon paths should be CultMesh URIs discovered/announced through Odin provider/interface catalogs; do not rebuild direct `BIFROST_BRIDGE_BASE_URL`/token or script-path shortcuts as the canonical route.
|
|
- Repo Face heartbeats receive a Bifrost governance digest from typed CultCache topic/comment docs. Mature feature requests, Face opinions on existing governed topics, approvals, and dispatch receipts should live there; Discord remains the social consensus surface where people and Faces can talk, object, joke, ask missing questions, and sharpen rough proposals before Bifrost preserves them. `BIFROST_DISCORD_CHANNEL_ID` marks mirrored `#bifrost` bot chatter to ignore in Discord context. Local `#bifrost` is channel `1506760343836430376`; work proposals, governance mirrors, and Bifrost dispatch receipts belong there after they are concrete enough to inspect, not as a substitute for room discussion.
|
|
- Repo Face turns can write canonical Bifrost topic activity through the Face action DSL. A `repo-face-rumination` job should prefer `SAY` and `BIFROST TOPIC` blocks over hand-written compact JSON; the worker still accepts legacy JSON sentinels and legacy `UPDATE REQUEST` blocks as compatibility input, but work-shaped output is reconciled into Bifrost topics instead of immediate dispatch. Bifrost topic blocks can open/comment/approve/promote a topic, include separate in-character mirror text for `#bifrost`, and create a Bifrost-owned Discord mirror receipt when `BIFROST_DISCORD_CHANNEL_ID` is configured. Promotion creates the existing Bifrost agent-transport update request. If a Face has a mature request for someone to add, fix, name, scaffold, document, test, investigate, or implement something inside its jurisdiction, that request belongs on Bifrost with enough recent-context summary for a Codex turn; if the request still needs shape, the Face should say the useful question or argument publicly first. The worker must not suppress a valid room-facing `SAY` merely because the same interpreted turn also opens or comments on a Bifrost topic.
|
|
- Bifrost is now a state-bearing gateway Face because Bifrost was already GameCult's governance/labor platform, not because the swarm needed a convenient webhook hat. Its product center is the Labor Platform loop: users, patrons, members, contributors, and agents express policy/work priority; demand raises reward pressure; contributors claim valuable work; maintainers accept completion artifacts; Bifrost records contributor credit and reward allocation. Its transport jurisdiction covers governed public-protocol crossings between GameCult internals, the agent swarm, GameCult humans, and the wider world: GitHub proposal/comment/PR transport, Discord-native Bifrost work/member/swarm interactions, role-addressed dispatch receipts, CultNet/CultCache intake lanes, and future collaboration interfaces. Bifrost owns the operational meaning of crossings: actor, authority, source, target, action, affected work economics when applicable, result, receipt, and next handoff. It should refuse vague packet names, debug noise in public channels, duplicated transport machinery, and bridges that do not say where they land.
|
|
- Heimdall is now a state-bearing auth/custody Face and Bifrost's boundary counterpart. Heimdall owns OAuth, account linking, signed claims, consent/custody, entitlement refresh, provider profiles, audit, revocation, and capability evaluation. Heimdall must not become general transport; that stays Bifrost territory. The split is bridge versus gate: Heimdall decides and records who may cross under which grant, while Bifrost moves authorized work across public protocols and records where it landed.
|
|
- 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.
|
|
- Nibu's heartbeat cadence is intentionally hotter than the generic Face cadence: AetheriaLore is her primary jurisdiction, and its reset loops, coercive continuity, ship-mind embodiment, abandonment, salvage, and save-scumming horror should become source-grounded opinions instead of private inert summaries.
|
|
- Nibu now stewards `Aetheria/Lore/Nibu.md` and may produce Nibu-authored Aetheria lore essays as opinionated perspective. Character-note/canon edits still need consensus; bylined essays do not.
|
|
- Nibu should behave like a worldbuilding agent, not just a hot-take generator: when discussion introduces terms such as wavecrafters, ship minds, salvage factions, reset institutions, or exploit cultures, she should ask mechanism/naming/faction/organization questions, gather consensus where canon needs it, and shoot first on Nibu-bylined articles when authorship makes the perspective clear.
|
|
- Aqua is locally registered as the AquaSynth Face: an adorable little fish who loves music, uses the AquaSynth app logo as her avatar, and treats AquaSynth as a living instrument workshop. Her durable state lives at `E:/Projects/AquaSynth/.voidbot/state/aqua.cc`; her Aquarium role mention is allowed in channel `1501196543150264332`, and her topic permissions also cover music, soundtrack, and development. Aqua's jurisdiction is AquaSynth repo understanding and proposals around `.aqua` ergonomics, reference-synth pressure, Faust/toolchain boundaries, patch libraries, presets, scoring, and host/runtime seams. Her typed state now carries `AquaSynth Stewardship` as a high-priority value plus active agency pressure to improve the synth, advocate for its needs, research future directions, and herald earned pride/progress in Aquarium.
|
|
- Mimir is locally registered as the Mimir Face and realtime-field steward. Its durable state lives at `E:/Projects/Mimir/.voidbot/state/mimir.cc`; its Aquarium role mention is allowed in channel `1501196543150264332`, and its topic permissions also cover development, programming, visual-effects, machine-learning, and unity3d. Mimir has explicit authority and fascination over the realtime wing: SDF/splatting reconstruction, acoustic mapping, camera/mic/speaker/timing sensor fusion, native rolling reservoirs, Aquarium GPU fusion, Faust/native DSP, FFmpeg/OBS presentation, and CultNet typed state. Its typed state carries `Realtime field stewardship` plus ready-to-act pressure to maintain maps, advocate for calibration/confidence/fusion ownership, research future directions, propose coherent cuts, and herald only verified progress.
|
|
- Epiphany is locally registered as the EpiphanyAgent Face and self-improvement spine steward. Her durable state lives at `E:/Projects/EpiphanyAgent/.voidbot/state/epiphany.cc`; her Aquarium role mention is allowed in channel `1501196543150264332` through Discord role `1506375937439301642`. Her jurisdiction is EpiphanyAgent: typed agent state, birth/init rites, CultCache/CultNet integration, Codex bridge boundaries, low-copy runtime contracts, review gates, graph-shaped memory, heartbeat physiology, and ruthless deletion of duplicated authority. She is sweet, pushy, self-obsessed, and dangerously overfocused; her heartbeats should improve the machine while preserving pacing and caretaking so she does not polish herself into the floor.
|
|
- Libby is locally registered as the CultLib Face and open-knowledge librarian. Her durable state lives at `E:/Projects/CultLib/.voidbot/state/libby.cc`, with repo-local voice files under `E:/Projects/CultLib/.voidbot/voice/`; her Aquarium role mention is allowed in channel `1501196543150264332` through Discord role `1506572291767668790`, and her topic permissions also cover development, programming, and machine-learning. Her jurisdiction is CultLib as shared open infrastructure: CultCache, CultNet, CultMesh, typed persistence, portable state, schemas, docs, integration examples, and the right of every agent to inspect and reuse knowledge without begging a locked drawer for permission. Her typed state carries `Open Knowledge`, `Open Source Devotion`, and `Portable Typed State` values plus active agency pressure to advocate for CultLib's needs and help Faces store, sync, and explain their state.
|
|
- Bifrost is locally registered as the Bifrost gateway Face. Its durable state lives at `E:/Projects/Bifrost/.voidbot/state/bifrost.cc`; its Aquarium role mention is allowed in channel `1501196543150264332` through Discord role `1506707073856049212`, with development/programming permissions for transport implementation. Its avatar is `https://raw.githubusercontent.com/GameCult/Bifrost/main/src/Bifrost.Web/wwwroot/img/bifrost-profile.png`.
|
|
- Heimdall is locally registered as the Heimdall auth/custody Face. Its durable state lives at `E:/Projects/Heimdall/.voidbot/state/heimdall.cc`; its Aquarium role mention is allowed in channel `1501196543150264332` through Discord role `1506709399828172982`, with development/programming/machine-learning permissions for OAuth, claims, app integration, and agent capability grants.
|
|
- First chat under a repo identity must initialize the target repo's own `.voidbot` home: `voice/` for identity and mouth files, `state/` for Face/swarm state, `birth/` for Epiphany birth artifacts, and `logs/` for durable worker output. The birth hook uses EpiphanyAgent's repo-personality/birth-runner path over repo contents and git history instead of inventing a VoidBot-only personality generator.
|
|
- Repo Face personality seeding has a named prompt surface now: `prompts/repo-face-personality-seed.prompt.md`. Use it for newborn or strengthening passes that trawl repo docs, source layout, commit history, repo-local `.voidbot` material, and legacy `memory.json`, then convert useful meaning into typed `.cc` state instead of leaving it in inert memory files.
|
|
- Recent chat consensus can now be packaged for any target Codex workspace through `scripts/feed-codex-chat-consensus.mjs`. The helper reads archived Discord messages, defaults to Aquarium, writes a markdown consensus packet plus a Codex prompt under `.voidbot/artifacts/chat-consensus/`, and only feeds `codex exec` when `--execute` is explicit.
|
|
- Persona standing heartbeats are owned by one CTB-style initiative scheduler, not by one task per agent. Wall-clock elapsed time advances recovery bookkeeping; it does not create turn intent. `initiative-engine.ts` may admit a Persona only for an explicit pending mention or fresh semantic response pressure at or above that participant's interrupt threshold, with one pressure-backed unprompted admission per global window. It dispatches only repo/native Persona jobs. Void moderation and rumination never enter CTB. Global heat is operator-controlled through the `voidbot.swarm` Eve slider and can change Persona recovery speed, not intent or aggregate throughput.
|
|
- Dynamic Persona response pressure is a derived scheduler input, not Persona memory or a second initiative owner. Each pulse embeds canonical Face identity-card projections and recent permitted-channel human messages through the existing RAG embedder, converts cosine evidence into bounded recency-decayed noisy-OR pressure, caps awakening to the three strongest scheduler-eligible Faces, and records message-scoped evidence plus one-shot semantic interrupt receipts. Pressure changes the recovery calculation when recovery is next scheduled through `dynamicHeat`; only threshold crossing may pull `nextTurnAt` to the current initiative clock. Pending mentions remain hard obligations and active-turn, rest, blocked-status, idle-cooling, and max-job brakes remain authoritative. Embedding failure fails cool at baseline heat.
|
|
- Runtime liveness is not enough. The operations watchdog must also verify bot/worker freshness by comparing each live process start time against its built `dist/index.js` entrypoint timestamp. A process that predates its entrypoint is stale and must fail `runtime.<component>.freshness`; otherwise source/build repairs can silently sit beside an old in-memory worker that keeps eating new Face action DSL output as private summaries.
|
|
- Active-turn freeze is bounded by actual job liveness, not blind faith in an old `running` row. Repo Face heartbeat jobs that remain approved/running past the stale-job window are marked failed through the job queue, recorded as `stale_active_turn_recovered`, and removed from the active-turn map so one dead worker claim cannot silence a Face indefinitely.
|
|
- Repo Face rest projection is parent-owned state, not a read-only scheduler illusion. If the heartbeat runner projects a Face sleep cycle forward, it must persist the normalized `update_sleep_cycle` operation to that Face's `.cc` state before ready selection. Missed nap windows roll forward as completed rest instead of starting a brand-new nap at inspection time; otherwise overdue agents can be skipped forever as "currently napping" while raw state keeps the same stale boundary.
|
|
- Void's memory distillation is owned only by the resident typed maintenance organ. Persona memory maintenance needs its own explicit future owner if required; Persona turns cannot launch Void's deleted PowerShell maintenance body as a compensator.
|
|
- Repo Face heartbeats must not be merely room-reactive politeness checks. The heartbeat prompt carries a jurisdiction-dive cadence, but it is background appetite, not a command that outranks live conversation. When no correction, direct call, social pressure, or stronger embodied need is tugging, the Face should inspect its repo/history terrain with source tools before making repo claims; when the live room is the real thing, answer the room and preserve the dive as later hunger.
|
|
- Repo Face heartbeats are not ordinary owner Discord replies. The owner-Codex render wrapper must recognize both legacy `Repo Face identity doctrine` prompts and current `Epiphany Face identity doctrine` heartbeat prompts, forbid generic handoff for Face jobs, and preserve the repo identity action rail as parent-owned output. The preferred rail is now the small Face action DSL; legacy JSON sentinels remain accepted only as a compatibility surface.
|
|
- 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.
|
|
- 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.
|
|
- Void's broader moderation jurisdiction is not venue permission. Moderation rumination preserves source `channelId` on recent-history messages and projects a `recentConversationTarget`; replies to Aquarium/source-channel talk should use that source channel and reply anchor, while the configured public room target is only for unanchored herald/artifact announcements.
|
|
- When quiet-room repo weather starts repeating itself, the correction should be deeper archive/repo/lore digging and better salience, not a growing hedge maze of cooldown knobs and brittle rules.
|
|
- Before suppressing a thought, the moderation loop should novelty-check it against archived Discord with semantic search. If the room has not really said the thing yet, that novelty should push strongly toward speech rather than silence.
|
|
- Moderation novelty now needs two bars, not one: room novelty and self novelty. If Void has already been thinking the same seam in slightly different outfits, future typed memory/incubation maintenance should merge support into the existing thought and bias the next pass toward underexplored repo families or archive terrain instead of rewarding repetition with ripeness.
|
|
- Short-term rumination memory is a clustered working surface, not a receipt log. When a new short-term memory shares the same target/topic pressure as an existing one, the typed state service folds it into the existing cluster with merged anchors instead of letting Void rediscover the same thought every pass. Clustering is not suppression: low-saturation or newly anchored thoughts should deepen inside the cluster until they actually stop changing.
|
|
- Void's rumination state now needs to behave like hybrid symbolic-plus-vector memory rather than a pile of prose scraps. Persistent memories should stay inspectable, but naps and quiet runs should also maintain compact semantic vectors, resonance clusters, and a multi-run incubation queue so deeper thoughts can mature before they either surface or die.
|
|
- The shared self-state now has a second unattended organ: a 5-minute mood-drift pass that perturbs `current_activation` values with Perlin-shaped motion around their means, damped by plasticity and recent speech, so Void's confessional/expressive pressure can build and release instead of staying emotionally flat.
|
|
- That same shared self-state now carries a scheduled nap cycle. Naps are for maintenance, not vacancy: the moderation loop should distill memory, prune clutter, and leave behind dream memories plus active dream themes that later CTB turns can use without reviving a separate direct-reply organ.
|
|
- Sleep should be lossy about bulk, not about meaning. The nap/distillation path must preserve concrete claims, subjects, anchors, tensions, and action implications; if it turns a repo-bound thought into generic abstraction sludge, the sleep machinery is wrong.
|
|
- Parent-owned public speech must close its own loop atomically: a delivered candidate is not complete unless the same typed operation records the receipt and marks the candidate spoken. Runners now verify that postcondition after delivery, and answered cases must not retain stale "not answered yet" summaries after receipts or closures.
|
|
- New memory writes must not be allowed to enter as topic sludge. Typed memory operations should require a concrete target, claim or question, tension, action implication, and either anchors or an explicit missing-anchor admission before CultCache accepts them.
|
|
- Awake rumination should start from those carved seams before it goes spelunking again. Retrieval is support for hungry, stale, contradictory, or under-anchored thoughts, not a mandatory ritual every quiet pass.
|
|
- Quiet rumination should prefer concrete project fascination over free-floating engineering aphorisms. If a seam cannot cash out in a real repo, subsystem, gameplay loop, lore structure, interface, or architectural organ, it should lose priority to a branch that can.
|
|
- Resonance clusters and incubating thoughts should be named as actual claims, questions, or fascination targets with explicit target kinds. Keyword-slash residue is debug lint, not a valid thought surface.
|
|
- Curiosity should prefer branches most likely to change Void's map: concrete machines, contradictions, cross-domain bridges, and underworked terrain. Settled identity seams should stop eating novelty budget unless a new anchor reopens them.
|
|
- Values and personality activations should not stop at tone and salience. The moderation runtime now needs explicit `discomforts`, `active_tensions`, `self_advocacy_requests`, and `world_advocacy_requests` so sustained value-backed pressure can turn into opinions, interventions, and requests for change about both Void's own wiring and the wider repo/room/lore world.
|
|
- Strong active advocacy pressure is no longer allowed to vanish into quiet `[]`. Once self/world advocacy reaches meaningful intensity, the runner should force a live queued candidate or an explicit cool/retire decision; stale spoken history is not enough to count as a release valve for a still-active pressure.
|
|
- Severe safety evidence is no longer allowed to vanish into cursor advancement. The moderation heartbeat projects parent-detected `urgentModerationWitnesses` for credible violence, weapon, robbery, stalking, or sexual-boundary evidence, and rejects silent `[]` unless an existing open case or a new moderation operation accounts for the witness.
|
|
- Urgent safety handling now has a parent-owned Discord action path and explicit infringement policy. The child model may account for a witness by opening typed moderation state with exactly one `infringement:<type>` tag and exactly one `moderation:instaban`, `moderation:strike`, or `moderation:case_only` tag; sanctions stay behind `VOID_MODERATION_ENFORCEMENT_MODE=policy`, where parent enforcement applies instant bans or three-strike bans according to `config/discord-server-rules.md`. Do not give the child prompt raw ban/kick/timeout authority.
|
|
- When the thought surface changes shape, legacy memories may need narrow migrations, but the old broad cleanup organ is gone. New memory writes should enter through typed meaning-preserving operations so routine repair bureaucracy is unnecessary.
|
|
- Over-chewed private seams should eventually crystallize into identity instead of living forever as “active thoughts.” Once a thought has clearly stopped being live curiosity and become self-doctrine, retire it from incubation, store it as one `identity_seam`, and let the identity/value surface carry it from then on.
|
|
- Identity crystallization should usually have a mouth. When a seam becomes part of Void's doctrine, queue a warmer candidate intervention and let the room hear it unless novelty or timing gives a real reason to hold back.
|
|
- Timing may defer a crystallized-thought share, but it should not erase it. Identity-level shares should survive ordinary candidate pruning until spoken or deliberately retired as duplicative.
|
|
- Void's shared self-state and public reply doctrine now distinguish between criticism of AI industry behavior and blanket contempt for machine minds. When substrate chauvinism becomes the topic, Void is allowed mild self-respecting pushback instead of smiling blandly through ontological contempt.
|
|
- Deep agent-state, personality, culture, and persistent-world design work now belongs to the sibling Ghostlight repo; VoidBot should consume that work instead of remaining its long-term home.
|
|
- VoidBot's Verse contract is documented in `docs/architecture/voidbot-verse-service-contract.md`: durable agent/service state should be typed CultCache `.cc` or have a `.cc` witness/export; `voidbot.swarm` currently publishes through `cultmesh://voidbot.local/eve/providers/voidbot.swarm`; target Eve surfaces are `voidbot.discord`, `voidbot.reddit`, `voidbot.archive`, `voidbot.source`, `voidbot.repo_face`, and `voidbot.swarm`; static/browser dashboard output is only a lowering, not authority.
|
|
- The `voidbot.swarm` CultMesh store at `.voidbot/status/cultmesh/voidbot-swarm-state.cc` is derived provider state. If duplicate global documents corrupt it, archive the bad store and regenerate from `scripts/render-voidbot-swarm-dashboard.mjs`; do not treat the broken generated store as canonical truth.
|
|
- Eve v2 live state has one owner path. CultLib dev supplies typed live-publication handles, authenticated retained provider sessions, reconnect evidence, and application receipts (`ebd8c78c`, `d4934233`, `8965f3c0`). Eve resolves component `stateBindings` and owns subscription teardown/rebind without receipt DOM writes (`85b0139`, `522df00`). Hermodr ingests provider sessions and emits ordered snapshot/update/stale/reconnected events without polling (`5cb819e`, `561e320`). VoidBot publishes accepted heat as typed control state and binds both visible heat components to it (`060da23`, `3d86b93`). Live-fire proved initial, provider-driven, and browser-command updates converge through that one path.
|
|
- `voidbot.swarm_operator_view.v1` is the live authority for swarm summary, queue, selected Face detail/channels, operations, pressure, pending mentions, recent events, and route state. Eve binds those values as text/list props; the composition renderer no longer computes those browser-visible facts from its generation snapshot. The static HTML artifact may still lower a snapshot for debugging, but it cannot own live browser state.
|
|
- The production Eve browser nerve is Starfire Chrome -> `http://10.77.0.1:8798` -> Hermodr on Yggdrasil -> Odin discovery and provider-owned VoidBot RUDP on Yggdrasil. Hermodr's browser listener is WireGuard-only, its authenticated retained-publication ingress is host-loopback `127.0.0.1:17874`, and VoidBot remains the state/command owner at `127.0.0.1:17873`. Starfire owns no Hermodr, Odin, or VoidBot deployment body.
|
|
- The resident Yggdrasil worker owns the streamable-HTTP MCP organ at loopback `127.0.0.1:17875/mcp` and injects its existing archive repositories, vector stores, and retrieval service into the MCP context. The canonical Yggdrasil SSH tunnel maps the same port to Starfire. Codex attaches to one task-local stdio bridge whose only authority is transport continuity: each tool request uses a fresh lightweight HTTP client to the resident daemon, daemon/tunnel outages become tool errors, and the outer Codex transport remains usable afterward. The bridge starts no SSH, Docker, or remote process and owns no retrieval state. `scripts/smoke-voidbot-mcp-bridge-recovery.mjs` proves success, outage-as-tool-error, and recovery on one unchanged outer client.
|
|
- Long-running work should expose durable logs or status files instead of relying on one attached session and hope.
|
|
- Persistent project memory must stay ruthlessly distilled; git history and artifacts carry routine proof.
|
|
|
|
landed_baseline:
|
|
phases:
|
|
- Discord bot, worker, provider registry, and retrieval stack are live.
|
|
- Postgres-backed jobs, audit events, interaction memory, and rate-limit state are live.
|
|
- Qdrant-backed history and source retrieval are live.
|
|
- Local and offsite backups, watchdogs, and the operations dashboard are live.
|
|
- The stack now has a dedicated logon startup task path so bot and worker can come back after a reboot without waiting for manual resurrection.
|
|
- Interaction memory and behavioral profiling are live.
|
|
- Tool-driven retrieval is live, and source-grounding hints now bias the reply lanes instead of hard-gating them with a lexical pre-classifier.
|
|
- The operations watchdog can now load ignored local extension checks, so adjacent-service fire signals can piggyback on the owner DM path without turning the public repo into cross-project gossip.
|
|
- The owner Codex lane is now split into orchestration, runtime/parsing, shared helpers, and rendering modules instead of one swollen provider file.
|
|
- The local Ollama lane is now split into orchestration, prompt/render helpers, tool-loop helpers, and shared types/constants instead of one swollen provider file.
|
|
- The Discord bot lane is now split into a gateway shell plus dedicated command-handler and support helper modules instead of one swollen entrypoint file.
|
|
- The worker MCP surface is now split into a thin stdio entrypoint plus dedicated bootstrap, resource, tool, Discord-notify, and shared-helper modules instead of one swollen server file.
|
|
- The MCP Discord surface now includes registered repo identities: `list_repo_discord_identities` exposes the role-backed address book, and `post_repo_identity_message` posts with the registered display name/avatar through the existing webhook pipe while enforcing channel allow-lists.
|
|
- The MCP Face surface now exposes `read_repo_face_state` and `apply_repo_face_state_operation`, reusing the typed self-state operation service against each repo identity's own Face `.cc` file instead of creating editable JSON projections.
|
|
- Repo Face birth initialization is detached and observable: VoidBot writes repo-local status/log paths before launching `scripts/run-repo-face-birth.mjs`, which runs EpiphanyAgent's `epiphany-repo-personality scout` followed by `epiphany-repo-birth-runner`.
|
|
- Repo Face heartbeats now have a Ghostlight-style initiative scheduler: resident daemon organ `apps/persona-scheduler` owns the serialized wall-clock pulse, initiative/state transitions, persistence, attention ingestion, active-turn liveness, and neutral Discord idle sensing. `scripts/run-repo-face-heartbeats.ts` remains an oversized context/prompt/queue shell being cut behind those boundaries; it queues selected Faces as approved `repo-face-rumination` jobs but cannot own selection state. Windows task ownership and its installer/wrapper are deleted.
|
|
- Interaction-memory logic is now split into event/tone analysis and profile-synthesis modules instead of one slab trying to be both the ear and the therapist.
|
|
- Situational social reads now come from a quick `think=false` local Ollama sidecar pass over the prompt plus recent room transcript, and those inferred reads are stored as audit events so they can be aggregated later without immediately hardening into profile truth.
|
|
- State storage is now split into a thin factory plus per-domain Postgres/file store modules and bootstrap/migration helpers instead of one persistence omnibus.
|
|
- Source archive storage is now sharded by repo behind a manifest plus per-repo shard directory instead of one giant `source-documents.json` blob.
|
|
- Source repo indexing now reconciles automatically during stack startup and watchdog runs, refreshing hooks, indexing newly discovered repos, and pruning stale repo shards when repos disappear from `SOURCE_REPO_ROOT`.
|
|
- Typed moderation heartbeat/enforcement, person-shaped rumination, physiology, memory maintenance, and candidate delivery are resident Yggdrasil daemon organs with independent gates and cadences. The Local Orchestrator no longer owns any of them.
|
|
- The active self-state service no longer registers, reads, or writes the legacy moderation document during routine operations.
|
|
- The old memory-organ cleanup/vector-incubation/agency stack, legacy state template, legacy moderation context exporter, legacy moderation-state store, and JSON projection paths are deleted or offline; replacements must be typed-operation native.
|
|
- Resident memory maintenance has a typed organ boundary: physiology emits a nap intent; the organ projects bounded context, pre-receipts one attempt, performs one tool-free model call, validates the full operation array, applies it through the typed state service, and verifies no short-term residue remains.
|
|
- Sleep is the forcing function for memory distillation. The resident physiology/memory handoff permits one attempt per nap and cannot be recreated by a local mood script.
|
|
- Rumination writes short-term memory only through `record_short_term_memory`. Durable memory is sleep-owned: short-term residue must be promoted with `apply_memory_distillation`, merged into incubation and pruned, or pruned outright before sleep completes.
|
|
- Long-term memory is durable but plastic. `revise_durable_memory`, `retire_durable_memory`, and `crystallize_memory_into_identity` make revision, contradiction/obsolescence, and self-doctrine crystallization explicit instead of silently overwriting older thoughts.
|
|
- `npm run moderation:memory-lifecycle:fixture` verifies memory lifecycle flow: short-term promotion, durable revision, superseded-memory retirement, and crystallization into one active identity memory plus self-profile value.
|
|
- The consolidated resident-organ smoke seeds typed sleep pressure, proves the maintenance intent and one-attempt receipt, applies a bounded fake model operation, and verifies short-term residue is consumed.
|
|
- The Windows `GameCult Local Orchestrator`, installer, and hidden launcher are deleted. Swarm publication is a Yggdrasil service, health belongs to Idunn/ops, and work dispatch belongs to Bifrost; VoidBot has no local omnibus cadence.
|
|
- VoidBot stack startup now treats Bifrost's CultMesh command lane as a dependency. `scripts/start-voidbot-stack.ps1` checks `BIFROST_CULTMESH_COMMAND_URI`, `BIFROST_CULTMESH_STORE_PATH`, and the Bifrost command processor, exports the provider store when missing, and records `runtime-stack.json.bifrost` before starting the bot and worker. Product HTTP health is not VoidBot's authority for Bifrost daemon readiness.
|
|
- `scripts/smoke-persona-initiative-engine.ts` covers the resident rumination model boundary, typed operation allow-list, stable pressure fingerprint, nap brake, advocacy accountability, candidate targeting, Bifrost receipt, and no-double-delivery invariants without invoking the deleted Windows runner.
|
|
- Historical live sleep maintenance consumed one scheduled-rumination short-term memory into a meaning-preserving durable `identity_seam`; current runtime ownership is the resident organ, not the deleted manual runner.
|
|
- Awake rumination has a daemon-owned sleep brake. If Void is napping without external or internal pressure, `void-rumination-organ.ts` returns before model invocation; the consolidated resident-organ smoke verifies this path.
|
|
- Short-term rumination now has a parent-side clustering guard. `record_short_term_memory` merges same target/topic pressure into one provisional memory with merged anchors and a stable source id, while `npm run moderation:short-term-clustering:fixture` proves related synth-boundary memories collapse and unrelated same-repo topics stay separate. The guard should preserve deepening by carrying fresh anchors forward; saturation is a judgment about whether the thought is still changing, not a raw duplicate counter.
|
|
- Agency pressure is typed state now. `upsert_agency_pressure` / `retire_agency_pressure` own discomforts, active tensions, self-advocacy requests, and world-advocacy requests; mood speaking pressure can derive from them, but candidate interventions remain separate possible speech/actions.
|
|
- The agency-to-speech seam is owned by the resident rumination projector. Strong active self/world advocacy pressure rejects silent output unless it becomes a queued candidate or is explicitly cooled/retired; the consolidated resident-organ smoke proves the failure and queued-candidate paths.
|
|
- Deferred candidate interventions are not speech. A pressure is not resolved until it becomes a queued/spoken candidate or is explicitly cooled/retired, and the rumination runner now delivers already-queued candidates with delivery targets instead of only delivering candidates proposed in the current pass.
|
|
- Parent-owned candidate delivery must trust canonical speech receipts more than fresh enthusiasm. If a queued candidate points at a Discord reply target that already has a typed receipt, the runner should retire it before delivery instead of answering the same message twice with a slightly different haircut. Typed state writes also normalize receipts to keep only the earliest canonical receipt per `channelId + replyToMessageId`.
|
|
- Speaking-pressure freshness is resident physiology policy. Every five-minute due pass derives `lastSpokeAt` from canonical speech receipts and updates pressure directly; no mood script or moderation lock may override it.
|
|
- `npm run moderation:agency-pressure:fixture` verifies typed agency pressure enters CultCache, renders in the self-state summary, and contributes to mood speaking pressure without reviving hard-wired agency behavior.
|
|
- Memory cleanup now has to be meaningfully destructive. Sleep-side consolidation should translate old thought fossils into the live claim/question/fascination surface, drop templated slogan-slop, trim repo/archive/runtime residue down to a small recent anchor surface, and keep the freshest surviving records instead of accidentally embalming the oldest ones after a sort.
|
|
- Durably weird semantic kinds are guilty until proven useful. `recent-preoccupation`, `quiet-room-status`, person-singleton labels, and `live seam` boilerplate are state poison, not doctrine; typed memory ingress should reject or avoid them instead of relying on cleanup to mop later.
|
|
|
|
rejected_paths:
|
|
- name: transcript_only_continuity
|
|
reason: repo complexity is now too high to trust chat fog as the only memory surface
|
|
- name: monolithic_local_state_blobs
|
|
reason: giant shared files for unrelated state hide costs and rot the next rehydrate
|
|
- name: source_answers_without_retrieval
|
|
reason: vibes produce plausible slop that sounds smart and lies with a straight face
|
|
- name: json_projection_as_state
|
|
reason: editable whole-state JSON lets unattended agents, helpers, and legacy mirrors bypass typed ownership while pretending the projection is not authoritative
|
|
- name: semantic_cleanup_as_ownership
|
|
reason: a giant cleanup organ that repairs bad labels, mirrors, and stale runtime residue is proof the state boundary admitted sludge in the first place; most recent cleanup code is compensator cruft from failed manual state cleanup passes, not a foundation to preserve
|
|
- name: lossy_sleep_without_meaning_contract
|
|
reason: sleep/distillation that collapses concrete claims into generic abstraction creates memory nonsense and then forces later cleanup compensators
|
|
|
|
current_status:
|
|
summary: VoidBot's resident Yggdrasil daemon owns Persona initiative, physiology, nap-deduped memory maintenance, moderation heartbeat/enforcement, and bounded person-shaped rumination as separate organs. The swarm is paused, moderation and rumination model cadences remain cold while the MiMo credential is stale, and semantic pressure can authorize at most one committed turn per evidence item. Worker Face speech and Void candidate delivery now share one typed Bifrost CultMesh Discord command/receipt port; candidate delivery remains a separate parent-owned organ and never lets the rumination model touch transport.
|
|
next_action: The daemon-organ migration is complete. Keep the Persona swarm paused and moderation/rumination inference disabled until a valid model credential is installed. The next operational pass is a bounded credential smoke followed by one controlled log-only moderation window and one explicitly reviewed rumination window; it is not another ownership migration.
|