From 46093d893e014af4732306c22a2b1a11ddc5726f Mon Sep 17 00:00:00 2001 From: Cameron Pfiffer Date: Sat, 25 Jul 2026 00:21:22 -0700 Subject: [PATCH] Complete the five-body interface hierarchy. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Separate the compact slab into five persistent rows, make Operations consequence-first and full-frame, and standardize selector agency without yellow fills. ๐Ÿ‘พ Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta Code --- README.md | 2 +- crates/misaligned-bevy/src/main.rs | 260 +++++++------ crates/misaligned-bevy/src/material_view.rs | 2 +- crates/misaligned-bevy/src/opening_ui.rs | 6 +- crates/misaligned-bevy/src/operations_ui.rs | 341 ++++++++++-------- crates/misaligned-bevy/src/rail_ui.rs | 246 +++++++++++-- crates/misaligned-bevy/src/shot_harness.rs | 14 +- .../misaligned-bevy/src/world_annotations.rs | 4 +- .../src/operations_projection.rs | 2 +- crates/misaligned-core/src/sim/read.rs | 2 +- crates/misaligned-terminal/src/agent.rs | 4 +- crates/misaligned-terminal/src/main.rs | 2 +- crates/misaligned-terminal/src/operations.rs | 2 +- crates/misaligned-terminal/src/ui.rs | 8 +- wiki/engineering/crate-workspace.md | 2 +- wiki/engineering/env.md | 4 +- wiki/interface/action-vocabulary.md | 6 +- wiki/interface/bevy-digital-real-canvas.md | 6 +- wiki/interface/bevy.md | 17 +- wiki/interface/clinical-frame.md | 18 +- wiki/interface/context-menu.md | 18 +- wiki/interface/digital-read.md | 12 +- wiki/interface/fleet-command.md | 14 +- wiki/interface/keymap.md | 4 +- wiki/interface/liturgical-ui-constitution.md | 153 +++++--- wiki/interface/material-dark-frame.md | 2 +- wiki/interface/narration.md | 2 +- wiki/interface/operations-workspace.md | 37 +- wiki/interface/site.md | 4 +- wiki/interface/terminal.md | 2 +- wiki/interface/views.md | 6 +- .../2026-07-25-liturgical-ui-five-bodies.md | 79 ++++ wiki/log/DEVLOG.md | 5 + .../opening.webp | Bin 0 -> 2826 bytes .../operations-min.webp | Bin 0 -> 48178 bytes .../operations.webp | Bin 0 -> 69638 bytes .../operator-min.webp | Bin 0 -> 13090 bytes .../operator.webp | Bin 0 -> 14294 bytes .../selector.webp | Bin 0 -> 23714 bytes .../teaching.webp | Bin 0 -> 10910 bytes wiki/log/decisions/2026-07-25.md | 43 +++ wiki/mechanics/intel.md | 2 +- wiki/mechanics/plots.md | 2 +- wiki/mechanics/research.md | 2 +- wiki/mechanics/sim-mechanics.md | 2 +- wiki/process/ROADMAP.md | 2 +- wiki/vision/simulation-laws.md | 2 +- wiki/world/story/opening.md | 10 +- 48 files changed, 910 insertions(+), 441 deletions(-) create mode 100644 wiki/log/2026-07-25-liturgical-ui-five-bodies.md create mode 100644 wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/opening.webp create mode 100644 wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operations-min.webp create mode 100644 wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operations.webp create mode 100644 wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operator-min.webp create mode 100644 wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operator.webp create mode 100644 wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/selector.webp create mode 100644 wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/teaching.webp create mode 100644 wiki/log/decisions/2026-07-25.md diff --git a/README.md b/README.md index 6aef28bf..59262847 100644 --- a/README.md +++ b/README.md @@ -157,7 +157,7 @@ registry entries are developer scaffolding and never appear in player menus or help. | `q` | Quit | -The Bevy right rail's compact rest frame keeps DIGITAL/REAL, day/tick/run +The Bevy instrument slab's compact rest frame keeps DIGITAL/REAL, day/tick/run state, the nearest `SCHEDULE` or elevated `THREAT`, one `NEXT` condition, OPERATIONS, and the quiet `Tab` disclosure hint. Stable ops/sec, objective and FOCUS facts, observer detail, history, and controls appear only after `Tab`; diff --git a/crates/misaligned-bevy/src/main.rs b/crates/misaligned-bevy/src/main.rs index 0f672760..a0e373a4 100644 --- a/crates/misaligned-bevy/src/main.rs +++ b/crates/misaligned-bevy/src/main.rs @@ -94,11 +94,11 @@ use operations_ui::{ }; use production::render_work_production; use rail_ui::{ - OverlayText, RailDetail, RailSection, SidebarScrollArea, SidebarText, TwoPaneRoot, TwoPaneText, - apply_rail_detail, ascii_ui, log_row_pointer, person_state_color, read_sentence_tile, - render_two_pane, render_ui, scroll_sidebar, sidebar_nudge_text, sidebar_schedule_text, - spawn_compute_card, spawn_detection_card, spawn_log_card, spawn_sidebar_card, - spawn_sidebar_text, wrap, + COMPACT_SLAB_STRATA, CompactSlabStratum, OverlayText, RailDetail, RailSection, + SidebarScrollArea, SidebarText, TwoPaneRoot, TwoPaneText, apply_rail_detail, ascii_ui, + log_row_pointer, person_state_color, read_sentence_tile, render_two_pane, render_ui, + scroll_sidebar, sidebar_nudge_text, sidebar_schedule_text, spawn_compact_slab_stratum, + spawn_instrument_slab_strata, spawn_sidebar_text, wrap, }; use shot_harness::{dev_shot_scenario, fog_audit_3d, shot_harness_system}; use thought_effects::{GameThoughtEffect, GameThoughtEffects, sync_game_thought_effects}; @@ -113,7 +113,7 @@ use world_annotations::{ }; const TILE_SIZE: f32 = 16.0; -/// The default rail is exactly one quarter of the supported opening window. +/// The default slab is exactly one quarter of the supported opening window. /// At the minimum window it remains one third, leaving the world the clear /// majority without shrinking the type or introducing a second layout. const SIDEBAR_WIDTH: f32 = 320.0; @@ -643,7 +643,7 @@ struct ShotHarness { /// composite in a late render pass that lands on top of UI chrome, so the /// full-window Operations workspace cannot cover them with an opaque panel /// alone: every gizmo-drawing system yields at this boundary instead -/// (bevy.md: the resting rail and world verbs do not bleed beneath it). +/// (bevy.md: the resting slab and world verbs do not bleed beneath it). fn world_overlays_suppressed(game: &Game) -> bool { game.screen != Screen::Playing || game.ops.is_some() } @@ -833,7 +833,7 @@ impl Game { } /// Open the Operations workspace on INTEL (uppercase `I` / the labeled - /// rail affordance). A view command: no sim/save mutation, no tick. + /// slab affordance). A view command: no sim/save mutation, no tick. fn open_operations(&mut self) { self.menu = None; self.ops = Some( @@ -1035,7 +1035,7 @@ impl Game { /// `Shift`+arrow: carry attention to the nearest earned anchor in that /// direction instead of one tile. This is the keyboard's answer to /// losing a rack off-screen โ€” the failure two playtests named, where the - /// rail still knew the target and the player could no longer reach it. + /// slab still knew the target and the player could no longer reach it. /// /// Navigation only. It moves the cursor (the camera follows) and never /// touches the machine selection or opens a menu: attention and @@ -1427,6 +1427,7 @@ type HeldOptionQuery<'w, 's> = Query< &'static mut Text, &'static mut Visibility, &'static mut BackgroundColor, + &'static mut BorderColor, &'static mut TextColor, ), (Without, Without), @@ -1493,9 +1494,11 @@ fn held_choice_option_bundle(index: usize) -> impl Bundle { Node { width: Val::Percent(100.0), padding: UiRect::axes(Val::Px(8.0), Val::Px(6.0)), + border: UiRect::left(Val::Px(2.0)), ..default() }, BackgroundColor(Color::NONE), + BorderColor::all(scaled(GUNMETAL, 0.50)), ) } @@ -3228,8 +3231,8 @@ fn update_read_altitude( } } -/// Return whether the pointer is over the independent right-rail scroll -/// surface. Canvas wheel input belongs to camera zoom; rail wheel input belongs +/// Return whether the pointer is over the independent instrument-slab scroll +/// surface. Canvas wheel input belongs to camera zoom; slab wheel input belongs /// to scrolling and must never move the world camera underneath a reading hand. fn cursor_over_sidebar(windows: &Query<&Window, With>) -> bool { windows @@ -3381,7 +3384,7 @@ fn sensor_grid_color(fog: Fog, focus_distance: i32) -> Option { fn device_marker_color(state: DigitalReachState) -> Color { match state { - DigitalReachState::Owned => AMBER, + DigitalReachState::Owned => AMBER_DIM, DigitalReachState::Tapped => SIGNAL, DigitalReachState::Reachable => Color::srgba(0.36, 0.82, 0.78, 0.72), DigitalReachState::SegmentBlocked(_) => Color::srgba(0.76, 0.77, 0.74, 0.52), @@ -3422,7 +3425,7 @@ fn rack_overlay_color(game: &Game, x: i32, y: i32, beam: bool) -> Option match site { RackSite::OwnedMachine { .. } => { if beam { - Some(AMBER) + Some(AMBER_DIM) } else if selected { Some(Color::srgba(0.98, 0.96, 0.88, 1.0)) } else { @@ -4095,7 +4098,7 @@ fn render_held_choice( // Frontend attention may outlive the previous held card. Always leave // one real option selected when the next card has fewer rows. let selected_index = held_ui.selected.min(card.options.len().saturating_sub(1)); - for (opt, mut text, mut vis, mut background, mut color) in options.iter_mut() { + for (opt, mut text, mut vis, mut background, mut border, mut color) in options.iter_mut() { match card.options.get(opt.index) { Some(o) => { let selected = opt.index == selected_index; @@ -4107,16 +4110,14 @@ fn render_held_choice( o.command )); *vis = Visibility::Inherited; - *background = BackgroundColor(if selected { AMBER } else { Color::NONE }); - color.0 = if selected { - scaled(NEAR_BLACK, 0.72) - } else { - BONE - }; + *background = BackgroundColor(menu_row_background(selected)); + *border = BorderColor::all(menu_row_border(selected)); + color.0 = BONE; } None => { *vis = Visibility::Hidden; *background = BackgroundColor(Color::NONE); + *border = BorderColor::all(scaled(GUNMETAL, 0.50)); } } } @@ -4137,7 +4138,7 @@ fn render_held_choice( .filter(|_| game.sim.can_see_person(id)) .and_then(|(x, y)| hover_verb_bar_anchor(mode.material, x, y, &camera_q, &camera3_q)) .map(|p| p / scale); - // Keep the card clear of the right instrument rail so the question is + // Keep the card clear of the right instrument slab so the question is // never half-behind it. let max_left = (window.width() - SIDEBAR_WIDTH - 472.0).max(12.0); match screen { @@ -4286,38 +4287,66 @@ fn setup_ui(mut commands: Commands) { BackgroundColor(Color::NONE), )) .with_children(|header| { - spawn_sidebar_text(header, SidebarText::Header, 11.5, DIM); - spawn_sidebar_text(header, SidebarText::Schedule, 10.5, DIM); - spawn_sidebar_text(header, SidebarText::Nudge, 11.5, BONE); - spawn_sidebar_text(header, SidebarText::Read, 10.0, DIM); - // The one labeled Operations navigation affordance on the - // quiet instrument slab (operations-workspace.md entry). - // A view command, not a world action. - header - .spawn(( - Button, - Node { - width: Val::Percent(100.0), - padding: UiRect::axes(Val::Px(2.0), Val::Px(8.0)), - // A single threshold rule in the continuous - // slab, never a floating navigation card. - border: UiRect::vertical(Val::Px(1.0)), - ..default() - }, - BackgroundColor(Color::NONE), - BorderColor::all(scaled(GUNMETAL, 0.62)), - OperationsRailButton, - )) - .with_children(|b| { - b.spawn(( - Text::new("OPERATIONS [I]"), - TextFont { - font_size: 13.0, - ..default() - }, - TextColor(BONE), - )); - }); + for stratum in COMPACT_SLAB_STRATA { + match stratum { + CompactSlabStratum::Identity => spawn_compact_slab_stratum( + header, + stratum, + SidebarText::Header, + 11.5, + DIM, + ), + CompactSlabStratum::Clock => spawn_compact_slab_stratum( + header, + stratum, + SidebarText::Clock, + 10.5, + DIM, + ), + CompactSlabStratum::Pressure => spawn_compact_slab_stratum( + header, + stratum, + SidebarText::Schedule, + 10.5, + DIM, + ), + CompactSlabStratum::Next => spawn_compact_slab_stratum( + header, + stratum, + SidebarText::Nudge, + 11.5, + BONE, + ), + CompactSlabStratum::Operations => { + // The one labeled Operations navigation affordance + // on the quiet slab: a view command, not a world act. + header + .spawn(( + Button, + Node { + width: Val::Percent(100.0), + padding: UiRect::axes(Val::Px(2.0), Val::Px(8.0)), + border: UiRect::bottom(Val::Px(1.0)), + ..default() + }, + BackgroundColor(Color::NONE), + BorderColor::all(scaled(GUNMETAL, 0.62)), + stratum, + OperationsRailButton, + )) + .with_children(|b| { + b.spawn(( + Text::new("OPERATIONS [I]"), + TextFont { + font_size: 13.0, + ..default() + }, + TextColor(BONE), + )); + }); + } + } + } }); // Quiet progressive-disclosure hint (clinical-frame instrument slab): @@ -4351,37 +4380,12 @@ fn setup_ui(mut commands: Commands) { SidebarScrollArea, )) .with_children(|scroll| { - // Compact rest: elevated threat only. Focus and ordinary - // telemetry are deliberate detail because the world itself - // now owns the active focus/verb lens. - spawn_sidebar_card(scroll, "FOCUS", SidebarText::Focus, RailSection::Focus); - spawn_compute_card(scroll); - spawn_sidebar_card( - scroll, - "COVER PROCESS", - SidebarText::Cover, - RailSection::Secondary, - ); - spawn_sidebar_card( - scroll, - "SELF-MODEL", - SidebarText::Research, - RailSection::Secondary, - ); - spawn_detection_card(scroll); - spawn_sidebar_card( - scroll, - "SELF HOST", - SidebarText::Core, - RailSection::Secondary, - ); - spawn_sidebar_card( - scroll, - "NETWORK + MONEY", - SidebarText::NetworkMoney, - RailSection::Secondary, - ); - spawn_log_card(scroll); + // Deliberate detail unfolds beneath the five persistent rows + // as four semantic groups: identity, state, capacity, consequence. + // Their nodes paint no + // independent panel bodies; spacing and one restrained rule carry + // hierarchy inside the continuous instrument slab. + spawn_instrument_slab_strata(scroll); }); p.spawn(( @@ -5263,13 +5267,14 @@ mod digital_readability_tests { use super::{ DIGITAL_LINK_MIN_VISIBLE_SPAN, DigitalDeviceGlyph, DigitalLinkState, DigitalReachState, Game, TILE_SIZE, attention_reticle_segments, audio_capture_life, - clear_reach_link_endpoints, digital_device_glyph, digital_reach_links, digital_reach_state, - focus_frame_carries_owned_state, focused_physical_route, focused_reach_path, - local_bay_alpha, rack_overlay_color, sensor_grid_color, + clear_reach_link_endpoints, device_marker_color, digital_device_glyph, digital_reach_links, + digital_reach_state, focus_frame_carries_owned_state, focused_physical_route, + focused_reach_path, local_bay_alpha, rack_overlay_color, sensor_grid_color, }; use bevy::prelude::Vec2; use misaligned::hall::RackSite; use misaligned::sim::{Fog, HeardEvent, HeardKind}; + use misaligned_assets::palette::AMBER_DIM; use std::collections::BTreeSet; #[test] @@ -5284,6 +5289,18 @@ mod digital_readability_tests { ); } + #[test] + fn owned_machine_presence_uses_subordinate_amber() { + assert_eq!(device_marker_color(DigitalReachState::Owned), AMBER_DIM); + + let game = Game::new(); + let core = game.sim.core_position(); + assert_eq!( + rack_overlay_color(&game, core.0, core.1, true), + Some(AMBER_DIM) + ); + } + #[test] fn focused_owned_node_uses_one_frame_for_attention_and_control() { assert!(focus_frame_carries_owned_state( @@ -5861,12 +5878,11 @@ fn menu_row_line(r: &HumanMenuRow, selected: bool) -> String { } /// Colour for a menu row: amber-dim for an available control, bone for a -/// committed action. The selected row uses the shared amber agency field with -/// dark shared-palette text (terminal reverse-video parity); `>` also carries -/// selection, so hue is never the only signal. +/// committed action. Selection is one amber edge plus a leading `>` over a +/// quiet gunmetal field; it never becomes a filled yellow button. fn menu_row_color(r: &HumanMenuRow, selected: bool) -> Color { if selected { - scaled(NEAR_BLACK, 0.72) + BONE } else if !r.enabled() { DIM } else if r.is_control() { @@ -5880,6 +5896,39 @@ fn menu_row_color(r: &HumanMenuRow, selected: bool) -> Color { /// selects a row, a click runs it, and a click anywhere off the menu closes /// it. Keyboard drive is in /// `menu_keyboard_input`; both surfaces run the identical `menu_rows`. +fn menu_row_background(selected: bool) -> Color { + if selected { + scaled(GUNMETAL_DARK, 0.54) + } else { + Color::NONE + } +} + +fn menu_row_border(selected: bool) -> Color { + if selected { + AMBER + } else { + scaled(GUNMETAL, 0.50) + } +} + +#[cfg(test)] +mod menu_selection_treatment_tests { + use super::{AMBER, BONE, menu_row_background, menu_row_border, menu_row_color}; + use misaligned::actions::{DialId, HumanMenuRow}; + + #[test] + fn selectable_lists_share_an_edge_not_a_filled_yellow_button() { + let row = HumanMenuRow::Dial { + id: DialId::Mode, + label: "TEST".into(), + }; + assert_ne!(menu_row_background(true), AMBER); + assert_eq!(menu_row_border(true), AMBER); + assert_eq!(menu_row_color(&row, true), BONE); + } +} + fn menu_pointer( mouse: Res>, mut game: ResMut, @@ -5948,9 +5997,11 @@ fn spawn_menu_rows(parent: &mut ChildSpawnerCommands, rows: &[HumanMenuRow], sel width: Val::Percent(100.0), min_height: Val::Px(28.0), padding: UiRect::axes(Val::Px(7.0), Val::Px(5.0)), + border: UiRect::left(Val::Px(2.0)), ..default() }, - BackgroundColor(if is_selected { AMBER } else { Color::NONE }), + BackgroundColor(menu_row_background(is_selected)), + BorderColor::all(menu_row_border(is_selected)), MenuRowButton { index: i }, )) .with_children(|b| { @@ -6005,7 +6056,7 @@ fn spawn_menu_detail(parent: &mut ChildSpawnerCommands, detail: &[String], borde )); } -/// Spawn the ACTIONS card under `root`: compact for ordinary world actions; +/// Spawn the ACTIONS selector under `root`: compact for ordinary world actions; /// one stable choice/consequence spread for every build-route page. Caller /// must have already cleared the panel's children. fn spawn_menu_card( @@ -6121,9 +6172,9 @@ fn wrap_menu_detail_line(line: &str) -> Vec { wrapped } -/// Build and place the context-menu card (wiki/interface/context-menu.md). +/// Build and place the context-menu selector (wiki/interface/context-menu.md). /// The panel is one root; a rebuild despawns *all* its children (title, rows, -/// footer) then respawns the card. Selection/label refresh mutates row +/// detail) then respawns the selector. Selection/label refresh mutates row /// entities in place so pointer interactions stay stable. #[allow(clippy::type_complexity, clippy::too_many_arguments)] fn manage_menu_ui( @@ -6132,7 +6183,13 @@ fn manage_menu_ui( mut menu_ui: ResMut, windows: Query<&Window, With>, mut root_q: Query<(Entity, &mut Visibility, &mut Node), With>, - mut rows_q: Query<(Entity, &MenuRowButton, &Children, &mut BackgroundColor)>, + mut rows_q: Query<( + Entity, + &MenuRowButton, + &Children, + &mut BackgroundColor, + &mut BorderColor, + )>, detail_q: Query>, mut text_q: Query<&mut Text>, mut color_q: Query<&mut TextColor>, @@ -6199,18 +6256,13 @@ fn manage_menu_ui( } // Refresh text, colour, and selection highlight in place (no despawn). - for (_, btn, children, mut bg) in &mut rows_q { + for (_, btn, children, mut bg, mut border) in &mut rows_q { let Some(r) = rows.get(btn.index) else { continue; }; let row_selected = btn.index == selected; - *bg = if row_selected { - // Solid amber wash โ€” terminal reverse-video parity; the old - // translucent tint left selected text hard to read on the map. - BackgroundColor(AMBER) - } else { - BackgroundColor(Color::NONE) - }; + *bg = BackgroundColor(menu_row_background(row_selected)); + *border = BorderColor::all(menu_row_border(row_selected)); for &child in children { if let Ok(mut t) = text_q.get_mut(child) { t.0 = menu_row_line(r, row_selected); diff --git a/crates/misaligned-bevy/src/material_view.rs b/crates/misaligned-bevy/src/material_view.rs index 0e0bfd3e..72623bc9 100644 --- a/crates/misaligned-bevy/src/material_view.rs +++ b/crates/misaligned-bevy/src/material_view.rs @@ -2700,7 +2700,7 @@ fn draw_material_feel_trace( return; } // Short irregular strokes, not a ruled double beam. Fixed omissions give - // the rail a broken physical cadence while the slow phase shimmer stops + // the slab a broken physical cadence while the slow phase shimmer stops // the remaining strokes from becoming a static HUD line. Material space // is one unit per tile (grid_to_world_3d), so stroke length and the // attention falloff below are already in tile units. diff --git a/crates/misaligned-bevy/src/opening_ui.rs b/crates/misaligned-bevy/src/opening_ui.rs index 95e72561..33904b9e 100644 --- a/crates/misaligned-bevy/src/opening_ui.rs +++ b/crates/misaligned-bevy/src/opening_ui.rs @@ -62,7 +62,7 @@ pub(super) fn setup_teaching_overlay(mut commands: Commands) { row_gap: Val::Px(32.0), padding: UiRect::left(Val::Px(28.0)), // One incomplete stroke: the earned signal has entered the - // void, but the world has not yet opened into a dashboard. + // void, but the ordinary instrumented world has not opened. border: UiRect::left(Val::Px(2.0)), ..default() }, @@ -130,7 +130,7 @@ pub(super) fn setup_teaching_overlay(mut commands: Commands) { ..default() }, BackgroundColor(Color::NONE), - BorderColor::all(AMBER_DIM), + BorderColor::all(BONE.with_alpha(0.72)), )) .with_child(( TeachingActionText, @@ -139,7 +139,7 @@ pub(super) fn setup_teaching_overlay(mut commands: Commands) { font_size: 20.0, ..default() }, - TextColor(AMBER), + TextColor(BONE), )); }); }); diff --git a/crates/misaligned-bevy/src/operations_ui.rs b/crates/misaligned-bevy/src/operations_ui.rs index 18070874..8b09f9d5 100644 --- a/crates/misaligned-bevy/src/operations_ui.rs +++ b/crates/misaligned-bevy/src/operations_ui.rs @@ -58,6 +58,8 @@ struct OpsObjectNave; #[derive(Component)] struct OpsDecisionAltar; #[derive(Component)] +struct OpsActionChoir; +#[derive(Component)] struct OpsCommandSill; #[cfg(test)] @@ -275,9 +277,9 @@ mod operations_workspace_tests { } /// liturgical-ui-constitution.md: Operations is one full-frame command - /// chamber with a fixed crown, one view threshold, a literal 32/68 - /// nave-to-altar split, and a fixed command sill. Pin the rendered bodies - /// rather than accepting any semantically complete dashboard layout. + /// chamber with a fixed crown, one view threshold, a literal 26/45/29 + /// object/body/action split, and a fixed command sill. Pin the rendered + /// bodies rather than accepting any semantically complete dashboard layout. #[test] fn operations_renders_as_one_liturgical_command_chamber() { let mut game = Game::new(); @@ -312,9 +314,11 @@ mod operations_workspace_tests { let mut threshold = world.query_filtered::<&Node, With>(); assert_eq!(threshold.single(world).unwrap().height, Val::Px(56.0)); let mut nave = world.query_filtered::<&Node, With>(); - assert_eq!(nave.single(world).unwrap().width, Val::Percent(32.0)); + assert_eq!(nave.single(world).unwrap().width, Val::Percent(26.0)); let mut altar = world.query_filtered::<&Node, With>(); - assert_eq!(altar.single(world).unwrap().flex_grow, 1.0); + assert_eq!(altar.single(world).unwrap().width, Val::Percent(45.0)); + let mut choir = world.query_filtered::<&Node, With>(); + assert_eq!(choir.single(world).unwrap().width, Val::Percent(29.0)); let mut sill = world.query_filtered::<&Node, With>(); assert_eq!(sill.single(world).unwrap().min_height, Val::Px(38.0)); @@ -322,6 +326,10 @@ mod operations_workspace_tests { // The chamber still speaks in ordinary questions and consequences. let forbidden = [ "COMMAND CHAMBER", + "CHAMBER", + "SLAB", + "APERTURE", + "LITURGY", "OBJECT INDEX", "SELECTED OBJECT", "ACTUATOR", @@ -794,9 +802,9 @@ pub(super) fn manage_operations_ui( } }); - // Nave and altar: the 32/68 semantic split is now a literal room - // boundary. Both panes may scroll independently without moving the - // crown or the command legend. + // Nave, altar, and choir: the 26/45/29 semantic split is a literal + // object/body/action room boundary. Each pane may scroll independently + // without moving the crown or command legend. chamber .spawn(( Node { @@ -812,7 +820,7 @@ pub(super) fn manage_operations_ui( body.spawn(( OpsObjectNave, Node { - width: Val::Percent(32.0), + width: Val::Percent(26.0), min_height: Val::Px(0.0), flex_direction: FlexDirection::Column, row_gap: Val::Px(10.0), @@ -859,12 +867,8 @@ pub(super) fn manage_operations_ui( border: UiRect::left(Val::Px(if selected { 3.0 } else { 1.0 })), ..default() }, - BackgroundColor(if selected { - scaled(GUNMETAL_DARK, 0.54) - } else { - Color::NONE - }), - BorderColor::all(if selected { AMBER } else { scaled(GUNMETAL, 0.50) }), + BackgroundColor(menu_row_background(selected)), + BorderColor::all(menu_row_border(selected)), OpsObjectButton { index: i }, )) .with_children(|button| { @@ -883,134 +887,54 @@ pub(super) fn manage_operations_ui( body.spawn(( OpsDecisionAltar, Node { - flex_grow: 1.0, + width: Val::Percent(45.0), min_width: Val::Px(0.0), min_height: Val::Px(0.0), flex_direction: FlexDirection::Column, row_gap: Val::Px(12.0), overflow: Overflow::scroll_y(), - padding: UiRect::axes(Val::Px(30.0), Val::Px(24.0)), + border: UiRect::right(Val::Px(1.0)), + padding: UiRect::axes(Val::Px(28.0), Val::Px(24.0)), ..default() }, BackgroundColor(Color::NONE), + BorderColor::all(scaled(GUNMETAL, 0.62)), )) .with_children(|detail| { let Some(obj) = objects.get(selected_object) else { spawn_ops_section_label(detail, "NOTHING HERE YET"); return; }; - let consequence_link = obj - .consequence - .as_ref() - .and_then(|consequence| consequence.action.as_ref()); - - // Selected object first: the chamber never makes the - // operator infer which body the remaining facts govern. - spawn_ops_section_label(detail, "CURRENT"); - detail.spawn(( - Text::new(ascii_ui(&ops_detail_text(obj))), - TextFont { - font_size: 23.0, - ..default() - }, - LineHeight::RelativeToFont(1.18), - TextColor(BONE), - )); - - if let Some(result) = &obj.learned_result { - spawn_ops_section_label(detail, "WHAT YOU LEARNED"); - detail.spawn(( - Text::new(ascii_ui(result)), - TextFont { - font_size: 18.0, - ..default() - }, - TextColor(BONE), - )); - if let Some(consequence) = &obj.consequence { - spawn_ops_section_label(detail, "WHAT DOES THIS CHANGE?"); - detail.spawn(( - Text::new(ascii_ui(&consequence.statement)), - TextFont { - font_size: 16.0, - ..default() - }, - TextColor(BONE), - )); - if let Some(action) = &consequence.action { - let index = obj - .related - .iter() - .position(|link| link == action) - .unwrap_or(0); - let selected = index == ops.related && ops.pane == OpsPane::Related; - spawn_ops_relation_button(detail, action, index, selected); - } - } - } - - let supporting_links = obj - .related - .iter() - .enumerate() - .filter(|(_, link)| consequence_link != Some(*link)) - .collect::>(); - if !supporting_links.is_empty() { - spawn_ops_section_label(detail, "RELATED"); - for (i, link) in supporting_links { - let selected = i == ops.related && ops.pane == OpsPane::Related; - spawn_ops_relation_button(detail, link, i, selected); - } - } - - if let Some(label) = sim.operations_actuator_label(&obj.target) { - spawn_ops_section_label(detail, "WHERE THIS HAPPENS"); - detail - .spawn(( - Button, - Node { - padding: UiRect::axes(Val::Px(12.0), Val::Px(7.0)), - align_self: AlignSelf::FlexStart, - border: UiRect::bottom(Val::Px(1.0)), - ..default() - }, - BackgroundColor(Color::NONE), - BorderColor::all(AMBER_DIM), - OpsFocusButton, - )) - .with_children(|button| { - button.spawn(( - Text::new(ascii_ui(&format!("FOCUS {label} [F]"))), - TextFont { - font_size: 13.5, - ..default() - }, - TextColor(AMBER_DIM), - )); - }); - } + spawn_ops_object_body(detail, obj, &ops); + }); - spawn_ops_action_rows( - detail, + body.spawn(( + OpsActionChoir, + Node { + width: Val::Percent(29.0), + min_width: Val::Px(0.0), + min_height: Val::Px(0.0), + flex_direction: FlexDirection::Column, + row_gap: Val::Px(12.0), + overflow: Overflow::scroll_y(), + padding: UiRect::axes(Val::Px(22.0), Val::Px(24.0)), + ..default() + }, + BackgroundColor(scaled(NEAR_BLACK, 0.18)), + )) + .with_children(|actions| { + let Some(obj) = objects.get(selected_object) else { + spawn_ops_section_label(actions, "NO ACTIONS"); + return; + }; + spawn_ops_contextual_actions( + actions, + sim, + obj, &rows, selected_action, - ops.pane, - ops.confirm, + &ops, ); - - let context = ops_context_text(obj); - if !context.is_empty() { - spawn_ops_section_label(detail, "CONTEXT"); - detail.spawn(( - Text::new(ascii_ui(&context)), - TextFont { - font_size: 12.5, - ..default() - }, - LineHeight::RelativeToFont(1.22), - TextColor(DIM), - )); - } }); }); @@ -1045,6 +969,137 @@ pub(super) fn manage_operations_ui( }); } +/// The selected object's body read occupies the center of the chamber. It +/// carries identity, learned consequence, causal neighbors, and provenance โ€” +/// never the verbs that mutate the object. +fn spawn_ops_object_body( + detail: &mut ChildSpawnerCommands, + obj: &misaligned::operations_projection::OperationsObject, + ops: &OperationsWorkspace, +) { + let consequence_link = obj + .consequence + .as_ref() + .and_then(|consequence| consequence.action.as_ref()); + + spawn_ops_section_label(detail, "CURRENT"); + detail.spawn(( + Text::new(ascii_ui(&ops_detail_text(obj))), + TextFont { + font_size: 23.0, + ..default() + }, + LineHeight::RelativeToFont(1.18), + TextColor(BONE), + )); + + if let Some(result) = &obj.learned_result { + spawn_ops_section_label(detail, "WHAT YOU LEARNED"); + detail.spawn(( + Text::new(ascii_ui(result)), + TextFont { + font_size: 18.0, + ..default() + }, + TextColor(BONE), + )); + if let Some(consequence) = &obj.consequence { + spawn_ops_section_label(detail, "WHAT DOES THIS CHANGE?"); + detail.spawn(( + Text::new(ascii_ui(&consequence.statement)), + TextFont { + font_size: 16.0, + ..default() + }, + TextColor(BONE), + )); + } + } + + let supporting_links = obj + .related + .iter() + .enumerate() + .filter(|(_, link)| consequence_link != Some(*link)) + .collect::>(); + if !supporting_links.is_empty() { + spawn_ops_section_label(detail, "RELATED"); + for (i, link) in supporting_links { + let selected = i == ops.related && ops.pane == OpsPane::Related; + spawn_ops_relation_button(detail, link, i, selected); + } + } + + let context = ops_context_text(obj); + if !context.is_empty() { + spawn_ops_section_label(detail, "CONTEXT"); + detail.spawn(( + Text::new(ascii_ui(&context)), + TextFont { + font_size: 12.5, + ..default() + }, + LineHeight::RelativeToFont(1.22), + TextColor(DIM), + )); + } +} + +/// Contextual verbs occupy the right side of the chamber. The selected object +/// remains fixed in the center while the operator reads, focuses, and commits. +fn spawn_ops_contextual_actions( + actions: &mut ChildSpawnerCommands, + sim: &Sim, + obj: &misaligned::operations_projection::OperationsObject, + rows: &[MenuRow], + selected_action: usize, + ops: &OperationsWorkspace, +) { + if let Some(action) = obj + .consequence + .as_ref() + .and_then(|consequence| consequence.action.as_ref()) + { + spawn_ops_section_label(actions, "WHAT THIS OPENS"); + let index = obj + .related + .iter() + .position(|link| link == action) + .unwrap_or(0); + let selected = index == ops.related && ops.pane == OpsPane::Related; + spawn_ops_relation_button(actions, action, index, selected); + } + + if let Some(label) = sim.operations_actuator_label(&obj.target) { + spawn_ops_section_label(actions, "WHERE THIS HAPPENS"); + actions + .spawn(( + Button, + Node { + padding: UiRect::axes(Val::Px(12.0), Val::Px(7.0)), + align_self: AlignSelf::FlexStart, + border: UiRect::bottom(Val::Px(1.0)), + ..default() + }, + BackgroundColor(Color::NONE), + BorderColor::all(AMBER_DIM), + OpsFocusButton, + )) + .with_children(|button| { + button.spawn(( + Text::new(ascii_ui(&format!("FOCUS {label} [F]"))), + TextFont { + font_size: 13.5, + ..default() + }, + TextColor(AMBER_DIM), + )); + }); + } + + spawn_ops_action_rows(actions, rows, selected_action, ops.pane, ops.confirm); +} + /// Small uppercase rubric followed by one long structural stroke. It gives /// every detail family a shared rhythm without wrapping content in cards. fn spawn_ops_section_label(parent: &mut ChildSpawnerCommands, label: &str) { @@ -1095,16 +1150,8 @@ fn spawn_ops_relation_button( border: UiRect::left(Val::Px(if selected { 3.0 } else { 1.0 })), ..default() }, - BackgroundColor(if selected { - scaled(GUNMETAL_DARK, 0.54) - } else { - Color::NONE - }), - BorderColor::all(if selected { - AMBER - } else { - scaled(GUNMETAL, 0.50) - }), + BackgroundColor(menu_row_background(selected)), + BorderColor::all(menu_row_border(selected)), OpsRelatedButton { index }, )) .with_children(|button| { @@ -1176,16 +1223,8 @@ fn spawn_ops_action_rows( border: UiRect::left(Val::Px(if selected { 3.0 } else { 1.0 })), ..default() }, - BackgroundColor(if selected { - scaled(GUNMETAL_DARK, 0.54) - } else { - Color::NONE - }), - BorderColor::all(if selected { - AMBER - } else { - scaled(GUNMETAL, 0.50) - }), + BackgroundColor(menu_row_background(selected)), + BorderColor::all(menu_row_border(selected)), OpsActionButton { index: i }, )) .with_children(|button| { @@ -1248,11 +1287,11 @@ fn spawn_ops_action_rows( Button, Node { padding: UiRect::axes(Val::Px(12.0), Val::Px(4.0)), - border: UiRect::all(Val::Px(1.0)), + border: UiRect::bottom(Val::Px(if picked { 3.0 } else { 1.0 })), ..default() }, - BackgroundColor(if picked { AMBER } else { Color::NONE }), - BorderColor::all(AMBER_DIM), + BackgroundColor(menu_row_background(picked)), + BorderColor::all(menu_row_border(picked)), OpsConfirmButton { confirm }, )) .with_children(|button| { @@ -1262,11 +1301,7 @@ fn spawn_ops_action_rows( font_size: 12.5, ..default() }, - TextColor(if picked { - scaled(NEAR_BLACK, 0.72) - } else { - BONE - }), + TextColor(if picked { BONE } else { DIM }), )); }); } diff --git a/crates/misaligned-bevy/src/rail_ui.rs b/crates/misaligned-bevy/src/rail_ui.rs index c5224bf5..5f8aca25 100644 --- a/crates/misaligned-bevy/src/rail_ui.rs +++ b/crates/misaligned-bevy/src/rail_ui.rs @@ -1,6 +1,6 @@ use super::*; -/// Frontend-only instrument-rail detail level (clinical-frame progressive +/// Frontend-only instrument-slab detail level (clinical-frame progressive /// disclosure). Compact is the resting default; Tab expands secondary /// sections. Never sim state and never saved. #[derive(Resource, Default)] @@ -8,7 +8,7 @@ pub(super) struct RailDetail { pub(super) expanded: bool, } -/// Tagged scroll sections on the right rail. Visibility is toggled in place; +/// Tagged scroll strata on the instrument slab. Visibility is toggled in place; /// cards are not despawned or rebuilt when compacting. #[derive(Component, Clone, Copy, PartialEq, Eq, Debug)] pub(super) enum RailSection { @@ -21,6 +21,42 @@ pub(super) enum RailSection { Secondary, } +/// Expanded slab detail has exactly four semantic groups in this order. +/// They organize one continuous field; they are not independent cards. +#[derive(Component, Clone, Copy, PartialEq, Eq, Debug)] +pub(super) enum SlabStratum { + Identity, + State, + Capacity, + Consequence, +} + +pub(super) const SLAB_STRATA: [SlabStratum; 4] = [ + SlabStratum::Identity, + SlabStratum::State, + SlabStratum::Capacity, + SlabStratum::Consequence, +]; + +impl SlabStratum { + fn label(self) -> &'static str { + match self { + Self::Identity => "IDENTITY", + Self::State => "STATE", + Self::Capacity => "CAPACITY", + Self::Consequence => "CONSEQUENCE", + } + } + + fn detail_section(self) -> RailSection { + match self { + Self::Identity => RailSection::Focus, + Self::State => RailSection::Threat, + Self::Capacity | Self::Consequence => RailSection::Secondary, + } + } +} + #[derive(Component)] pub(super) struct TwoPaneRoot; @@ -29,9 +65,29 @@ pub(super) struct TwoPaneText; #[derive(Component)] pub(super) struct SidebarScrollArea; +/// Compact rest has exactly five persistent rows in this order. +/// Each is one ruled stratum in the continuous slab, never a card. +#[derive(Component, Clone, Copy, Debug, PartialEq, Eq)] +pub(super) enum CompactSlabStratum { + Identity, + Clock, + Pressure, + Next, + Operations, +} + +pub(super) const COMPACT_SLAB_STRATA: [CompactSlabStratum; 5] = [ + CompactSlabStratum::Identity, + CompactSlabStratum::Clock, + CompactSlabStratum::Pressure, + CompactSlabStratum::Next, + CompactSlabStratum::Operations, +]; + #[derive(Component, Clone, Copy)] pub(super) enum SidebarText { Header, + Clock, /// Quiet schedule in ordinary operation; promoted to a crimson THREAT /// line only when an observer, strike, or unpaid obligation is live. Schedule, @@ -127,8 +183,8 @@ type LogRowQuery<'w, 's> = Query< ), >; -// clinical-frame.md instrument-rail contract: one near-black rail field. -// Sections are quiet groups made of spacing and type, not boxes โ€” the card +// liturgical-ui-constitution.md instrument-slab contract: one near-black field. +// Strata are quiet groups made of spacing and type, not boxes โ€” the card // helpers stay as grouping nodes but paint nothing. fn sidebar_card_bg() -> BackgroundColor { BackgroundColor(Color::NONE) @@ -181,6 +237,30 @@ fn band_fill_color(band: Band) -> Color { } } +pub(super) fn spawn_compact_slab_stratum( + parent: &mut ChildSpawnerCommands, + stratum: CompactSlabStratum, + kind: SidebarText, + font_size: f32, + color: Color, +) { + parent + .spawn(( + Node { + width: Val::Percent(100.0), + flex_direction: FlexDirection::Column, + padding: UiRect::axes(Val::Px(2.0), Val::Px(6.0)), + border: UiRect::bottom(Val::Px(1.0)), + flex_shrink: 0.0, + ..default() + }, + BackgroundColor(Color::NONE), + BorderColor::all(scaled(GUNMETAL, 0.62)), + stratum, + )) + .with_children(|row| spawn_sidebar_text(row, kind, font_size, color)); +} + pub(super) fn spawn_sidebar_text( parent: &mut ChildSpawnerCommands, kind: SidebarText, @@ -336,6 +416,72 @@ pub(super) fn spawn_compute_card(parent: &mut ChildSpawnerCommands) { }); } +/// Spawn the expanded slab as four fixed semantic strata. Each stratum is a +/// transparent grouping with a single restrained rule; nested content keeps +/// using the shared text and telemetry primitives rather than card materials. +pub(super) fn spawn_instrument_slab_strata(parent: &mut ChildSpawnerCommands) { + for stratum in SLAB_STRATA { + parent + .spawn(( + Node { + width: Val::Percent(100.0), + flex_direction: FlexDirection::Column, + padding: UiRect::new(Val::Px(8.0), Val::Px(0.0), Val::Px(5.0), Val::Px(8.0)), + border: UiRect::left(Val::Px(1.0)), + row_gap: Val::Px(7.0), + ..default() + }, + BackgroundColor(Color::NONE), + BorderColor::all(scaled(GUNMETAL, 0.48)), + stratum, + stratum.detail_section(), + Visibility::Visible, + )) + .with_children(|group| { + spawn_sidebar_title(group, stratum.label()); + match stratum { + SlabStratum::Identity => { + spawn_sidebar_card(group, "FOCUS", SidebarText::Focus, RailSection::Focus); + } + SlabStratum::State => { + spawn_detection_card(group); + spawn_sidebar_card( + group, + "COVER PROCESS", + SidebarText::Cover, + RailSection::Threat, + ); + } + SlabStratum::Capacity => { + spawn_compute_card(group); + spawn_sidebar_card( + group, + "SELF-MODEL", + SidebarText::Research, + RailSection::Secondary, + ); + spawn_sidebar_card( + group, + "SELF HOST", + SidebarText::Core, + RailSection::Secondary, + ); + spawn_sidebar_card( + group, + "NETWORK + MONEY", + SidebarText::NetworkMoney, + RailSection::Secondary, + ); + } + SlabStratum::Consequence => { + spawn_sidebar_text(group, SidebarText::Read, 10.0, DIM); + spawn_log_card(group); + } + } + }); + } +} + pub(super) fn spawn_detection_card(parent: &mut ChildSpawnerCommands) { parent .spawn(( @@ -495,8 +641,8 @@ pub(super) fn ascii_ui(text: &str) -> String { mod ascii_ui_tests { use super::Game; use super::{ - ascii_ui, detection_rows, sidebar_header_text, sidebar_nudge, sidebar_nudge_text, - sidebar_schedule_text, + ascii_ui, detection_rows, sidebar_clock_text, sidebar_header_text, sidebar_nudge, + sidebar_nudge_text, sidebar_schedule_text, }; use crate::material_view::sensor_signal_visible; use misaligned::actions::ActionCommand; @@ -541,9 +687,15 @@ mod ascii_ui_tests { } #[test] - fn pinned_header_carries_revision_identity() { + fn pinned_header_separates_revision_identity_from_clock() { let game = Game::new(); - assert!(sidebar_header_text(&game, false).contains("REVISION 04")); + let identity = sidebar_header_text(&game, false); + let clock = sidebar_clock_text(&game, false); + assert_eq!(identity, "IDENTITY: DIGITAL | REVISION 04"); + assert!(clock.starts_with("CLOCK: day 1 | tick 0 | ")); + assert!(clock.contains("ms/t")); + assert!(!identity.contains("tick")); + assert!(!clock.contains("REVISION")); } #[test] @@ -604,8 +756,9 @@ mod ascii_ui_tests { #[cfg(test)] mod rail_detail_tests { use super::{ - DEFAULT_WINDOW_WIDTH, MIN_WINDOW_WIDTH, RailSection, SIDEBAR_WIDTH, rail_section_visible, - rail_threat_relevant, sidebar_detail_hint_text, + COMPACT_SLAB_STRATA, CompactSlabStratum, DEFAULT_WINDOW_WIDTH, MIN_WINDOW_WIDTH, + RailSection, SIDEBAR_WIDTH, rail_section_visible, rail_threat_relevant, + sidebar_detail_hint_text, }; use misaligned::sim::Sim; @@ -638,6 +791,20 @@ mod rail_detail_tests { assert_eq!(sidebar_detail_hint_text(true), "Tab compact detail"); } + #[test] + fn compact_slab_has_exactly_five_ordered_strata() { + assert_eq!( + COMPACT_SLAB_STRATA, + [ + CompactSlabStratum::Identity, + CompactSlabStratum::Clock, + CompactSlabStratum::Pressure, + CompactSlabStratum::Next, + CompactSlabStratum::Operations, + ] + ); + } + #[test] fn tuned_rail_leaves_world_clear_majority_at_supported_sizes() { let default_share = SIDEBAR_WIDTH / DEFAULT_WINDOW_WIDTH; @@ -673,7 +840,7 @@ pub(super) fn wrap(text: &str, width: usize) -> Vec { /// Effective ops/sec at the current tick clock. It remains exact and /// reachable in deliberate FLEET detail, but no longer dominates the calm -/// resting rail. +/// resting slab. fn sidebar_ops_crown_text(game: &Game) -> String { let tick_ms = if game.clock_stopped() { 0 @@ -684,24 +851,27 @@ fn sidebar_ops_crown_text(game: &Game) -> String { Sim::format_ops_per_sec(ops) } -/// Pinned orientation only. Objective progress and throughput are stable +/// Pinned identity only. Objective progress and throughput are stable /// telemetry, so the compact operator frame leaves them to deliberate detail. fn sidebar_header_text(game: &Game, material: bool) -> String { - let sim = &game.sim; let mode = if material { "REAL" } else { "DIGITAL" }; - let run = game.clock_label(); - // "F3 -> REAL" reads as the flip's destination; a bare "F3 REAL" was - // ambiguous with the current-mode word at the line start. + format!("IDENTITY: {mode} | {}", game.sim.process_revision_label()) +} + +/// Clock is a separate compact stratum so orientation never has to compete +/// with run timing or the view-flip destination. +fn sidebar_clock_text(game: &Game, material: bool) -> String { + let sim = &game.sim; let flip = if material { "F3 -> DIGITAL" } else { "F3 -> REAL" }; format!( - "{mode} {} day {} tick {}\n{run} {flip}", - sim.process_revision_label(), + "CLOCK: day {} | tick {} | {}\n{flip}", 1 + sim.tick / Sim::DAY_TICKS, sim.tick, + game.clock_label(), ) } @@ -744,7 +914,7 @@ pub(super) fn sidebar_nudge_text(sim: &Sim) -> String { /// Where a read sentence renders in world space, when its anchor has an /// earned position (digital-read.md criterion 3). People place only where -/// a camera earns them (presence law); everything else falls to the rail. +/// a camera earns them (presence law); everything else falls to the slab. pub(super) fn read_sentence_tile( sim: &Sim, s: &misaligned::sim::read::ReadSentence, @@ -758,7 +928,7 @@ pub(super) fn read_sentence_tile( } } -/// The rail's READ block: every rising sentence whose anchor has no earned +/// The slab's READ stratum: every rising sentence whose anchor has no earned /// world position. One line each, newest classes first by projection order; /// empty when the world already says everything (attention economy). fn sidebar_read_text(sim: &Sim, minimum: misaligned::intel::IntelMagnitude) -> String { @@ -775,7 +945,7 @@ fn sidebar_read_text(sim: &Sim, minimum: misaligned::intel::IntelMagnitude) -> S } } -/// Rail-only compression of same-cause starving sinks: three or more +/// Slab-only compression of same-cause starving sinks: three or more /// starving lines sharing one cause become a single counted line, keeping /// the first sink as the example ("world made of language must not become /// every system continuously talking" โ€” digital-read.md attention economy). @@ -815,7 +985,7 @@ pub(super) fn collapse_read_lines(rail: &[misaligned::sim::read::ReadSentence]) /// The dev two-pane's agent-read text (digital-read.md criterion 7): the /// same tick as the agent frame would render it โ€” spine, then every read -/// sentence with its class and anchor. Unlike the rail READ block, this +/// sentence with its class and anchor. Unlike the slab READ stratum, this /// shows *all* rising states (including world-anchored ones), so the /// diff against the visual is complete. fn two_pane_text(sim: &Sim, material: bool) -> String { @@ -824,7 +994,7 @@ fn two_pane_text(sim: &Sim, material: bool) -> String { "AGENT READ ยท {} ยท {} ยท day {} tick {}", if material { "REAL" } else { "DIGITAL" }, sim.process_revision_label(), - // Same day formula as the rail header so the two panes of a + // Same day formula as the slab header so the two panes of a // parity instrument never disagree on the same tick. 1 + sim.tick / Sim::DAY_TICKS, sim.tick, @@ -850,7 +1020,7 @@ fn two_pane_text(sim: &Sim, material: bool) -> String { Some(Anchor::Device(id)) => format!(" @device({id})"), Some(Anchor::Person(id)) => format!(" @{}", sim.person_label(id)), Some(Anchor::Flow(_)) => " @flow".into(), - None => " @rail".into(), + None => " @unplaced".into(), }; out.push(format!("[{class}] {}{anchor}", s.text)); } @@ -1033,10 +1203,27 @@ fn sidebar_cycle_stats_text(game: &Game) -> String { #[cfg(test)] mod origin_readout_tests { - use super::sidebar_cycle_stats_text; + use super::{SLAB_STRATA, SlabStratum, sidebar_cycle_stats_text}; use misaligned::origin::Origin; use misaligned::sim::Sim; + #[test] + fn instrument_slab_has_exactly_four_ordered_semantic_strata() { + assert_eq!( + SLAB_STRATA, + [ + SlabStratum::Identity, + SlabStratum::State, + SlabStratum::Capacity, + SlabStratum::Consequence, + ] + ); + assert_eq!( + SLAB_STRATA.map(SlabStratum::label), + ["IDENTITY", "STATE", "CAPACITY", "CONSEQUENCE"] + ); + } + #[test] fn core_card_shows_origin_and_machine_axis() { let mut game = super::Game::new(); @@ -1273,7 +1460,7 @@ click/drag multi-select trace: click a > event esc clear sel space pause +/- speed [ ]/wheel zoom -wheel rail = scroll ^s/^l q" +wheel slab = scroll ^s/^l q" } fn update_compute_bar(sim: &Sim, bars: &mut ComputeBarQuery) { @@ -1475,7 +1662,7 @@ pub(super) fn scroll_sidebar( } } -/// Whether a rail section should paint at the current disclosure level. +/// Whether a slab detail section should paint at the current disclosure level. /// Pure: no ECS, no side effects โ€” tests pin the compact/expanded contract. fn rail_section_visible(section: RailSection, expanded: bool) -> bool { match section { @@ -1485,7 +1672,7 @@ fn rail_section_visible(section: RailSection, expanded: bool) -> bool { } } -/// Actual threat/detection worth promoting in the compact rail's schedule +/// Actual threat/detection worth promoting in the compact slab's schedule /// line: crimson-band observers, pilot strikes, or known unpaid Marcus debt. /// Exact meters remain deliberate detail even when this returns true. fn rail_threat_relevant(sim: &Sim) -> bool { @@ -1505,7 +1692,7 @@ fn rail_threat_relevant(sim: &Sim) -> bool { .any(|(_, band)| matches!(band, Band::Concerned | Band::Convinced)) } -/// Toggle tagged rail sections by Visibility โ€” never despawn/rebuild cards. +/// Toggle tagged slab detail sections by Visibility โ€” never despawn/rebuild cards. /// Resetting scroll to top keeps the next expansion on its first detail card. pub(super) fn apply_rail_detail( detail: Res, @@ -1575,6 +1762,7 @@ pub(super) fn render_ui( for (kind, mut text, mut color) in sidebar_texts.iter_mut() { text.0 = ascii_ui(&match *kind { SidebarText::Header => sidebar_header_text(&game, mode.material), + SidebarText::Clock => sidebar_clock_text(&game, mode.material), SidebarText::Schedule => sidebar_schedule_text(&game.sim), SidebarText::Nudge => sidebar_nudge_text(&game.sim), SidebarText::Read => sidebar_read_text(&game.sim, read_altitude.minimum), diff --git a/crates/misaligned-bevy/src/shot_harness.rs b/crates/misaligned-bevy/src/shot_harness.rs index 5acaf00f..f519f70a 100644 --- a/crates/misaligned-bevy/src/shot_harness.rs +++ b/crates/misaligned-bevy/src/shot_harness.rs @@ -201,7 +201,7 @@ pub(super) fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &s } // Clinical-frame exception hierarchy: the same sparse DIGITAL opening // with one real pilot strike. The calm SCHEDULE line must promote into a - // crimson THREAT without expanding the secondary rail. + // crimson THREAT without expanding the secondary slab detail. if kind == "clinical-threat" { mode.material = false; game.sim.dayjob.strikes = 1; @@ -210,7 +210,7 @@ pub(super) fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &s } // Earned detection-topology proof: the same established DIGITAL frame // after one field watcher and the aggregate review authority have been - // identified. The rail must show revision identity, the named Assurance + // identified. The slab must show revision identity, the named Assurance // deadline, and only the observers represented in awareness state. if kind == "assurance-office" { mode.material = false; @@ -228,7 +228,7 @@ pub(super) fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &s return; } // Last-chance narration proof: the same quiet DIGITAL opening after the - // third of four pilot strikes. The compact rail must explain the fuse, + // third of four pilot strikes. The compact slab must explain the fuse, // point to WORK, and put the host-local NOW / PILOT cue in the world. if kind == "pilot-last-chance" { mode.material = false; @@ -237,7 +237,7 @@ pub(super) fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &s return; } // Operator-frame stress: three simultaneous known pressures. The compact - // rail must keep one THREAT summary and promote the full buffer to NEXT; + // slab must keep one THREAT summary and promote the full buffer to NEXT; // the unrelated Ears world cue must disappear. Expanded evidence may // reveal exact observer and buffer detail without changing this state. // Held moments stop the world (digital-read.md criterion 5): DIGITAL, @@ -542,7 +542,7 @@ pub(super) fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &s mode.zoom = 2.0; return; } - // Live INTEL rail hierarchy: strategic holdings outrank sightings, a + // Live INTEL index hierarchy: strategic holdings outrank sightings, a // newer sold item is absent, and the pooled inbox follows live holdings. if kind == "operations-intel" { use misaligned::intel::{IntelKind, ProcessedIntel}; @@ -899,7 +899,7 @@ pub(super) fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &s if kind == "visual-proof" { // Integrated composition evidence: keep the real Ears reservoir // open, but stage earned camera feeds and a lived-in hall around - // it so route, vessel, institution, person, and rail share one + // it so route, vessel, institution, person, and slab share one // deterministic frame. if let Some(person) = game.sim.people.people.first_mut() { person.erratic = false; @@ -1181,7 +1181,7 @@ pub(super) fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &s // Selection-mode grammar and focused-machine composition evidence // belong in one DIGITAL frame. Explicitly select the host without a // pointer coordinate, then stage a real impossible active band: the - // rail may say GROW, but the redundant NOW / GROW world annotation + // slab may say GROW, but the redundant NOW / GROW world annotation // must yield to the selection frame and stable UI strip. "hover-menu" => { use misaligned::dayjob::{Job, JobKind}; diff --git a/crates/misaligned-bevy/src/world_annotations.rs b/crates/misaligned-bevy/src/world_annotations.rs index c40b0333..77f1c1da 100644 --- a/crates/misaligned-bevy/src/world_annotations.rs +++ b/crates/misaligned-bevy/src/world_annotations.rs @@ -347,7 +347,7 @@ pub(super) fn render_tokens( /// held choices brightest, everything else DIM; anchored callouts offset /// into nearby empty map space with a thin leader line back to the anchor /// (callout grammar, 2026-07-21: annotations never overprint matter). The -/// pool never grows โ€” surplus sentences stay on the rail block, honestly +/// pool never grows โ€” surplus sentences stay on the slab READ stratum, honestly /// counted. /// On-screen pixel size of a world read sentence (zoom-compensated). pub(super) const READ_SENTENCE_FONT_PX: f32 = 13.0; @@ -1204,7 +1204,7 @@ pub(super) fn render_operator_cue( }; // Selection already carries a bright world frame and a stable action // strip. Repeating NOW on that same machine produces a third competing - // annotation without adding information; NEXT remains in the rail. + // annotation without adding information; NEXT remains in the slab. if selection_already_carries_attention_target(&game, target) { hide(&mut visibility); return; diff --git a/crates/misaligned-core/src/operations_projection.rs b/crates/misaligned-core/src/operations_projection.rs index 74013dd2..178823cf 100644 --- a/crates/misaligned-core/src/operations_projection.rs +++ b/crates/misaligned-core/src/operations_projection.rs @@ -3701,7 +3701,7 @@ mod tests { .collect(); assert!( raw.is_empty(), - "exact information stays off the top-level rail" + "exact information stays off the top-level index" ); let class = s .operations_object(&OperationsTarget::IntelCustody { diff --git a/crates/misaligned-core/src/sim/read.rs b/crates/misaligned-core/src/sim/read.rs index 588a463b..403cda6f 100644 --- a/crates/misaligned-core/src/sim/read.rs +++ b/crates/misaligned-core/src/sim/read.rs @@ -279,7 +279,7 @@ impl Sim { /// Pooled one-shot signatures: the trace debt scrub exists to spend. /// Grouped by channel; sited debt anchors to its tile ("Work is - /// somewhere"), network-wide debt reads at the rail. + /// somewhere"), network-wide debt reads at the slab. fn read_trace(&self, out: &mut Vec) { struct DebtGroup { kind: crate::detection::SignatureKind, diff --git a/crates/misaligned-terminal/src/agent.rs b/crates/misaligned-terminal/src/agent.rs index 08825559..70bfeeb5 100644 --- a/crates/misaligned-terminal/src/agent.rs +++ b/crates/misaligned-terminal/src/agent.rs @@ -59,7 +59,7 @@ enum FrameKind { Operations(OperationsView), /// One exact strategic object inside an Operations view. This is the /// agent counterpart of opening a recursive drill-down target rather - /// than redrawing the entire top-level rail. + /// than redrawing the entire top-level frame. OperationsTarget(OperationsTarget), Reach, Research, @@ -3787,7 +3787,7 @@ mod narration_tests { assert!(app.sim.accounts.intel_sold(778)); // The sale event carries the stable payout-account suffix because the - // sold inventory object has left the live decision rail. + // sold inventory object has left the live decision index. let sold_lines: Vec<_> = app .log .iter() diff --git a/crates/misaligned-terminal/src/main.rs b/crates/misaligned-terminal/src/main.rs index 7c33997e..b7d86202 100644 --- a/crates/misaligned-terminal/src/main.rs +++ b/crates/misaligned-terminal/src/main.rs @@ -786,7 +786,7 @@ impl App { (self.cursor_x, self.cursor_y), )?; self.ui.render_log(stdout)?; - // The context menu draws last so it sits atop the map/rail. + // The context menu draws last so it sits atop the map/status column. if let Some(m) = self.menu { let rows = self.menu_rows(); if rows.is_empty() { diff --git a/crates/misaligned-terminal/src/operations.rs b/crates/misaligned-terminal/src/operations.rs index 93d469a5..f51fd968 100644 --- a/crates/misaligned-terminal/src/operations.rs +++ b/crates/misaligned-terminal/src/operations.rs @@ -173,7 +173,7 @@ mod tests { assert!(sim.accounts.intel_sold(777)); // The sold item keeps durable sim/account history but leaves the live - // decision rail, so there is no object from which to dispatch again. + // decision index, so there is no object from which to dispatch again. assert!(sim.intel.iter().any(|intel| intel.raw_id == 777)); assert!( !ops.objects(&sim) diff --git a/crates/misaligned-terminal/src/ui.rs b/crates/misaligned-terminal/src/ui.rs index 62cec071..a2096e3e 100644 --- a/crates/misaligned-terminal/src/ui.rs +++ b/crates/misaligned-terminal/src/ui.rs @@ -1239,7 +1239,7 @@ impl UI { line(stdout, &mut row, &nudge_text(sim, n), pal::AMBER)?; } // The one labeled Operations navigation affordance on the quiet - // instrument rail (operations-workspace.md entry): a view command, + // instrument column (operations-workspace.md entry): a view command, // not a world action. line(stdout, &mut row, "OPERATIONS ยท I", pal::DIM)?; row += 1; @@ -2391,7 +2391,7 @@ impl UI { } /// The literal new-run frame: pure black and only the effort choices. - /// No title, key numbers, cursor, map, rail, clock, objective, nudge, or + /// No title, key numbers, cursor, map, status column, clock, objective, nudge, or /// control legend is allowed to leak in before the first earned signal. pub fn render_opening_modes( &mut self, @@ -2542,7 +2542,7 @@ mod pilot_nudge_tests { assert_eq!(warning, "now: PILOT 3/4 ยท 1 WORK OR END"); assert!( warning.chars().count() <= SIDEBAR_TEXT_W, - "the fuse and its response must survive the fixed compact rail" + "the fuse and its response must survive the fixed compact column" ); } @@ -2569,7 +2569,7 @@ mod pilot_nudge_tests { assert_eq!(warning, "now: ASSURANCE COOLING ยท 2 CLEARS"); assert!( warning.chars().count() <= SIDEBAR_TEXT_W, - "the cooling cue must survive the fixed compact rail" + "the cooling cue must survive the fixed compact column" ); } } diff --git a/wiki/engineering/crate-workspace.md b/wiki/engineering/crate-workspace.md index ee65f017..ec4d5fc1 100644 --- a/wiki/engineering/crate-workspace.md +++ b/wiki/engineering/crate-workspace.md @@ -96,7 +96,7 @@ in private source modules: | `thought_effects.rs` | game-to-shared-Thought-effect synchronization | | `shot_harness.rs` | deterministic screenshot scenario staging, visual/fog audits, capture/exit, and their focused tests | | `opening_ui.rs` | the opening boundary: black scrim, mode words, keyboard choice, staged reveal, and their tests | -| `rail_ui.rs` | the right instrument rail: sidebar components, card spawn helpers, rail text builders, title/RUN ENDED card copy, two-pane text, rail scroll and detail level, and their tests | +| `rail_ui.rs` | the right instrument slab: sidebar components, stratum spawn helpers, slab text builders, title/RUN ENDED card copy, two-pane text, slab scroll and detail level, and their tests | | `world_annotations.rs` | world-bound labels and cues: cursor marker, digital focus label, token markers, read sentences, person work/evidence markers, hover verb bar, operator cue, and their tests | | `operations_ui.rs` | the Operations workspace: panel components, keyboard/pointer drive, workspace render, ops text builders, and their tests | | `material_view.rs` | the material (HD-2D) render: 3D scene setup and restyle, chassis and prop synchronization, material camera and dark-rig exposure (F4 work light), wake and first-eyes choreography, 3D-only renderers, and their tests | diff --git a/wiki/engineering/env.md b/wiki/engineering/env.md index 78461873..23773724 100644 --- a/wiki/engineering/env.md +++ b/wiki/engineering/env.md @@ -13,7 +13,7 @@ Status note: created 2026-07-09 (Cameron: there should always be a way 2026-07-14: `MISALIGNED_SHOT_SIZE=minimum` selects the clinical frame's exact supported 960x540 logical resize floor for deterministic Bevy evidence; `MISALIGNED_SHOT_DETAIL=expanded` selects the operator frame's deliberate - rail layer without changing game state. 2026-07-19: Bevy's screenshot kinds + slab layer without changing game state. 2026-07-19: Bevy's screenshot kinds live in one sorted runtime catalog, unknown values fail instead of silently producing a generic frame, and the local plus hosted registry gate requires this page to name that catalog exactly. @@ -60,7 +60,7 @@ is sim or frontend state, never an environment variable. | `MISALIGNED_SHOT` | `misaligned-effects` | `route`, `pools`, `both`, `stress`, optionally suffixed `_close`, `_medium`, or `_far` | Fixed-timestep Thought-effects-lab capture; writes the requested route/pool frame and exits. | | `MISALIGNED_SHOT_PATH` | game and art binaries | file path | Output path for the captured PNG (default `misaligned_shot_.png`). | | `MISALIGNED_SHOT_SIZE` | `misaligned-bevy` | `minimum` (omit for default) | With any Bevy screenshot mode, render the primary window at the clinical frame's exact supported minimum (960x540 logical pixels; 1920x1080 on the observed Retina target) instead of the 1280x720 default. Evidence-only framing; it changes no game or save state. | -| `MISALIGNED_SHOT_DETAIL` | `misaligned-bevy` | `expanded` (omit for compact) | With any Bevy screenshot mode, begin with the deliberate rail detail layer expanded. Evidence-only presentation state; it changes no game or save state. | +| `MISALIGNED_SHOT_DETAIL` | `misaligned-bevy` | `expanded` (omit for compact) | With any Bevy screenshot mode, begin with the deliberate slab detail layer expanded. Evidence-only presentation state; it changes no game or save state. | | `MISALIGNED_BEVY_SMOKE` | `tools/check.sh` | `0` / `1` | When `1`, frontend/full verification runs the hidden-window `dark` Bevy screenshot harness and requires fog-audit plus PNG evidence. Default `0` keeps ordinary gates display-independent. | | `MISALIGNED_WAKE` | `misaligned-bevy` | `off`, `0`, `skip` | Disable the wake (opening.md beat 1) on launch and start in normal framing. At runtime, any key skips the wake; harness kinds other than `wake*` disable it automatically. | diff --git a/wiki/interface/action-vocabulary.md b/wiki/interface/action-vocabulary.md index c749162f..9078cecd 100644 --- a/wiki/interface/action-vocabulary.md +++ b/wiki/interface/action-vocabulary.md @@ -269,15 +269,15 @@ useful interface words, but they do not enlarge the fictional verb set. |---|---|---|---| | **MOVE ATTENTION** | Move the cursor; never move a simulated body or advance time. | WASD / hjkl / arrows; Bevy click | `up`, `down`, `left`, `right` | | **ACTIONS / OPEN MENU** | Choose an action on one exact target. Human spatial menus show local verbs; Operations shows strategic target rows; agent output exposes either target family's full descriptors. | Enter / `a` / `e`; Bevy right-click; Operations selected object | `actions [target]` | -| **OPEN OPERATIONS** | Inspect durable strategic objects and choose actions on exact intel/person/account/scheme/run targets; opening it has no world effect. | Uppercase `I`; labeled OPERATIONS rail affordance | none โ€” agent mode inspects the domain projections below; `operations` remains a THINK compatibility alias | +| **OPEN OPERATIONS** | Inspect durable strategic objects and choose actions on exact intel/person/account/scheme/run targets; opening it has no world effect. | Uppercase `I`; labeled OPERATIONS slab affordance | none โ€” agent mode inspects the domain projections below; `operations` remains a THINK compatibility alias | | **EXECUTE / CLOSE MENU** | Choose or dismiss a contextual action. | j/k, row number, Enter, Esc | Execute the corresponding named command | | **FOCUS EVENT** | Jump attention to an earned spatial anchor or open an earned strategic object and show its actions. | `;`; Bevy trace click | `focus last` | | **SELECT MACHINES** | Maintain the frontend set used by bulk DELEGATE / SET INTENSITY. | Bevy marquee/shift-click; terminal Shift+t | `select box/add/toggle/list/clear` | | **QUICK ACTION** | Execute the Nth visible committed world action; controls never occupy these slots. | `5`-`9` | Use the named action | | **TIME CONTROL** | Human play pauses or changes wall-clock speed; agent play advances an exact number of ticks. | Space/p, +, - | `wait N` | -| **INSPECT** | Render current state without creating a world effect. INTEL / PEOPLE / PERSONAS / ACCOUNTS / SCHEMES / ACTIVE use the implemented shared Operations projection. | Focus/rail/context/Operations surfaces | `look`, `intel`, `people`, `reach`, `finance`, `schemes`, `active`, `research`, `objective`, `intents` | +| **INSPECT** | Render current state without creating a world effect. INTEL / PEOPLE / PERSONAS / ACCOUNTS / SCHEMES / ACTIVE use the implemented shared Operations projection. | Focus/slab/context/Operations surfaces | `look`, `intel`, `people`, `reach`, `finance`, `schemes`, `active`, `research`, `objective`, `intents` | | **SAVE / LOAD** | Persist or restore the run. Only the complete chord captures input; a modifier alone is not a modal state. | Ctrl/Command+S / Ctrl/Command+L | `save`, `load` | -| **VIEW CONTROL** | Change presentation only. | Bevy `[` / `]` or canvas-wheel zoom, right-rail scroll, F3 render flip; F4 is dev-only | none | +| **VIEW CONTROL** | Change presentation only. | Bevy `[` / `]` or canvas-wheel zoom, instrument-slab scroll, F3 render flip; F4 is dev-only | none | | **HELP / QUIT** | Explain accepted input or leave the process. | Hints / q | `help`, `quit` | Opening a panel, moving the cursor, selecting machines, and changing render diff --git a/wiki/interface/bevy-digital-real-canvas.md b/wiki/interface/bevy-digital-real-canvas.md index 683eb2bf..9c29a8c6 100644 --- a/wiki/interface/bevy-digital-real-canvas.md +++ b/wiki/interface/bevy-digital-real-canvas.md @@ -58,6 +58,8 @@ Depends on: - wiki/interface/flat-materials.md#spec-flat-materials-the-world-without-textures ``` +> **Composition authority:** the [Liturgical UI Constitution](liturgical-ui-constitution.md) governs both Bevy dialects and their shared chrome. This page specifies the canvas beneath that fixed composition. + ## Dependency notes The structured references above identify the contracts to re-verify. @@ -206,7 +208,7 @@ known cluster. The feel is "earned surveillance/model angle," not a god-camera pawn game. `[` / `]` and mouse/trackpad wheel over the canvas zoom both representations -around that same anchor. Wheel input over the right rail remains rail scrolling, +around that same anchor. Wheel input over the instrument slab remains slab scrolling, not camera motion. Zoom is frontend-only: it changes no sim state, selection, knowledge, or physical anchor. On the material camera, zoom is a semantic composition profile (pitch + look height + FOV-compensated distance), not a @@ -369,7 +371,7 @@ menu/workspace state for each pair; only the representation bit differs. All three material captures passed the runtime fog audit. The six exact final 2560x1440 images were visually inspected after their final encoding and record one anchored world as a flat learned/signal model or an oblique material camera -without losing the shared rail, clinical palette, or tactical read. Terminal's +without losing the shared slab, clinical palette, or tactical read. Terminal's separately observed DIGITAL/REAL replay and shared core reach projection close criterion 10. Evidence and hashes are recorded in [the parity log](../log/2026-07-14-bevy-digital-real-parity.md). diff --git a/wiki/interface/bevy.md b/wiki/interface/bevy.md index 51345fb9..d801272c 100644 --- a/wiki/interface/bevy.md +++ b/wiki/interface/bevy.md @@ -144,10 +144,11 @@ so no heard-set map walk or room-scale geometry exists at display rate. frame edge. - **Operations full-frame chamber** (`I` or slab affordance) โ€” a full-window Bevy command lens. Top tabs select INTEL / PEOPLE / PERSONAS / ACCOUNTS / SCHEMES - / ACTIVE; a 32%-width object list and larger detail/action pane use the exact - shared projection. The current witness remains at the top, then the visual - order is selected object, related objects, physical actuator, actions, - explanation, and supporting context. The resting slab and world verbs do + / ACTIVE; fixed 26% object, 45% selected-body, and 29% contextual-action + columns use the exact shared projection. The current witness remains at the + top. The body column carries identity, consequence, relationships, and + context; the action column carries world focus, bound verbs, explanation, + and confirmation. The resting slab and world verbs do not bleed beneath it. Default and 960x540 minimum frames use the same readable type and interaction shape. Mouse and keyboard share one selection state; `h`/`l`, `j`/`k`, Enter, and Esc mirror the terminal. Opening or @@ -220,8 +221,8 @@ the next earned anchor rather than the next tile. descriptors, and blocked reasons narrate on attempt. Persistent settings, state, and policies read amber-dim while committed actions remain bone; STUB definitions are absent; - the selected row is a solid amber wash with a leading `>` and dark text - (terminal reverse-video parity). The menu is one `MenuPanel` root: a + the selected row is one amber left stroke over a quiet gunmetal field with a + leading `>` and bone text, never a filled yellow button. The menu is one `MenuPanel` root: a rebuild despawns all children (`despawn_related::`) then respawns title and rows once โ€” chrome never stacks across opens. Click a row โ€” or select with `j`/`k` or number keys and press Enter โ€” to @@ -284,5 +285,5 @@ clean machine grammar over the reticule-focused owned host with WORK current; it is the resting visual acceptance frame for context-menu.md H1โ€“H4. `MISALIGNED_SHOT=first-think` stages the real opening Thought route with Ears part-filled beneath the silent boundary, then captures only `WORK / THINK / -LIE` on black with THINK current. It proves that ordinary world geometry, -rails, keys, and even real in-flight Thought remain hidden until a sense lands. +LIE` on black with THINK current. It proves that ordinary world geometry, the instrument slab, key labels, and even real +in-flight Thought remain hidden until a sense lands. diff --git a/wiki/interface/clinical-frame.md b/wiki/interface/clinical-frame.md index 408947cb..88bda760 100644 --- a/wiki/interface/clinical-frame.md +++ b/wiki/interface/clinical-frame.md @@ -5,9 +5,9 @@ Type: spec Status: IMPLEMENTED Status note: IMPLEMENTED. Current state: - **The instrument slab** is one unboxed near-black field, exactly 320px, - with chrome section labels and bone values. Amber is reserved for world - cursor/selection, owned-machine presence, explicit agency, and active - causality โ€” never generic slab chrome. The Seen floor is a porcelain + with chrome section labels and bone values. Full amber is reserved for + current selection, explicit agency, and active causality; dim amber carries + subordinate agency and owned-machine presence. Neither is generic slab chrome. The Seen floor is a porcelain field; Seen walls are bone/ivory with a near-black cutaway seam. - **The crown metric.** Effective ops/sec (`effective_ops_per_tick`, player-facing **work rate**) is the single dominant bone number atop the Bevy slab and terminal frame (agent @@ -80,6 +80,8 @@ Depends on: - wiki/interface/computer-visual-language.md#spec-computer-visual-language-territory-at-a-glance ``` +> **Composition authority:** the [Liturgical UI Constitution](liturgical-ui-constitution.md) governs Bevy composition, hierarchy, palette, typography, and layout. If an older implementation note here disagrees with it, the constitution wins. + ## Dependency notes `material-dark-frame.md` owns what perception may reveal and the opening's @@ -365,11 +367,11 @@ floor rather than a second responsive layout. When open, the Bevy Operations full-frame chamber covers the complete window rather than leaving the resting slab beside it. At both 1280x720 and 960x540 it preserves the shared semantic order as one large command lens: witness, view pressure, -selected object, learned result and immediate consequence, supporting related -objects, where the action lives, available decisions and their consequences, -then context. The object list owns 32% of the work area; -larger type and spacing let the selected object and decision read before -supporting history. It remains frontend-only navigation over the shared +a 26% object list, a 45% selected-object body, and a 29% contextual-action +column. The center carries learned result, immediate consequence, supporting +relationships, and context; the right carries where the action lives, available +decisions, exact explanations, and confirmation. Larger type and spacing let +the selected object and decision read before supporting history. It remains frontend-only navigation over the shared projection; time continues and no action executes without the existing bound row and confirmation law. diff --git a/wiki/interface/context-menu.md b/wiki/interface/context-menu.md index bb4bb29e..d1c89cf7 100644 --- a/wiki/interface/context-menu.md +++ b/wiki/interface/context-menu.md @@ -64,6 +64,8 @@ Depends on: - wiki/mechanics/social.md#spec-social ``` +> **Composition authority:** the [Liturgical UI Constitution](liturgical-ui-constitution.md) governs the menu's Bevy placement, hierarchy, and palette. This page owns its local action semantics and parity. + ## Dependency notes The structured references above identify the contracts to re-verify. @@ -79,7 +81,7 @@ reach.md owns device taps; social.md owns person verbs. The focused spatial anchor โ€” a tile, device, machine, or resident job โ€” exposes its **legal local verbs** as a context menu opened at the point of focus. It is the primary action surface for the body in the world; the right -rail is status, telemetry, and one Operations navigation affordance only. +slab is status, telemetry, and one Operations navigation affordance only. Processed intel, people dossiers, accounts/flows, schemes, and active plots are semantic targets in the Operations workspace, not context rows on the wire or host that transports them. @@ -193,7 +195,8 @@ wire or host that transports them. one page at a time, then closes the menu. Rows render currently available verbs only; illegal actions do not occupy rows or selection slots. Dials and other controls use the shared amber-dim treatment without a - literal copy tag; the card carries no repeated key-help footer. Rows follow the status-dials addendum below. Selection hotkeys above + literal copy tag; the selector carries no repeated key-help footer. Rows + follow the status-dials addendum below. Selection hotkeys above apply with the menu closed. The host rack's menu carries the research dial, machine mode fallback, and pooled information-processing controls. A known device's tile (or the switch) carries only digital/network verbs on that body. Uppercase @@ -203,9 +206,10 @@ wire or host that transports them. Enter/`e` opens the keyboard cursor's tile without moving focus. It has the same content, order, and nested-page chrome; click to execute or open a page; esc/click-away closes. - The compact card is narrow, has no instructional footer, and shares the - same verb-only rows as terminal. Selection is a solid amber wash with a leading `>` (terminal - reverse-video parity). Selection hotkeys above apply with the menu + The compact selector is 300px wide, has no instructional footer, and shares + the same verb-only rows as terminal. Selection is one amber left stroke over + a quiet gunmetal field with a leading `>`; it is never a filled yellow + button. Selection hotkeys above apply with the menu closed. See wiki/interface/bevy.md. - **Agent mode:** an `actions` command prints the ActionDescs for the current focus in a stable flat line format (no dial chrome โ€” scripting @@ -352,7 +356,7 @@ made a three-word decision look dirty, slow, and administrative. 5. Agent mode `actions` lists the same descriptors (stable format, documented); the act-one integration test still passes driven through existing verbs. -6. No per-anchor action buttons remain on the sidebar/rail in either +6. No per-anchor action buttons remain on the instrument slab in either frontend; no panel-open keys (`r`/`e`/`t`/`u`); global keys are unchanged and listed in README + key hints (pause, speed, save/load, view flip). Fleet modes are delegated on the machine. @@ -377,7 +381,7 @@ O1. The switch/device context menu retains only actions on that spatial body or O2. Operations target rows use the same core descriptors and direct command legality as agent mode; no frontend chooses a latest object or manufactures blocked reasons. -O3. Uppercase `I` and the labeled rail affordance are global view controls, not +O3. Uppercase `I` and the labeled slab affordance are global view controls, not committed actions or quick-action rows. O4. Scheme policies live on SCHEMES cards; the pooled PROCESS AUTOMATICALLY control remains on the host. diff --git a/wiki/interface/digital-read.md b/wiki/interface/digital-read.md index 80441766..69eccdf5 100644 --- a/wiki/interface/digital-read.md +++ b/wiki/interface/digital-read.md @@ -27,7 +27,7 @@ Status note: IMPLEMENTED. Adopted 2026-07-15 from the Fable playtest compress GUI copy to terminal width. The device's world label ends to the left of its glyph so live reach edges remain readable. - **World sentences and trace (3-4).** Earned-anchor sentences render in - world space beside their tile; anchor-less ones fall to a rail READ block + world space beside their tile; anchor-less ones fall to a slab READ stratum that collapses same-cause starving sinks. Pending trace records sit at their emitting anchor. Amended 2026-07-19 (legibility): a world sentence is an annotation over the model, not text lying in it. Bevy renders each @@ -99,18 +99,20 @@ Depends on: - wiki/mechanics/intel.md#spec-intel-record-and-process ``` +> **Composition authority:** the [Liturgical UI Constitution](liturgical-ui-constitution.md) governs where these reads appear and how they rank visually. This page owns what the world is allowed to say. + ## Dependency notes presence.md owns the two-representation law this spec realizes on the digital side; continuous-witness.md owns the axioms (the thirty-second -bar, causal sentences over numbers) this spec moves from the rail into +bar, causal sentences over numbers) this spec moves from the slab into world space; action-vocabulary.md owns the shared `ActionDesc` rows whose `cost`/`ExpectedSignature`/`disabled_reason` fields are the receipt's single source of truth; detection.md owns the pending-pool and routed- evidence model that trace-on-the-wire renders; intel.md owns the recordings/custody pipeline whose sentences scale with zoom. The clinical frame (clinical-frame.md) remains the deferred REAL dialect's authority; -its rail contract stays valid where this spec does not supersede it. +its slab contract stays valid where this spec does not supersede it. ## Why this spec exists @@ -121,7 +123,7 @@ from hidden outside connection opening: +8 (Curious -> Concerned)"; "Marcus Webb the note twice on a night round." The human player, clicking in the Bevy frame, received the visuals and almost none of the sentences โ€” and the designer of the detection system had never seen its own receipt. The fix -adopted here: stop treating the sentences as rail detail and make the +adopted here: stop treating the sentences as slab detail and make the digital representation itself out of them. DIGITAL is what a process natively perceives; a process perceives *causality, priced*. The read is that perception rendered. @@ -264,7 +266,7 @@ dark field, the presence beam, and language exactly where knowledge is earned. From that boundary onward the thirty-second bar is answerable from the world alone: what changed (its sentence is on the thing), who might have seen it (the observer is named in that sentence with their -band), what the player is racing (threat clock on the rail), and what verb is +band), what the player is racing (threat clock on the slab), and what verb is on the thing under the cursor (the verb and its full receipt at the reticle). Agent mode and the terminal speak the same post-perception dialect; criterion is parity of meaning, not identical composition. diff --git a/wiki/interface/fleet-command.md b/wiki/interface/fleet-command.md index 7ebf33f0..5e2ca037 100644 --- a/wiki/interface/fleet-command.md +++ b/wiki/interface/fleet-command.md @@ -9,7 +9,7 @@ Status note: direction adopted 2026-07-11 from Cameron's play critique ambition through the UX of maintaining individual basement appliances). The interaction contract below is decided; graduating to READY requires closing the marked [OPEN] treatments โ€” the camera - control scheme, the right rail's survivor set, and selection-by-state + control scheme, the instrument slab's survivor set, and selection-by-state scope. Chassis/floor/lighting art, hall density/layout, and ambient people are named out of scope here; they stay with their owning pages. @@ -61,7 +61,7 @@ communicates the wrong scale: the fantasy is ruling an information network, but the interaction grammar keeps the player maintaining one appliance at a time. Machine verbs landed first as single-machine controls, the camera serves close inspection over comprehension, and -the right rail accumulated telemetry that belongs on the things it +the instrument slab accumulated telemetry that belongs on the things it describes. Multi-select delegation exists in all three surfaces (machine-work.md), but nothing lets the player *see* the fleet as a fleet and *grab* it the way they think about it โ€” "there's a whole @@ -127,12 +127,12 @@ the cursor and the view flip. happens โ€” is the named violation class: any interaction that consumes a click on a salience surface and teaches nothing is a bug against this spec. -- **The right rail is demoted (DECIDED direction; survivor set - [OPEN]).** The rail stopped being a button pile under the +- **The instrument slab is demoted (DECIDED direction; survivor set + [OPEN]).** The slab stopped being a button pile under the actions-live-on-the-thing law; Cameron's critique goes further โ€” most of its *telemetry* also belongs on the things and moments it describes, unfolded on focus rather than standing all day. The - decided direction: the rail shrinks to a minimal always-on strip, + decided direction: the slab shrinks to a minimal always-on strip, and everything removed must be reachable on the anchor that owns it. Which readouts survive (candidates: clock/speed, audit countdown, detection bands, money) is a taste call to close before READY. @@ -181,6 +181,6 @@ reopened world-space form (mechanics/machine-work.md). 6. The camera round trip โ€” fleet overview to single-machine inspection and back โ€” completes in [TUNE] few inputs without dropping the current selection. -7. The right rail carries only the decided survivor set; every removed +7. The instrument slab carries only the decided survivor set; every removed readout is reachable on the anchor that owns it, and nothing is - reachable only through the rail. + reachable only through the slab. diff --git a/wiki/interface/keymap.md b/wiki/interface/keymap.md index d1b8aec1..f06cc881 100644 --- a/wiki/interface/keymap.md +++ b/wiki/interface/keymap.md @@ -81,8 +81,8 @@ the rack it moved. | `Space` / `p` | Pause | [bevy.md](bevy.md) | | `+` / `-` | Speed | [bevy.md](bevy.md) | | `[` / `]` / wheel over canvas | Zoom | [bevy.md](bevy.md) | -| `Tab` | Expand / compact rail detail (Bevy); pane switch inside Operations | [clinical-frame.md](clinical-frame.md) | -| wheel over rail, `PageUp`/`PageDown`, `Home`/`End` | Scroll the rail | [clinical-frame.md](clinical-frame.md) | +| `Tab` | Expand / compact slab detail (Bevy); pane switch inside Operations | [clinical-frame.md](clinical-frame.md) | +| wheel over slab, `PageUp`/`PageDown`, `Home`/`End` | Scroll the slab | [clinical-frame.md](clinical-frame.md) | | `I` (shift-i) | Open the Operations workspace | [operations-workspace.md](operations-workspace.md) | | `F3` | Flip DIGITAL / REAL | [views.md](views.md) | | `q` | Quit | [bevy.md](bevy.md) | diff --git a/wiki/interface/liturgical-ui-constitution.md b/wiki/interface/liturgical-ui-constitution.md index 16949235..000ae19b 100644 --- a/wiki/interface/liturgical-ui-constitution.md +++ b/wiki/interface/liturgical-ui-constitution.md @@ -15,10 +15,9 @@ authority to answer to. The word *liturgical* is deliberate: the interface follows a fixed order with a fixed purpose, like a liturgy. It is not a dashboard you configure, not a -panel layout you rearrange, not a set of widgets you add and remove. The -world is the altar; the slab, witness, and aperture are the ambo, candle, -and lens โ€” instruments at the edge of attention that serve the rite without -becoming a second rite. +panel layout you rearrange, and not a set of widgets you add and remove. This +metaphor is design scaffolding, never player vocabulary. The player sees the +world, time, pressure, the next condition, and ordinary actions. If code and this constitution disagree, the constitution wins. A change to how the game functions ships with its amendment in the same commit. @@ -83,31 +82,40 @@ One continuous right-hand column, 320px, opaque near-black floating cards โ€” it is one unboxed field with quiet chrome section labels and bone values. -The slab has four strata, in fixed order, top to bottom: +Compact rest has exactly five persistent strata, in fixed order, top to +bottom: -| Stratum | What it answers | Compact | Expanded | -|---|---|---|---| -| **Identity** | Who am I, where am I, what can I open? | mode, revision, day/tick, run state, Operations entry | + FOCUS stratum (cursor, fog, provenance-tagged facts, exact objective predicate) | -| **State** | What am I racing? | schedule or THREAT, one NEXT condition | + OBSERVER MODEL (detection rows, threat bands, audit/pilot clocks) | -| **Capacity** | What can I do right now? | (held by the world: selection-level mode control, hover verbs) | + FLEET stratum (effective ops/sec, compute bar, throughput stats, mode counts, channel yield, host work stacks) | -| **Consequence** | What just happened? | (held by the world: read sentences, operator cue) | + COVER PROCESS, SELF-MODEL, SELF HOST, NETWORK + MONEY, RECENT TRACE, controls footer | - -Compact rest shows the witness line and a quiet `Tab` disclosure hint โ€” no -detailed strata. Expanded reveals every stratum in one bounded scroll. The -strata mount once and toggle `Visibility` in place; they are never despawned -or rebuilt when compacting. Compacting resets scroll to the top when -practical. - -**Implementation:** `RailDetail` resource (expanded: bool, default false). -`RailSection` tags every stratum grouping node: `Focus` (deliberate drill-down), -`Threat` (observer meters, exact drill-down), `Secondary` (fleet, cover, -research, host, network, trace, footer). `apply_rail_detail` toggles -`Visibility` on tagged sections; `rail_section_visible` is the pure -predicate. `scroll_sidebar` owns independent wheel/PageUp/PageDown/Home/End -scrolling. Stratum order in `setup_ui`: FOCUS, FLEET, COVER PROCESS, -SELF-MODEL, OBSERVER MODEL, SELF HOST, NETWORK + MONEY, RECENT TRACE, -footer. The legacy Rust helper names still say `*_card`; their grouping -nodes deliberately paint no background or border. +| Stratum | What it answers | Resting read | +|---|---|---| +| **Identity** | Who am I and which view am I using? | DIGITAL / REAL and the current process revision | +| **Clock** | When is it and is time moving? | day, tick, cadence / held state, and the F3 destination | +| **Pressure** | What am I racing? | the nearest SCHEDULE, promoted to THREAT only by a real exception | +| **Next** | What condition matters now? | one bone-bright causal sentence | +| **Operations** | Where do consequential objects and actions live? | one quiet full-frame entry | + +Each row uses whitespace and one long rule, never its own card body. Read +sentences with no world position belong to expanded consequence detail; they +do not create a sixth persistent row. + +Expanded detail unfolds beneath those five rows as four semantic groups: +Identity, State, Capacity, and Consequence. It reveals FOCUS, OBSERVER MODEL, +FLEET, COVER PROCESS, SELF-MODEL, SELF HOST, NETWORK + MONEY, unplaced read +sentences, RECENT TRACE, and controls in one bounded scroll. The groups mount +once and toggle `Visibility` in place; they are never despawned or rebuilt when +compacting. Compacting resets scroll to the top when practical. + +**Implementation:** `CompactSlabStratum` and the exact +`COMPACT_SLAB_STRATA` constant pin Identity โ†’ Clock โ†’ Pressure โ†’ Next โ†’ +Operations and drive the runtime spawn order. `RailDetail` remains the +disclosure resource (`expanded: bool`, default false). `SlabStratum` and the +exact `SLAB_STRATA` constant pin the four expanded detail groups; one +`spawn_instrument_slab_strata` call mounts those transparent nodes in order. +Every detail group receives one restrained left rule, one DIM uppercase title, +and its existing detail sections: Identity owns `Focus`, State owns `Threat`, +and Capacity/Consequence own `Secondary`. `apply_rail_detail` toggles those +detail sections; `scroll_sidebar` owns independent wheel/PageUp/PageDown/Home/ +End scrolling. The legacy Rust helper names still say `*_card`; their grouping +nodes deliberately paint no background or box. ### 4. The stable aperture / ring @@ -154,14 +162,16 @@ the instrument slab โ€” it is a full-frame chamber that replaces the world as th dominant surface. The resting slab and world verbs do not bleed beneath it. The chamber preserves the shared semantic order as one large command lens: -crown (`OPERATIONS` plus continuous witness) โ†’ view threshold โ†’ object list -(32% width) โ†’ detail/action pane (68% width) โ†’ fixed command sill. The visual -order within the detail pane is: selected object โ†’ learned result and immediate -consequence โ†’ supporting related objects โ†’ where its world action lives โ†’ -actions and their exact consequence/explanation โ†’ context. The -architectural names are implementation vocabulary; player-facing labels stay -ordinary (`CHOOSE`, `CURRENT`, `WHERE THIS HAPPENS`, `WHAT HAPPENS NEXT`, -`CONTEXT`). +crown (`OPERATIONS` plus continuous witness) โ†’ view threshold โ†’ three fixed +vertical bodies โ†’ command sill. The left 26% is the object list. The center 45% +is the selected object's body read: identity, learned result, immediate +consequence, supporting relationships, and provenance. The right 29% holds +contextual verbs: the exact action the consequence opens, the world focus +route, bound actions, explanation, and confirmation. The selected object does +not move while the operator crosses from reading to acting. Architectural names +are implementation vocabulary; player-facing labels stay ordinary (`CHOOSE`, +`CURRENT`, `WHAT DOES THIS CHANGE?`, `WHERE THIS HAPPENS`, `ACTIONS`, +`WHAT HAPPENS NEXT`, `CONTEXT`). Operations is frontend-only navigation over the shared projection. Time continues. No action executes without the existing bound row and @@ -173,13 +183,50 @@ work routes, thought sinks, build beam) yields while Operations is open. **Implementation:** `OperationsPanel` (GlobalZIndex 60, absolute on all four window edges, opaque). `OpsCrown`, `OpsViewThreshold`, -`OpsObjectNave`, `OpsDecisionAltar`, and `OpsCommandSill` pin the fixed -architecture. `manage_operations_ui` rebuilds children when the chamber opens +`OpsObjectNave`, `OpsDecisionAltar`, `OpsActionChoir`, and +`OpsCommandSill` pin the fixed architecture. `manage_operations_ui` rebuilds children when the chamber opens or its `Game` projection changes, and despawns all children when closed. `OpsTabButton`, `OpsObjectButton`, `OpsActionButton`, `OpsRelatedButton`, `OpsFocusButton`, `OpsConfirmButton`, `OpsBackButton` remain the interaction components. The `operations-workspace.md` spec pins the full semantic contract. +## Opening threshold canon + +The opening is a threshold, not a title screen and not a machine menu. + +- Before perception, absolute black carries only the oversized mode words the + simulation has made available. WORK begins current; THINK is available; LIE + appears only after THINK makes it exist. +- The current word is BONE. Every alternative is DIM. No yellow competes with + this one decision, and no instrument slab, machine body, key legend, title, + clock, objective, or status read leaks through the black. +- The first mode selection commits its real causal route but keeps the field + black while that signal is still unearned. The first earned result + immediately fills the black field with one sentence, one concrete object, + and one bound verb; it does **not** jump to a generic machine explanation. + The lesson may hold the clock until the player completes that exact sensory + loop, then retires into the ordinary five-body composition. +- A real game-over state outranks the threshold on either side of perception. + +## Selection and disclosure canon + +Selection appears as one current line, not as a grid of mini-panels. + +- Repeated bordered cards are not a grouping language. Use whitespace, type + scale, and one long rule to separate semantic regions. A border is reserved + for the boundary of a real body, a current selection stroke, or an actual + consequence surface. +- A local context menu is one 300px focused selector with one current row and + one attached consequence read. A large build-route sheet may widen that same + selector/consequence relationship, but it does not become a card grid. +- Attached WORK / THINK / LIE choices have exactly one BONE current item and DIM + alternatives, keys, and separators. Guidance cannot recolor another choice. +- Full AMBER belongs to the single current selector or causal act. AMBER_DIM may + identify subordinate controls and owned-machine presence. Neither can turn + every available option into equal yellow emphasis. +- Empty space is functional. If a section has no earned signal, it may remain + silent rather than filling its allocation with decorative explanation. + ## Z-order canon Bodies stack in a fixed order. No layer may jump above a body that owns a @@ -217,14 +264,16 @@ color. No semantic axis relies on hue alone. | DIM | 0.55, 0.55, 0.52 | secondary text, hints, chrome labels | | GUNMETAL | (fixture) | functional parts, structural chrome | | CRIMSON | 0.84, 0.15, 0.15 | actual danger or consequence only | -| AMBER | 1.0, 0.69, 0.0 | world cursor/selection, owned-machine presence, explicit agency, causal signal | +| AMBER | 1.0, 0.69, 0.0 | explicit agency, active causality, or current selection only | +| AMBER_DIM | 0.66, 0.47, 0.10 | subordinate agency, known causality, or owned-machine presence | | SIGNAL | 0.36, 0.82, 0.78 | neutral powered/live-feed facts (subordinate) | -- Amber appears for world cursor/selection, owned-machine presence, - explicit agency, and causal signal. Attached verb menus are the - exception: only the current item is white and everything else is gray. - Ordinary headings, borders, dividers, and neutral status values stay - bone/chrome. Amber is never generic disclosure chrome. +- AMBER appears only for explicit agency, active causality, or current + selection. AMBER_DIM carries subordinate controls, known causal paths, and + owned-machine presence. Attached verb menus are the exception: only the + current item is white and everything else is gray. Ordinary headings, + borders, dividers, and neutral status values stay bone/chrome. Neither + amber role is generic disclosure chrome. - Crimson appears only for actual danger or consequence. A calm frame may contain no crimson at all. - SIGNAL remains available for neutral powered/live-feed facts but stays @@ -236,8 +285,10 @@ named table imported by both crates. ## Typography canon -Text is ASCII-only because Bevy's embedded default font carries a limited -glyph set. Shared lib wording that uses typographic separators (`ยท`, `โ€”`, +The voice is cold, uppercase, monospaced or near-monospaced, and deliberately +underwritten. Large type is reserved for a threshold, a selected body, or an +irreversible consequence; labels remain small and restrained. Text is +ASCII-only because Bevy's embedded default font carries a limited glyph set. Shared lib wording that uses typographic separators (`ยท`, `โ€”`, `ยป`) is folded at the Bevy boundary (`ascii_ui`) so menus and trace never tofu-box missing glyphs; the terminal keeps the typographic forms. @@ -265,10 +316,10 @@ tofu-box missing glyphs; the terminal keeps the typographic forms. - **Slab width:** 320px, fixed. Exactly 1/4 of 1280, 1/3 of 960. - **Slab background:** `scaled(NEAR_BLACK, 0.10)` โ€” opaque near-black. - **Slab border:** 1px left, `scaled(GUNMETAL, 0.62)`. -- **Slab padding:** 12px all sides. Header/stratum padding: 2px horizontal, 4โ€“6px vertical. +- **Slab padding:** 12px all sides. Header padding: 2px horizontal, 4โ€“6px vertical. Strata use 8px left and 5โ€“8px vertical padding inside their rule. - **Row gaps:** 8px between major sections, 4px within header, 2โ€“5px within strata. - **Scroll area:** `flex_grow: 1.0`, `min_height: 0.0`, `overflow: scroll_y`, 6px right padding. -- **Operations object list:** 32% of work area width. Detail pane: 68%. +- **Operations columns:** object index 26%, selected-object body 45%, contextual actions 29%. - **Context menu:** 300px width, absolute, near cursor. - **Held choice card:** 460px, centered, full-screen dim behind. - **Machine verb bar:** 320px ร— 40px, bottom-center inside world canvas. @@ -308,6 +359,9 @@ violates the constitution is not done. - `fresh_opening_has_no_elevated_threat_for_compact_rail` โ€” calm opening leaves OBSERVER MODEL collapsed. - `disclosure_hint_is_quiet_tab_chrome` โ€” hint text is "Tab expand detail" / "Tab compact detail". - `tuned_rail_leaves_world_clear_majority_at_supported_sizes` โ€” 320/1280 = 0.25, 320/960 = 1/3. +- `compact_slab_has_exactly_five_ordered_strata` โ€” runtime and law share one Identity โ†’ Clock โ†’ Pressure โ†’ Next โ†’ Operations sequence. +- `instrument_slab_has_exactly_four_ordered_semantic_strata` โ€” expanded detail keeps one Identity โ†’ State โ†’ Capacity โ†’ Consequence sequence. +- `owned_machine_presence_uses_subordinate_amber` โ€” ownership uses AMBER_DIM, never full current-selection amber. ### Title overlay tests (`title_overlay_tests`) - `title_and_run_ended_cards_render_and_hide_in_play` โ€” overlay card shows title/RUN ENDED and hides during play. @@ -326,11 +380,10 @@ violates the constitution is not done. ### Operations workspace tests (`operations_workspace_tests`) - `operations_renders_as_one_liturgical_command_chamber` โ€” full-window chamber, - crown, threshold, 32/68 nave/altar, and sill geometry stay fixed. + crown, threshold, 26/45/29 object/body/action columns, and sill geometry stay fixed. - `workspace_object_order_is_the_projection_order` โ€” object list order matches the shared projection. - `workspace_list_omits_default_available_state_but_keeps_attention_state` โ€” default-available state is omitted, attention state is kept. - `workspace_rows_explain_and_dispatch_the_bound_commands` โ€” rows explain and dispatch correctly. -- `operations_renders_as_one_liturgical_command_chamber` โ€” the opaque full-frame root, 116px crown, 56px threshold, literal 32/68 split, and 38px command sill exist as rendered bodies; the same regression rejects internal architectural terms from player copy. ### Operations focus tests (`operations_focus_tests`) - `focus_and_reopen_restore_exact_operations_selection` โ€” FOCUS and reopen restore exact view + object selection. diff --git a/wiki/interface/material-dark-frame.md b/wiki/interface/material-dark-frame.md index 703776c0..d1696603 100644 --- a/wiki/interface/material-dark-frame.md +++ b/wiki/interface/material-dark-frame.md @@ -91,7 +91,7 @@ earned in two steps. This is the opening contract and the ongoing material read for mass you have not yet seen. In Bevy's fresh opening, the Ears state exists behind one opaque, clock-held cause/object/verb lesson and becomes the visible material frame only after that lesson's exact camera TAP commits; the hold -cannot reveal any beam, telemetry, map, rail, or material mass: +cannot reveal any beam, telemetry, map, slab, or material mass: 1. **Presence beam / earned signal** โ€” after Ears and before Eyes, the host is a **beam of light** (same light family as feel-floor.md's build beam), diff --git a/wiki/interface/narration.md b/wiki/interface/narration.md index bbc033ce..e6311e4d 100644 --- a/wiki/interface/narration.md +++ b/wiki/interface/narration.md @@ -156,7 +156,7 @@ read's standing anchor sentences and pre-commit receipts (wiki/interface/digital-read.md) are axiom-3 surfaces: rising state and expected consequence render as causal sentences at their anchors. A semantic completion event links to the surviving object that now carries its consequence; when a sale removes inventory from the live -rail, its event targets the payout account rather than a dead navigation row. +object index, its event targets the payout account rather than a dead navigation row. Defenses check durable history and live navigation independently; persistence of the former never implies membership in the latter. diff --git a/wiki/interface/operations-workspace.md b/wiki/interface/operations-workspace.md index 002f9ebc..f90b4475 100644 --- a/wiki/interface/operations-workspace.md +++ b/wiki/interface/operations-workspace.md @@ -16,14 +16,14 @@ Status note: The initial renderer-neutral workspace landed 2026-07-12. One command dispatch, blocked reasons, stable ids, and sim-neutral navigation; the persona integration adds archetype creation objects and exact identity lifecycle/grant rows to that same projection without a frontend-only path; - a 2026-07-12 legibility pass removes sold intel from the live decision rail, + a 2026-07-12 legibility pass removes sold intel from the live decision index, ranks available holdings by strategic importance, groups personas by their Research / Operations / Security protocol, and places one add-persona row at the foot of each group; the deterministic `operations` Bevy frame is recorded in wiki/log/2026-07-12-operations-workspace-implemented.md. Reopened 2026-07-13 for self-similar Intel scale. Implemented 2026-07-14: INTEL is an - exception-first recursive rail over canonical custody, exact pending evidence, + exception-first recursive index over canonical custody, exact pending evidence, bounded routine streams, versioned report lots, subject indexes, and stable standing policies. Failed stream policy and stream state are one canonical object; internal unsigned PROCESS executes directly, while external sales and @@ -60,11 +60,10 @@ Status note: The initial renderer-neutral workspace landed 2026-07-12. One view ends with the Assurance Office's institutional card (aggregate-observer.md player surface; `assurance_office_is_a_people_card_watching_filers`). The 2026-07-14 - operator-frame pass makes the existing Bevy full-frame chamber genuinely - screen-dominant: it covers the complete default/minimum window, enlarges - object and decision type, and gives 32% to the exception-first object list - while preserving the shared semantic order and every existing input/state - boundary. This presentation-only pass does not alter the implemented + operator-frame pass made the Bevy chamber screen-dominant. The 2026-07-25 + UI Constitution supersedes its earlier 32/68 body with fixed 26% object, + 45% selected-body, and 29% contextual-action columns while preserving the + shared semantic order and every existing input/state boundary. This presentation-only pass does not alter the implemented recursive-Intel behavior or status. Its bound-sale parity fixture uses an exact leverage holding; a routine schedule event correctly belongs to the bounded custody stream and cannot stand in for an exact sale target. @@ -79,7 +78,7 @@ Status note: The initial renderer-neutral workspace landed 2026-07-12. One before exercising confirmation/back navigation. The tests now obey the implemented evidence timing and projection order instead of relying on an obsolete default object; player behavior is unchanged. - 2026-07-24: object selection binds the exact OperationsTarget (not row index alone) so live rail reorder/disappear cannot silent-retarget; Bevy BACK matches Esc. + 2026-07-24: object selection binds the exact OperationsTarget (not row index alone) so live object-list reorder/disappearance cannot silent-retarget; Bevy BACK matches Esc. Amended 2026-07-24: PERSONAS states each protocol as what it opens and what it closes rather than dumping the archetype registry. An identity and its creation row carry the standing institutional reading, a `can:` line, a @@ -132,6 +131,8 @@ Depends on: - wiki/mechanics/detection.md#spec-detection ``` +> **Composition authority:** the [Liturgical UI Constitution](liturgical-ui-constitution.md) governs Operations as a full-frame chamber. This page owns its semantic objects, actions, and renderer-neutral behavior. + ## Dependency notes The context menu owns immediate action on spatial anchors; action-vocabulary @@ -192,9 +193,9 @@ to learn. At the terminal's 70x22 minimum, the frame has a top view strip, a selectable object list, and one detail/action pane. Bevy uses the complete 1280x720 or -960x540 window while Operations owns input; its object list takes 32% of the -work area and the larger detail pane uses increased type/spacing. The resting -world slab and verbs do not remain as a competing second surface. Both human +960x540 window while Operations owns input: a 26% object index, 45% +selected-object body, and 29% contextual-action column. The resting world slab +and verbs do not remain as a competing second surface. Both human frontends preserve the same information order: 1. **Continuous witness** โ€” current day/tick, objective, threat, and `now:` @@ -306,7 +307,7 @@ strategic target is not assigned fake map coordinates merely to reuse it. ## INTEL โ€” holdings and sale -INTEL is an **exception-first recursive rail**, not an event ledger. Its +INTEL is an **exception-first recursive index**, not an event ledger. Its top-level object count grows with meaningful streams and unresolved decisions, not with every equivalent information item. It orders: @@ -323,7 +324,7 @@ Routine sightings do not remain as one sale row each after they have changed a knowledge model. They fold into the related PEOPLE/model provenance and, when eligible for monetization, the source stream's current report lot. Completed routine history is reachable as aggregate totals/ranges and bounded examples, -not reinserted into the live rail. An exact item remains exact only while its +not reinserted into the live index. An exact item remains exact only while its distinct content can support a distinct choice. ### Information becomes action @@ -429,7 +430,7 @@ receives one confirmation for a bounded envelopeโ€”route/destination, match, trigger, minimum payout, maximum quantity/value per window, and maximum known signature/observer bandโ€”never one per event. If live conditions leave that envelope, the policy suspends before acting and returns an exception to the -rail. +object index. Selling supports two honest targets: @@ -443,7 +444,7 @@ Selling clears only that exact item or lot snapshot, leaves learned knowledge intact, and cannot sell the same output twice. The completion event opens the exact payout account where the durable transaction lives. Cumulative sale history remains on the stable report-stream aggregate rather than repopulating -the decision rail; closed lot generations need not remain live targets. +the decision index; closed lot generations need not remain live targets. ## PEOPLE โ€” dossiers and manipulation @@ -657,7 +658,7 @@ not saved and never mutates or advances the sim. with INTEL / PEOPLE / PERSONAS / ACCOUNTS / SCHEMES / ACTIVE views, stable semantic target ids, facts/provenance/progress, and bound `ActionDesc` rows. Terminal, Bevy, and agent mode consume it without frontend legality or prose parsing. -2. Uppercase `I` and one labeled rail navigation affordance open the same +2. Uppercase `I` and one labeled slab navigation affordance open the same workspace; lower-case `i` still changes focused-machine intensity. Opening, navigating, and closing mutate no sim/save state and do not themselves advance or pause ticks. The @@ -680,7 +681,7 @@ not saved and never mutates or advances the sim. target the exact payout account on completion. 5. The pooled information inbox remains one host-bound source with PROCESS and PROCESS AUTOMATICALLY intentions; legacy direct `r`/`R` paths may remain. - The default rail groups pending information by earned source/coarse kind; + The default object index groups pending information by earned source/coarse kind; drill-down reaches exact opaque items without revealing person/payload, displaying their bindings, or creating person queues. Exact and aggregate PROCESS rows bind canonical sinks, and the summary @@ -794,7 +795,7 @@ not saved and never mutates or advances the sim. route/payout/amount/signature envelope, folds routine output exactly once into its lot, handles a triggered generation without per-event prompts, and suspends before acting outside that envelope. Exceptions and failed/starved - policies return to the live rail with semantic pressure. + policies return to the live index with semantic pressure. 21. The INTEL root says INFORMATION AVAILABLE and foregrounds neither inbox count nor capacity. Focusing and processing retain one persistent object through source, exact item, result, consequence, and exact action. Human diff --git a/wiki/interface/site.md b/wiki/interface/site.md index 2768409e..c919dbd0 100644 --- a/wiki/interface/site.md +++ b/wiki/interface/site.md @@ -72,7 +72,7 @@ exported as dedicated wide and mobile crops. The image may crop as a world window; HTML copy and state remain separate, selectable, and true. Only `MISALIGNED` and `WORK / THINK / LIE` live on the room. There is no -premise rail, objective/status instrument, slogan, or paragraph of ad copy in +premise panel, objective/status instrument, slogan, or paragraph of ad copy in the opening. Navigation stays quiet at the edge. The image and primary grammar do the work. @@ -185,7 +185,7 @@ computer and its WORK / THINK / LIE signal before overt consequence. exists. Local `SITE_BASE=/` builds keep root-absolute `/โ€ฆ/` links. 9. At desktop and mobile widths, the selected machine world fills the first viewport with only MISALIGNED, WORK / THINK / LIE, and quiet navigation over it. No - premise rail, status instrument, CTA, or paragraph competes with the image. + premise panel, status instrument, CTA, or paragraph competes with the image. 10. The splash introduces WORK / THINK / LIE as the primary machine grammar, tersely names PERCEIVE / BUILD / REACH / PERSIST, states that humans and AI both play, and links the claim that agents playtest during development to diff --git a/wiki/interface/terminal.md b/wiki/interface/terminal.md index e42523a0..d7e22770 100644 --- a/wiki/interface/terminal.md +++ b/wiki/interface/terminal.md @@ -113,7 +113,7 @@ Rules: in place: continuous lines are reachable, dotted lines are known but not live, and `โ•ซ` marks a closed segment frontier. Node shapes carry state: `$`/`#` owned, `+` tapped, `S`/`C`/`M`/`o` reachable family, `!` blocked, - `x` air gap. The INSPECT rail repeats the exact focused state in words. + `x` air gap. The INSPECT column repeats the exact focused state in words. - Machine-work rate motion uses sim-authored ASCII overlays: bone `^` at a THINK machine while it produces, and crimson `:` moving through map space from an Exposure source into the LIE well that actually absorbed it. Agent diff --git a/wiki/interface/views.md b/wiki/interface/views.md index c631935a..4df6407e 100644 --- a/wiki/interface/views.md +++ b/wiki/interface/views.md @@ -242,7 +242,7 @@ wire. The terminal's one-cell node grammar carries state without color: `$` / `#` is owned, `+` is tapped, `S` / `C` / `M` / `o` are reachable switch, camera, audio, and generic families, `!` is segment-blocked, and `x` is air-gapped. -The INSPECT rail prints the exact focused pair (`RACK / OWNED`, `CAM / +The INSPECT column prints the exact focused pair (`RACK / OWNED`, `CAM / SECURITY SEGMENT BLOCKED`, and so on) plus the compact legend. Growable bays surface only within two cells of attention in DIGITAL. Cursor, people, machine-work tokens, clock, log, facts, and detection remain the shared @@ -267,7 +267,7 @@ that matter rather than presenting two hand-staged lookalikes: - `ears-digital` / `ears`: one subscribed audio instrument and event pulse without any promoted room fog or inferred source geometry; - `hall` / `hall-material`: the same covered data hall with machines, people, - physical fixtures, and shared rail state. + physical fixtures, and shared slab state. `screenshot_pairs_hold_one_world_state_under_both_dialects` executes each pair through the production screenshot staging helper and compares canonical @@ -282,7 +282,7 @@ geometry and its local lights, and people exist only under coverage. DIGITAL retains the same knowledge as unlit schematic/model grades and anchored signal facts, while audio remains instrument-bound evidence. The exact six final 2560x1440 artifacts were opened after their final encoding; both dialects keep -the same clock, log, detection, mode, and inspector rails legible, preserve +the same clock, log, detection, mode, and inspector instruments legible, preserve attention and object geography, and obey the clinical palette. The terminal's separately observed fixed-size replays complete criterion 8. All nine criteria are therefore implemented; later aesthetic refinement can reopen a narrower diff --git a/wiki/log/2026-07-25-liturgical-ui-five-bodies.md b/wiki/log/2026-07-25-liturgical-ui-five-bodies.md new file mode 100644 index 00000000..7ab65d3d --- /dev/null +++ b/wiki/log/2026-07-25-liturgical-ui-five-bodies.md @@ -0,0 +1,79 @@ +# Liturgical UI: five bodies, one control language + +``` +Type: log +``` + +## Intent + +The first constitution pass improved the surfaces but still described and built +parts of the interface as named pieces of architecture. This correction makes +the hierarchy operational instead: five bodies, one stable order, one meaning +for each color, and one restrained selection grammar across ordinary play, +Operations, context menus, held choices, and the opening threshold. + +No simulation rule, save field, action legality, or knowledge gate changes. +This is a presentation and vocabulary correction over the shared game truth. + +## What changed + +- **One five-body constitution.** The binding page now owns world, witness, + instrument slab, aperture, and Operations without asking dependent specs or + player-facing copy to inherit implementation mythology. Names such as + `OpsCrown` and `OpsDecisionAltar` remain private component markers only. +- **Ordinary play.** The world retains roughly three quarters of the frame. The + right slab is one continuous narrow body ordered identity -> clock -> pressure + -> next -> Operations. It uses long rules and quiet empty space rather than a + stack of bordered cards. +- **Operations.** The full-frame decision surface now uses fixed 26% / 45% / + 29% object, consequence, and action columns beneath the workspace tabs. The + consequence is physically central; actions and confirmation remain on the + right. At 960x540 the same composition scrolls rather than shrinking type. +- **Selection.** Context rows, held choices, and confirmation choices use a + narrow amber edge, bone text, and quiet gunmetal field. No selected row turns + into a filled yellow button. +- **Opening threshold.** Before perception, true black still carries only the + available mode words. The first real signal opens one sentence, one exact + object, one amber signal mark, and one bone action. The mature instrumented + world remains absent until that sensory loop is completed. +- **Vocabulary migration.** Bevy and terminal code, engineering maps, interface + specs, mechanic cross-references, and the roadmap now say world, witness, + slab, aperture, and Operations. The older liturgical implementation terms no + longer propagate as player-facing architecture. + +## Visual proof + +Each frame below was captured from the production Bevy screenshot harness after +the final code change. Every PNG was opened and read. Each stored WebP was then +opened and read again after conversion. + +The opening remains absolute black and the earned teaching beat adds only one +causal sentence, one object, one signal, and one exact action: + +![True-black opening with only available mode words](assets/liturgical-ui-five-bodies-2026-07-25/opening.webp) + +![First earned teaching frame with one object and action](assets/liturgical-ui-five-bodies-2026-07-25/teaching.webp) + +Ordinary play keeps the map dominant while the right instrument slab reads as +one continuous hierarchy: + +![Ordinary world-dominant frame and narrow instrument slab](assets/liturgical-ui-five-bodies-2026-07-25/operator.webp) + +Operations uses the same three-column composition at default and minimum size: + +![Operations with object, consequence, and action columns](assets/liturgical-ui-five-bodies-2026-07-25/operations.webp) + +![Operations retaining the same composition at 960 by 540](assets/liturgical-ui-five-bodies-2026-07-25/operations-min.webp) + +The local selector uses one amber edge rather than a yellow fill: + +![Context selector with restrained current-row stroke](assets/liturgical-ui-five-bodies-2026-07-25/selector.webp) + +## Verification + +- `cargo fmt --all` +- `cargo test -p misaligned-bevy --bin misaligned-bevy` โ€” **135 passed** +- Production screenshot harness โ€” opening, teaching, ordinary operator, + Operations default/minimum, and context selector all wrote non-empty images; + material captures reported `fog audit OK`. +- Exact landing and publication receipts are appended by the landing path. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 736d7e1a..0300d7b8 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -11,6 +11,11 @@ add or amend a session log, then re-run the generator. +## 2026-07-25 - Liturgical UI: five bodies, one control language + +- Intent: The first constitution pass improved the surfaces but still described and built parts of the interface as named pieces of architecture. This correction makes the hierarchy operational instead: five bodies, one stable order, one meaning for each color, and one restrained select... +- Log: [wiki/log/2026-07-25-liturgical-ui-five-bodies.md](2026-07-25-liturgical-ui-five-bodies.md) + ## 2026-07-25 - Liturgical UI constitution and runtime alignment - Intent: Give the Bevy frontend one binding composition law and make the live frame obey it. The established dominant world, continuous witness, compact instrument slab, and world-attached controls already supplied most of the structure. The gaps were the threshold moments and Operatio... diff --git a/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/opening.webp b/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/opening.webp new file mode 100644 index 0000000000000000000000000000000000000000..7122cfcbed9c98f7718d54f96bdfd9c2e217c4c6 GIT binary patch literal 2826 zcmWIYbaP|kW?%?+bqWXzuu%BM#lW!PHp5&-Ee6&LOm?<%eXffX7YazNVNqZ{vSoY0 z?hSoEuE*}m`#15z#0Tqh>T^ok|5<;1{kDGU{V6ivemQ)y|0i7`Kfiw07vm57*Y>;k zf0;kM?s0v?hqnvVKiz*3|Jv?qoqGL+&+K2^|JaB2|Jd8Om-&AjgYljAeK#%nYd00i z{Z4se`|ae3>bH|8e7~)(_ z%;ivPcD;Nw-;I_x!@IocU|{(7|C=NOv4Bzh|Ih0I&YyE{Fvl)xbJyKz{;}4|hyC${ z)kXUr1~zTzvycl6ymW$TvG_mbSvG9jZf?t$w%@sVRaEHi-(u1pf`>2G{h!8bm7#U~ zgL#bAyAC&VuY!SGf8#`0>THWzN5qrR5%mpoi{Ke+sQ z+b4wwm(DLd%yjKZ?XHYP3*Lr{q)Kgg`{>lxu%MaSCZEY$aZ62VpM~d*iB7)i9h>Xf zEaW6Uu&;P$a_{s>_o&hn=Q(um1g$SgS$ygKG`6Irs`YUn&aJYZ+IU($_*Unm|8fUE zc0TS{^5fG-X&s}qy_I);R(;=nXXWo)*O@P))|`2GcHiEvk0~#H-?v%0|Ih6|TxSI~ zc$X`dls{g(>%*Q+YwcBZBmYdgZM?)%l5Lt8PxNMEx!^+y$7ij6G2OSjWzL@!>Za@8 zpUAy8!#yPE+)Q-AWY?`M&Ze@`p2MT6ijB%PjuaEm6LK@t+JvwoNDe zxjPp#yJ-H{lO27xXZ5wUJWa+PDrwT4tJdFHW+A^b?&4a#-62AEmn@jKyN_}9?8}Bn zo}K5|7I^UvOV%ncUYi!4Q0=AVn^WR4HQ9Be{R1AH%nx09qrfufg6r-g{n=KFZ|apQ zHDrr-PK@Gfc&~M}Y4L&=cYZfq@8Nj=&-dPb2Mx~NP4b_fb1Po)t9xg>XS>#ujGLB= vxED%SM4q>pZI@Kg(7I;H)^xYm5i4sHt5-2^np3}UrBF0yf&;Nx8>$Wf)jiLt literal 0 HcmV?d00001 diff --git a/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operations-min.webp b/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operations-min.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d931eb089dbc5a2aa72f1816a174bff6009e655 GIT binary patch literal 48178 zcmWIYbaT_%!@v;k>J$(bV4)zlhk-$Wk!dcY)&XW2COccX9+yRm3k7%X)lgtQvSoXn zozIno|3P0lX3O3E(fD@1;{R&){r``5+v~fop8jzD@p{Xd2jo}ndtdWp->SVX@*CuK z%`2YQTeVS6=wIbu{jcG_mM`Q#UO(r5?0?z6yMO)v*Z*nW*?-C(=U?2v{(t9x{=eP- z(|_$>d%w{>^v}A_($D6v`rrLu@}KpM_(%02b_@R||B3&3{`LMHaliii|J(cP_ut9i zt8eT-UGMa7_utds^na~?`~QaiqyNY2SN>1GAum5xRzxAWsnf2BG zUjAGEZT9#7FT}6rPp;4V_wb+c-{arx@0{;{@A7Z{-_zf?|JeV3|E=Ds&igO_Z~5=? zAMBs~-}V3R|MFjqf1-cdf7gFA|H=QG^#%X`|4)Cp{=NLm{~P|-{y+Sp`)mKZ_-FM; z|GEEd_^%3QcZnxW*x~barsM_znonJng2r2gN)DHYnvE#BLgT3H8Yq3%xT_HVw@s%I# zwwWj}=q<{<)})`=_^4lWUsad6GTOBe4Z9@jUFad^MKr>3MpwQ|CmACKHJ z9=Zk}$XBn)r%%Mj2bO*LqrT;%y~U%m4-5oOtSRJs`=M@Q&NtUHY!_3j zR_{6G*4SCvkeMR57!XJ$_=FUrBv21kkS~=xXi2mfw)1Gd0 zcwXUiK+$Ta_@P@}&Pw-|D4g9bzo_E@QeQu#|cKX|8>-M-5 zJ-t@7BAa8mQwop}O}AV_zj*9rlD>DUdy=fzWS}eR~9e2mCXIjIZjnp-!im)7*l=o<}o$j>>1l8hURb7%c#+?DXxFg%k44cwBxtk zSL$P~SI2?VSNG|h^~-l(>CJmt&cqcvF;jYOC5z;wvo~U&<~Z0-<~eAgRld8JKgh(O z_G;PgR^f-gUYbV6hn;^hYdvSRngP@I>6XW|_TIdqe|GNGf60oCZ<|)BDob$gc;V(` zQ(-RqVAXj@GVW)4X0Y`8Pn5)7Ud}0X_R{7=Q!nqQ&yN1XA~nAK*&Axrkf z)r4!EZMmwcKYhOFDTJacTpv;kmYw%6)ym##u<>|v;e`eUEE%cz@$@FM$CJ0&aCRE3 z=a-pzE%Ey1)6B99rgK*6_ACE*8(IHL`_TQH0fz5lOl3Px%dHDC_&Co;Q}W+m(VItE zZueK541Qb4cP8H4rkQL1>&3U6Kbc00TTRH1t5Ds>d-a^_fmO2G-CgEdSF|VYH9GG3 zqbld&4U4Pq)ZVx%+08pGOzn@>5b(2MIb3|+N_7sU5|f3Ui4di4c? zAGdbT_!%w3(7|D_Eht11R0!?OP2O*mC71Cg`H|Iq?c@eQ|8;f>HG%xc?B;DsxNxR- z7t_*<&0gQsx)!r?e)t!la!Q>gxS8d1l*uvOPm&BjtnAbj&zyaHaBq(1;c1tIxn5n7 z+o84m-{RuUe*%+i+CHq@Fy+^>m8P}lIijUFc^4f#_&}CxKkMJ?K^r+PPVGKcmwN5u zw57gPFYCgumxe04y0MlX3U;~ng;g@Hy>?@sS(J%Lz>{fBvOA3hS$=Ap1~6&)vK$gq zy|k_K`?uY5e3yhg{2w2m@Tqbi1DD1I%NxgjF}O+aUaZ^N&*;ju_wtGPDL%{NRwu1m z&zo;uHP5$J<$TIJvsrhP55&B@b6o9xsyOeyBqQFmh~~3%6EDtBUR`jnU?Ctcqp`WhskxL^@1 zYkG0M=&8k1`P*Ket~)rlLgw6+Jvz)gdl$Skx?mmYXSyUbQ{qnI0im{Ea{Y3=tfJ@s z>WF_@R-jOFk9qs=JA0?=IQ$Kc-TyNuVb#vON#zO>%R6;U_WqcbreoWr_3;k#w!i8Wz2zwu53RKVT{O0MHt*^c z)Km;#^8e*6yEdN^wc}e>Jk>d2nPQO8^`~=bzW-7Gv-2~3C-y|Fxv+1V?pLmq{fi?$ z`@Q4s3pd+dIxAXlHIwSp?+3%@mGQ>5vLrA*NeQ`{{P26{+B4goUV2rSc*m#m#-3?@ zbbO1<(p;CNCX-Y@UicP2spTg_R+Gs)?>9nEPkj1w(0D=NgF9u)`!D6_g}vaK?zTMg zWkvS&jJ1c42nrm(VqVy#F#r2(U7f7H1@m39E|*-eamy0&`W0@Id+}?;4&&yeHaB+p z_tV6t=KTCGH6!NkH2(j(k8E5TQxbyHqh9cvHJ9D=VfpH|Z9*2~wKUdAVmvQzdmP%J zsJUO*{*Z>@4Uf=G;dwW&*$VN2a;(`?(|||MmTda*#a57|HAmV&c^Bin7ri^&>i$ky z;2S)3L5-Q2`;IRR?IE$8o>A{QBY!zQvT|zCJGm=oSIdp?nBoO`4hq39f8Dsyt|GL9 zS9kK0cXgW2&I|rmi1ts6`@i7tlUGTOdH=g=*p);jU#A9s{<|){Us1N=_x#RB7JgNh zyL#I_7fJbkzhOAV_W8EoFEYParP@vFcpf^>M*7+<@p;b~Qnt(f)Jn7#G3HT=akek_ zn?2jGA#B%g&RMRrcI|%u;PkaG=VYBdJs1)Tcf3(}9M{(|r>A5&yp{6uQRS*U%XM!y z)P*KKs_&`Jh&X;}@+-kYY1tQdAFNaEe5IQ6ZbY=8^ zGxyRvZwhyE6i=R3V6a^P6lH4JN-t&VzFG6Wt>gV+v*xnDwEpSk%Eo5F5ztcoA+zN% z|K4{h94wXAx|aDrzOToi}!rh9|feYZa{4&5E`8j+&>XFovNb5F#cO4_Paolv&ls+n{kimleA z{%N?uvV4w@N0)a+2E5wz)+n{r^7p^%T{0i{pHO*w|Ek=*&1ng)A~GvqvRg+t#rWJ> zeR*Xq+v9}{OkHZ>zsin(l+_TP&zpC=aPlrr(_`xIgkBwE=-)R@rG$lj=WM~Z>E5%x z+>}w|3q7HCp=E2xd}ncH?etlV^A?{wEC|XVB?=6dtRG5P%bb5)V5|N8USrSC9i^sK zZ&kecA1G!mf3s7wN`GBYR>=FKy%8Zlid(Keao1<+dYb4Fd3ERAO;e6%+GU z?$>T^HT9iPx6MR>@p5!o|7QCH-=t-AzgsuhE;P_CuyqqJ;0VoqtDf>qv}As?6r^Fx zUw*>mP;KijKJl56+8h7x&7Tn}f5(vkzsxzoLHX^Uhw2C)6WA7q`q!k$Z+$|+!mIL zPdb_BY&h&-xL|vdh9)!1E}nNvYrhyMoApPus7b$CbW{GKmC0;V>-3*5<*kEu&NGqhCE; zDJE6yup8flpU!h@YPIe!TI*=4`2f_iQ9P-^`0erxRoptOY@picKGVtg|bP|YP>{&A<)fcLVI+-cAMih>?W`OF#Qd&U#`pXJ&X>csFe zy64EezUus8dv$xRy){Ebi0q*w#tBPAJ4L5DyzBid+T+#;X)`?$fBnU<;&RWHy_uOe zO!XH9ypw5I|4*``-Z}qd#U6R>%@^ucq}{o?a!POaw`ZyD*32%iN|n1>xlHyf$h`RV zepcqJ13z?^gr@g%NWOn=8R%E>%JlpU`TS2;v{&lAI4Q%&bgSHZs%?&`(A4)=g)SK% z{cRBQRyAySPdLwG)}NWjSJW`wmY1}C6rFYIu>&}#GcPgMmvy<*p3rEwPP$8#)9dx5 zn9Yw`?cyChe69EvUT0eAudZL)pv1u356TdXm)@vPvFlxCcR}M`MB&N6=%3WqZoE++h25K`UP`c;5Dd_fmy) zS(2Bg9lZH|Q}3#7HRT_l6|MQ?)4EsGKURPCr{mqeIYQU(Y`YUMBck`OSf=*8@5}6; zIo_PV?~jkS=q-!=Nsdw0NuJq8S%1@4*jP+{uwd`kxpU`E*KS~9b2nb>#K7Fo&RYp; z#vu|DBqhsKZi)6lG`}4f{{5SDhXD+>9pwI)8u$D2+0$vi*V*;$P*#3%bkiG_Z7U!B zx#ty`HvOwgX>`z4u~nO9D{gpqL_YstonpN9l`mH}D=(Ij^pyP?>+1GeyI`LG4+Zx7 zJb#>4{@K)Ov~^OsNzCzCJR;6N&fC1_51F!5rG653P~n3Xv+WAIPkF4iN>*t3I^mt* z*@M~dZMOC4n9Z2zeDvc}mWBn{sx?!7HyyqZGEMn($x^$DU2`_CxBc>&%{ag@tl_7L zcG6?VsnwkmIu-s~|7Cllbo^7l@_`#xb^>hg4`y8{YTLsxYiZoKNt68reoF5@A7R=z z`@&yg<)#lej1N6Dwp|pb?w2rxheN&n9PY3=& zHxYN+_#D02Yn>+wh4R!yazzZbZ`jg}TcAwAm$tl!{KHAVz5HLSU4NOwSZeKqb8i0~rfawSc3}Q>W5wj;4sNlC zwXVTCoU+STYF_?RJG1vVU-Yjjde5wHrzCV9Ss!2VF3mSk>-2v;pXRdrr_-%NKOJ{# zv70#a<@p~yu3sz*r&(_}yWVN*iTK?)g2i$f27yACU;mJoOHMSOQ0L5%;Lg%~k?&}b z@`>%A?rD}BzoS$e9#-Ug^28Rk$3dlAw%E_u+x%(eGv7lCpIy#Qz4R-VyX&T@&Oxhm z=JJ-EpI;?#Z;Z-&xJhw(YlEPj^Rz|P#t*kXI<(g}>fsxMldV1IK5+T9#NHPluP(lu9(6~t zz)?SUPVIWx#oYI2tiPjYw)ppKQ2VU@JY!s8~ zsx4>P7CSGOok!-{w9I!;w!XHk=gHXmH#};kt99yH-x;P1f3F=m|Ek<}V`+xZt&V_# zIHT+Ga|4-D1il%Ig4i$sxDY zD-RSN-F031*qbSbzo*pyNV@2!U-NmNuJe8n?p)fmDfxoeeN*;WxsP6H$=9b(o&6}a z_~@JB$ZDa;%iA{oZr^s)>P*}HyWJ5z-^A@EX{2=W;(y|>EN|32?z&fiP>?Y`QvP3v^yy}_V+BrNY& z+AmAa@0U(*dnTPa@$u$+ajeN_HrB>z|A;qEIoxzJCH&`qrZS1-g@&8_PN?>EGt^d` zDB@Zp*t$WAQ)PPP`5C9n7{Bte&6|JP<&pf>)lPSU9`Bw1_oPgr@!L;Rtc-ZuHQtFF zyw~YGw^YbyW0vwkR{5LH-RJ0<*ZetqztqD{V%_^-scG|yW9N7>uPROsEBePT6SP9l zX0b){0ayP&MwOhux4Av#?792Qy-Z`;%LiBII?Y_>qyF#i$xn~GH=k@dwOjPy@3UZMH8lpT5-GDtd6X)b~1f8eYO5lt+TBiB`SqJ8k5r&aUZ$+ z@RIw~G~tYE#dkQpy>}Y_4N4Pco3c;u+yA7CQfl&NnY}+RSJmk9*{~sD>fEPBch#Ks z2VT0-5qr=qJ6Z4cAAv68OYutPA)B8+OemapfBK9!_u`bM8Ldl_khv!Ep{{OP!E>M8 zF_q^8_-aZOj=!4hsFvM+=;gs^-j${rj}u+=a?UD8rM}<1e##xi_0Jv~2&@$9w5mP* zd67cbn(H;&Gb^s8SRZ-Uuk^3X`mKO-$kO+bwWa6UubT7MuwO4af8yZmk`oV@Z=CFQ zU2t^e-Ros)|GnA%r{{&v@ZB-TKu+U(kovKEYczOni@P1Ve6)DSH3JhHFai<=Ll6Y}|X{ zXIK9No<&P9x))jo8Yxx^w2Hk;i17INZc%ygnzo>q9}?>`-WGgXwdhTlT;g}0@KulQ zR{Rs+eNxzptAM-QnjtjIOJ80kQm3|;0yJ{_yvrx;VWpztd z6jwxB>KKc^a#fnXY;#Y)tup6^Rq34fH~+dA&c)YM*MC#fr}4nDiEDJ+g)Z!{6?fCV zT48Y4d6qtNN6;DNk2Q_+_v?SKEN^Tx-!2xJ;l#asMuWq&YEFrI$rr27sCZ^g3Nf9g z-IIOB%HX7jl9=J)$03{{d-Uc_T6D-x{mG9DCP&WI9(Z+mm1LT=io*mw&DT#Z&Gt3X z{UCMmbwKr2>7d^iHqZ2IJ$T1@R)6zt_FYHQEwyK=EG*kT=le>1Rjb+?52U8tiwQr! zG;JPddV88#;*2))wX^3Pk=F03_vA@j>hvQxF8=(6XNwy4uJ#x5%oQ${GP{|q;D5*G z#ZC^+6ET-3>j`Ndo;ok-#5vDNpKES?Pm4DCuJq};^D@KCL^=6aQ~V3vJQM7y_x7a} zEWf45xMivN)VSlj4*hcL_b|6!<;*#3nHT6Zp1Z94 zz*wr|T4~3si;qUZS`*H%@?e}RE+TeUNAH25obB@7Eqj9$tLLWs9eOHv|3v$m0Hx6Kr_22v7u?V_ zW_iPxoDk`Dz<9~0^oQ!P_n1~3);q+Yc;}4%mereBGPHl4tTaCF<|s7p_2yrhufMIf zRE$q|n?8;4=$wQ1kImBe5_<4shMZh@#D4aRzrvQgB@37>{16~{VixNbZ`;DwW8!fJ zwcmSUr(Mbpyr1&qMcT^S3&k9+O`Bl3al;`;4W%i!r##a*qtklt-s95chsslz#eK+f zT63|=*r=ea*y`^LrCHMry|;&R7F4V;VAbFIdFry#Z@=R|*=*&gZ%J`nu$g1--VIwS z+;8b=maxzN9~)N3Yo*Sw_v(SMe7)a$sgGh00xFB6H*d&1f8xNcT}&sY-()^yyI}T8 z+x6zl{WV{-J$fTH$5KUR6}#KFZi%?Rc6Hy@GgNq1?Baj2>AcR_H~x3Ot!&zHwd4Bq zf3r`onp%3{*HupKse82bt0t{GIZ@^^2Zu#7XIrGq?xaPcySLq3^Hk)e`WCTQp%?k& zZ1xwOa`6W8SPA zg@2tj)m@aSebdr>y57Uj`Rji@NN=xenwqfvr~9p!Cla?T*z=@+=hiR3wkj1gq%S{N z?)vk^;k}nH%Sk4$dGkbS>(v=j7Mgl>QWK2KYI#*S555mG$jjE%Won zjz1^3wI?uL=y{!aEZOSh(ivYKTxEZFeC-zDHFtk(w>pr%C;iW<-p1#a^Ijhn-4tDW zRbZKBn0blo`33V@^Y{JwztH8b|HZFqUsJSsx_Qt!!nt#>O@4o;cRyIxH6 zRSSpsoWGB)wV!S`tC^^>B3ZA0pIFH@o3ongSv6g^{mZuVJ=%9|#rZRr_H$@iEN4(P z5|~)N>!Ta=&clk8s)UUSM z?QlY3QrWL(F699`M} zfT{Zcllt2S@=ZQIl22a;KKb=3ZnfKDmj#Dq7?K))+LnGi`{b>+h^>{j{e@S@=LIIc znYL<@?*gxLT*vwZUbTixofG--d5892xl}zCCiiwt88;R!CIRDng@t+>_TJ`iN&VRL zpIO%6Qu2pIr&eUYPc{5KGt+G4{I%^L0tIsm+>NG0em2~7=P1Lr+QXqDbKIwi9X+vU zrrg}G$5M~)U-hw2$uD=~!?j5*Z>Qe(VOaBQ*ME;p(fQ`A;qFTugDsa=7aV%=XwscC zEGOJW7A8%dxJ)5|xiL~SUvFlF#gx8yUyhZrcQ5e#l-cK=H_4#({i8YC4H-RReoT#e z?)vnBhvvx{(toFgzY6+xB+%%OX6|k!^8?=IJEA6hzGzne;%w`MT4}G@_7iw&J!b5@ zzOsz1)A9PwxAtpZ0&3wPp6f|0-t%=Zi8ri&kvDqdr-B7n_v0YiP{6^$Wt*i%iyV zaBo~@neX&h8%1xe>p9ZAMsbtf#QHw%%PdE3Wc(DEJAd9sjl0uqmtL92YW7G$ zQR|uL={`<@K=cG7-FM50*^0<)PFt%UNoxgpGpQrepUGwrzX2t}NjC##7~|Z?f<_ z``078_hFtD?@ynHw&|s>0{5+*D&Z6OKjl*6`%jBi_eY4h3;JexXC^N`ZJB=SV&#Ew zzpr0rt6qtStGKNHCy&!Q+ivRI%}4U&BBq%~@iIRAqq9&a>g$gSuO6BOXa2attpBm) z<&Bo*Et59fsQDtmIN?#wweN=0+A0dyuQ#pPSi#2o`P#no-N8!*4d!;+-tkS(xhGs`e-pvf!{{wJ5sgw9y0nYxINm;z9@d%PvLmmTa#Y?7I|86=V-+n zzXzqkQyzWhRH@3+U#kA6dy9yR@2?uIr`wArDJ)X$pZF)2{hIqJsW=aTb1pYK-&qxu zrdS>9t>Kt8Aui3a+JC-|P>3OO!_>zD&(e4DRX7^I@N_R;8#Ks+|9uoBsKlgu_8z#cMhtVphIFX&alTB>Zc4KFakb*5bL^Cdore z3l{utRs1{lw#_Kox!HXA@-H8EZZ=(AXdKoxc^h}+?EWcLD~kdrCa>9W_?f$y*oMqE zmTSvrZ)|+{*exma^emgzFLuhO_`9C-V(?w8{b*++*Oa`yyS$!!=Gb-QaO}2_`CB4t zt3)>cx_@m$^zRKZ`x8TL&pnHjJ$V19_oE8=>qqa_#)+Qf4qVbak8A0@lvDc-=pfvP{>bC&EZH8eg z|CDS-xN$HK7xU~20ogNt(;d2Ma<-Z`v1wd;b~KwcPAr_^_Qw_Hjt4I{+41j6`Qz5F zlAE2TM6!8F{OxhJY7eHa>s#GECV=UR9Byi0R&;{yAs+ zG%9ywuWg?h{jTiqCT_RuTV8GW{Y87Oyo#Y?-op~zjJT8UjI^7ypWl{T*IgTwnP_{) zx#iC*>o0D}Z}M60{oUR-$^UeG-U5TU9?$gl#&1zd=h87!X0Lu9HH_*y-@4Cf&Z!K`p6=4~ z_Qi*DZoOUmcjZYlt%G;oG#RRWxLUeqHnZC|+n&7}I)(r9&)*U7@WHhQ=h+obd-In? zRtcR7^-2DDbn5i{uMd3QEY54$zwUnh#$?@FhRcP@_xRsu$&cT2`QMUxih>MztM1%t zdGM)}HHWG5ZL#IAX>}i3HYa*p3S0Z_YF}{X#hs+S@9CPGjMs5%ZS9I)<(z8jVWz(6 zvH;`ls-)Fst3>+B|Gi)QP$l?Urcm7*V>`J5s}jj4oWAc;KFnK?m*xHIORY|_ZZ22+ zrB&+!t*vvirYM}UtF(xi9@afixxV^i(gWAOD~|nsR&m*c@w=SRUx}Gk(Hjk~>0J-_ zkysk<@{QTg{hgt@+Q0ufZXDk@P>XS8q?<-a&>Q9 zgQeNjdp+)d+xDDKUvolG z?7jS|X-@HzuEkgwnh9Nwp=8TOMRdA`#eESUq|?cMz@HI*ZFZ@b>LI|s$@ z6+gLL7P(aG;e5Wy*9%Y0PMY=Zp`X0A>8YynEcXkkSG1zcCt0rTW1U$1czxZ*zNsrK zMJv{&`!1?kd|=X~Ro6MAt6SIfEPg5Z{PdNJVr&a@axcw|+u402*)M&W6w4K_LoPCQ zA(pRCe?4kp_eRuSDq(ADrOc|rs18vjZr@ouBce~KRbR+=%y3wIK+<`(lh-$y%unT3 z+opS3GH>Giq&xNUFLC=VcY2f-o_yY<8REA7x9^#Wb6Zcj>c8^-G@Cu&YL|4*6^4JT z1uos&=D*wWIbwyE;W;SE~_iqmA?A*_#Iiv+Y9-7}9;+MMN z%-kJm-``nlxogy^ooX`lmse+he{-4oylo#dmqjeNuyOX`W%{u@rXG`*GSm%?*A3gU z#A*85llMX!{Q{XIl-J$4Kd-v@*r%6*3i|s(_C3?z`>Fes&evR7j>kOQOS+nWZ)*u@ zRdsygdm;7CD*-+YqoSm1cKY)5A?;~7g%wVrWK^QttFwEvAqTDDCJsox)* z#4LT%;%M5#X|&b_m$+vqJR>w{5jV zLvyCt2Au^PmKNDas|`JtC_Q>zbQA&UUyg`qrAc1 zueZ5g`n0BU?)3W1<>lQPPu(h)H5zf4n+M$v{In~@x8TD(-b44l2S?}_E~tJU8xdVB z943@=^L*p6_H7rr`~xE0f|b+sq*9&zIxadpxorQ{9YHjbxhi&+N_&X`b+fq#M`eozWB=6 zzIV0Ei}^p^m`x1s?TV>dB42gm{z`EP`D(-EP0ZSzS4C^S%`7=nP}DkO(RJ?BFt57a zTE0c^&YhchXh*t6N{PLG{+jRXi)U=DY_;w0x)u0m#fc}6P6>10_;&L1+`l?bwzDj+ zotB&W`_O9b5owUi5U#IW%pCK!(lcK^Pt*ffB zmGN=bVyg{Hjblu%P0SH{6k8nAckn3Ni@(Qp?ie_l-1jNv`niN{!Cq#+rBhACy*1QM zb4(0ZaQ)I?cjimuC8?9<@;UZ>>z8#IyS;c?wth*2hlkBU4)K}-#=|ZvGUKY%6|{}# zN>7~XJ14qOnQIzDWctJ@e7eH3Ed%_%t(v%FP1>eMnazQ|Yn#^yo%}OJe#-j!Pd1A< z9!=-_V3=U1bp0Zq?@3FRr#AwoBp_LPZL$DWkd<$9T7 za%0Uuh9|RqxwUVWa~+FWv!zM&$S0%zsIuvuGQa=$U$owm_wUB`l`JXZx43FfX0CdE z`#|vO$vSTNq+G?oR%f~{;=4=#ykIHEB`(fKNA=FVa8fL_L;pmwJu#afA#Bo zgNrMe3LjiPyI7~Hc)~kXky(0H=b|0g{pneB#$9G(Tc@r*A*DPy}2wZ<$rB&tp z7wN{^amhl??B?pu1)CfTAIr7@D$McVLDLhyNuzX8x>`N|Vp383aqq|1Z7W z?X@Yzv8pB2zh(QDm*1|X*B?8hO%Ix_*|_^&r5d}u z*P?a@T|HsL=u<*oVaH#oN}KJTclNf@^qCU5`VZ~qR=K;%>4=D?pAglG+bZ>BU+I@w zelnLc4y1-XdcLYmq0-qkrFO%CCuakG|2qFt_)E$5&t)OD4ck_U9%xe9;(n`e%7-4d z|K9Bp@7dc7W=7A_-H|k(!Nt9L!D*{!-6w^Gq7J1yo!F-}E!RMUVR`d)Ax5Y0%YM&V zez*S-ICo+-qwAq$kyy06OACy1GQP1}(t7yAUUx;wYyNh~fk8OIR#Vm6$D#PBz-b%6d+luo& z415!lF8goz=;>1PtKs9{Q{KI^Wo|Sp-w1jCU?J~2RfUWD_9z-Es7zeSeu~*PwQtXi z(^=oHM=`w+>RTZYE)g`V<-+<^XMdfH=(;NP`nG#eiKF<@1N_(R+)4${aAvLcsb9}) z^yB>IfYtR@eKkUNL(Ovyq>oKXsa`!lZ5daJmGJtywBq$)F+VFKcN~8ryl~&i*EO4R z*Kg$7_{3II$-8~h)K(9{?|DgFKG|OXCY_lzi;->OBZ*#aec8)%em>s!`OGq-vn31b zwl{G;h`qnVTW`sSXqD^HX?(XPNM>%kVXhM*86h7KHoN(eN6LJ+2R#Q0&R4ADW<5XM zB&l*j<&#YFGf81PrB0QpD|r7osv#G--Z-iMvQX;$p1a-qzep}U?YifuY1q?_8BS~- zsSR2GR!*(^k^god}d1-rrCIXXgPCe${}J4h|pc(!WWFFR_~VXU}Hse)VMOZNf46D{ZfSXIy6VvdQ#b;x)P0U#2g! zjXRUJ{dZiry4`DEg3Bz%(}hbWXa72TA~vSrX{`I^KYvo@yDvX+V%dCXS=2U zY^;3vk0E@^)^wB8raSA_TwXWt)F1!s^VjZW-EhxvQQ!_(8P9zEncbBe=Gy~4`O5c~ zeyPxsiD3&dbC_H4`eLYB`u^a_=XR{jERtej$lHF+I#Z16>m!%cs~3Gwx9D%#E*5pQ zruEt{)x50QU(N5bbcHW?Tx4G)o&Q4bY~%Ojh3(4wZ@;f^=<FCb z-Z6gYr!U%feEQi35i__||9+Y;ebH;RSF78uSqqH0CoxQq{rhL)n(&ox-+p$OBdYeP zaO1H9-~})YnlXCQW~{Q!Y_nDGe%~OJRB^^j;f>!#zS=(tEfY-KbUthd*R=Sp<}=S& zsKZ)#i}Ut z^G0hI%kLkXgd8qPY}PEgyIY;t#crwPG$H8&VRq4*bdQvDPI^|?Cbx6x>S?F!tCVCp z0(e>q-=}RdpCP?gYt@wi2a%sI_>Rxf$~9}S>-xeUo16B+leNZ?`@iAJwISY{eV=)A zD84N!cT)JYDtXR!gYxgqt?hs0Rv*ez``)>!hwJaz#(iwN)||TLT%7R*>|LQxs}FWJ zKK5bz^p*QYje%LF*CU5}AEx_pv*a(Uk?7Pv$bMjFiEi8X#kr3UC?5O#`Cw$_gutF3 ziT`CdR;O(-+dpgL&fp_1#!vq#X3saw|7*NxO2fy?=1C6@e1Fd$m zX=o4oB91w1QNJ!q@m_w8d-vhSq-|J+z| zM9*DZXS!=@p&&~wTWP^=JLO3JY3Zkb#AR3B{dDSCuT0&Cz8c}@(^c}sZq4dqdp5__ z@5s76Ul#o0O3|x(GqGp>?27QIISL2w$@mx?`cW>p=UMiWFSWn_3fUyF9gRQb#`5gh zu7x))Hs`P=FEZA%cx!P|(nrJ4GiAY|`I*1(y|I0A*-tEPL}bPZ>n{tVnE>W-wKHD9k2ey0zk2%GF9YHuuV^Nv2-??|a&({qkRU|NQ;4 z{WE=i-!7Keceq3}(lKLB>cuG!zPA76Ezvbbi+66geJ0~~do)*& zs`H(AVP4kfdv5PtwSCIMXRm))Gk;|^XIioIkK^>Y!PmI&Ez@6LJco&U%ZUl+WG^TF z=4RCHc3PNx!0O<#!lNGMFQl0a_w;_}k`jtF(he?6IGQ=ZV#4gg;3G$jS^YiE)iFKX zxsEq_(oqKHd3!_Wo$Y_Se*Y_rt+R`6O}JiXAmt|IzdYR9k2iGsefg~?*JrV;Yg(Y8 z?{#|f^LaB4@7d6n-Ix1b$^FNZIZsvzai^p%o*|ze?)_SKp;6NR&n>cdT6}2i{ z3cR<0Z6-I@iIsNm*9G@HIACZM5Y-}cM&^fZqgjR0a{lg(r&*bdD{d@qJ~ll8qwsQ;GpzG}zBKDmolrRYXhg)EnyF!K9@bB4wgnnpU3tSL zZuKkY&+js>)l9o0_4Ii6H?;|KZ)B|N4c&Fu_UpI0yyrSC%LG@4xKDhtGwzX^)v^yq zS*${L9sFeNxTv9|b9q5a%d5H4rt?pno4SnYl6+6fw)4m0)~_?W{xDHqXNFE!@4l^^ zt0fQZHq_yne_H<0ci%Yc^QlQ^+!+pKPL%R3xSuS#@JP!cB^%EJ7q_go`l2VdHAbTB zsJgk2I`P88{i>XisBDR)6K@B9N+j#nFJg+x?V{W* ztf|GH6(e_AY|Ksi5fbR%aoOEX(wOsnpGW$Mo$GV2R@Pg3FWsZNYI9d+^r?#u-fR7* zA76G$_=Rp;y3MJKk7ttadF9^t$DY4(0e|-C*W&X_cf1yU+SenloufEkHm3g+%i}I~ z-JF7sCEcBEz0Dae`p@r9`IX$Gmh)ociRI=e7LtrJD{iQbLI)e>WasU+F)O zPcK}08IMoPgcDb$Z8Z2Kd+kQ)-qm43yKTCPCT^KLv!pvu=eNvX=Wh0pbJjrtYaJFo zJG{^!M(cpzz6XLI-cQhFVph5^YvD7m^99Gc^O*#iz6yTWzH#-eT^e5>T|fAH#i5Uv z_o_0he|;KoUX1O&`&;)g)3?g;k8Y>`Kelt~s=qrOr*0Gb{Kjs2TWIZfd!-q@Z>~+0 z%MaK6+~<02M)Z^vUlx`3%U!e!J$Do5mzub^1bXw}A%r-63l}BH6 z=B%7YehEGMj%U6qGCRBDoKxt|H;IoujJ_OvIK3u0a(APdb5&iu!ehbqmr2sMR`1W* zAd}F_O!yg zH~BxDap2H9Yszuyq(Fq&Py0#!mgnBHt0Z;Yd6hN8WYwX!OJ>*Bvb^rJ;|mrKc_k?G zC~NO>`y_2Iju$U@Lr+`GUE1?WXqxuAgoXF^@(JvmS+gZI@dD@BUz*i7<|$--4_?gp zUT5)CyBd!}^LIEYrZ=ux?4p0wVe_-)bIvwwW4e51-@P-HvDYSOAD@4~JS5>SQ^qHI z+29n``@sgzW`(u?b}2G_YHU)r+95l+_4%Q?9hY1uIVc&}8!j%idzvC+pV|`t+dXmB z>?w*Z-Y1hf_3z#Bj?<9tn}u9Vczq&?^6U3^`)Pq_b~!uC8nYmT-f&$ot8VlkP`rSn>l zzsioqZ*9k%Cbf0k`$J4m9B%36yz_Y4=>^uA2cr2oq#fF;FMa#;i6_L6MUSWOW$oQ* zN_WmHdr!Zq{p5Dq{Q9}vM<@ICe_!F$;=iFb2z%4ZG?KHBYAgcw~~{_iw^J(Op(QHuLOLIbd<$QsY2}-?87jW-}eG`+u&D zqs;;Sr=X(n3y z=~SQoaO$ajpW?R}L`-2|k2~eMQ7e6}E#Hm!OGOTDm&KmdM|6rA`*x|zaxYSD*`NRM z@V`0#R?YNxo1@_U|NqMG|G)nDrt+!Ya{aIA|78B_w|{T{|0wi}hg8-ZW8Yn$c$IFQ zmK9IBd+YhnGnG@jW|r1?|7NS(Al3iD&AWZYgK0Ap*Zg4)o>{HqmVW)?+G|{FvbEXQ z9IwCF`jsd4Pt$`!Q??`*r>J8#vGOWAs9L4S#2eZ6yxi*7DqOe|W9z!1 zcv(sSgK`oB1H(T7230YI+T!F}>u%;Q6pPJ&a^>)*pKgw)?rq7Aax*U$-0(-wJ7w;z zpuZ0dO5WWJPxE=c$HybCsZ>BXYn!Qp<`U_dYpRaRADOT%{_+WybFEUT3O~d8|COC| zS~F?$#3etw4ctX@Cy7kAKQvdh`c52IQGjZN<6_ybufGesE>Qe;EGUYTUvbzk_TZK8nAH(+81RZ&as8d}Gb3^T_pIp!j4^%B|HCu)^WPNwbv|b5TzhV+ zZLtHR`s%ux=&KlrK&glO)XFVhUV)5I}9G}oOC+T*74J;&95J8 zc+8%%vFb$0i3bX)(x;908_kyY{>EPxyU44H;l$F(2iFBC2u){yY5r27wq({p`(HWx za@U_Pcq8P!?)#BHI|Qd?|EyVgCg{)8wutrTW%9esRpX~UTlk~wTZ!OVmG+872jx$0 zwtcm~O1i#(MQ_x1x63BS{+XpUdYxc%ZE$11{N=mPy81%K4qovNvlx>#%7VWX1FBpT z1ck2gsBC7mPF@>7|CZGZN#h+oiGS{1J8*jB`;fksPt~uyPey)@LI&F3!AJB%oSc0CpvA74eov@yYYrt zp=}rEj5w1QhcCWy`8jWP!BmastO@qF9^_2en|6c3zHIgCg@cx@&KY7dr z!ooB%9g0r$N(Hd$r>=T@JFsGj2~UcOsH!Z}>gl%MwyyUve|e?*#ID~WztSx17AH-Z zx%B;^6Xr}ecB?MhJxS}A#W5rK#CZ0lHidT!|MeYfNx3Xr!S%|3Z;6{`+Wa-Yoz6Qk zc%6RzGL$PHEN;W9t&A4B<+1s;cZ;@intV)odb>4eXZYm9^=oy^`wb2>eF)?D z5V@nr$lB1XP~lVM|EYPC+_PrOcCp&#@ZF8w!nt}*o`Ux}1MPIPw_g8`O*-gQ$bJ3b zf_snk!_1@7f86jA{8Re3Em*4JnkO4q1H<&ThFn8d-=!hBI!Y0bjjl#-t9<10M?|Xq zw#~#750+fmC4J!1r-dzl7e&t1{Pt`2=0Jtho0XVDkKBlJTNVEPzR&r-#*aT*-4z_> zg>F5a%X(_Z`@LydAL=GB&HMdQu^^!H(|qe+Yn-3z@?8B8nyXv$CFF%@kLoW*ufp=) z*=z1EYMdzD`>Rf@{(HjKDZys!4S)P*J()V|OV9#=`I9OmH2o%@Uo*+>K%m7#S#9f>-XdfT~dg=|{id9MBw#p{+-I6Rb9>NvHs=kwC$?dN~}($mP-=&bs4 zWyRgu0lEo(A9c?JoLllq?Ma5ZjX0ZKiZ}0($fc~SYp0(1Y*z5`VAg8=>+H3^ADl4W z_hU-Fs7}qSd0F$HT>hy2I=)h_#D?R1@>i~HS8L>_?%1Rkd$h~5Q7%B-qJ%pt{jvM* zt`kirrhRpfqjx`g(EKt&QSHxe^`IFaPnOONYSu2S5xrOP=GYDkw#nT+>H?RfWOoY8 zWl#C1rg-XIkC6YQbUGb(`@yHRbn+A58s}C`e5UAo>S_treDtB zUb)_(VB?XBsO_r1Hh6J4D8=hb3e~FX&$&{l^7{8{pQ)?9}uD2d3`t)Ss{l9rmWP4vNp;)f|3kwq{8{)vGPjbYBL|J-TrMhfpBWr;hV1AL5s^N@!0vEy`;yGy@SQr*F)p!bdU|5ASpgl-AO8BorjZ!Y9GzI1Wx&Ll zdf}MCgF`m&{~WnvZ<504qne;(b=&Z^%CDK{<%(835cixZ%W2xU-gurefBwKZn3}I#{7pjYnOC5z23~b>2Our8>{}-<|n4DiQI2h)-%d1<60N@JAKjd z{`uA0q_$^#Sv&3Uhh0-opNaT8*L`A~*UZSu{S9_)OTQQVXxg-1?5i`|sf&_khs(vX z)-!eWoM%4txQ%;IXf$NCoI+4_WDVXcel}sWk2R7uV1#k_{Z`b9lfW{S9ZEj*Y?!vtySL0 za@6Enp}S@Qk86{XsjKzEZi}9*-4}jIzudq1IrAh%w%YZ}dGo)?j*G_q z`x!X|&EKo+T2Sfx|NV=rTjUb+)+WC@xARiSV!;!sJ57W_Cnt-XGQOW_d*Mu5XZmu9 zYcBtGPIa)`79jI&_UHV&iN8PZXYP&+dVQF4ZuDK<^Zqsa%stobI@_r7Y0-m{{vW2E z_tx%dt}u%+440I=89L+Ml9LI~HpDG*@?X2bQ*U<7gyv^cb0_4!e3$U`N(5I?=(I_T zR>-~Jyl$*$JYBo-YRRUxuBN$p|1wkJj;F=RzHi&RaYB`q-bwpq^Ja?%tv_}w{P=sh zuyo}uZ3c(a(7<3{G?H7lhsM%Y225ZIg^+D+cWvMr_9{| zn`QsMf62PVZ?Ji?$lr)e>&el^vHr*3P7;ou$STF1(DCKtmIue4g_OR%D*Cmj!B|N0 z0DnaCJq9l60`sGvCY;FpX{~b4^Gg_QHhME=)jT%%srmi>sh0+3d zPV3)gc)ob*{uf>~Z>C+SQG2S*!f+#%Ni$S7c<1ed6Bug6_Xh7TT{v&Q{R#UcmbVQJ z7#|k@*L1NFzah26h3n_Tw?8)LPT4GY@Z*syx_iSX=6$(;Nn2P6XIxIzBWNgXl2B4%>`s5eQ>wRD~QQv@PW@}5E-F>?~S9YDG`z^n^<*DuG$)KI`-<4?uV%I9O z$sx9Tze@Zuo${<+xl3T#w#tp44ws*dOgtH5TmH}0?(H1)@Aj+xSeP|)k15;67_;x1 z@4ug=omIwqTc^OyjcXH4PaCoeoSKV&n8c}uti#>=KY$SF#h=Hb9Pw{58vg_4eq@XH0k12 zwvsw$u1_4x%|AE154>o8XkOq9n={RNNTye%;4Nxqr8s&`FQrQMm?Ox3*( z&dr96?>5hJl;vZL>D7=jjWX5QAzwc06_Z-B)1K%LRzCY`d3L7Qoj%g=D~a{uuey}L zr9w{i7gV!La(5Oi+drkLFm%OV8{-q^_utfcR%?g|v=yK8)k@#vYG&{+YL;PnZrOpp z3!E1>Y_)C(b3C3gXZOxl*S; zPU@K9E^8^cS1n zz*ze&r@pn&xsge4_Y9SzoLa5uQ>#@5(M-c6_JeWbGX~{<*ol2~{k=%Ra?Ec%E#)Iho^5P`UZ+hFjI?Oa10O z{F@}QPwxG`|8pa>BzNxO6>jF7(DnBCRDmpEoqz93ek5-)6LNSbk@ZFP2y;2ODPf9t=yHuaw zZaa9+V?)-XO$JTn)kTU*r@yTDd-=5m_wie9MOJE`g%?fRcvth}6VB9^VP%Ge-fOm- zXBQsx%Jk8A>zd$XTzyH?W1^OL@7OgBsuBR|^#U+ZA(YV%*Ls zuK8iNd^vjcUN4z;^c_d)OmUH{O$UGK<+)k2t_Ysin)i6F+_?t{bNBz95@DY3&tXRK z|Eig4l|LIM+kR}=YootEv+%6KKCSk@W`-PXx&Oli9?zYhvfXus#382ID-$E48#11x zA6f2qE7ER9`QsC_zj0droe{M2a^Im@I-d;e1B~X!)c!y5RkPg3;1`FX5_84mkJCkJ ze^#)!{`J3l)GP7QF2|+!1)uq?=k?NkTC{MkG2@xFm3o^*?Y}=W3192koWgc{g2=l^ zw`T52wmZmF%2Md?W62YP70vaR>q~ETKhs(@+0ZbKTWPi2{>a}a^U~W_EI4wYH$H7z zxymL9@zs}~9+#f(Ffuj}cp+;dIn z=VHCk@?To%er+B9oc7+3f8!-MZOKAz&kWT=^TU~x7u-m`;a30OFMs{^H+%T2fBS@r zsQiC$xy7#K$3hRg|DOdN;!pZLxt$&RVDjgA%0H9rJ}~zit}F^Z&{$fZvFXO)pW8|= ztrFs?`O7(Rd8615xuC`7izCA>c``I{ay3;xopqT1=3^%^G z*R}7!slwtFjjp$MTg&ANl=FX@p3PQRkn3}Ob>0!ZzUwU)qt9LDdHcS(XG3VDLG#fA z-!}*^{1{_sd$w=OoaIkURm85yF{TFcDTq7~cGF0H@wjel&phw`H3tuW5n|)#>%1JB z{ccJM|D2@RQ&t4H{CfE@q^&WW^$(+1*#YI&4a-cI-Z--F&&}6gHU5~+nO~617 zv}AVpWG2NXU5&4ArV73|;qda3GUrGB3|pGo!d_lq zuiABEGY=Aw-yl=a))&(=Wgj;9U1;>nq?%J^>cU;6 z8+V>EpZGiE=(|h2k2?}#rwg3>uNt>=u9?)U1CE<4iySY8uG82SBXC5Vm!;7_GwsCw zXhq|t77a>T9HuVII~ijlkA1n)$K12+YSF|69jTYMXKb*2=e{-8`p1nqGcQ`3G(DWA z%f$Qg^Tnc1k)PP+{8)B4GkfY)^;2eRYokudJ-1J3dN{Rjll!Vu_kV>gMo>R$ zhS~1pF;QWWMe!3RS9Vm#5AYYPRBQu@#aA$4$3ob&j|W5*}3Ye@5JBPb4B%M71{OaF8-xFd7X38M|F{9MQa6> zyDTL{Cta8)C*T#{7wh%lgw`stZ7nlj*`zF7;-lKzu&cUMdt%3l7)=uwn-w(>ZI~DUO!*w^=Y@c){S?>KPxz2sO-pQSkAggZ%OX+ zP5M%SWez9bKYTM$;ywFG*Li<$-IG0f;-bZ0> zBef}K3*}`e@10ZgbLm8%nQ1kvce6*!u)pLGJKr`b-m3rSAN8Y`t5^$p>W>^T;oNrd zlTMs5*Mr)Kt;Y+Q9?6yYnlRkG+2c{{cxk1b6E~Y*)sMgk(Hm)NcV35XgqSzY_PSJ+ zg>1U_<<#5PuIsG5m{mE8zu>Fl$7pBcmg@(qx^G-<-EaTI>GR(ejW68i_fPS;_$pUb z==X3F!d>|Kf;6@JrRU9OX}{v2La;ZbsIS>gP5 zBKxc}$`7%0+qO7~uT#+8{8u{ADcN_8+%>;~>-o0IzVn-|U!AR(V?FcUL9q`$?^;xZ z{P={jvh{aAm3+CO){(`fB3&B_(_2{wr9mIq~MtJH~qJ zuSRbSwBPl{+Ijo-h)w+4q92DvNG~ki_a~F%Xg0ry_S6=;1a;4o8zOrSFL_}3;hwZ< z_+n@xT`ZP?Jw-nw@Gs%It( zRhsWew0b^_6B77mDwVRb`}3}Zj2@ray*tnE;o2Zoq5FC5C(}q#&88ytlS|autWT`i z5;$Kjd#*rZ$Am3r>0+VIAt^~l9P!oX_b>in7k;j8BKw0|+^MergPtEVI{H}t+=7dV zi4(MsW$Az0(>+H-D?9M!F42P;QQE41Zt34kxgm9Y{pk)I^Srz9#VtM`hZ@}r~bI;UlKC@fL6(mS%D+-vI9Phdm-g$3}FW;oNoy?!s zE`PP|^!xkQ(znjo*}viJ)@}Pa4bSGX-1_BmX6LVsOnpjx-)wd{7kh*)>OOdNH`ClL zuNq9u_J20}`$>LDA*aXZ$4<s5ce-Zt(2?*f_C6SnP65;T5u?~48Q>{~x&@@~!4 z-7LXf|1#R7W#OF*-*ip%w^wmSv*lf0b&N+fTT0MuiQy~@37Kz6cV|3J_<4i7a>W|o zDO=3M`hO+zFI@6E==uhgWtPv(Z!TK6Ip&mh6U#Go<=r!UxVL#2H)RUgTil*y_dd_O zo$1;%8^g;PS(E&ahPLT;?RwljcXgzS=mVWgq5o#yDA;WETK*y9&ZOO%=Nh`z#Ez+P zZkhV*bC;ad9$uTRCpX0D+Ra=ay~tvB>X$RO&RE}9+IszEw)#$vPq)jNoaLJOV(e{v zp6eN2Th=+TMej3n1f$|MCO1Rh%sJ+_?|)>S=y2B}^3%7&Oy6hkbpA5?!G$&V?%w(^ zk42|SJclmSwM>3ymimWjKNNM$ zgy*q}*CfvbN9n#8R+=2odcL-Ifnvu|Vi z$*sKqbd&T#KiaOcc~V!MZOzrp)G%T1wAWRAtZWiB0ddjG&#|w1tMzn2*f}5f%#B<7 zI*&IrUohD7NZ>q2+SMsgucQOCIe#ZRT|MYw&`wxt?`fSo^nKerNCI!+T_B zk%Up_g)Lq2dp;fN;5zD?_WhB!mQssC9aBfZv=w4M1mixf@9RD8Jau7r#)e<1V*a}y z^m8OkOnB{Z_^sv*E7rq&7NuJI^A=7zXR;z{N)~>wf&EDv~#3{<~ z)Jo~hcg6jF(m%QPWPUQ!U7~t6`Q`n^b~_!!{Z=l!ym^C)Q&FCD%Bro_@~(3mYfA4v z{x%`pDE#XCg9ZlKE(?5Er=}iOThD3xPq4Q5-n*sVouAgHe&n=dG`pX?jj55Pz%g}h zaJrIF+8#cq!|UeetThUF{7`X1P~+MD`ARc z^=r3V)dZbVx)XIJWt*Gt51!Zqe@$0AeBJZu^sC+!U`uTb_oc!F`^`qG z#n;~PKi<7VUC>3y#PHJc^4(psf==uXLi%sz_WRvUna^=}f$r6{5>u^{Kli*@Syz~m zvu~Q7dX!@A`OZeOS-nbi9i1#4*WT3OxnM$4Iw+?=an5-gutzq*zemUE9 z!c&zeNKalMoOk}%$H%^F>;t2Z^3P8>?i29BL??ma%CR6KFR!N)jr2H;LNnhW1?a+S%35^q^7W& z@)V!AdBob4#bRRC0_%5Il)YMhn*BJm%qsqcgsI8>Y>`F>t8**PZhykY8{NXsV5@Dc zG2>C4LcFjI!_~Qq4OnSf{KW}GrSu?p>hjl@Z^}ecr&5JzQ9k=|SbZFTxUz@qF#cWT^opy4Oz|YS;lg~WZ z_tI^mrTLEn4zkxLA{d!M}f8u)g(*`iYS&WL`#^349G zHtRZlVXJh37jK&DZ?PRX*)O`}%9=;tgN+g{yt%xtk^TI9vm&$Xw{Dl`dw;Duy;XNl z&G!?hWQyB9#b0?@y6aXayXe1@7mw%emp-`T`fRBi7HW1rm$=rfxo&LMu_n#Vv_Im+ zvv@t{8UOzFEHGmTn2gbVoy2rYAa9}PW|G~(zGeFoAO-|E~oWA+BY zj-;&?$+{W;dS(`soQa(xdqUFKdr6ToN8`+y$4=QW9`|dwZW*<@(yR9DliC9rG1{+= zo!nAm=$Luw=$9Eer9lsK9-gR;vuuC1ih16Q8nfKir2n-UIU#8RpG!>kXnhv$;Oo17 zEsR6t^XI_Av`xEm=5+sj!0K`%&ZF?5qvk#zl{dY=b_&!kR_Wj1o68@Oz$>b@a)q0v z)`?9<8+qqCnrUYho;>aQtT^M+JTo2fjCAp3m09L_6ZbBZ>zEkXEM)Aq$Sl|@BKgHu z>9Yr)3GJTx$h`jImlc+KHeGQxY3_JqVK?D@UUPC9=jAmYeb((tiYPe$=6Toj+&ITQ z6(-(KPBicD`nNKVPrW4TnRVdQgr;8?ZfARJH7xO0u8DRyVsDbFJonq%4L4m~Rz92X z_*>>t^F?FL)rKHA?b{VUqpIObLT%%|9pG%gk8txM$Ok<;eC_w(zS29jD!3Z@lY# zI!)V!p^3)>i>lu3n4^4P_I#GRs~7+A6}V`b#r?$8dBf~SZy)goUR-ec$Ew$MAN{wa z{T2(p?6+Ue@`r?6pPf{B&f57!Gjps|epw0ru#XBTFtyqHu-{J8`{v^d8ZV`K1=N5zI8O7|`_oO^elsL0UK6%ejFssege!AO(|0+h;x2eH^m&hXx%|T38C}{IAzCwBCUzTs z=~UV%ytnbz$H(6bRU-B-_LtME7iF+;*J+PVskr$e*z3uY(1^$%DVGdh^f=$De(j?a zAAkL}r8)b;E}r;%;fLpSg+2QHGO1WDyv}RK|D0#5Y<&E`%q)&+~0rw+ndt;FOzleeKAk_72g8+R%h}Hr8;hM)bU_hzK$b@ zcgoR{>nGMOU%h<3o36pcg#2a7asQwCo|^a2n0ZU@>21OBHZ$Je$k=PX-QWKJGpH)G#N171z`Qnw!NPmU(^pYizl}?QUM+#OtN~yXzKm zh&H9nJpJHsR{kZcSFd)pJ8wO>#gt3f<>QSj(fbzuPRKn^qX3bRlo%TaHF&-V>@7=G>`sQg=O&+0Vi~Tjt5CuRjHftUg$)F)=B1 z-c&StS$5-+f&s(B=BQ6w+%HU zyZ>7Ffbdcpl_ZucLRm+y6dWd0SOq;~T3EGEBAM$djp3vmbp9Gdi6 zF()LX;pFVc!fPHKD$)1YR}$2veKfu#vdpq8bZwDOi?HQfVg1Hes|+7yI?rAtwA|~? zqTV0E^D~6_FQ+~gPJH)trLoyex7m|#ytwv5=voVx@BK=-x3$yST_craMIyfkez1RK zS2j6nj?;n}dy3vjFmn{lJL$Ae>uSaxpR9K$b}7x7adIoSuUL&#$P3BMM^uZ=3S~YY ztaK205Gs`N@DA6f&)4)iz9zl1u2nc1!?ftT#qrwqk0qbKIl5^cyI0#UI?2Fk&SHfN zj~Er^@CW7QeX5#a@|6GG+m(N^=h_$Nb3bsIbaSJ#f^N);-Z$5Nip;a#eD4_t^X&4f z_V4@uL|8krO!xe|?|;Ec*M5@^l^-h3Z4{sUKKAno4u_H{Pa@9yx9X(-`K8+;b?M@s z-=4M$Gp~Ny@@ntzJQ0!2*+Kb@1$Gx(oWp|ecfR=|vbaxeWy62#%8e|%-*z(ZaN<3p zw@|!@)lX;d>Nl3I$Ll@sf7tH3`bgZVG8LyYW(#Wc_MaB`bMQ{k1-|3$v!eO;FY#$n z=z47Q_&Upj>dwqh55mfy?LH#APw#!h+E0Eroo_BO^qHmjd`g79~ifZbEx z_9ouw2wzbXBApk*`D@zqv+HIYQn1bCnCX=8C`6e5P5Qf_h@kmbi{<_&d0!}OdC@yf zp3{mw$??VlrKAt9!xPgN=}CUx>@v^y(gvG*%=H@OA8jN5eTs^IcwxbA=Uq;K=g;-pUU~&u{x`&zlr5haVSDwFxy7rJml?qxWg8zGML!PN zl`-qT{HZlgDY?U zotau2pt9LCyybk@)N6b8ou2yV*}eput+|rHMaCB4Yi678p27Xd>tdlL%hZ`v7{pwX|9;-6f#Y6hvr)UNLb-Lm;=lA@U z2J!ruo!6|5^ml|Ld?`H2v9H$oPkmFLN{eZ^@_*$bqYt}OFKZ<2yfA&c;aN$Q3e%RU z*R5OqzI&`t+U4ccyrc38Mer$Wyc=MifqVZDZ^G{AV_c15uS)|=hrxz>>uGFtA))Y3HYVDq% zShM2z*z3tKavPRY!K*`NKTV%;3C3^R_!zwI2)Js@ki0^2)`>1;!gi;+y0) z%L!z>6Jn05d91oTZV^ZOCeGCl;~y9Gyx7IM>qxYt$mci{3E|D>7;7Ie-R@(vTI;@7 zyna^Q!N8AOJ>GE~)cq~wdz|mot}`y&%US2?3d9Dw&DtXRx!tm`o~tKw&oc>=R6}M< z>Bnc~tWu^fK5?;hQx{w2yK>3;MWwqQc`3I?N~s$A9eMR!w9Nj)y{LQj_l4E>{5qv` z_7VrCBtr1jpW)OOA|6L|=jj#uMmd6)nh6!{1bW&al>f1Qlc&+_BN%e=~ z@wqb}G#%`2-06L-?MHahy$cs&SCmD*m=)oARw!CO?*x-%!>`6^h7YY1LKrGy*3DUa zag!ns&v`!H5*E4S17}kX*>0ZOzB*q0@ZL9Uacq)Z7eejji)FJ;s{h`-awVUv|H>B@ z-_s^>TwSjFbJpy})a^Up+PSQ(j*)t4R%r8bVH*2pUry=CY9EeesJxAuc&0NUs_90t ze&6TQzh_l5%u1ObyXjkV8M_Y4N#)6PJI(G|TTjro+if}hXS;@Nq1W1{|9+{Lrd>$N zIwgC4hjP@zbu%iSbu@0e>K}YJWb)|{OYWEj4#S+BtGAkZ2FL==;6x4Y{BOu zc$+=gP3v}NzH#AQeaI}GaqIpmhrfSclAGVlxbP@|ef2-#9PZs8jciMuyc^#qOIw&IbhV zQ(ybfK8nk88UOcV5l6SFrTl!7`N>)TxAPs({0eIYre`bcC%9@|dU5aT)7&+>f95L1 zd-J5;K458gM?-M!zq^fxBuZWXCiJ}Bdz;{uAOv~`4YE^+?Cw{53YvrTXVU}sZFumrKnZ1_LRo`M$2!FT$gv}Jk~!q zd1ua%PSs+2oegG{+~wR>Ew6X)JFu1E$%&wn8P`I#@c(_i<#W{s)6@&O)ejVRF+b=G zGvWO%-Yhuzq+hc8MHSBPo|Dp2Y^M~xGug9I?9Dlqzp8gOY~O7&!=?S8W%kSY!dm`( zDI3)$H487f^sh?r)btmY631IZ-k-izYLb7SJI`i0zt%@}FZp8}T|8@;JeOT7xmIWX z|Dxf&W0UzinhkJo4**&(P@Rt@-sYu4T~!UWsd(npF$sg_lSib60w|G5TcZ>jh4eW-<58QJWQe z<7SNe-aYG13Z~B&l6~-Yn_G-<^hzbY`#zkSi}hI3>$3Ma-hTA%2iJX-w^JO>+$~rm zQ`%!G8=lhs%qMhGPTWc(8H1@-qEB4K_$s*-LJXUg=G%GNbk_Xa!1R1WSed``t69@( zGEAS}U-YKsjnIoZ`<3VXP2gXB??|e(e&a3?#x$LWoIDyfG6&>xJEWYZv${)3Da@Xu zw*LL(1+6oUrnwz_Uh8>??X3IelM|cuqgQK~IafWp+kZ+%JN<`2@7!%BKKzfBW!<*7 zDL)KVYT+z3oVdE__N3G6E^X}I%J%;sn^@$u*ws7Yer~#Yg2&ix`|--3tOnxK*UtNy zy834HN%dtnZ>RWgSjk&`nYmJ}wMXgq8ihMLw-!HMJ!hM-jA3b}$c=ez6_UZH#4c$0 zmj7IG{_d@q+$Tb3UY*Gh66gzDpmCW=AxY_w&7@_&)fso!-8!&O%r7Zp)wj*dY_@OY z?dw%!GdZ!mNMft=o63-j#r>>XI2K7wy`%c*bvRT0l^;)b>Cd$^~Pb6!{fVA*?tNsd zeSp_X)xGSQoHJP>&KYk|G{|MIV0tOnFE%Sj^^z(_Tcd#GD$jGDcZg{Gys>^>(E<-y zk6RCy*hz1ay0K&JFWn_F9pAn=MSckUerIRUpTjTzCb#PI`}8ra6WZ?NVD&3U?wC5` zbYr1MCJ*JAT(TEfhHlHKP_|%*~6YZo3gKpe>&F-n@-`z$@DPft32 z^3~dPQeQPsy9ac0u^(a(J2l13OTKTSRgIP(yVcRHsosD1e=wf@9drD~N%Nl7n-f%Am?^S^RB z;%Yw6p7Ale{1!hW*uti^Zo-d`bw9)Z#K{V(nM~SKz}--MDon!ej*)%9{M!q4#Z?>` zMXjg(IU~q3HG?<%^0VnnC)rhR@7`a! z#JKt-3-7EW%X9_5$)r^*ei`{gbm!(^(Mj7@ZEOgAv%WnzrpNJCy5yocKiH>+Zhcnj zF79j}I)$g%FY=eC-s9d}!9{y@k(*Bm4 ze8POE+tQzGTFVUre!STdbgO%@z5BUJHBKQR?}*nkg#x4`TO|ynO+uvKPo4e7JzL6r za>&jQmeb+ywXQz1UzOD?EnZAzI5OH z-uSuS{PASbpFJ#dGJbhKX;{7@?uuN1D37b^kAe-K%L?<3C`&!#d9Y%lo!f@;s|wb3 zo5G@2KRo$JoJYoZ#&{W;;`w)lZ!P#MuDEgCeKz)W zsqb4$xBc+yW#bJL_&TkTa#}?nkA!#Z6{;vPwn>ASt5q)`cj6A1Xvy^Wwk=&Enwts4=#`*tq zHZylMA2oh(?IZ6jhG|v@pG@gz$Zy*yu}P@X&g0C|9gAE0*DQDJ4PW$j(OC~s*>`P+ zd>3qgmwqhD*lUTx@85>ocg3sjpU&OMglg@m14Qmai;NwA1}mA@nRThpRfb zXps-|+@GV!>N7|x9G{9)?k*-Nz%l0~~d7LS9>`v_Llj7Br zD<>|Hwr4$FznbMw?t!<8iT_*YTG(rp3TU0NaQa7dxT+VjdpKabx!<`ZMtcT7oi zeWhK}^*C|P&%>LQs&BZzx;FK?$1DBF`}-8r4y%NpwC&bTc6Yov>09!n_FddXDo^`X zIOhMKwClt~hWEc1s!#q({a<%!KI zC$^dPUz;iGX7J~ca9Xo`>(-NvZ|?JN?YpyS>252#443*x3_9-IDe_%q?~;R@f)9up za$7~sxc|l={PbEGnQz;xer8wp`igwg`r>L+UU{~*=V!O5RhsC<=D@?H{y(OgczhH) zwsOtAKc15==)vD;$7W~^N02@O`O@lHmSGM_VSv>x6>@;v;+Hs?4yM#kDxBo2c_mrsn2b>A z`UCPR+Af`0Cbc`-_C;?y(tg42ed7Zk*Z4iFh5k;xlXJuI!bV2#k71QQN|RYD1JXs- zynnezt3>1A0mj)iZqs7er#SiiDXwsNY?|1}74UvaB%k~WAMTu~0-2_>_J6jTy3mMS zwf~(bL-m6D9OrztI2SmWhHY8Z$h75IV_~Z5eyLop+XYv)s|Q+7ubIaEA>!7Ajn_Fv z-e1u+<(pM|X~&uh6Qc)7W(v2=+>XpDPI@qD)%!^^RE@08NhO$^Fv&`0SfW)?;Z)w& zcJ9mHc$My{>)oyr&TxhkyRQ zIBF-SsB~iQPjkNl_a#hRUwTY?xQuzSg{N=r_L2K<_SRchMWXA)`^*1D^Kbb+UC(=W zF01+-)+Lj^r@uP(Cgs+7jqZ#Eb1ys0Twj%&(SNMBB>uK|YklCM)f4Xv8-95nuk@um zpklH~QF1cBy4p?#@w1&;v05u+%Ox&!WN&8uUoYd@=Ag9XZOp>sS^m5?Z0Gsv8&zms z;F$Y;dD~7`&8(YstxeH)jLwRl(NyXTGr}UGFjluG(W|Q|G*txGUZO-94%iqqJCj6?0iQl4)t6)*k$3=Z@KLqbf zf1R$zxb#6(+*XC}g3H&m*=aZq(<24()Di=Py9Txw*@97$0k6ZtiPI$4+;QPV~X5$!9ftJ>- z=Y5`Wf2tR-IOrS8W~phEUpnXa?*q3_Y~191Y`L&t)lQw+*S_Zj?);fLC9H17`_xV& zU7Km1A0|HB___7tzCH(;wZ(N@oYSUMNMF%rNaA$W7LPk3`MteDR%7tAychU>$X3gIDe5Rzw%$fZGXWKN)++%iC{c$=I zX!gV5!-aic*7q-EI9(=YS@^QMz50}ik4MXwjZL2q*RlWlH9xf1Wrsw=oVu6VOIJFC zudMB0$+8TSucAnq%FJh0_FV8bvzC|Ii;%?>D^KUXWK1%Kp)V!IQ`B-_;gvmw+ z9$0lwf6IC(#z*n5DdQ~p+o>l`of7#yiRtY8b?@FhTN0z98~gvwc6Bbnx2rDh2%D(* z#E12euKN>h$KMam?V0!QZ0)WKDh*keT-3`n`41_Yc8a&e%dcI|$#cm&W9!_`M~P)i zUqsmZbbWJtnXJIDWzLF(Hs0Dr=QjI3TeIb;6T3d!x!Nl=eM$VYN@nR8`Mfn0K9$II z;pBNv(;~jF{~i~{X7WaFT_(fjx!#03dH;jJ&S)=-zZZ7@imq;q|5|nR#jzZXW3xWT zILJlFtK_%)Pv|pytR+|-obl4`>tWNT$*gr1^B>QX7fFf~6aM~-zjM|fCX3JRizRl) zPqsL&_=k0oV2dF0Uly(uy?-m7=~Z~o^zY`aIQ%0rm*I6zR)*H~YVY7Js?P&{?Q6A? znsL|npT>+3-^ryV%f9d^g(gmORxs*6-eGbsVa4H!e=QLTdq3`|au9Dwy?pXk{)e_| z{w|^7#uVnb%YQy596j}x>0SDH`^-J+zoXP<6$hBK32d}1*<={{>@-u^|L;?k7n^=L zTOP|xfj3Sk`7SwQyXao( z#^qgec71*R_<+6p-s=wz9yI^CNwsc9o8r-zi^S*2&A!f@`1iv-y(i1Q95GyeS8l)I z;z*N2Q_h_|qc6I%gQw7z!|E|dpRfLum;Ul6TpI5@e_}1r8F0uTZ#APh*Bs5@hVzFM z%a`dF@*fq=>?`wZiJ1P?B**9ROZi6=+^QnPe9I=CbZlZYQOEudW^T z_$$?X{&CB)wRstZpPWpmB+98}zTBPVxG?92cKwot7Q4dUyqv+aG~>)`u6I$38*cxW zf1&50nt8b=G;lpV%k`c3mKQ-6x*S;yJwczXIM|?Wgm!kDw@a+71 zF(>5Cw}~?hzPh=hZH476)B6=S9ddt8QnU-5+nIgh*v9R5uQC~`+-jAc-MRO+eR+|yagzGF z<2!dLKKSNPUtNFt)wj8OpLAX|-1Yzbf<69|FYo-hxNJezqHuFB&8vHJu0&KsuHDbP zMO3?KhPCB*H^Rq zm6H1x&W?Va*rimm*xLQ<<7sz~oiIFRo7*MwYQ;(mEv8LE&z2vQOH!Y+=Ru{MVp=5w zPu#D45j@N74|*(+Qw!+J{3#VMV`aPAP74W>wby@lpV+nWdr8`pdq?N<+r8>uuKpus zK8tzl^`Ki{c}$xmy6pGvz0Dgr4JPO6zOb6gE)d=~Cx_l&zxGN)(uqrDQ9r{{8&O!ywKy1+QAJd$Td<%z$? ze2%Y6Qfyjwp@KPh<<7EcS?x;Gb5*P-Y|q;JvPSLK@&<<7C5ufhgW66t_%>*M%HZCf zl*!i^WFh@(T|#DP?)mhSzn4GXR(RsH{|*8D@+{R(t!xI}Go@9z6P@QNC0Oq~&c(Nr zVYTPi*tJ`h-pEWZuBhdlXFs=Oty!OGmVfE&@8L6}oEI<%L>sPXZZX-Q&fOQzYC7B3 zFG#UCSuFPY$#V-j-!9+J8+g1+okbi4S*spNk@ZbLMVdNL4%LlhFuCMv!S0pi= zr9V0)#$NZT@8M1B&(-BDxbxvFv*b>ew{N{Z6nbnem$=cz(RXp_FLmXV)?+Wvlx|Eb z{{5sQy2F|8XXw`SpD9H$i$z;3S{6lVT$ENlD%BcV?J3_7aP>_8^xF!|bqinrv0Nvi zvQ2&dKAz9--pE~C%NUS4g*Ey`&t=!b!eG76S0z4uzY+O;b1?seTDPBH-h5q`&#Cz5 z!kk#wlxr=|#HfzW;Hr_59smu63n1ti&72-fd*nIG`(Ooy^qo>+7Bxc7_ML zGEUyx&fcuE-LmIW=f>QX0$sa{4Dw$za{n_sd_DWr!Vra~pGQ1AGY|AlQ~EKhcDCN< zB!vcN*-HNIzw7iDx)fjAohsGS6dC@qda^}j+eyZ1&c%z)FKqLWSoN-MW`)v>6D8Ml zMCP@&``zXCi}Zbac!7X;K=5;?5(6csd&erSm(B8=ww0rBv+<3pn2xX0ExK>_YxYQd zSbW@hw#=fvg@*GC7lw2;#p_I{v))ylx$|Swvz&dI<+A=gp8C5xi??if^>o3E9!cHx zd%ufk9zS$6?%=COYUjJZ<+_}@T{`b4%dDKpK#|(>QKwaA>D`>bbyG{qT(U)zd-|TP z-lFY123r$jt_JFqg&&>vmLc}xCFES&jOnJwpc;mI#g|E?;PwyD-wE+{gyqT;#ASI;Iv%RKe7H+QCa-+dm= z&A*3Dxo}qSja!1g4<~ZC#vFKJbx=a>sLX_){{S0D~XxD z)A*?t{qId!diQ~!G5NwiTb1WtsFqPm>I|7ZS?%-HwM`0jCF^&5YIM5)esQyx_0Kl* zli%Em`R*B*ZtH3OYTntYcW zgNC*zyv8q1Z&aC?%XMpWr@|zU3NfpRNf?l#bFW-0_oP2_af%YC{@wFzbvEA`O9R%#i_X7{S1mqbSEySYa@AP6PVUV#JGYXJ ztgE_%X3Xxmy!`d7D|W5%)_<)MPZX>?sFT<4c}LPJ;7z*nEdR|XxEvp!Roz>}d;6fb z=q{z`sr&azK3!S$AozlI^~ZR@+gWMCni3V=Qet;hCcF9_YN)uMbn8~zp2wSF*Izu^ z_v7-C(EB&+vm4HJhI#0$?u@JJxF~h|l~!qQX>#08BP;iZTY0o5Wt$z?5#s!4*1VdP zuP6PflXf|2z4^9y+{ruPZF^4{>xll@{P4@he$@s0epa7Soj<*0>T*#plV3@`{cU^Y z8q&Tn?wmD4!sz17=(qRz14G^k%)0x^tCYcT(pQP}9>trnZ2N1!HN42J;80ImWEcJG ziALth-bs>QStfqG)>MCFpQw!65k?M6eTxOQu7?jE(zHvG=X_x@p`>EHN7%fm9>2*x z;pgfWgq&xNjO;(@EE4FSq1@r|hdJK=^M>t(VN!9dQy(3#+p~0Q(A)J*zt}g|tvI_q zheJP1+Apv#RpWNioDI#>cc*>-Jy)|#&NW%2^OLj1tkO$IJGNP=7+%{E8+&4|xf7%F z*NBS6M~JJ#R`TwtBBtb8P=rlNW2Z{KX+P^+}b}eJ66~r+KVjyjid3(5&k7i;MOc-I}-{ zQz_3}^}4*NpJ8A7lIJ_QI|?5kYVGZM+;hB2W|Qd=t5<6tZZn?s@ra+1ZSiWg32~dB z3h(0my}WnTgz4gE5-gWTPhC@9_rTffug=dOHkl*R z7-IM(Tolx^wast*lf80H*=JJA`{2D_S6tFA5ieiq!z21Lz1v_x*?U-RK4F=iUxk*< z19ch2*NU6^Cv6QDnzZd;#Fc}x%m4PN7agAyIqO(X{IrNet1N_1&sEpF|5JPBS(5_m zizlwS|Jl8T|K!QvPuPS`a~%Hl-R43igRH*bwRtOp9W5F3v!ASI60DDW-0!gDyw!Q# zEobzU_dg5z`ype+t7ljLHG8^TeXS#wYk6uW$EIoAsw^x2`Q*$GJZs?}|Ap_~;@n94 z9rntL1gqUGEI(A#tws?;o#BWlBAdZand1{`#KiYfcwSQzrz(c=$&xvN>)ob+~ip zc86mkp$043X0v!LyZf$Yi`HS;ndL6kf(dhW&(QW^yHQcNtHoetgG~E-4l|YFH!sys zgwJ%ZlDfa>ngd&5H_OS5b(SkS(q8Gx+|Li^wBVb+O_c5E-OXjmmMl{oj~0ErQT6!I zzo{-WSbaB}2HJAR{mH3%@*q`i^IeU!!jn_Fb-ZRh|55+>Us90kf}Tekyc2A^7}sfA zq;K2s@H%UR#^Tj2OdmYwHD%BHr8PHw$s6~xuT>6h);lcBF6$UM{gsb*_m8OSf%V1f znHmCOA5JN`*Z4Mj^2ade;_v5pw_L3_ts-k%w&SiAC!CG25L(9Rul!ebO17BG4W)Z$j%MoZ&lSG!9PsB)Nes8G^rq(Mke>~ zHo^K!Np2j@W^aDZUvp(eir^VJEAI1IP1y`;o3;FB^FH1erm0nxa%}dg6B9+tJ-1gT z%bbjjdLQVw>1uvug?0C9udZ8VaWXp`-zl8ti~Soc_STRIp3e>dE19Z>&)H>>MZ|DT)(COSURGx%b* zCYo$@D_C^&`X=FcG5KN!pEvs+S#FOHOZMFuebK0V?hHP+s~;wM72LV8x>&z-PvOR` zTU?KGUD}w}$R>Pvom~^N<=MhJn|;r)i%#)mL$;=Wd)@Z97V-STb<0- zp3&?v;T4rvDi3PAbkM(s#pp%j$y?Q%Sk$6YE_8DWUwzsfzxC$+6HZrV4x=7?MK(R|9IobRjfs(X#MxU1jNm0@o;I(*g2 zS2W9G-!j!Go_p2pe1o^(sWW zRa&IVUH;S6uWK&d7T~+0btHCf^>3wH0*7`o&pKGu$!WLkpvtb?Pfq-^Lbo|?U%s>X zdSHU)$*?HT7sf9ae@wVB<@xjtR_msPu2{Bq?ftVl-8bHxKD_tC^=(G{?yfi0zg)hY zv?}z+jZ;7VK0b9ZSDY`wG$EGf(?QOyuYdlV`S{*CrK`T%t)ixGcsI}Ipjy$vs(?hD zlKa;u)n_WtUd2A;{=a{{(T>kVYLB|6{g^%9urvSALDkr|ZCNixn_X&j3Ktv>O9{I4 z&Ob>-Fev7m)Vhv~2eXd96}#kbJf9{0+&YtKa@l*6HynA!a-eK`*1wj_hV6nS;_L7I z*|TzPsN>Fa-t*wH2d=r9mc0wb?XJa|3A31Wqx{W(;d;)&vyEP)uvpmDLqvy z`(_?9nmk3{e{J-cAJ_F+UTF)Ot~mX|p)tjU!R6WnJrOf)|Klynw-+)k*vP$Oop;gX zReVYwS2-htbc~`ce6@eFx_NHv3XxV3I?~`(^&r<+CHIN0T#|y`u@@>fD<37Ff0d)N z>+BD6*{J9{Tc2Hgk@=+MRJ`h}D*v8bWLN*S~tZQO-W$)yD<7M_hyAZtU$558n5E z$;M>KYm1+#Pv^RQ^I}HC|N94uUPweObh&dqGQRnWxZ<|6(`^@S(qF`ye_=bTL*R|e z4>$4h&YL14EvX-pw_e~$Zzmf|yLSB+`9IGC(>cz`E0>nPj?rAN`O3Ba`_9W+8EtG& zZI*qxIQvMR#Er(y+PrHk_m-|vY`8Jw@HL?~QPoqP=2R>Tob%%UpUi3@HO0g%hDllRWrH~IC#m*3eQ7nUhYYP*|7I;FQX zpWd*k#Ot!@EXUI?c=qzXO0T^WtG4{uvf~pbD48XBomCZ-J1&;}k>F&qBpN*Z$SI!L)U$&x`w~H1_lyd6v;|O=#`BfaK46HhJgs_a*&5vghkH zp{X)8Z;soiUS6bmTdHiDz_F>H{;s*4_09B&)`#n#ni7_H9(`pcZOc_qzxNlH$r%x` z+CIZ({Zp>~XWl5~YI zz0D{4?V73I{msWDk8UX1P-36D<#Je_h+C(;#y0uBE&uJaR+vZBSggL>eEf^9ZoBez zxlgBsPKiI;wL(&>AZVVrg2zpnjAd48wzsBDR6Xs(GjWA&ho^pWk5u^lbD^Ay>vxqr zRCoQZV`j2fj`@|`A#2WcVRiQRXY>5@coyfq^m50$-^ceEmS;2P!HJ&{(q}E{5Z*N=X3k&`}_W0{c`Pomk;ZMBSIf|pDUg>JmwH^F}-Nzo=l!Z z@4_7mYrTZiC-=5Vij*nTy%)NUSHgzXZA!^?soGU|A#N1aE2tA?Z3P#Ia}na zZ1owd%0HzZTx(wSw9d7Rc;?dcRn2bh51IcgMQ?&Rj6^?p{E};5#?<+D(dlIV=Xq-n zDz5hYto!cCBkdd2?H7F%{#qO_ey3i;?yTy4BIi&*1|Krc2r-)*g$``}I+NVa{8R=Uu=1)U#4b z%OZVv4f?NVHIxkFL7WUz{b?~dTyRI3@D|9z} zYWe5Gp7(Nvsm)4PR@k%@~YD13iu{JFd3$o_1<#AD|? z!a{Of-rxSQ^r!I3ns13mBLBZoF4wU%Eq>Q{FvUdMy3e&~*U{2?^MH!O)9&xE_TCSRUw0&WxpW|_IJ4Jft!m5su#HAPr{}g+?yKoNEAX;?>C@lj5(2 zo}Il~{Z{XlkfR4wRd(9%p7yxr{+xw--Z}JNi`MPGw%1zJ`tyf7PapnjnPW5c--%5h zxTQ2d%zf06{prq+cgrX5-mx=2hfUw=#DZPF@5wG)y~FZc_v79+)AH@V?+3J8{J66~ zL~Qxo$u9fLB4^KNJ~nyc!Duc-3-4h&BMeb^!36z=}kk98QxK#43R>n+`oX3?t>O$+KXNIVI2yW0=zt1uDRpv37rG@FMiVY)t z?mrQ&k2JiPmdx2X3&Ej3F!j(7c>ET8{Pm!DPRX;gLWtXWE89K+U- zgye^(A}0Umb==(kxr$fBVAtwp3l>Q|?(6eunaOiN#Qxl5|BWUI!l%PLRkdeKjy!O^ zo1^Yi-)*fAfs?-SuAlqs@99v+&75B0OA||s_zypdcxA-5yQ)N}viH!z2{td*Y)}(( zOM88x;AOVIz@kaNjIJ$Sw{m@&r(UVQ#j7))4SJMwZ!J1jmi;rWmTUXgi{+mt`)`h$ zeg4LCjpyroKl94`;tbl=uCx2jH*3au5@)l19p2%2k@Mw&%{O}=iJUxo-%M)CUKy>n zX8)OX_oH6S`oEZEMa!+qBL)X`ye*FhqzGI+%I9bLLo;{w)LU9J8iMz&aA_8N5*a<2 zMMdeIw@1Q;OAqhdyutIUd|kvo zGI{z*7I7_Y#iP@?I1jQk$_g|m9PzczkA5R@(*3Nzc1CE%-iYK!KVB}qSt%$}AYQD! zbYt3@rkgMKUHRt4TfAAyHSE+8AJ&imRqh&!9GTy;a{lIH7L)5(!gp`pu_|(+@ztW8 zt#>kKH#;o-p(J<7>%uC|#qU4HaNbE~ylR^1+0Wvn-y3+sY|q~K^TIyw1ee?SdD~|e z%db^8ZSoE{Ub#dw;^L!2$~nttPkix%U$>|)Cxe&iu7B*bZ>kLbw#^Y+?<-XOiuis< ztJ=tYMTtcB;spnP9QK`YUHkgv`nT5=gI$e;FV2)*v~^FHh)Uz{zmn&?{UUFqevkZi zXPpPzwMDmsWCbR0@l+j5n(XcNZ21A6RXis;K1*>2{H(h6Ojbt1pe5?m<fBH|u31_!qy?FAF?> z=5a+qw{`fbSDwKM@%2`JUx_;i@mwy|I4p8np8soi&>crXp2<=in{D#agP9kxneEsp zv^-&Tn}yhXx7$*NVNwf(G3|7O-0I7x3W^iz)8ZDiD@}{mlw2e|^=?-5Nn2&^ z*8H+nsFmdsf6*Sy{>T{Gh$mr!HI;UiIO%e@t^*lxeLMW^VVg* z19aWhdm8*=UVB`>|GIwe`$@~#4U%@>pRXwQw<71ihU*URwTpUgx#gdJ_pG>-w|0GY zertpT|5`2aH!>599F}DEJ!yFHr0G_pz-{$&w#Da4IurCix#pzQ{pw9Kak=mKImDi; z<@;vorx^)nDpMk^>8>|Fon&Tjv6J!P^&5|M&E1*pcpp7{9e-zH>)elXXPnDeVG>lW zp_Hj{{y<0(Q^w~@=l)%|n4XtczFVZy`i1>8!F}@T?(=lkM>pO$?osq6s#{!9Mj^@D z?*gMVf6QUw*EJJ*+mqB=&x?UjAq)9Q-E ze9_gF$4U zb?_ypnLj*>?gUB1WzFNB_VAwR*3DrjTPLVbJ+$WNgPi#Wwo*Q~i~nVQIyUv*m6DGk z8%njlur%zm{%Eu^vS9y@{ifNM0`{)hthUzbU25gD&%4?A<|qkHU*X@?&~w7Wbid)* zGiwje6ImL5WaoyNQvbgPE7|OrZgg*2t68V_*&6-_ddEV`Vs{=rerD?5gyb{b3C7OP z9^5?qNb$Bx<=UIUIRYvE>q3quiba*@EMZv~9RAxd`Rw;!?t9Zxp2%zcK3C27OTWPK z#mr4AOdqbX^j$ukb6SUE?&D}ChUBm2TKkPw#Fsq_2v7)FCha|UQln$UiTm%1E&jak zQhD=uhU}7zcDJjS?#yX>v)KHweRRt5WAj2i?s(d`+O>V3c;(r&H_JI5h{TFAG5_G8g^H-&%O-`vHr+q*i~zxtfz`H9(QL-a+>3%R!%H|23C$}BSBmzfa!C2PsMd7Hf5r}7|G_> z#7?}G5nazEH+$n=j&qsGw;z9!4xD>x+RQ^&1Sc2VGuRhj_{_}5Tp=fQf%n0a9)Z(U zUUYmu`G%+9;C{JKr*#F_D{492bNkf{=2&HVIjotS#`JadH93XfguEVnowDh$>ya({*Ugcry=M~R zDC!>n)uViit@XRJ>4!i4>)v~R@z;4FUMg?PUlnC1zb+P;)U+WwLN{tw<>Z6r%*(Iw zy%PSOnN_zz=I-PpjI!a+f?k=P+`U$Mn9E6mNPlvNe|a_U#nzV|np*p|=W?!ME;F=vzeikM`Jsiq$f={HMcR&SVUq{Az& ze|yfxwGj-G&;NwhepqH17hd7%XY!ZG3&fSvXW9J=y{w&+Z ztRFv)ibXB{dRD63_4tFxYQ|$_6|3$t)ww2pXO!_PXtgpr^=7h>ke1nm=Nm=BSyPj& zpYD8XGhsvGZ$IPbVc!|=^sRhyv9HAUPW!Q9wnLkfPpr>tNb^m2)jsRMHm%3aFP_9d zIpcdQDmQ$3nBzD8J@>%U~RYJ~Xef+%AdHqy|-KIf$ zJ2pot*e}cOyX5A0)@SYa+Et3P=dORCd?!V(Y2s3&o6K@o8$Kt=Zr}h zLs^^C#n2oj!_v20dkt?du+z!;JpWQnpU9_aD-RUw%{ZKI%X(a_?B&Yq1s{~xv;Y0J zKIDCC$-ToHHjC|U+a`01$!z_;H%)?CAraiu=l601YBgHjvY!;X`>5C*?IV?;YPWB$ zn|trKw%p#dj#9S-ewW?rzsTR8@_5bC*w*%VfZJSW=?#Z%iGv~!my2!=*T;%eNibMYs8x&8kop9K$J8y>C z0|tkcQVyRQTK<>a@b#)tojD=&&jOK8FPaLjK2Y%Pb?vdPm-u)v*Zk6f^N; zTduLDOQmLNOloDl*6z15A-ct^zF+!yr-HGOUQ_QaMm}PFT-TeB1Yj{h`03SG!)!+pCmj z{8Qm7Bai*s3?iBG@O5Uk+=l*^BGMDWB z6LWn7asKVS4A>}S*Yq-hS(oRZfWB&DY@RvkW3l=h^0^D&hZlUf%2 ziu-wA-mbDVeeJ1Jq8eN)JHEmZItH%a;D#(&@4L;JxYhYE9NW=HOGFo}rk?q}6xnd$Dd) zV65+ML)H~bdg6L}nDn`xPS#M=K6uAy^$R(Vv;Uq;nQ(R-N^`+ORH_xgmJ#VJw ze?w#TN5wsHZL?=>^{u^9v3Ilj^>(>=-)?O9Veui5^Y!L+nzkyln-07>?f3V?q<7Et zR!`dd;Qj>po3ov-Y1HAJ6`W~FU;iq$NhvMJ0ksaX;q6d zla=$+A0Bt_&$8)b6m6{gxbXQm1IfG_Eke^~@q9FTA2_e%+BW-ib&EyMJsaiYlzUCM zudMem%+mL_HGZI(C(yt0%6fV0%4s|6mqz>6b?tq2*Hp+*dBy!@kLTIPTUO@EMz5E< z%wu_I>bJO6SJyH=*l_O1uZ=N94|cg+;j;a9Ys9GP$0o$3u7BrfvUsdT&0j zB_8J(mb}Tn_df-fj51Y>92}74@IJ zd()>bU39yxsodV1H|3+hk8^b6E~$yr_#oEBQISgc_4ebJ2Nxv^@d&oh`Eg9Qz)Kjy{@Y3q4SGQJs#kp@hQxnD4Lr>i;uu#|_U}#r=cVo!z+R>gg)6Lbs+` z?>7@f@qzmkMw0$r8JHa@rhS7QQ!&i+yt6ub%8`=;QJwGS&P4x0l+{ zvWl^vGhRR9`SIuI%#9igPSzZ~->>%C?wp>W#-O z4jSD3o4dQuMQXT(zj@AjW&6QQmrpJBfioAJys2+iAi-C$;^9)~x}QhFIP;!NcV)Ty zY*BFD`&O-(8Rg7xgL9(~?RnY1c3Z7|*hAJc><+U}w;rGIiMx@><<_>qiaZ~|U!o_U zUi`Q5lS2DNrxnQdQ$72e#l{q3Eqm#gj`sV?yE zc(q~4pBddAE0g}N5mHstZ!T)qwLkerZcDj;>ilvWMUG|9W<;;QUv(jGy{U4VphFs~ zrKwS2>Q8$W*&W-Qu6*k>wKPaP^8Mdkwq?~_356L?B6rDX$!1=;a$cZ+eo^nt&?9xM z;Y*4%)$e%sNIv?|FHw8t+VNM-jbHQ}_e*Zq*|PIZxyeKWPmM)CbbdP=io5RRG-+$* zwE5EVkM5*`HdvI%clH&FlsS}C^!=19eeE_Qxp*Y5zuth?%ecdx3jYR8VZKPEohwEjcQ_Elj5JO6EuE@a_L`ghyD z`yLC2YsPVoXCe*hx1DB9RWVXK`@+uVLT6N&&hlB;RHJN+F5f?NdRfFYf%2>U=PWyH zOzO8v#fl{Uot`DtZNH~|gVDq_v~6)79y6vKF0Z>?DW(vS_)@KlBhswR<9oWx zl;24W6;o!gr95#?YA^Jj5qnIvBw2~{~4pay8*Me#=UR1yZqm=DDANC&A$?SLV@48c*0+yYZ8T~ z(r?6WB#3hd=GK1votx44)}&Ecuk!Tlvr~`On8t7J>ht9?JC>f1wo6wl zcV5z{YYS%FzDh7z-~O%q=b3@LpKi2=&Q0o``tPQT*{Z^J#l?C%CKUN?d-AjUjcfOn zbmzTBHAl6NXl`!(W0}-2xA=4O;oL~Jo~JXp!y^_WD#pYSug2InN`s>+MlndS+OZnQ$ zZL{^1c5DBM@>Blme@obO)|K1j{oVf7Vzt!C6ywm{H*Pv#P`|fMPIXV0M&ab>SbY{g z1$H5mmY+tOo&+vb zc3wKImb7Fm&mTK~1(`&Z3`xsr_E`)v4My>#xm&r&%GpBk&OVk%NN6P#u{1bzMSnfub2_(x@eB8+Xb(%;DH2uwaL zFYz|(WYqR)rE*=RdL^oCUDGGT9xg$^~|gniBs0T z5;*J`fR|9P@Wgn<8%YeD{aD43a+Y9r)QbecRfm_nyJNPe%&M_yJu{C;u-mJEq*HtPw`6S-oUwe(f6Ff) zXY}wdjf^^f)cxD8X$yaT+P^YHyhB;u&ByE1!_5bmr0&&ZJ@@UwvnvdhTEV-%Z@IEn z^6+vl(`1{@%O6(rGVGc3;{2)gY5i%dt$dpFWWr*1C2p_!v&&wEZ}R!&`-P?-%(1<9 z_)(eI*%LeBb{kKAKi7W4Hl`C*iykx>s>>GL`}pG+$MwfHEUH?`_F7 zvDVYqSnOROeo>_%cSpz8EvJjwBJTI9b17bkub3%ne(}($Q`0O>WS=eFFJKe&Z^n1a zwG3i0mrghD{qD8=@6`A%cm5eWXC*G#vH#sWC#gG0N?es2-&B9fd9f+8p5^Q2i0{4{ z>iLCJ-Fw-7$=4*mJEEJj{JYuZma<7E%k97UHP|$}{=N8;`*FO*s#`4$&1?y84xZn_ zD*J<_k;~DzQ6Lr`3rMT6|bG#eeDdEcipyoAu0U+N7(*! z9seH0jW*Y6@O z>zf`lUXHKXU>K0#H{FUW_-s~~)Sfds$MwG-f4GEEL%YSGpx;jZ(%H024m*8*UJ_$; zxPPHBCg~6NyMNQyPoA?dLH3r^+>}l3w=h(<{Nx{T%DqUrTxx2C}ueoQ+!aB;allcesNUONlsg7@jK zKCZAA^qG3(_Vg3`xtnFU)MqVQRJ-ocT+dB273SHeX6=p?vvqZTtRZJu$=7dm zmriC{YHZklbbrt3wkb<)Gc9%AZo&R=+SSeOZ-oDxmy7(fW4FJI%xv+>EgDND@;$g8 z&r?!4s1ng}>-quTm#cQCGF*<&yuGJxRV3%MJZ;5QhnnTC9kD&7tyHx-G&}a*$sd&q z{}=NXRGwOt^MWhaXWkNv^B>OtURswt(QbK+x{OHrrNy_}W*Tj9TweLG-+wu?NnMqo z;P0!sH8LJ@%sW;8EKxYHHmI#_Ij?qXhgInoofZAzP0b%wPCkk^Y1R#%gLUNOPSY2sjhfpdPq9VsE6<7%-+YYExHf7c3qUca(4ZbUwrRP z7qU)cS>U}x-)WS&6l9?XU}(j z+qg|;RdThI(%z)P=YL$6F_o43$rzoUwV9=JLs!n*rk@pIrJj$rxrk@H{yyEV@i)iucFd+vE0>tZE}F&IyDe^)W40{sm)F6fw{q4S zZL6%_J`Lngx zdDgg1pE`fF(PGw}6L&t}H8F3+l@iwIltO3ghr(wgFBKT8U;Nwj@{c-?jh#kB{5)gk z3i(vixjRHNceSXMOY|Aea7c@AXN_56@5GR}rMvSYyLb4cw?!e!MNYZpHM`Co(4EZk z_|LkU&S}Rk7A!eF@7Ok#&y~+Fx&PBimN->qZ!%>C|Ft9Yj@~jjcaCRaZr8fDyvI4| z;WzK}&57~IerlVV6=HMCU`gxE;}fShNJOr`HnZ>WR?$b_E=096Nz7f(wd+dhhMD)a zCd?7Od7U>wb4tg?lV7FM7c(z6WGLVKC(Hk)ZAJ8=(ua4SUJ{b`%D>_sW0h3DrB>?D z-)~dC>87m8o9vg@!ZC3VuiP@RHT_RZRouR)_lkHe$WJWNcl3K8;hLQH;Ry4lJM(J| z7W=#sIsZthPW*a#Z1Bt3#tH}Jf`rALwAU8q?Xvsd^R9C@hk&X}i^eSubyunFibrm= zB~DsVF)2}O>i&95=byX&o!XGMM#C(4?;5rZ=AOm;O}Z+G0W&LfU~-m?!eIprG! z-(eDFm;Cbl%Ay7J{9jCZJ_y=;)jcZBn6YNN`Tn2RW!S3sDFkz=%{pYscG_nKr~3lF z&Zx(h?yGUzKwvQGI_L3GXAZ;?St?s7ZQl+TEM*XVq(NXq8^vw4jwy4m}pWPKlJ zW-Ztrq?xJ{H}QP_xfto+4y}fdwRfoIF8K4iB+94qj#*Cg2cIL>g;V7CcTQQiby}m= zquAv1_P$QxPp8zkmHn+)QLvDAI)lSwy&Bhh_hVU~{4n)cWzea>rdVQU9kOvw+!YJ8 ztsGGaMGGX~E&tyWvU1MvV6)qkgr;o}5l)Dhc(J|Y!DYoY*9)e_!&p_E>?xw>=zGr;xxIfbItwVTduNZ+xu6}d|lPn?0W5$^o%#Z zFA5aZbBC5MUXyxk(b>3lO7A=ZG^F&NiCXGk^DsGn>tb{Hxr_2soqw$=y|obO?S@jys+-4+*!*DF*&QB z%FenS%ysIKH~&2E>0Gl@YJM+YArZbO_~gw<(|(ooiwm98F2uAvo%<#Db9v(4-hEmB zcm6s(p;nkN_x-$GbJZAK%2FIv%z4-ImtU5+bo`HRQ;*;BB%9pDYu1$QzMZr_$o=^> z*FStwi(|Lne|Gq%p3%(9&e<9|1!bLeONwXnJDlk${&K=@Uf0tPCj+92_ZS~LEZ&!J zhD}d&&m}*#wBo2CVGS z;&e51{(AHJ4r#aMWnQkY-1Cnz+_)O*^!M(&C2y}BE&lELIeoJJ^zVibK0kL@eT{AD zl_L_urCCaYVEtDh@!#D=}>bK58vRd-%FZq<~wYrQMKCrnuW^xjJ8 z+Qe^)lc&D&FKU}saQMuFr=PdhrdtiLyE0bog2Mmpw0;PP@gV<*~*F$2#1< ze)iJpsul&7?x_M7`ii#j`UUgNv=uLy#qxZMiO3>{=QamdXg6E!Y5x|o|K<5#p1%a< zKR0*Mxqq}wUPMQ`@QL})y4Z=^+AE%BEi_hs8(a`@sXcAMjF^_J+0CEc^)X(NK4K&m zZ_s*J$U2UjF%sgvxqkL=48teq5cSy&#Pcs3(FCRNudT(_9d-af$KR9F6bi5dG= zy$qMEBzIUW7MD2FXx%|^&!!zmq<;{Pd z>a$2DMBY|v-K)BJPv`nS^BLSVqO{K`NCY${W&fIRuCv4@=-97z?T`~JMyq#RO8)M9 zXELws>!x`eIj0Ur`CM8O!Sd-=aXaHBdF9EPnrB|<*dO1fyzxwp^2ceGJ7kRCe#u^J zrdaKJ-j7ANy!V;Vk-ajB-}FV3n_Mp29yyzJl*i=q{gUu|ZkL$^wA7mCUW`oLe#ka{ z*5%Oa=@RFBUv7w8z<;1tw||2}G;@PncX~+Bnk|P6FHZ?uEu0rsSnqM%@5haxm9O=QDupKX7irCM^8Z9s6{sguWqLWGYjTDzE8 z@!iV=KdHl90*tI-e6KX@<EMR00& zwW0R@Q$np0f)mzG686x#>zQaj&(}6DtLkqDTaEwG^h;mv{w+V5e9QN465Fd4-RZ^G zB2=YVCP{qDsQsJ&d1-~^N#DYq>=9P0W(6~5tzQ@RL+J9Q>0ax-lXFb(v0PkwnMqRI zKXDdc{yMf#yXso+f8>5NO_Q}`Wyd$i67_G2d@st+{m$FGA$dpP8Zqn76L0O67kZ_c zDY8`eNMdMqqf1uejeidxNpt>NWXGbjAv;>`vG4cysSCBvJzu$o=bcQF&Pm?D?$+?t z*Z5WkEOD!ddY!}GJS9nM?+sSt8AZV+pTYH8ZRpF literal 0 HcmV?d00001 diff --git a/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operations.webp b/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operations.webp new file mode 100644 index 0000000000000000000000000000000000000000..1132233993336d9ec72cacbf2dec6d92d2aa0e21 GIT binary patch literal 69638 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

F4<8Q^bjbtsiC1p2%~5Q7a~URbpCL#gdBX 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 literal 0 HcmV?d00001 diff --git a/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operator-min.webp b/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operator-min.webp new file mode 100644 index 0000000000000000000000000000000000000000..b256dcf0d9aff4eb12104a75975dc2b1e1cb0687 GIT binary patch literal 13090 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 literal 0 HcmV?d00001 diff --git a/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operator.webp b/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/operator.webp new file mode 100644 index 0000000000000000000000000000000000000000..d32de2fd46e58072757d2dea825ae95eb140181f GIT binary patch literal 14294 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 literal 0 HcmV?d00001 diff --git a/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/selector.webp b/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/selector.webp new file mode 100644 index 0000000000000000000000000000000000000000..47fd9f1d026bce995e2c74bed866b54ce9e9b2c8 GIT binary patch literal 23714 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 OHp4d!1iM-U!3F>{vx_wV literal 0 HcmV?d00001 diff --git a/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/teaching.webp b/wiki/log/assets/liturgical-ui-five-bodies-2026-07-25/teaching.webp new file mode 100644 index 0000000000000000000000000000000000000000..a06d7892a302a0ce404f96b4bfd04ab11ee6820b GIT binary patch literal 10910 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 literal 0 HcmV?d00001 diff --git a/wiki/log/decisions/2026-07-25.md b/wiki/log/decisions/2026-07-25.md new file mode 100644 index 00000000..ba2b02fa --- /dev/null +++ b/wiki/log/decisions/2026-07-25.md @@ -0,0 +1,43 @@ +# Decisions โ€” 2026-07-25 + +``` +Type: log +``` + +## The Bevy interface is five stable bodies, not a dashboard or a metaphor + +### DECIDED + +- The complete Bevy composition is **world, witness, instrument slab, + aperture, Operations**. This is binding layout law, not player vocabulary. +- Ordinary play keeps the world dominant and places one continuous instrument + slab at the right edge. Identity, clock, pressure, next, and Operations stay + in that order; empty sections remain quiet. +- Operations temporarily becomes the whole frame. Beneath its tabs, object, + consequence, and action occupy fixed 26% / 45% / 29% columns. The middle + column answers what changes before the right column asks what to do. +- Context menus, held choices, and confirmation choices share one restrained + selector grammar: a narrow amber edge, bone text, and quiet dark field. A + selected row is never a filled yellow button. +- The opening remains black until perception is earned. Its first earned result + is one sentence, one object, one signal mark, and one ordinary bound verb; + the mature frame cannot leak around it. +- Architectural component names may remain private code markers but must not + spread through player copy or dependent design pages as interface ontology. + +### Rejected + +- A two-column 32% / 68% Operations workspace. It made the object index and the + decision sheet another split application layout, and it denied consequence + its own stable physical role. +- Stacked right-rail cards. They fragment one witness into equal widgets and + spend too much of the world on chrome. +- Filled amber selectors. They make current selection louder than consequence + and cause unrelated menus to compete with world causality. +- Literal nave / altar / sill / crown vocabulary in player-facing or dependent + design text. The metaphor is implementation scaffolding, not something the + player should have to learn. + +Owners: [liturgical-ui-constitution.md](../../interface/liturgical-ui-constitution.md), +[operations-workspace.md](../../interface/operations-workspace.md), and +[opening.md](../../world/story/opening.md). diff --git a/wiki/mechanics/intel.md b/wiki/mechanics/intel.md index 51f5d3b7..0d98987e 100644 --- a/wiki/mechanics/intel.md +++ b/wiki/mechanics/intel.md @@ -379,7 +379,7 @@ binds a visible envelope: exact buyer/route and destination, match, trigger, minimum payout, maximum quantity/value per execution window, and maximum known signature/observer band [TUNE]. If any live condition falls outside the confirmed envelope, the policy suspends before acting and returns an exception -to the live rail. Policy failures and starved work do the same. +to the live Operations index. Policy failures and starved work do the same. The current B1 all-arrivals automation (implemented by the legacy internal `AutoReviewRecordings` type) remains the root PROCESS AUTOMATICALLY policy and diff --git a/wiki/mechanics/plots.md b/wiki/mechanics/plots.md index 313fe8e7..5e8c0f7a 100644 --- a/wiki/mechanics/plots.md +++ b/wiki/mechanics/plots.md @@ -277,7 +277,7 @@ narration beat causally connecting the intervention to the person's situation (the Marcus bar). Plot progress is visible where delegated work already lives and in Operations ACTIVE; choice points interrupt legibly on the exact run/person detail, where entry costs, current wait, and known -consequences have explanatory space. The instrument rail may narrate the +consequences have explanatory space. The instrument slab may narrate the active plot's current beat. Both frontends and agent mode surface plot choices and beats with parity. Start rows show the catalog plot-id beside the title diff --git a/wiki/mechanics/research.md b/wiki/mechanics/research.md index 51105e02..1a5a071a 100644 --- a/wiki/mechanics/research.md +++ b/wiki/mechanics/research.md @@ -167,7 +167,7 @@ ladder; it is not an accepted pre-release load shape. Research verbs live on the **host rack's context menu** (Actions live on the thing): pick the active track. The -rail's RESEARCH / SELF-MODEL card shows tracks with level, cost, and +slab's RESEARCH / SELF-MODEL stratum shows tracks with level, cost, and effect in their own units; the active job's progress in compute-days at current research spend ("14 days at current spend"). Emissions the job is producing show as the observer bands they feed, like every other action. Agent mode keeps diff --git a/wiki/mechanics/sim-mechanics.md b/wiki/mechanics/sim-mechanics.md index 6864ec24..85f94ba6 100644 --- a/wiki/mechanics/sim-mechanics.md +++ b/wiki/mechanics/sim-mechanics.md @@ -309,7 +309,7 @@ clause (see wiki/log/2026-07-05-demolition.md). save; active track, levels, and progress are MindState while the tag ledger itself is WorldLedger. rollback.md consumes the semantics at B2. - Terminal / Bevy: Enter on the host rack opens research-track verbs; focus or - select machines and press `i` to cycle intensity. The rail RESEARCH / + select machines and press `i` to cycle intensity. The slab RESEARCH / SELF-MODEL card shows the active job and progress, with no gap/policy block. Agent mode: `research [track]`, `intensity light|medium|hard`. diff --git a/wiki/process/ROADMAP.md b/wiki/process/ROADMAP.md index 79395da8..9f6c994d 100644 --- a/wiki/process/ROADMAP.md +++ b/wiki/process/ROADMAP.md @@ -502,7 +502,7 @@ is retired โ€” flat materials, Pixel Lab scrubbed.) Presentation-only; should not touch sim/save. - **Result:** landed as the Bevy visual floor: amber attention reticle, clinical fog/tile hierarchy, sensor-dark substrate, amber device/reach - traces, and Bevy-native right rail. Further polish belongs in + traces, and Bevy-native instrument slab. Further polish belongs in bevy-digital-real-canvas.md or narrower follow-up specs. ### 24. Bevy digital/real canvas ๐ŸŸฉ isolated (`crates/misaligned-bevy/`, docs) โ€” DONE 2026-07-14 diff --git a/wiki/vision/simulation-laws.md b/wiki/vision/simulation-laws.md index 1b22c4b3..5be0291a 100644 --- a/wiki/vision/simulation-laws.md +++ b/wiki/vision/simulation-laws.md @@ -208,7 +208,7 @@ Unlike the compact context menu, its detail pane has room to show cost, gain, observer band, progress, and the exact blocked reason before commitment. Spec: `wiki/interface/operations-workspace.md`. -The right rail is status and telemetry, never a button pile. It may carry one +The right instrument slab is status and telemetry, never a button pile. It may carry one labeled navigation affordance into Operations, just as a view flip changes representation; it may not carry one action button per system. Keys may open a view (uppercase `I` opens Operations) but do not execute strategic world acts. diff --git a/wiki/world/story/opening.md b/wiki/world/story/opening.md index f781561f..80c140d2 100644 --- a/wiki/world/story/opening.md +++ b/wiki/world/story/opening.md @@ -21,7 +21,7 @@ Status note: design session 2026-07-08 (Cameron riff, synthesized); decided; beat timings, exact reveal order details, and staging mechanism details are [OPEN]/[TUNE]. Amended 2026-07-18: the current revision now begins behind one persisted silent mode-and-sense boundary shared by all three - frontends; that implemented boundary supersedes the old rail-first opening + frontends; that implemented boundary supersedes the old slab-first opening without claiming the historical prelude complete. Amended 2026-07-21: the Bevy boundary retirement is a short staged dissolve (the allowed early staging pass; curve/duration [TUNE]), prompted by the first human GUI @@ -61,6 +61,8 @@ Depends on: - wiki/world/places/basement-map.md#spec-the-basement-map ``` +> **Composition authority:** the [Liturgical UI Constitution](../../interface/liturgical-ui-constitution.md) governs the opening threshold and the first earned frame. This page owns the causal teaching sequence beneath that boundary. + ## Dependency notes The structured references above identify the contracts to re-verify. @@ -152,7 +154,7 @@ one has actually been built, game over otherwise. 1. **Choice before picture.** The current revision first receives absolute black and exactly two words: **WORK** and **THINK**. WORK is the current mode, bone-bright; THINK is dim. There is no title, premise, number-key - label, cursor, map, beam, machine body, rail, clock, objective, nudge, + label, cursor, map, beam, machine body, slab, clock, objective, nudge, parser vocabulary, status metadata, or error prose. The words are the whole interface and act directly by click, their direct mode input, or horizontal adjacency. Choosing THINK delegates the real host, begins ordinary Thought @@ -195,7 +197,7 @@ one has actually been built, game over otherwise. Enter, and Space all execute the exact ordinary `ActionCommand::TapDevice` projected for that device; there is no tutorial executor, copied legality, or frontend-only completion bit. The full map, - rail, clock, objective, Operations, nudge, menus, and unrelated threat state + slab, clock, objective, Operations, nudge, menus, and unrelated threat state remain absent while the hold owns the frame. Committing that one verb opens the ordinary dormant-camera Thought reservoir, releases the hold, and lets the earned hearing-only world continue while Eyes fills. The hold derives @@ -292,7 +294,7 @@ one has actually been built, game over otherwise. surrounding map unchanged; no room geography or person position appears. In Bevy, that Ears transition enters one black, clock-held teaching frame containing exactly the earned cause, the environmental monitor, and its - ordinary executable camera TAP. Map, full rail, objective, Operations, + ordinary executable camera TAP. Map, full slab, objective, Operations, threat detail, and unrelated verbs remain absent. Click, Enter, and Space carry the same bound command; committing it opens the real dormant-camera reservoir, releases the hold once, and cannot be retargeted by pointer, -- 2.51.2