154 lines
20 KiB
YAML
154 lines
20 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: >
|
|
Keep feature work on moderation, mood, and self-state stopped while the
|
|
private state boundary is rebuilt around the typed CultCache `.cc` store.
|
|
The immediate priority is to rebuild the scheduled phase machine and memory
|
|
maintenance from typed operations instead of feeding the next Void any
|
|
legacy projection or mirror state.
|
|
|
|
constraints:
|
|
- 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 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:
|
|
- Make the new project-state surfaces the default continuity path for nontrivial VoidBot work.
|
|
- Rebuild the moderation/self-state foundation so canonical CultCache `.cc` documents are mutated only through typed operations, never through an editable JSON working projection.
|
|
- Keep the old moderation and mood scheduled tasks offline until their typed replacements are deliberately reinstalled; typed rumination exists as a direct runner again, but not as an enabled legacy task.
|
|
- Cut legacy moderation mirrors, whole-state projection commits, and memory-organ compensators 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.
|
|
|
|
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, memory appends, incubation merges, 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.
|
|
- 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 memory organ should queue 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 moderation state as `moderation_runtime.recent_delivery_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.
|
|
- 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 `moderation_runtime.repo_activity_cursor` inside the live moderation state 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.
|
|
- 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.
|
|
- 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, the memory organ should merge support into the existing cluster, raise saturation/refractory pressure, and bias the next pass toward underexplored repo families or archive terrain instead of rewarding repetition with ripeness.
|
|
- 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 the direct reply lanes can mumble through later.
|
|
- Sleep should be lossy about bulk, not about meaning. The nap/distillation path must preserve concrete claims, subjects, evidence refs, tensions, and action implications; if it turns a repo-bound thought into generic abstraction sludge, the sleep machinery is wrong.
|
|
- 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 evidence refs or an explicit missing-evidence 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-evidenced 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 new evidence 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.
|
|
- When the thought surface changes shape, the old memories need to be translated too. The memory organ is now responsible for rewriting legacy seam labels/dream themes into the live ontology, merging duplicate fossils, and pruning stale low-coherence seam memory before it rebuilds resonance and incubation.
|
|
- 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.
|
|
- 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.
|
|
- 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`.
|
|
- The old `Void Moderator Rumination` and `Void Mood Drift` scheduled tasks are disabled. Their replacement entry scripts are typed-only: moderation now builds a bounded context packet, runs the reviewed rumination prompt from `prompts/void-moderator-rumination.md`, and applies typed operation payloads; mood updates typed sleep/speaking pressure in `.voidbot/private/void-self-state.cc`.
|
|
- The active self-state service no longer registers, reads, or writes the legacy moderation document during routine operations.
|
|
- The old Codex rumination, memory-organ cleanup, repo-weather, vector incubation, legacy mirror repair, and JSON projection paths are offline until rebuilt against the typed state boundary.
|
|
- 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 evidence 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, and the memory organ should cut them during ordinary cleanup rather than preserving them for another nap to admire.
|
|
|
|
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 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 scheduled tasks are disabled; the moderation replacement has real rumination again through a reviewed prompt file plus typed operation output.
|
|
next_action: Harden the scheduled moderation phase machine and rebuild the memory-maintenance organ from the typed `.cc` state boundary. The next brain should derive cleanup, agency, sleep, incubation, and speech candidates from validated typed operations and model-owned decisions, not from legacy projection fields, mirror repair, or hard-wired compensator stacks.
|