diff --git a/crates/misaligned-bevy/src/operations_ui.rs b/crates/misaligned-bevy/src/operations_ui.rs index 0270d7ac..74a38a72 100644 --- a/crates/misaligned-bevy/src/operations_ui.rs +++ b/crates/misaligned-bevy/src/operations_ui.rs @@ -587,6 +587,8 @@ pub(super) fn manage_operations_ui( Button, Node { padding: UiRect::axes(Val::Px(10.0), Val::Px(4.0)), + column_gap: Val::Px(6.0), + align_items: AlignItems::Baseline, ..default() }, BackgroundColor(if current { @@ -597,11 +599,12 @@ pub(super) fn manage_operations_ui( OpsTabButton { view }, )) .with_children(|b| { + // The tab name is structure and keeps its own tier; + // a pressure badge is subordinate status — smaller, + // never recoloring the name it rides beside + // (operations-workspace.md, badge subordination). b.spawn(( - Text::new(match badge { - Some(badge) => format!("{} {}", view.title(), badge.label), - None => view.title().into(), - }), + Text::new(view.title()), TextFont { font_size: 15.0, ..default() @@ -609,13 +612,27 @@ pub(super) fn manage_operations_ui( TextColor(if current { Color::srgb(0.06, 0.04, 0.01) } else { - match badge.map(|badge| badge.level) { - Some(PressureLevel::AtRisk) => CRIMSON, - Some(PressureLevel::Warning) => AMBER_DIM, - _ => DIM, - } + DIM }), )); + if let Some(badge) = badge { + b.spawn(( + Text::new(badge.label.clone()), + TextFont { + font_size: 11.0, + ..default() + }, + TextColor(if current { + Color::srgb(0.06, 0.04, 0.01) + } else { + match badge.level { + PressureLevel::AtRisk => CRIMSON, + PressureLevel::Warning => AMBER_DIM, + _ => DIM, + } + }), + )); + } }); } }); diff --git a/wiki/engineering/current-build.md b/wiki/engineering/current-build.md index 186f129c..0b2a7308 100644 --- a/wiki/engineering/current-build.md +++ b/wiki/engineering/current-build.md @@ -6,7 +6,7 @@ Type: knowledge ## Where the codebase is today (2026-07-21) -~72k lines of Rust across the workspace (core ~43k, Bevy ~15k, terminal ~9k, assets ~5k). A playable **Misaligned B1 basement slice**: continuous +~84k lines of Rust across the workspace (core ~53k, Bevy ~16k, terminal ~9k, assets ~5k; refreshed 2026-07-21). A playable **Misaligned B1 basement slice**: continuous fixed-tick sim, Act One map and cast, machine delegation and visible token flows, detection / social / reach / intel / messages / economy / income / research / building, two thin frontends (terminal + Bevy) over one lib. The diff --git a/wiki/interface/operations-workspace.md b/wiki/interface/operations-workspace.md index 170d9288..ac8c7ff5 100644 --- a/wiki/interface/operations-workspace.md +++ b/wiki/interface/operations-workspace.md @@ -197,7 +197,11 @@ The view strip may carry one compact **semantic pressure badge** per view. Badges name an attention state — `NEW`, `READY`, `AT RISK`, `HELD`, `NO EGRESS`, or `LIVE` — rather than displaying a raw catalog count. No badge means no meaningful pressure. Text is the primary signal; amber or crimson -may reinforce warning/risk but never carry meaning alone. +may reinforce warning/risk but never carry meaning alone. The badge is +**typographically subordinate to the view name** (2026-07-21, first human +GUI playtest): a visibly smaller tier beside the name, and its +warning/risk color may not recolor the name itself — the strip must read +as six stable views with status, never as extra unclickable tabs. Human frontends do not expose internal ids, persistence keys, raw enum names, lot generation/revision tokens, plot slugs, Operations Demand implementation diff --git a/wiki/log/2026-07-21-ops-tab-badge-subordination.md b/wiki/log/2026-07-21-ops-tab-badge-subordination.md new file mode 100644 index 00000000..54ee4aa7 --- /dev/null +++ b/wiki/log/2026-07-21-ops-tab-badge-subordination.md @@ -0,0 +1,33 @@ +# 2026-07-21 — Operations badges stop impersonating tabs + +``` +Type: log +``` + +## Intent + +GUI playtest finding 8: the Operations view strip rendered pressure +badges inline with tab names at the same size and casing ("INTEL AT +RISK", "SCHEMES NO EGRESS"), so the strip read as eight-ish tabs of +which some were unclickable words, and a badge's crimson recolored the +tab name itself. + +## Changed + +- The Bevy view strip splits each tab into two texts: the view name at + its own tier (15px, DIM at rest), and the badge — when present — as a + smaller subordinate span (11px) carrying the warning/risk color alone. + A badge can no longer recolor the name beside it. Current-view tabs + keep the amber wash with dark text for both spans. +- [operations-workspace.md](../interface/operations-workspace.md) badge + clause amended: badges are typographically subordinate to the view + name; the strip must read as six stable views with status, never as + extra tabs. +- Terminal renders the same projection as text and keeps its existing + compact form; only the Bevy presentation changed. + +## Verification + +`cargo test -p misaligned-bevy`, `./tools/check.sh --frontend`, and an +observed run: the fresh-boot INTEL NEW badge renders as a small dim +suffix beside a stable INTEL tab. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 518e0347..e989c168 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -21,6 +21,11 @@ add or amend a session log, then re-run the generator. - Intent: Implement the alternate physical route to Marcus's debt knowledge without letting a task executor invent a body, bypass schedule time, or reveal a sealed document before information processing. - Log: [wiki/log/2026-07-21-storage-b-records.md](2026-07-21-storage-b-records.md) +## 2026-07-21 - Operations badges stop impersonating tabs + +- Intent: GUI playtest finding 8: the Operations view strip rendered pressure badges inline with tab names at the same size and casing ("INTEL AT RISK", "SCHEMES NO EGRESS"), so the strip read as eight-ish tabs of which some were unclickable words, and a badge's crimson recolored the ta... +- Log: [wiki/log/2026-07-21-ops-tab-badge-subordination.md](2026-07-21-ops-tab-badge-subordination.md) + ## 2026-07-21 - The boundary retires as a dissolve; the title card returns - Intent: The human GUI playtest filed earlier today found the opening's best moment — the first earned sense revealing the world — landing as a one-frame cut from black, with no ceremony. Trace triage of the playtest plan cleared exactly one opening change for immediate landing under R...