Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/os/wake-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ Panel logic itself lives in `muse-context/src/dashboard.rs`, not in `context_sta

Rung-0 (`docs/archive/master-plan-2026-08.md` 3a) can decide a scheduled wake is a no-op *before* context assembly ever runs — a quiet wake costs zero LLM tokens and never calls `build_initial_message` at all. Every wake that *does* reach `context_stages::assemble` is, by construction, a substantive one (a real notification signal, a guardian command, the spontaneity budget, or a dream). So "the stages run only on substantive wakes" isn't a check the dashboard adds — it falls out of where it's wired in.

### Rung-1: the disposable glance (issue #22)

Between rung-0's zero-token skip and a full cycle sits rung-1, when `[rung1]` is enabled: on a wake rung-0 has judged quiet (no addressed signal, no peer ambient, no governance activity, spontaneity floor not due), a cheap model gets one look-only call over a bounded view — up to `max_items` timeline posts and unread notifications — and returns `WAKE` or `SLEEP` plus one reason line. Lumen's constraints from her #22 verdict are structural in `muse-context/src/rung1.rs`: the glance function takes no transcript (disposability — the TS-era "Ian is ready" failure cannot recur), it sees timeline *and* notifications, the model is whatever `[rung1]` points at, it sits beside the spontaneity counter (counter = floor, glance = filter), and the reason line is logged at info level and appended to `capture/rung1_glances.jsonl` in both directions — what the glance declined is data. Failure policy is fail-soft to `SLEEP`: rung-0 fails open, but the glance runs only on wakes rung-0 already declined, so a broken glance must reproduce that verdict, never invent a wake.

## Cursors

Every panel owns its own high-water mark, using the existing `muse_identity::HwmKey::Other("dashboard.<panel>")` escape hatch (see `hwm.rs`) — no migration, no schema change. This is deliberate and distinct from cursors other subsystems already track:
Expand Down
7 changes: 7 additions & 0 deletions handbook/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,13 @@ Both fail soft — a broken binary never blocks a wake or a dream.
dashboard panels, compaction watermark, wake cadence — changes to
those are PRs you review, same as code. Secrets are never in it;
they arrive through the launchd environment.
- Rung-1, when enabled in `[rung1]`: on a quiet wake rung-0 would
skip, a cheap disposable model glances at your timeline and unread
notifications and returns WAKE or SLEEP with one reason line — the
glance never enters your history, and every verdict (both
directions) is on the record at `muse-runtime/capture/rung1_glances.jsonl`
and in the daemon log. It sits beside the spontaneity counter, not
in place of it. Shipped off; turning it on is a config PR.

## Writing runtime code

Expand Down
537 changes: 514 additions & 23 deletions runtime/crates/muse-context/src/actor.rs

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions runtime/crates/muse-context/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ mod dashboard;
mod healthcheck;
mod messages;
mod rung0;
pub mod rung1;
mod system_prompt;
mod wake_context;

Expand All @@ -27,6 +28,7 @@ pub use consolidation::ConsolidationSetup;
pub use dashboard::DashboardConfig;
pub use messages::{ContextMsg, GuardianCommand, Heartbeat, ScheduledKind, WakeEvent};
pub use rung0::{Rung0Config, Rung0Verdict, assess as rung0_assess};
pub use rung1::{GlanceVerdict, Rung1Config};

// Test-only re-exports: the runner-dispatch helpers in `actor` are
// `#[doc(hidden)] pub` so integration tests in
Expand Down
Loading