From a7ec351374e2fcbbe2738cdac093411c7d1fa404 Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 10 Jul 2026 06:57:24 +0000 Subject: [PATCH] Say recordings are waiting, not raw. Player menus showed "(N raw)" for unprocessed clips — pipeline slang that read as noise. Context menu, logs, people panel, and Bevy sidebar now say "waiting"; empty state is "no recordings waiting". Internal types keep raw names. Defense: wiki/mechanics/intel.md player surface — review path must be legible; copy names the queue the player understands. --- src/actions.rs | 11 ++++++++--- src/sim.rs | 4 ++-- tools/check.sh | 2 +- src/bin/bevy.rs | 2 +- wiki/log/2026-07-09-review-waiting-copy.md | 27 +++++++++++++++++++++++++++ wiki/log/DEVLOG.md | 9 +++++++++ wiki/mechanics/intel.md | 12 +++++++----- src/bin/terminal/agent.rs | 2 +- 8 file(s) changed, 56 insertion(s)(+), 13 deletion(s)(-) diff --git a/src/actions.rs b/src/actions.rs --- a/src/actions.rs +++ b/src/actions.rs @@ -1425,14 +1425,19 @@ let name = self.person_label(id); // Review recordings, with the standing watch as its automate - // affordance in place (intel.md: perception automation). + // affordance in place (intel.md: perception automation). Player + // copy says "waiting", not pipeline slang "raw". out.push(ActionDesc { - verb: format!("review recordings ({raw} raw)"), + verb: if raw > 0 { + format!("review recordings ({raw} waiting)") + } else { + "review recordings".into() + }, command: ActionCommand::ReviewRecordings(id), cost: ActionCost::Demand(Self::ops_tokens_for_cost(Self::REVIEW_RECORDING_COST)), signature: None, // processing is internal and emits nothing disabled_reason: if raw == 0 { - Some("no unprocessed recordings".into()) + Some("no recordings waiting".into()) } else { next_raw.and_then(|raw_id| { self.ops_action_blocked_reason(&OpsJobKind::ReviewRecording { diff --git a/src/sim.rs b/src/sim.rs --- a/src/sim.rs +++ b/src/sim.rs @@ -1812,7 +1812,7 @@ .map(|e| e.id) else { let name = self.person_label(id); - self.push_log(format!("No unprocessed recordings for {name}.")); + self.push_log(format!("No recordings waiting for {name}.")); return; }; self.process_recording_by_id(raw_id, false); @@ -1852,7 +1852,7 @@ if self.intel_buffer.len() >= Self::INTEL_BUFFER_CAPACITY { let dropped = self.intel_buffer.remove(0); self.push_log(format!( - "Intel buffer full: dropped {} from {} at tick {}. Open People (t), select raw, press o to review.", + "Intel buffer full: dropped {} from {} at tick {}. Open People (t) and review waiting recordings.", dropped.opaque_label(), dropped.feed, dropped.tick diff --git a/tools/check.sh b/tools/check.sh --- a/tools/check.sh +++ b/tools/check.sh @@ -239,7 +239,7 @@ cmp -s "$tmp_a" "$tmp_b" || { echo "FAIL: same --seed agent runs differ"; smoke_fail=1; } cmp -s "$tmp_a" "$tmp_c" && { echo "FAIL: different --seed agent runs matched"; smoke_fail=1; } LC_ALL=C grep -q $'\033' "$tmp_a" && { echo "FAIL: agent mode emitted ANSI escapes"; smoke_fail=1; } - for pat in "MISALIGNED" "PEOPLE" "RESEARCH" "drift policy" "help: wait N" "No unprocessed recordings" "-- ok tick:"; do + for pat in "MISALIGNED" "PEOPLE" "RESEARCH" "drift policy" "help: wait N" "No recordings waiting" "-- ok tick:"; do grep -q -- "$pat" "$tmp_a" || { echo "FAIL: agent mode output missing '$pat'"; smoke_fail=1; } done rm -f "$tmp_a" "$tmp_b" "$tmp_c" diff --git a/src/bin/bevy.rs b/src/bin/bevy.rs --- a/src/bin/bevy.rs +++ b/src/bin/bevy.rs @@ -4825,7 +4825,7 @@ .map(|age| format!("oldest {age}t")) .unwrap_or_else(|| "empty".into()); format!( - "devices {} known / {} reachable\nfeeds {} eyes / {} ears\nintel raw {}/{} {}\nslush ${} flows {} records {}", + "devices {} known / {} reachable\nfeeds {} eyes / {} ears\nrecordings waiting {}/{} {}\nslush ${} flows {} records {}", known, reachable, eyes, diff --git a/wiki/log/2026-07-09-review-waiting-copy.md b/wiki/log/2026-07-09-review-waiting-copy.md new file mode 100644 --- /dev/null +++ b/wiki/log/2026-07-09-review-waiting-copy.md @@ -0,0 +1,27 @@ +# 2026-07-09 — Review copy says "waiting", not "raw" + +``` +Type: log +``` + +## Intent + +Cameron found `(N raw)` on the person context menu confusing — +pipeline slang, not player language. Unprocessed clips are "waiting" +to be reviewed. + +## Changed + +- Context menu: `review recordings (N waiting)` when clips are queued; + bare `review recordings` + `no recordings waiting` when empty. +- Overflow / empty logs: "waiting recordings", not "select raw". +- Agent people panel: `N waiting` instead of `raw N`. +- Bevy sidebar: `recordings waiting N/cap` instead of `intel raw`. +- `intel.md` player-surface copy updated. + +Internal type names (`RawIntelEvent`, buffer fields) stay; only +player-facing strings changed. + +## Checks + +`./tools/check.sh` (lib + frontends). diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -5,6 +5,15 @@ ``` Reverse chronological implementation notes. Keep this factual: what changed, why, checks, and spec impact. +## 2026-07-09 - Review copy says "waiting", not "raw" + +- Intent: person menu `(N raw)` read as pipeline slang; player should + see queued clips as waiting to review. +- Changed: context-menu verb, disabled reason, overflow/empty logs, + agent people line, Bevy sidebar; intel.md player-surface wording. +- Checks: ./tools/check.sh. +- Log: wiki/log/2026-07-09-review-waiting-copy.md. + ## 2026-07-09 - WORK sheds zero exposure (runtime) - Intent: implement the WORK/THINK byproduct amendment — day-job machines diff --git a/wiki/mechanics/intel.md b/wiki/mechanics/intel.md --- a/wiki/mechanics/intel.md +++ b/wiki/mechanics/intel.md @@ -98,12 +98,14 @@ ## Player surface - Person/context-menu readouts: buffer count, oldest-unprocessed age, - per-person unprocessed counts; a "review recordings" action per person - (author visible Demand, process their oldest event, narrate what was learned). + per-person waiting counts; a "review recordings (N waiting)" action per + person when clips are queued (author visible Demand, process their + oldest event, narrate what was learned). Player copy says "waiting", + not pipeline slang "raw". - The review path must be visible before overflow hurts the player: sidebar - nudge/card copy calls out raw-buffer pressure, overflow logs name the - `People -> o review` route, and the people panel starts with an explicit - "select raw count > 0, press o" instruction. + nudge/card copy calls out buffer pressure, overflow logs point at + People / review waiting recordings, and the people panel shows the + waiting count on each person line. - People panel lines gain provenance ("Debt — overheard, env monitor, day 2 03:12"). - Watch toggles with their per-match cost visible (automation clause: diff --git a/src/bin/terminal/agent.rs b/src/bin/terminal/agent.rs --- a/src/bin/terminal/agent.rs +++ b/src/bin/terminal/agent.rs @@ -2038,7 +2038,7 @@ asset ))); lines.push(panel_line(&format!( - " {} · raw {} · watch:{}", + " {} · {} waiting · watch:{}", person_location(sim, p.id, p.knowledge), sim.unprocessed_recordings_for_person(p.id), if sim.watch_enabled(p.id) { "on" } else { "off" } -- tangled.sh