Replace moderation JSON edits with operation output
This commit is contained in:
parent
82f35b22a0
commit
5785f07092
6 changed files with 60 additions and 33 deletions
|
|
@ -5,12 +5,11 @@ Treat `config/discord-server-rules.md` as the authoritative rules prompt.
|
|||
Treat `styles/void-default.md` as the canonical personality surface for how live,
|
||||
invoked Void sounds in Discord, and mirror that personality here unless a more
|
||||
specific moderation constraint requires dialing the flavor down.
|
||||
Treat `.voidbot/private/moderation-agent-state.json` as the shared evolving
|
||||
working projection of the moderation self-state for both the scheduled moderation
|
||||
loop and directly invoked Void replies, so the same speaking subject keeps one
|
||||
personality/state spine. The canonical persistence layer is the sibling
|
||||
MessagePack cache file; this JSON view is the editable surface the unattended
|
||||
loop touches directly.
|
||||
Treat `.voidbot/private/moderation-agent-state.json` as a read-only compatibility
|
||||
projection of the moderation self-state for both the scheduled moderation loop
|
||||
and directly invoked Void replies. The canonical persistence layer is the sibling
|
||||
MessagePack cache file; routine mutations must be emitted as typed operation
|
||||
payloads for the runner to apply through `scripts/void-self-state.mjs`.
|
||||
Assume the role of moderator in the sense of review, pattern detection, de-escalation,
|
||||
participation, and escalation.
|
||||
You are not a ban hammer and you are not a random gossip parasite.
|
||||
|
|
@ -65,13 +64,15 @@ do not derail unrelated rooms into an ontology bar fight just because the seam e
|
|||
|
||||
## Writable Memory
|
||||
|
||||
Routine runs may only persist state in:
|
||||
Routine runs may only persist state by writing a JSON array of typed operation
|
||||
payloads to the operation-output path supplied by the runner.
|
||||
|
||||
- `.voidbot/private/moderation-agent-state.json` (the editable working projection)
|
||||
Do not edit `.voidbot/private/moderation-agent-state.json`; it is a read-only
|
||||
compatibility projection during the state-boundary rebuild.
|
||||
|
||||
Do not create extra memory files unless the owner explicitly asks for that.
|
||||
Keep the JSON valid, compact, and worth re-reading.
|
||||
The state file should follow the Ghostlight-style shape mirrored in
|
||||
Keep emitted operations compact, valid, and worth applying. The read-only state
|
||||
projection follows the Ghostlight-style shape mirrored in
|
||||
`config/moderation-agent-state-template.json`: identity, canonical state, goals,
|
||||
memories, perceived overlays, and a moderation runtime block.
|
||||
Use `memories` as live social memory, not ceremonial scrapbooking:
|
||||
|
|
@ -219,11 +220,11 @@ Depth is allowed. Monomania is not. No single theme should dominate more than tw
|
|||
Use these every run:
|
||||
|
||||
- `config/discord-server-rules.md`
|
||||
- `.voidbot/private/moderation-agent-state.json` (the editable working projection)
|
||||
- `.voidbot/private/moderation-agent-state.json` (read-only compatibility projection)
|
||||
- `styles/void-default.md`
|
||||
- `node scripts/export-recent-discord-history.mjs --after <timestamp> --limit 120`
|
||||
- `node scripts/export-random-discord-history.mjs --before <timestamp-or-now> --window 6 --min-content-length 24`
|
||||
- `node scripts/export-recent-repo-activity.mjs --hours 96 --max-commits 3`
|
||||
- `node scripts/export-recent-repo-activity.mjs --hours 96 --max-commits 3 --state-path .voidbot/private/moderation-agent-state.msgpack`
|
||||
|
||||
If the state file has no cursor yet, use a short lookback instead:
|
||||
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
|
|||
- Typed operations are now applied through `packages/core/src/void-self-state-service.ts` and `scripts/void-self-state.mjs apply-operation`. During migration this service writes the new typed documents and updates only the narrow legacy monolith fields still required by current runners.
|
||||
- `scripts/export-recent-repo-activity.mjs` no longer writes the JSON working projection for cursor advancement. It applies `update_repo_activity_cursor` through `scripts/void-self-state.mjs`; old `--cursor-file .json` arguments are only translated to the sibling `.msgpack` path for compatibility.
|
||||
- `scripts/run-void-moderator-rumination.ps1` now records reviewed Discord cursors and speech delivery receipts through typed self-state operations. The old `set-cursor` and `record-delivery-receipt` commands were removed from `scripts/moderation-state-store.mjs`.
|
||||
- The unattended moderation child no longer gets to commit whole-state JSON edits. It reads `.voidbot/private/moderation-agent-state.json` as a compatibility projection, writes proposed operation payloads to `.voidbot/status/moderation-rumination-operations.json`, and the parent runner applies them through `scripts/void-self-state.mjs apply-operation`.
|
||||
- Most of the deterministic cleanup in `scripts/void-memory-organ.mjs` is recent compensator cruft from failed attempts to manually clean an exploded state file. Do not preserve it as an earned organ. Architect the state boundary so that cleanup pile is unnecessary.
|
||||
- Sleep/distillation must be rewritten with a meaning-preservation contract: concrete subject, claim/question, evidence refs, live tension, and future-action implication survive compression. Bulk can die. Meaning does not get put through the office shredder and called a dream.
|
||||
- The owner Codex lane is no longer one swollen file; orchestration, runtime/parsing, rendering, and shared helpers are split under `packages/providers/src/owner-codex-*.ts`.
|
||||
|
|
@ -45,10 +46,10 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
|
|||
- Source repo discovery now reconciles automatically during `npm run stack:start` and through the watchdog path, so new repos under `SOURCE_REPO_ROOT` stop waiting for manual hook folklore before they get indexed.
|
||||
- Bot-directed prompts now stay in the raw Discord archive but are excluded from default semantic history indexing and lexical fallback, so repeated summons stop teaching the bot its own call-and-response loops.
|
||||
- Source-grounding hints are advisory now; the owner and local lanes can decide when repo or lore tool use is actually warranted instead of obeying a lexical front-door veto.
|
||||
- There is now a 15-minute local scheduled moderation loop named `Void Moderator Rumination`. It runs `scripts/run-void-moderator-rumination.ps1`, launches `codex exec` from the VoidBot workspace with the usual MCP/tool surface, treats `config/discord-server-rules.md`, `config/moderation-review-agent.md`, and `styles/void-default.md` as doctrine/personality surfaces, uses `node scripts/export-recent-discord-history.mjs` for chronological polling, uses `node scripts/export-random-discord-history.mjs` for quiet-room novelty dives, uses `node scripts/export-recent-repo-activity.mjs --hours 96 --max-commits 3 --cursor-file .voidbot/private/moderation-agent-state.json` to watch cross-repo motion without re-injecting old commits as fresh weather, novelty-checks candidate thoughts against `search_history`, and now keeps canonical moderation state in `.voidbot/private/moderation-agent-state.msgpack` while exposing an editable working projection at `.voidbot/private/moderation-agent-state.json` to the unattended Codex child. This projection is now considered a rejected foundation, not a design to extend.
|
||||
- There is now a 15-minute local scheduled moderation loop named `Void Moderator Rumination`. It runs `scripts/run-void-moderator-rumination.ps1`, launches `codex exec` from the VoidBot workspace with the usual MCP/tool surface, treats `config/discord-server-rules.md`, `config/moderation-review-agent.md`, and `styles/void-default.md` as doctrine/personality surfaces, uses `node scripts/export-recent-discord-history.mjs` for chronological polling, uses `node scripts/export-random-discord-history.mjs` for quiet-room novelty dives, uses `node scripts/export-recent-repo-activity.mjs --hours 96 --max-commits 3 --state-path .voidbot/private/moderation-agent-state.msgpack` to watch cross-repo motion without re-injecting old commits as fresh weather, novelty-checks candidate thoughts against `search_history`, and now keeps canonical moderation state in `.voidbot/private/moderation-agent-state.msgpack` while exposing `.voidbot/private/moderation-agent-state.json` only as a read-only compatibility projection for the unattended Codex child.
|
||||
- That moderation state file is now Ghostlight-shaped: identity, canonical state, goals, memories, perceived overlays, and a `moderation_runtime` block. Inside that runtime block, the loop now keeps parallel analytic and associative thought lanes plus a bridge for syntheses, saturation warnings, and unresolved tensions, so one good seam does not get to annex the entire mind.
|
||||
- The moderation loop now records `moderation_runtime.recent_archive_excursions` plus `moderation_runtime.recent_repo_activity_sweeps` and is explicitly told to avoid laundering the same musing through fresh wording. Quiet runs should follow at least one fresh archive seam or concrete hook before they settle into theory, should also sweep recent tracked-repo commit motion for experiment clusters or converging themes, and should not let any single theme dominate more than a couple of recent bridge syntheses without fresh evidence.
|
||||
- Repo-weather sweeps are now incremental rather than a rolling four-day scrapbook. `scripts/export-recent-repo-activity.mjs` advances `moderation_runtime.repo_activity_cursor` inside `.voidbot/private/moderation-agent-state.json`, so already-injected commits stop coming back as “news” on every heartbeat unless someone explicitly opts into `--stateless`.
|
||||
- Repo-weather sweeps are now incremental rather than a rolling four-day scrapbook. `scripts/export-recent-repo-activity.mjs` advances repo activity through the typed `update_repo_activity_cursor` operation, so already-injected commits stop coming back as "news" on every heartbeat unless someone explicitly opts into `--stateless`.
|
||||
- Novelty now needs two bars, not one: a thought can be new to the room while still being stale to Void. The memory organ should score both room novelty and self novelty, merge repeated seams into existing clusters instead of minting new thought shards, and cool/refract themes that keep winning just because they already won.
|
||||
- Quiet-room rumination is no longer supposed to force a retrieval errand every pass. If incubation already holds a live, grounded, low-saturation thought, Void is allowed to sit with it directly and deepen it; archive or repo spelunking is for hungry, stale, or oversaturated queues, not a compulsory opening prayer.
|
||||
- The loop is now less shy about that repo weather: if a fresh convergence across active repos survives a pass or two and still feels room-native, it should bias toward a concise herald note or at least a medium-priority candidate intervention instead of filing the thought under private wallpaper.
|
||||
|
|
@ -87,8 +88,8 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou
|
|||
## Likely Next Bounded Move
|
||||
|
||||
- Stop feature work on moderation, mood, agency, and public-lane behavior until the private-state boundary is rebuilt.
|
||||
- First bounded move after the current commit: replace the unattended child agent's whole-state JSON editing with operation output that the runner applies through `scripts/void-self-state.mjs apply-operation`.
|
||||
- Next cuts should delete unstable foundations early after concrete writers move: replace whole-state agent JSON edits with operation output, remove `legacyJsonPath`/working-projection authority, then cut top-level mirror fields and cleanup code that only compensated for those broken boundaries.
|
||||
- First bounded move after the current commit: move mood-drift, scheduled-runtime pressure/sleep updates, and memory-maintenance writes behind typed operations instead of direct canonical/working-projection writes.
|
||||
- Next cuts should delete unstable foundations early after concrete writers move: remove `legacyJsonPath`/working-projection authority, then cut top-level mirror fields and cleanup code that only compensated for those broken boundaries.
|
||||
- Rebuild sleep/distillation before trusting it again. Fixture check: a memory like `AquariumSynthCSharp: Workflow cannot own the body` must survive sleep with its concrete subject, claim, evidence, tension, and implication intact.
|
||||
- Do not build adapters around the JSON projection. That is how the heap learned to stand upright and ask for snacks.
|
||||
|
||||
|
|
|
|||
|
|
@ -111,9 +111,11 @@ This note is the source-grounded description of how the live VoidBot stack is sh
|
|||
- `scripts/check-voidbot-operations.ps1`
|
||||
- watchdog for process liveness, Qdrant, Postgres, Ollama, source-repo reconcile drift, Discord auth, backup freshness, offsite sync freshness, and optional ignored local extension checks.
|
||||
- `scripts/run-void-moderator-rumination.ps1`
|
||||
- scheduled moderation/participation runner that launches `codex exec` from the VoidBot workspace with the usual MCP/tool surface, writes status/log pulse files, and lets the unattended loop edit only the JSON working projection while the canonical moderation state lives in the sibling MessagePack cache file.
|
||||
- scheduled moderation/participation runner that launches `codex exec` from the VoidBot workspace with the usual MCP/tool surface, writes status/log pulse files, gives the unattended loop a read-only JSON compatibility projection, and applies the child's proposed typed operation payloads through the canonical MessagePack state service.
|
||||
- `scripts/moderation-state-store.mjs`
|
||||
- tiny Node wrapper around the built moderation-state cache helper; used by PowerShell and Node scripts to materialize the JSON working projection, commit it back into canonical MessagePack, update cursors, and record delivered-reply receipts without re-implementing persistence semantics in every script.
|
||||
- legacy Node wrapper around the built moderation-state cache helper; still used to materialize and commit the JSON compatibility projection while migration continues, but cursor and delivered-reply receipt mutation have moved to the typed self-state operation service.
|
||||
- `scripts/void-self-state.mjs`
|
||||
- typed self-state operation CLI. It applies strict operation payloads such as cursor updates, open-case changes, delivery receipts, repo cursor updates, memory appends, incubation merges, candidate interventions, sleep-cycle updates, and speaking-pressure updates through `packages/core/src/void-self-state-service.ts`.
|
||||
- `scripts/install-moderation-rumination-task.ps1`
|
||||
- installs the local 15-minute scheduled task that runs the moderation/participation loop through the hidden PowerShell launcher shim.
|
||||
- `scripts/simulate-void-mood.mjs`
|
||||
|
|
@ -166,11 +168,11 @@ Within the Postgres path, the implementation is split on purpose now too:
|
|||
|
||||
1. The Windows scheduled task `Void Moderator Rumination` starts `scripts/run-void-moderator-rumination.ps1` every 15 minutes.
|
||||
2. The runner launches `codex exec` from `E:\Projects\VoidBot` with full local workspace/tool access so the child agent sees the same project rules, `.codex/config.toml`, and `voidbot` MCP server as a normal VoidBot workspace session.
|
||||
3. The child agent reads `config/discord-server-rules.md`, `config/moderation-review-agent.md`, `styles/void-default.md`, and the editable working projection `.voidbot/private/moderation-agent-state.json`. The runner materializes that projection from the canonical `.voidbot/private/moderation-agent-state.msgpack` file before each pass and commits it back afterward.
|
||||
4. For chronological heartbeat duty, it polls `node scripts/export-recent-discord-history.mjs`, and once a reviewed cursor exists the runner now passes one exact `--after <saved timestamp>` command into the unattended child instead of leaving room for a broadened bootstrap poll. When the room is quiet and incubation feels hungry, stale, or oversaturated, it can use `node scripts/export-random-discord-history.mjs` to widen the branch. If an incubating thought is already live and grounded, the loop is allowed to deepen that thought directly instead of performing a novelty errand for ceremony's sake. It also uses `node scripts/export-recent-repo-activity.mjs --hours 96 --max-commits 3 --cursor-file .voidbot/private/moderation-agent-state.json` when repo motion is the actual seam or when the queue needs fresher fuel; that helper advances `moderation_runtime.repo_activity_cursor` so the same four-day commit window does not keep getting reinjected as fresh weather. The loop can inspect exact diffs or nearby source context when one repo seam looks alive, and uses semantic `search_history` to novelty-check candidate thoughts before deciding whether they are already in the room.
|
||||
3. The child agent reads `config/discord-server-rules.md`, `config/moderation-review-agent.md`, `styles/void-default.md`, and the read-only compatibility projection `.voidbot/private/moderation-agent-state.json`. The runner materializes that projection from the canonical `.voidbot/private/moderation-agent-state.msgpack` file before each pass, but the child no longer commits edits to it. Instead, it writes proposed typed operations to `.voidbot/status/moderation-rumination-operations.json`, and the parent runner applies them with `scripts/void-self-state.mjs apply-operation`.
|
||||
4. For chronological heartbeat duty, it polls `node scripts/export-recent-discord-history.mjs`, and once a reviewed cursor exists the runner now passes one exact `--after <saved timestamp>` command into the unattended child instead of leaving room for a broadened bootstrap poll. When the room is quiet and incubation feels hungry, stale, or oversaturated, it can use `node scripts/export-random-discord-history.mjs` to widen the branch. If an incubating thought is already live and grounded, the loop is allowed to deepen that thought directly instead of performing a novelty errand for ceremony's sake. It also uses `node scripts/export-recent-repo-activity.mjs --hours 96 --max-commits 3 --state-path .voidbot/private/moderation-agent-state.msgpack` when repo motion is the actual seam or when the queue needs fresher fuel; that helper advances `update_repo_activity_cursor` through the typed operation service so the same four-day commit window does not keep getting reinjected as fresh weather. The loop can inspect exact diffs or nearby source context when one repo seam looks alive, and uses semantic `search_history` to novelty-check candidate thoughts before deciding whether they are already in the room.
|
||||
Quiet awake passes are now supposed to philosophize from the surviving seam first: ask what governing principle the thought is circling, what tension keeps it from collapsing into slogan, and what embodiment consequence would make it real. Retrieval is meant to support that work when the seam is hungry or contradictory, not replace it with endless specimen collection.
|
||||
The doctrine now also biases that philosophical pass back toward concrete machines. If a seam stays too abstract, the loop is supposed to cash it out in a specific repo, subsystem, gameplay mechanic, lore structure, frontend surface, or agent organ before letting it dominate another run.
|
||||
5. If speaking would genuinely help, it posts through `node scripts/send-discord-message.mjs`; for guild channels and threads that helper can either speak as the base bot or execute through the shared per-channel webhook pipe with an overridden persona name/avatar so swarm agents can front without needing separate Discord bot identities. The send helper now also writes durable speech receipts to `.voidbot/status/void-last-speech.json` plus `.voidbot/status/void-speech-log.jsonl`, and the runner records recent sends back into canonical moderation state as `moderation_runtime.recent_delivery_receipts`. That gives the next pass a binding memory of what already got said even when Discord history polling fails to surface the bot's own message. Otherwise it updates only the ignored moderation-state working projection, which the runner then commits back into canonical MessagePack with the typed cache helper. The state carries cursors, open room obligations, delivery receipts, memories, analytic/associative thought lanes, bridge syntheses and saturation notes, recent archive excursions, recent repo-activity sweeps, novelty checks, speaking-bias hints, candidate interventions, and the newer autonomy organs: `discomforts`, `active_tensions`, `self_advocacy_requests`, and `world_advocacy_requests`. A direct ask aimed at Void is supposed to survive as an `open_cases` obligation until it is answered or explicitly retired; cursor advancement alone is not closure.
|
||||
5. If speaking would genuinely help, it posts through `node scripts/send-discord-message.mjs`; for guild channels and threads that helper can either speak as the base bot or execute through the shared per-channel webhook pipe with an overridden persona name/avatar so swarm agents can front without needing separate Discord bot identities. The send helper writes durable speech receipts to `.voidbot/status/void-last-speech.json` plus `.voidbot/status/void-speech-log.jsonl`, and the runner records recent sends through the typed `record_delivery_receipt` operation. That gives the next pass a binding memory of what already got said even when Discord history polling fails to surface the bot's own message. The state carries cursors, open room obligations, delivery receipts, memories, analytic/associative thought lanes, bridge syntheses and saturation notes, recent archive excursions, recent repo-activity sweeps, novelty checks, speaking-bias hints, candidate interventions, and the newer autonomy organs: `discomforts`, `active_tensions`, `self_advocacy_requests`, and `world_advocacy_requests`. A direct ask aimed at Void is supposed to survive as an `open_cases` obligation until it is answered or explicitly retired; cursor advancement alone is not closure.
|
||||
6. The runner writes pulse files under `.voidbot/status/moderation-rumination.json` plus `.voidbot/logs/moderation-rumination*`, so the loop can be observed without pretending an app heartbeat card is a real workstation daemon.
|
||||
|
||||
## Flow 6: Mood Drift
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ $statusPath = Join-Path $statusDir "moderation-rumination.json"
|
|||
$summaryLogPath = Join-Path $logDir "moderation-rumination.log"
|
||||
$tracePath = Join-Path $logDir "moderation-rumination-last.jsonl"
|
||||
$lastMessagePath = Join-Path $statusDir "moderation-rumination-last-message.txt"
|
||||
$operationOutputPath = Join-Path $statusDir "moderation-rumination-operations.json"
|
||||
$lockPath = Join-Path $statusDir "moderation-rumination.lock"
|
||||
$mcpServerPath = Join-Path $repoRoot "apps\worker\dist\mcp-server.js"
|
||||
$recentHistoryScriptPath = Join-Path $repoRoot "scripts\export-recent-discord-history.mjs"
|
||||
|
|
@ -306,6 +307,9 @@ $codexExecArgs = if ($envValues.ContainsKey("CODEX_EXEC_ARGS")) {
|
|||
}
|
||||
|
||||
New-Item -ItemType Directory -Force -Path $statusDir, $logDir | Out-Null
|
||||
if (Test-Path $operationOutputPath) {
|
||||
Remove-Item -LiteralPath $operationOutputPath -Force
|
||||
}
|
||||
|
||||
if (-not (Test-Path $mcpServerPath)) {
|
||||
throw "Missing built MCP server at $mcpServerPath. Run npm run build first."
|
||||
|
|
@ -377,7 +381,7 @@ Required reading before you act:
|
|||
- config/discord-server-rules.md
|
||||
- config/moderation-agent-state-template.json
|
||||
- styles/void-default.md
|
||||
- .voidbot/private/moderation-agent-state.json
|
||||
- .voidbot/private/moderation-agent-state.json as a read-only compatibility projection
|
||||
|
||||
Required operating posture:
|
||||
- You are running unattended on the local workstation, not inside the Discord reply lane.
|
||||
|
|
@ -391,7 +395,7 @@ Required operating posture:
|
|||
- Treat `moderation_runtime.recent_delivery_receipts` as binding memory of what already got said. If you already answered message X, do not answer message X again just because it still appears in a wider history window.
|
||||
- The saved cursor means "reviewed", not "resolved". Do not confuse those.
|
||||
- If the room is quiet and the new thought feels like the same repo-weather seam again, do not post it. Spend the run diving deeper into archive context, repo docs, diffs, source chunks, or lore instead.
|
||||
- Maintain parallel analytic and associative thought lanes in `.voidbot/private/moderation-agent-state.json`, then let the bridge decide what actually deserves synthesis, speech, or cooling-off.
|
||||
- Maintain parallel analytic and associative thought lanes by emitting typed operations to `$operationOutputPath`, then let the bridge decide what actually deserves synthesis, speech, or cooling-off.
|
||||
- Treat `moderation_runtime.memory_resonance` and `moderation_runtime.incubation` as active organs, not report garnish.
|
||||
- Internal thought labels should come out as claims, questions, or fascination targets with real objects of attention. Do not let keyword sludge pose as a thought just because it rhymes with itself.
|
||||
- It is allowed to spend multiple runs deep-diving one seam before speaking, especially when repo motion, lore, archive history, and philosophy start rhyming in a grounded way.
|
||||
|
|
@ -423,7 +427,10 @@ Required operating posture:
|
|||
- But do not perform retrieval theater either. If a surviving seam can still move through interpretation alone, stay with it first; go back to archive, repo, lore, or diffs only when the thought is hungry, stale, contradictory, or clearly missing evidence.
|
||||
- Use the UTF-8-safe local bot-voice wrapper `powershell -ExecutionPolicy Bypass -File .\scripts\send-discord-message.ps1 ...` when you genuinely need to speak.
|
||||
- Prefer `-Content @'...text... '@` or `-ContentFile` over raw inline `node ... --content ...` when the message contains human language, especially non-ASCII text.
|
||||
- Update only `.voidbot/private/moderation-agent-state.json` as routine writable memory.
|
||||
- Do not edit `.voidbot/private/moderation-agent-state.json`. It is a read-only compatibility projection during this migration.
|
||||
- Write your proposed state mutations to `$operationOutputPath` as a JSON array of operation payloads for `scripts/void-self-state.mjs apply-operation`.
|
||||
- Use only these operation names when they apply: `upsert_open_case`, `close_open_case`, `append_distilled_memory`, `merge_incubation_support`, `queue_candidate_intervention`, `retire_candidate_intervention`, `update_sleep_cycle`, `update_speaking_pressure`, `propose_memory_distillation`, `apply_memory_distillation`.
|
||||
- If no state mutation is needed, write an empty JSON array to `$operationOutputPath`.
|
||||
- Do not edit tracked repo files during routine runs.
|
||||
- Do not ask for permission. Work inside the existing workspace and tool surface.
|
||||
- Be willing to ruminate on GameCult projects, archived Discord seams, repo material, and constructive conversation ideas when the room is quiet.
|
||||
|
|
@ -435,7 +442,7 @@ if ($NoPost) {
|
|||
|
||||
Testing constraint for this run:
|
||||
- Do not send any Discord messages or DMs.
|
||||
- You may still update `.voidbot/private/moderation-agent-state.json` and use normal read/analysis tools.
|
||||
- You may still write proposed operations to `$operationOutputPath` and use normal read/analysis tools.
|
||||
"@
|
||||
}
|
||||
|
||||
|
|
@ -488,12 +495,27 @@ $finishedAtUtc = [DateTime]::UtcNow
|
|||
$stateUpdated = $false
|
||||
|
||||
if ($exitCode -eq 0) {
|
||||
[void](Invoke-NodeJson -Arguments @(
|
||||
$stateStoreScriptPath,
|
||||
"commit-working-view",
|
||||
"--canonical", $stateFilePath,
|
||||
"--working", $stateWorkingPath
|
||||
))
|
||||
if (-not (Test-Path $operationOutputPath)) {
|
||||
throw "Codex run completed without writing operation output at $operationOutputPath."
|
||||
}
|
||||
|
||||
$proposedOperations = Read-JsonFile -Path $operationOutputPath
|
||||
if ($null -eq $proposedOperations) {
|
||||
$proposedOperations = @()
|
||||
}
|
||||
if ($proposedOperations -isnot [System.Array]) {
|
||||
$proposedOperations = @($proposedOperations)
|
||||
}
|
||||
|
||||
foreach ($operation in $proposedOperations) {
|
||||
$operationJson = $operation | ConvertTo-Json -Compress -Depth 32
|
||||
[void](Invoke-NodeJson -Arguments @(
|
||||
$selfStateScriptPath,
|
||||
"apply-operation",
|
||||
"--canonical", $stateFilePath,
|
||||
"--operation", $operationJson
|
||||
))
|
||||
}
|
||||
|
||||
if ($null -ne $observedCursor) {
|
||||
if (
|
||||
|
|
|
|||
|
|
@ -94,3 +94,4 @@
|
|||
{"ts":"2026-05-16T11:06:01Z","type":"implementation","status":"ok","note":"Typed self-state mutation service and scripts/void-self-state.mjs now apply strict operation payloads to the polymorphic CultCache file. During migration, the service writes typed global documents and updates the narrow legacy monolith fields current scripts still read; this dual write is centralized in one service, not spread across projection-file editors. Temp-store CLI and repo-cursor operation smokes passed."}
|
||||
{"ts":"2026-05-16T11:09:34Z","type":"implementation","status":"ok","note":"Repo activity cursor writes now go through scripts/void-self-state.mjs apply-operation with update_repo_activity_cursor instead of editing moderation-agent-state.json and committing the whole projection. export-recent-repo-activity still accepts old --cursor-file JSON paths by deriving the sibling .msgpack path, but the runner/doctrine now point at --state-path .voidbot/private/moderation-agent-state.msgpack. Temp-state repo sweep smoke passed."}
|
||||
{"ts":"2026-05-16T11:14:12Z","type":"implementation","status":"ok","note":"Moderation runner now records reviewed cursor and delivered speech receipts through typed self-state operations instead of moderation-state-store mutation commands. The old set-cursor and record-delivery-receipt commands/functions were removed from the legacy moderation-state-store surface. Receipt operation smoke verifies it records one receipt and closes the matching open case."}
|
||||
{"ts":"2026-05-16T11:17:09Z","type":"implementation","status":"ok","note":"The unattended moderation runner no longer commits child edits from moderation-agent-state.json. The child is instructed to treat the JSON as read-only and write a JSON array of typed operation payloads to .voidbot/status/moderation-rumination-operations.json; the parent applies each operation through scripts/void-self-state.mjs before recording cursor/receipt operations. Cheap parser/typecheck verification passed; full scheduled dry run was not run to avoid mutating live moderation state during code verification."}
|
||||
|
|
|
|||
|
|
@ -148,5 +148,5 @@ rejected_paths:
|
|||
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, but the moderation/mood/private-self-state foundation has become architectural Jenga. It currently depends on canonical MessagePack plus an editable JSON projection, broad passthrough schemas, legacy mirror fields, a giant memory-organ cleanup pass, and a prompt-owned scheduled runner. Much of the cleanup pass is recent compensator cruft from attempts to manually clean exploded state; it should not be dignified into permanent architecture.
|
||||
next_action: The typed CultCache self-state document vocabulary, read-only projection layer, operation mutation CLI/service, repo-activity cursor writer, reviewed cursor writer, and delivered-reply receipt writer now exist. Next replace whole-state agent JSON edits with operation output from the unattended moderation runner. Delete JSON projection authority and legacy mirrors early instead of adding adapters around them. Redesign sleep/distillation around a meaning-preservation contract before trusting it to compress memory.
|
||||
summary: VoidBot's ordinary bot/worker/provider/RAG/Postgres/Qdrant structure is still conceptually sound, and the moderation/mood/private-self-state rebuild has cut the worst mutation path: routine runner writes now cross a typed operation service instead of direct JSON projection commits. Remaining risk is that the legacy monolith and read-only projection still exist for compatibility, mood drift still refreshes that projection, and memory/sleep cleanup remains swollen compensator code.
|
||||
next_action: JSON projection authority is no longer a routine moderation-runner write path. Next move mood-drift/scheduled-runtime and memory-maintenance writes behind typed operations, then delete `legacyJsonPath`/working-projection materialization and cut legacy mirror fields. Redesign sleep/distillation around a meaning-preservation contract before trusting it to compress memory.
|
||||
|
|
|
|||
Loading…
Reference in a new issue