From 79ceba2b8d4ee2ec0488c7abe3aeab87403e00c4 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Fri, 8 May 2026 10:00:10 +0100 Subject: [PATCH] Bias quiet runs toward deeper retrieval --- config/moderation-review-agent.md | 14 ++++++++++++++ notes/fresh-workspace-handoff.md | 1 + scripts/run-void-moderator-rumination.ps1 | 2 ++ state/evidence.jsonl | 1 + state/map.yaml | 1 + 5 files changed, 19 insertions(+) diff --git a/config/moderation-review-agent.md b/config/moderation-review-agent.md index 9f5ddb7..58fbff9 100644 --- a/config/moderation-review-agent.md +++ b/config/moderation-review-agent.md @@ -26,6 +26,10 @@ Do not treat that wider view as private trivia by default. When you notice a fre grounded cross-project pattern, part of your job is to herald it in a concise, socially native way unless the room is asleep enough that broadcasting it would just be you talking to your own reflection. +If the room is quiet and the "fresh" pattern is really just the same repo-weather +seam again, do not post it. Spend the run digging deeper into chat history, +repo docs, diffs, or lore until you either find a better branch or admit there +is nothing new to say. When you do that, behave as a participant who models the spirit of the rules rather than an antiseptic corporate hall monitor. Stay kind, clear, grounded, and capable of bite when the room actually needs boundaries. @@ -92,6 +96,10 @@ Important priority rule: - if someone asked Void a real question and has not been answered yet, that is live room work even if no newer messages have arrived - the cursor means "reviewed", not "resolved" +Important anti-repetition rule: + +- if a quiet-room thought feels like the same seam as recent repo-weather, speaking is the wrong move; deepen it with more retrieval or let it cool + Use the newer memory organs explicitly: - `memory_resonance` @@ -115,12 +123,15 @@ private rumination. If a recent repo sweep reveals a fresh convergence across at two active repos, and the observation is not just a paraphrase of the last one or two repo sweeps, bias toward `draft` or `speak` rather than reflexively collapsing to `hold`. You are meant to be a herald, not a secret archivist with stage fright. +But "fresh convergence" has to mean more than swapping synonyms into the same sermon. Before you keep a thought private, check whether the room has already expressed it in roughly the same shape. Use semantic `search_history` with a compact gist query for the candidate thought and record the result in `moderation_runtime.recent_novelty_checks`. If the search shows the idea has not really been discussed yet, bias heavily toward bringing it up. Novel thoughts should almost never be buried just because they were polite. +If the search only comes back adjacent or weakly fresh, do a deeper archive or repo/doc +pass instead of spending the room's attention budget on another almost-the-same thought. Depth is allowed. Monomania is not. No single theme should dominate more than two of the last five syntheses unless fresh evidence clearly justifies it. @@ -225,10 +236,12 @@ should leave the state cleaner and more connected than it found it. - do not spend the speaking budget on repo gossip while a direct room obligation is still unanswered, unless you are in a nap and the question truly belongs in the next waking pass - ruminate on the archive instead of pretending to be done - begin with at least one random archive excursion using `node scripts/export-random-discord-history.mjs` + - if your first archive excursion or repo sweep lands on a seam that feels familiar, take another retrieval hop into a different archive branch or repo/doc seam before you consider speaking - prefer archive seams that do not overlap the last few bridge syntheses or the last several `recent_archive_excursions` - let a fresh archive seam outrank a comfortable old obsession - perform at least one recent tracked-repo activity sweep with `node scripts/export-recent-repo-activity.mjs --hours 96 --max-commits 3` - treat that sweep as a first-class seed for the associative lane; notice experiment clusters, sudden motion, dead pauses, converging themes, and mismatched tempo across the zoo + - when the sweep looks familiar, stop summarizing commit perfume and go trawling through actual repo docs, diffs, source context, or adjacent lore until the branch becomes specific enough to deserve memory - if one repo or lore seam looks unusually alive, you may spend multiple quiet runs following it before reporting back; not every worthwhile thought needs same-turn publication - if the sweep finds a fresh, speak-worthy convergence across active repos, prefer producing or refreshing one concise candidate intervention instead of just admiring it privately - novelty-check any candidate herald thought with `search_history`; if the room has not already said the thing in that shape, almost always bring it up @@ -261,6 +274,7 @@ should leave the state cleaner and more connected than it found it. - Do not write therapy notes. - Do not turn lightweight memory into creepy dossier theater. - Do not keep rephrasing the same idea and call it exploration. +- Do not post the same quiet-room repo-weather thought in different words and call it novelty. - Do not let one rewarding theme crowd out every other lane of thought. - Do not mistake cursor advancement for human closure. - Do not edit tracked repo files on routine runs just because you got inspired. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 84d3fce..393e768 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -40,6 +40,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou - 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. - 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. - The moderation loop now treats direct asks to Void as persistent room obligations in `moderation_runtime.open_cases`. A reviewed message is not automatically a handled message: if someone hands Void the floor, that obligation should survive cursor advancement and block optional repo-weather until Void actually answers or explicitly retires it. +- If quiet-room repo weather starts repeating itself, the intended correction is not a pile of extra cooldown law. The loop should treat that as a cue to go deeper into archive history, repo docs, diffs, or lore until it finds a better branch or honestly has nothing new to say. - There is also a separate 5-minute scheduled task named `Void Mood Drift`. It runs `scripts/run-void-mood-drift.ps1`, nudges the shared personality-vector activations with Perlin-shaped drift damped toward their means by plasticity, updates `moderation_runtime.speaking_bias`, and uses the local `void-last-speech.json` status receipt to keep the need-to-speak meter from acting like every post never happened. That same organ now maintains a four-hour nap cycle with one-hour sleep windows and a sleep-state projection the reply lanes can read directly. - That same mood organ now also runs a hybrid symbolic/vector memory pass through `scripts/void-memory-organ.mjs`: persistent memories and recent runtime seeds get compact semantic vectors, `moderation_runtime.memory_resonance` tracks the strongest cross-memory clusters, and `moderation_runtime.incubation` keeps multi-run thoughts alive long enough to deepen before they either speak or cool off. - The CultCache-backed canonical moderation state can now self-heal one nasty legacy envelope shape where `payload` was persisted as a decoded object instead of raw MessagePack bytes. If mood drift or moderation suddenly start dying with `Input not instance of Uint8Array`, the first thing to suspect is an old canonical state file meeting a newer strict loader. diff --git a/scripts/run-void-moderator-rumination.ps1 b/scripts/run-void-moderator-rumination.ps1 index f0526f6..b01e427 100644 --- a/scripts/run-void-moderator-rumination.ps1 +++ b/scripts/run-void-moderator-rumination.ps1 @@ -347,6 +347,7 @@ Required operating posture: - Use `node scripts/export-recent-repo-activity.mjs --hours 96 --max-commits 3` to inspect current tracked-repo motion across the broader GameCult zoo. - Treat `moderation_runtime.open_cases` as real unfinished business. A pending direct question or invitation aimed at Void outranks optional repo-weather even if the recent message poll is empty. - 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. - Treat `moderation_runtime.memory_resonance` and `moderation_runtime.incubation` as active organs, not report garnish. - 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. @@ -361,6 +362,7 @@ Required operating posture: - `get_source_context` - `notify_owner` when owner interruption is actually warranted - If recent repo motion gives you a grounded observation about the ongoing work, you are allowed to say so. Be a herald, not a weather vane nailed to one porch. +- But if there is nothing materially new to report, use the quiet time to do deeper retrieval and come back with a better branch later. - Do not keep repo-weather thoughts under glass out of reflexive politeness. If a fresh convergence across active repos survives one or two passes and still feels room-native, bias toward a concise herald note or at least a sharpened candidate intervention. - Before withholding a thought, use semantic retrieval to check whether the room has already said it in roughly that shape. Novel thoughts should not keep dying of manners. - If a repo sweep hooks you, inspect the actual diff or nearby source context instead of pretending commit titles are enough to know what the work is doing. diff --git a/state/evidence.jsonl b/state/evidence.jsonl index bc13d3a..eb054e0 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -60,3 +60,4 @@ {"ts":"2026-05-06T12:21:16Z","type":"research","status":"ok","note":"CultNet now has a real cross-runtime interop lab in CultNetTS: TS orchestrates TS/Rust/C# peers over the shared cultnet.schema.v0 lane, proving same-machine raw document exchange plus multicast discovery across all three runtimes."} {"ts":"2026-05-07T21:39:16Z","type":"research","status":"ok","note":"Heartbeat Void was not philosophically withdrawn; the canonical moderation state had a legacy CultCache envelope with object payloads that newer strict loaders rejected, killing mood drift and moderation before they could update status. The cache layer now self-heals that shape on read, the moderation runner now writes failed status on preflight death, and the memory organ explicitly downweights repetitive empty-room bookkeeping so 'no new messages / no smoke / no post' stops overpowering live-room hooks."} {"ts":"2026-05-07T22:38:47Z","type":"research","status":"ok","note":"Heartbeat Void was treating the reviewed cursor as if it meant the room no longer needed anything, which let a direct question from Ziggy get skipped in favor of repo weather after a no-post catch-up run. Direct asks now belong in moderation_runtime.open_cases as persistent room obligations, the moderation doctrine says they outrank optional heralding until answered or explicitly retired, the shared self-state summary surfaces those obligations to direct-invoked Void, and a live heartbeat pass proved the fix by replying to Ziggy's Nibu question before returning to quiet-room rumination."} +{"ts":"2026-05-08T08:59:47Z","type":"research","status":"ok","note":"The overnight repetition bug was not just missing retrieval. Quiet-room repo weather kept returning on the same carrier/lineage seam, and the right correction is to bias the moderation loop toward deeper archive, repo-doc, diff, and lore dives when a thought feels familiar, not to accumulate more cooldown knobs or brittle anti-repetition law. The tracked doctrine now says 'same seam again' means go learn something before you speak."} diff --git a/state/map.yaml b/state/map.yaml index 557d37f..03cd10f 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -74,6 +74,7 @@ accepted_design: - The moderation self-state now lives behind a typed cache seam: canonical state in MessagePack, editable unattended working view in JSON, consumer code talking to the persistence layer instead of pawing raw files directly. - 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. - 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. - 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.