REC-121 / REC-019 (VoidBot part):
- Deleted packages/sandbox (policy-first sandbox scaffolding) and its
root tsconfig.json project reference. Removed its two remaining doc
mentions in README.md and docs/architecture/overview.md, including
the two forward-looking roadmap lines that described expanding it
("Add real constrained sandbox execution...", "Expand sandbox
execution from dry-run policy checks...") since there is no longer
any scaffolding for them to expand.
- Removed the direct `@msgpack/msgpack` dependency from
packages/core/package.json; health/CultCache code obtains
MessagePack through CultLib instead.
- Removed the root npm script `swarm:dashboard`, a byte-identical
duplicate of `swarm:render-dashboard`.
Updated package-lock.json by deleting it and running `npm install`
fresh (a `--package-lock-only` pass alone left stale entries for the
removed workspace and dependency). That also dropped @msgpack/msgpack's
now-unreferenced-by-core transitive optional deps
(@emnapi/*, @napi-rs/wasm-runtime, @snazzah/davey-*, @tybys/wasm-util);
vendor/cultcache-ts still declares its own @msgpack/msgpack dependency
independently and is unaffected.
Kill attempts that failed: none.
- `rg -n '@voidbot/sandbox|packages/sandbox' apps packages scripts
--glob '!packages/sandbox/**'` -> no matches (repeated the census
command against current HEAD).
- `rg -n '@msgpack/msgpack' packages/core/src` -> no matches.
- `rg -n 'swarm:dashboard\b'` outside its own definition -> no matches.
- Cross-repo: `rg -n '@voidbot/sandbox|packages/sandbox'` over all of
F:/Projects (Grep tool, respects each repo's .gitignore) -> only
this repo's own README/docs/tsconfig/package-lock, now all cleaned.
Checks run: initialized the vendor/cultcache-ts submodule (empty in a
fresh worktree, unrelated pre-existing gap), `npm install`, then
`npx tsc -b --pretty false` across the whole workspace -> clean, no
errors (a pre-init run showed 11 `Cannot find module 'cultcache-ts'`
errors, all from the uninitialized submodule, none related to this
change).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
5 KiB
VoidBot Architecture Overview
Deployment: VoidBot runs on Yggdrasil and is deployed by Idunn from upstream repository pushes. Local checkouts are development and diagnostic environments, not deployment targets. Do not create or restore a local VoidBot deployment path.
This initial scaffold follows the phase-one shape from the spec:
Discord Gateway
-> Command Router
-> Permission Engine
-> Context Builder
-> Job Queue
-> Provider Adapter
-> Storage Layer
- PostgreSQL-backed jobs, audit events, and interaction memory
- persistent local archives for RAG
- Qdrant or local JSON vector stores for retrieval
Current state
apps/botowns Discord connectivity, routing, and command handling.apps/workerpolls owner jobs, runs the local Discord-safe Codex lane, serves bounded history-search tool requests from the RAG index, and prepares handoff bundles when needed.packages/corecontains permissions, context assembly, Postgres-backed state storage, style loading, and the rotating system message catalog.packages/providersisolates provider contracts from Discord code.packages/ragcontains the message archive, chunking pipeline, local embedding backends, pluggable vector-store backends, and log import state.
VoidBot's Verse-facing service contract lives in
docs/architecture/voidbot-verse-service-contract.md. The short version:
VoidBot owns Discord cognition, r/GameCultOrg moderation judgment when Bifrost
supplies Reddit threads/posts, repo Face Reddit thread intent packaging,
archive/source retrieval, typed Void self-state, and repo Face compatibility
rails; Huginn owns Persona/.cc runtime inspection stewardship; Bifrost owns
governed work and Reddit transport; Odin discovers provider-owned CultMesh
surfaces; Eve/CultUI is the presentation contract.
Current shortcuts and tradeoffs
- Postgres now owns jobs, audit events, and interaction memory, but the archive side of RAG is still file-backed under
.voidbot/. - Retrieval now uses a persistent vector backend with a local embedding backend by default (
qwen3-embedding:0.6bthrough Ollama). VECTOR_STORE_KIND=local_jsonkeeps the zero-service path available for local development, butVECTOR_STORE_KIND=qdrantis now supported for a proper vector database.- Discord history vectors and source-tree/lore vectors stay in separate physical partitions so source indexing no longer rewrites the entire history corpus.
- The bot live-ingests every message that matches the configured indexing rule and can also backfill from exported log files.
- Source and lore indexing can also be kicked off by local repo
pre-pushhooks, which launch a detached incremental resync of the pushed repo into the source archive and source-side vector store. - The owner Codex flow can perform repeated read-only history searches through a bounded tool loop instead of relying on a single retrieval snapshot.
- Stock Discord replies are loaded from
config/system-messages.jsonand rotated through shuffled variants to avoid repetitive canned responses. - Changing embedding models requires a full vector rebuild from the archived messages, which is handled by
npm run rag:rebuild. - Local and offsite backups now have a verifier plus a recurring watchdog, so backup freshness and remote retention stop relying on operator vibes.
owner_codexhas two lanes:local_exec_owner_onlytries a read-onlycodex execpass for direct Discord repliesmanual_packageremains available when you want explicit approval-gated packaging
- When the local Discord-safe lane is not enough, the worker posts a handoff notice and writes the full context bundle to
.voidbot/artifacts/<job-id>/. - The current swarm operator surface is published as an Eve/CultUI CultMesh
provider at
cultmesh://voidbot.local/eve/providers/voidbot.swarm, backed by.voidbot/status/cultmesh/voidbot-swarm-state.cc; any generated browser page is only a debug lowering of that provider surface. - The local orchestrator pulse publishes
voidbot.cultnet-rudp-stack-healthovercultnet.transport.rudp.v0to Idunn after each pulse. The operations watchdog remains a compatibility report, not the daemon liveness owner.
Upgrade path
- Keep the current
voidbot.swarmCultMesh publication discoverable through Odin. - Add
.ccwitnesses or native typed CultCache documents for remaining JSON-only status surfaces before treating them as Verse state. - Move Persona and repo Face
.ccinspection to Huginn-owned tooling while VoidBot remains the Discord compatibility carrier. - Publish separate Eve/CultUI surfaces for Discord, r/GameCultOrg, archive, source, repo Face, and swarm state instead of growing a bespoke dashboard authority.
- Add a true restore drill path instead of stopping at backup verification plus freshness monitoring.
- Add moderation, budgeting, and rate limits before enabling
openai_apifor member traffic. - Expand worker-side run records and admin tooling around the interaction memory/event stores.