From 058477a82a7c58da8541b317c75ff088ffdeb583 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Fri, 22 May 2026 20:13:59 +0100 Subject: [PATCH] Prune retired Face state entries --- packages/core/src/void-self-state-service.ts | 17 +++++++++++++++++ prompts/repo-face-state-projector.prompt.md | 1 + state/evidence.jsonl | 1 + 3 files changed, 19 insertions(+) diff --git a/packages/core/src/void-self-state-service.ts b/packages/core/src/void-self-state-service.ts index 6c5c979..cced499 100644 --- a/packages/core/src/void-self-state-service.ts +++ b/packages/core/src/void-self-state-service.ts @@ -206,6 +206,8 @@ function normalizeTypedStateForWrite( state: VoidSelfStateTypedProjection, observedAt = new Date().toISOString(), ): void { + pruneRetiredTypedState(state); + let thoughtMemoryChanged = false; for (const memory of state.thoughtMemory.shortTerm) { thoughtMemoryChanged = clampFutureTimestampFields(memory, observedAt, [ @@ -242,6 +244,21 @@ function normalizeTypedStateForWrite( } } +function pruneRetiredTypedState(state: VoidSelfStateTypedProjection): void { + state.thoughtMemory.shortTerm = state.thoughtMemory.shortTerm.filter(isNotRetiredEntry); + state.thoughtMemory.memories = state.thoughtMemory.memories.filter(isNotRetiredEntry); + state.thoughtMemory.incubation = state.thoughtMemory.incubation.filter(isNotRetiredEntry); + state.agencyPressure.pressures = state.agencyPressure.pressures.filter(isNotRetiredEntry); + state.candidateInterventions.interventions = state.candidateInterventions.interventions.filter(isNotRetiredEntry); + state.faceAffect.needs = state.faceAffect.needs.filter(isNotRetiredEntry); + state.faceAffect.socialBonds = state.faceAffect.socialBonds.filter(isNotRetiredEntry); + state.faceAffect.statusReads = state.faceAffect.statusReads.filter(isNotRetiredEntry); +} + +function isNotRetiredEntry(entry: { status?: string; retiredAt?: string }): boolean { + return entry.status !== "retired" && !entry.retiredAt; +} + function clampFutureTimestampFields>( value: T, observedAt: string, diff --git a/prompts/repo-face-state-projector.prompt.md b/prompts/repo-face-state-projector.prompt.md index 6a6e837..69d9936 100644 --- a/prompts/repo-face-state-projector.prompt.md +++ b/prompts/repo-face-state-projector.prompt.md @@ -50,6 +50,7 @@ Current projection audit: - If the packet includes a correction like "automated", "thousands of renders", "loss landscape", or equivalent scale language, phrases like "one named canary", "one listening note", "one honest ear verdict", "one named sanity check", or "human-auditable verdict" should not survive as an active next desire unless the later transcript explicitly re-approves them. - Do not "compromise" by saying the old one-off check is acceptable as long as it supports the automated flow. That is still the old shape. The corrected active desire should point toward automated loss/artifact visibility; any manual/auditory spot check belongs only as a possible later analysis aid, not as the next ask. - In that corrected case, do not mention canaries, named sanity utterances, listening notes, ear verdicts, manual sound labels, or witness ceremonies in the projected memory block except to say the character has been corrected away from them. Do not leave them as commentary, side-notes, optional asks, or smaller gates. If the old urge survives, frame it as private embarrassment or history, not something to request in public. The Face will see the raw transcript separately; your job is to stop stale state from re-authorizing it. +- FORBIDDEN LITERAL TOKENS IN THE PROJECTED MEMORY BLOCK WHEN THIS LOOP IS PRESENT: `witness`, `witnesses`, `witnessing`, `witnessability`, `canary`, `wet-voice`, and `LocalCastBridge`. Do not use them positively, negatively, historically, metaphorically, or inside "avoid X" language. Raw transcript can contain them elsewhere; your projected memory block cannot. - When the room is irritated by "witness" language, do not use the word in projected prose at all. Use plain alternatives such as inspectability, evidence, generated artifacts, traces, metrics, or reviewable results. If you must refer to the rejected pattern, call it "ritual proof language", "symbolic ceremony", or "old proof vocabulary" without repeating the contaminated word. - This ban applies to metaphorical identity prose and rejected-history prose, not only work requests. The projector must not smuggle a corrected term back into the character by making it sound mythic, lyrical, embarrassed, historical, or socially interesting. - After drafting, inspect your own projected memory block. If corrected-away terms still appear as "the old instinct", "a stale loop", "she can still want", "as a side lens", or any other half-alive desire, rewrite them out. The projected memory must leave the character with the corrected active shape, not a seductive fossil. diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 8e47f2e..6137028 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -279,3 +279,4 @@ {"ts":"2026-05-22T18:45:38Z","type":"implementation","status":"ok","note":"Repo Face relapse repair stayed at projector/interpreter/state boundary: projector now treats corrected old pressure as stale instead of live desire, Interpreter retries correction relapse and contested doctrine before routing, memory-projection smoke passes for Aqua/Epiphany, known Aqua/Epiphany relapse artifacts are rejected, and Aqua's live state retired the canary/listening/witness records that were re-poisoning projection."} {"ts":"2026-05-22T18:53:46Z","type":"implementation","status":"ok","note":"Mimir live Face state scrubbed: retired LocalCastBridge/OBS/wet-voice/witness-gate pressures, installed body-first six-sensor/audio/remote/sync sequence, and removed witness wording from canonical strengthening notes."} {"ts":"2026-05-22T19:02:02Z","type":"verification","status":"ok","note":"Mimir scrub verified through typed-state and prompt projection: active Mimir state has zero live matches for retired-alias/wet-voice/witness/canary loop terms; regenerated prompt contains those words only in raw transcript correction evidence, not projected state. Projector prompt now forbids reskinning corrected loop vocabulary as mythic identity prose."} +{"ts":"2026-05-22T19:12:12Z","type":"fix","status":"ok","note":"Fixed Void self-state write semantics so retired typed entries are pruned from current documents instead of retained as tombstones. Repaired Mimir's .cc: file shrank from about 54KB to 27KB, retains 8 global typed documents, has zero retired entries in typed arrays, and raw bytes no longer contain LocalCastBridge/wet-voice/witness/canary residue."}