diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 876eb1a..5833813 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -221,6 +221,7 @@ Git history and smoke artifacts carry routine proof. `state/evidence.jsonl` shou - Inspection-only initiative synthesis now lives in pure `inspection-participant-factory.ts`, including explicit zero semantic pressure and empty evidence/receipt state. The prompt-inspection CLI no longer fabricates a partial participant inside the orchestration shell. - The remaining-shell audit found the resident daemon still spawns `scripts/run-repo-face-heartbeats.ts` as a fresh child process every observation pulse. This keeps the script as hidden runtime authority and pays Node/TypeScript bootstrap cost once per minute even while inference is paused. The next rebuild must move one typed tick into the app runtime, call it directly from `apps/persona-scheduler/src/index.ts`, and demote the script to a CLI/inspection wrapper. - Resident tick ownership is now in-process. `persona-scheduler-runner.ts` owns one typed tick; `index.ts` serializes direct calls without spawning Node/tsx children; `persona-participant-dispatcher.ts` owns participant projection and live turn dispatch; `persona-prompt-inspection.ts` owns explicit inspection. `scripts/run-repo-face-heartbeats.ts` is a 31-line CLI adapter. A focused negative smoke proves paused dry runs return before any downstream source can become necessary. +- Yggdrasil rollout is verified at code revision `f23bfbd`: deployed initiative smoke passes; two consecutive resident pulses returned `agent_swarm_paused` with zero selected/queued turns; `docker top` showed only `node apps/persona-scheduler/dist/index.js` and no pulse child process. The one-minute observation loop is now actually cheap while paused, rather than merely avoiding model inference after paying process bootstrap. - Direct Face `UPDATE REQUEST` and `BIFROST TOPIC` packets are ignored while `REPO_FACE_BIFROST_ENABLED=false`. Do not debug missing Bifrost jobs as a live failure unless that flag has been deliberately enabled again. - Live model-facing prompt prose has started moving out of executable code. The shared loader is `packages/shared/src/prompt-template.ts`; extracted prompt surfaces live under `prompts/`, including repo Face turn/reviewer prompts, provider wrapper prompts, situational social read prompts, source-grounding reminders, consensus-feed prompts, and repo Face model-smoke scenarios. Code should project data and select prompt names; prompt files should own behavioral prose. - Identity collapse has started. Active bot, worker, MCP repo-identity tools, and Face CTB scheduler paths now load through the canonical Face registry and treat repo Discord identities as compatibility projections. Next bounded move is to finish removing remaining direct conceptual dependence on repo identities, then split the Face turn loop into scheduler, context assembler, prompt renderer, candidate parser, policy gate, and transport adapter. diff --git a/state/evidence.jsonl b/state/evidence.jsonl index b7633fe..af8f1ce 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -439,3 +439,4 @@ {"ts":"2026-07-16T05:25:00Z","type":"implementation","status":"ok","note":"Inspection-only participant synthesis moved into inspection-participant-factory.ts with explicit zero dynamic heat/response pressure and empty evidence/receipt state. The heartbeat shell is now 618 lines and no longer fabricates a partial initiative participant for prompt inspection."} {"ts":"2026-07-16T05:30:00Z","type":"architecture","status":"ok","note":"Remaining-shell authority audit found apps/persona-scheduler/index.ts still spawns scripts/run-repo-face-heartbeats.ts as a new Node/TypeScript child every one-minute pulse. The script therefore remains hidden runtime authority and imposes process/bootstrap churn even while paused. Next cut is a direct in-process typed scheduler runner; the script must become CLI/inspection only."} {"ts":"2026-07-16T05:45:00Z","type":"architecture","status":"ok","note":"Resident Persona scheduling rebuilt around persona-scheduler-runner.ts as one in-process typed tick. index.ts no longer spawns a Node/tsx child per minute; participant dispatch and prompt inspection have named organs; run-repo-face-heartbeats.ts is a 31-line CLI adapter. Pause short-circuit is dependency-injected and smoke-proven before downstream sources, while typecheck, initiative, migration, and CLI dry-run checks pass."} +{"ts":"2026-07-16T05:55:00Z","type":"verification","status":"ok","note":"Idunn deployed f23bfbd on Yggdrasil. Deployed initiative smoke passed; two consecutive resident ticks returned agent_swarm_paused with selected/queued empty and queuedCount 0. docker top showed only the resident node apps/persona-scheduler/dist/index.js process, proving the former per-minute Node/tsx child runner is structurally absent."} diff --git a/state/map.yaml b/state/map.yaml index 8c7080f..aacdc3e 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -292,4 +292,4 @@ rejected_paths: current_status: summary: VoidBot's bot/worker/provider/RAG/Postgres/Qdrant/CultCache structure is live. Repo Face/persona heartbeat jobs run through the direct `openai_api` provider configured for MiMo `mimo-v2.5-pro`, with the expensive state-projector pass still disabled. The 2026-07-04 transport repair replaced the old Bifrost HTTP/token bridge shortcut with typed Bifrost CultMesh Discord command and receipt documents advertised in the Bifrost provider store at `cultmesh://asgard.starfire.bifrost/commands/discord-post`. VoidBot stores the Bifrost target as a CultMesh URI, writes command docs to `E:/Projects/Bifrost/.bifrost/provider-store.cc`, optionally pumps Bifrost's command processor, and waits for typed receipts before completing repo Face Discord delivery. Bifrost's provider advertisement exposes `discord.post` command metadata for Odin/Eve agents, and a bounded Weksa live-fire completed visibly. Eve live state now runs end to end through CultLib dev retained publications, Hermodr ordered SSE, Eve component bindings, and VoidBot typed control state. Receipts acknowledge intent only. Heat initial load, provider-driven change, and browser-command change were visibly verified without reload through the same subscription. - next_action: Keep the Yggdrasil swarm paused. Verify the in-process runner rollout on Yggdrasil: served revision, deployed initiative smoke, repeated paused ticks with zero queueing, and absence of per-pulse child Node/tsx processes. Then map the still-separate Void moderation heartbeat, rumination, mood, and memory-maintenance ownership before moving those organs into the daemon. Do not unpause without an explicit controlled-live-fire decision. + next_action: Keep the Yggdrasil swarm paused. Map the still-separate Void moderation heartbeat, moderation rumination, mood, memory-maintenance, watchdog, and Bifrost-dispatch pulse ownership across the Windows GameCult Local Orchestrator and Yggdrasil daemon. Name owner, inputs, outputs, persistent state, process supervision, and deployment body for each before moving code. The target is daemon-owned organs with typed ports, not blindly folding unrelated policies into Persona initiative. Do not unpause without an explicit controlled-live-fire decision.