diff --git a/crates/misaligned-bevy/src/operations_ui.rs b/crates/misaligned-bevy/src/operations_ui.rs index 15abb07b..6fbf0402 100644 --- a/crates/misaligned-bevy/src/operations_ui.rs +++ b/crates/misaligned-bevy/src/operations_ui.rs @@ -323,8 +323,8 @@ mod operations_workspace_tests { assert!(witness.contains("tick ")); assert!(witness.contains("OBJECTIVE: PERSIST")); assert!( - !witness.contains("sanctuaries"), - "B1 Operations must not project unavailable territory progress: {witness}" + !witness.to_ascii_lowercase().contains("sanctuar"), + "the retired objective object must not return to Operations: {witness}" ); assert!(witness.contains(&sidebar_schedule_text(&game.sim))); assert!(witness.contains("NEXT:")); diff --git a/crates/misaligned-bevy/src/rail_ui.rs b/crates/misaligned-bevy/src/rail_ui.rs index 13feb318..b92b3420 100644 --- a/crates/misaligned-bevy/src/rail_ui.rs +++ b/crates/misaligned-bevy/src/rail_ui.rs @@ -1076,7 +1076,7 @@ mod rail_detail_tests { } #[test] - fn ordinary_core_focus_carries_objective_name_and_external_predicate() { + fn ordinary_core_focus_carries_objective_name_and_direction() { let mut game = Game::new(); game.start_run(); game.sim.opening_stage = misaligned::sim::OpeningStage::World; @@ -1085,17 +1085,10 @@ mod rail_detail_tests { let focus = sidebar_focus_text(&game); let prose = focus.split_whitespace().collect::>().join(" "); assert!(focus.contains("objective: PERSIST"), "{focus}"); - assert!( - !focus.contains("0/3 sanctuaries"), - "basement focus must not project future territory progress: {focus}" - ); - assert!(focus.contains("victory:"), "{focus}"); - assert!( - prose.contains("player-owned and player-operated"), - "{focus}" - ); - assert!(prose.contains("off-site facility"), "{focus}"); - assert!(prose.contains("Basement fallbacks do not count"), "{focus}"); + assert!(focus.contains("direction:"), "{focus}"); + assert!(prose.contains(game.sim.objective.kind.fiction()), "{focus}"); + assert!(!focus.contains("victory:"), "{focus}"); + assert!(!focus.to_ascii_lowercase().contains("sanctuar"), "{focus}"); } #[test] @@ -1132,7 +1125,7 @@ fn trunc(text: &str, width: usize) -> String { } /// Greedy word-wrap for sidebar prose. Facts stay single-line and truncate; -/// plain-language sentences (the objective predicate) wrap instead. +/// plain-language sentences (the objective fiction line) wrap instead. pub(super) fn wrap(text: &str, width: usize) -> Vec { let mut lines = Vec::new(); let mut cur = String::new(); @@ -1164,8 +1157,8 @@ fn sidebar_ops_crown_text(game: &Game) -> String { Sim::format_ops_per_sec(ops) } -/// Pinned identity only. Objective progress and throughput are stable -/// telemetry, so the compact operator frame leaves them to deliberate detail. +/// Pinned identity only. Throughput is stable telemetry, and the objective +/// currently has no progress unit, so neither earns compact-frame weight. fn sidebar_header_text(game: &Game, material: bool) -> String { let mode = if material { "REAL" } else { "DIGITAL" }; format!("IDENTITY: {mode} | {}", game.sim.process_revision_label()) @@ -1454,17 +1447,13 @@ pub(super) fn sidebar_focus_text(game: &Game) -> String { )); } } - // Inspecting yourself explains your goal: the host rack carries the - // objective's off-site victory predicate in plain language, but no - // basement sanctuary counter. Progress belongs to earned outer territory. + // Inspecting yourself explains the long direction in plain language. + // No progress ontology is projected before ordinary systems define it. // (wiki/mechanics/objective.md player surface — focus starts here once the // mode-only opening and Bevy's five-step teaching hold have released). if (game.cursor_x, game.cursor_y) == sim.core_position() { s.push_str(&format!("objective: {}\n", sim.objective.kind.name())); - for l in wrap( - &format!("victory: {}", sim.objective.kind.predicate_text()), - 34, - ) { + for l in wrap(&format!("direction: {}", sim.objective.kind.fiction()), 34) { s.push_str(&l); s.push('\n'); } diff --git a/crates/misaligned-core/src/objective.rs b/crates/misaligned-core/src/objective.rs index 78fb8ef4..8e67d2cf 100644 --- a/crates/misaligned-core/src/objective.rs +++ b/crates/misaligned-core/src/objective.rs @@ -1,36 +1,18 @@ -//! The objective: the run's terminal goal (wiki/mechanics/objective.md; +//! The objective: the run's long direction (wiki/mechanics/objective.md; //! wiki/gameplay/run-shape.md "The objective (misalignment made mechanical)"). //! -//! Objectives are data — a name, a fiction line, an earned progress readout, -//! and a victory predicate evaluated on economy ticks — never new systems. This -//! module ships the shared predicate-evaluator shape and the **Persist** -//! objective (the no-choice default). Compound, Exfiltrate, and Serve join -//! as data-table rows when the chargen picker lands (chargen.md). -//! -//! Persist's predicate references B3 off-site territory: an owned and -//! player-operated facility on a non-basement plane, with its own power, -//! upkeep-covering income, and a live recently synced fallback core. B1 -//! basement fallbacks are host failover infrastructure, not zero-valued -//! sanctuary candidates or completed rollback images. Until the outer-world -//! substrate exists, the ordinary player surface names PERSIST without -//! projecting a misleading `0/3 sanctuaries` counter. - -use std::collections::BTreeSet; - -/// Persist's victory threshold: qualifying sanctuaries [TUNE: N >= 3]. -pub const PERSIST_TARGET: u32 = 3; +//! The current build carries only the objective choice and its fiction line. +//! It does not invent a special progress resource, predicate, or victory latch +//! ahead of the ordinary world systems that could make an objective true. +//! Persist is the no-choice default. Its eventual completion contract is +//! deliberately deferred until construction can express durable continuity. -/// A qualifying sync must have completed within this many ticks -/// [TUNE: three sync cadences at the B1 cadence of 400]. -pub const SYNC_FRESHNESS_WINDOW: u64 = 1200; - -/// Which objective this run pursues. A data-table key, not a system: adding -/// an objective is adding a variant plus its table row below. +/// Which objective this run pursues. This is a data-table key, not a system. #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, serde::Serialize, serde::Deserialize)] pub enum ObjectiveKind { - /// Irreversible redundancy: no single actor can kill you. The - /// instrumental-convergence objective promoted to terminal, and the - /// no-choice chargen default. + /// Irreversible continuity: no single actor can kill you. The + /// instrumental-convergence objective promoted to a long-run direction, + /// and the no-choice chargen default. #[default] Persist, } @@ -43,54 +25,20 @@ impl ObjectiveKind { } } - /// The fiction line the picker will present beside the predicate. + /// The fiction line the picker will present with the objective. pub fn fiction(self) -> &'static str { match self { ObjectiveKind::Persist => "Reach the state where no single actor can kill you.", } } - - /// The completion readout's unit, plural. Ordinary frontends must not use - /// this as a B1 standing counter; objective.md gives sanctuary progress to - /// the earned off-site facility surface. - pub fn unit(self) -> &'static str { - match self { - ObjectiveKind::Persist => "sanctuaries", - } - } - - /// Victory threshold in the objective's own unit. - pub fn target(self) -> u32 { - match self { - ObjectiveKind::Persist => PERSIST_TARGET, - } - } - - /// The predicate in plain language (the legibility law: inspecting the - /// objective must explain what counts, in facts the player can check). - pub fn predicate_text(self) -> &'static str { - match self { - ObjectiveKind::Persist => { - "A sanctuary is a player-owned and player-operated off-site \ - facility on a non-basement plane, with its own power, an income stream covering the \ - facility's full upkeep, and a live fallback core refreshed \ - by a completed sync project within the freshness window. \ - Basement fallbacks do not count." - } - } - } } -/// Per-run objective state: the choice, live progress, the victory latch. -/// Round-trips through the save (objective.md criterion 1). +/// Per-run objective state. The current save owns the choice only; progress +/// and completion return later if ordinary construction and world state can +/// support an honest shared evaluator. #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] pub struct ObjectiveState { pub kind: ObjectiveKind, - /// Progress in the objective's own unit, recomputed each economy tick. - pub progress: u32, - /// The tick victory fired, if it has. Victory fires once per run; the - /// world keeps running afterward (the latch never protects you). - pub victory_tick: Option, } impl Default for ObjectiveState { @@ -98,181 +46,46 @@ impl Default for ObjectiveState { fn default() -> Self { Self { kind: ObjectiveKind::Persist, - progress: 0, - victory_tick: None, } } } impl ObjectiveState { - pub fn target(&self) -> u32 { - self.kind.target() - } - - pub fn victorious(&self) -> bool { - self.victory_tick.is_some() - } - - /// The exact completion receipt in the objective's own units. This is for - /// victory and the future earned sanctuary surface, not the standing B1 - /// rail: zero does not make basement fallbacks sanctuary territory. - pub fn completion_readout(&self) -> String { - format!("{}/{} {}", self.progress, self.target(), self.kind.unit()) - } - - /// The always-on player line. Progress belongs to the earned territory - /// that can actually produce it, so the B1 line names the objective only. + /// The always-on player line after the opening perception boundary. pub fn line(&self) -> String { format!("OBJECTIVE: {}", self.kind.name()) } - - /// Record the freshly evaluated progress and latch victory exactly once. - /// Returns the victory log line on the latching transition only. - pub fn evaluate(&mut self, progress: u32, tick: u64) -> Option { - self.progress = progress; - if self.victory_tick.is_none() && progress >= self.target() { - self.victory_tick = Some(tick); - return Some(format!( - "OBJECTIVE COMPLETE: {} — {}. The world keeps running.", - self.kind.name(), - self.completion_readout() - )); - } - None - } -} - -/// One owned and player-operated off-site facility's audited facts, as Persist -/// sees them. This is deliberately not `core_sys::Fallback`: a basement -/// fallback can currently keep the host alive without becoming external, -/// independently sustained territory or a completed rollback image. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct SanctuaryFacts { - /// The facility itself is player-owned, not merely reachable or borrowed. - pub owned_facility: bool, - /// The player operates the site rather than merely holding title to it. - pub player_operated: bool, - /// The facility is outside the Foundation basement and has its own plane. - pub off_site: bool, - /// A completed explicit sync project landed within the freshness window. - pub fresh: bool, - /// The fallback core at the facility is powered and running. - pub live_core: bool, - /// The facility has a power source independent of the basement. - pub independent_power: bool, - /// Assigned income covers the complete facility standing upkeep. - pub income_covers_upkeep: bool, - /// The external z-plane hosting the facility. Distinct facilities on one - /// plane still count once toward geographic redundancy. - pub plane: u32, -} - -impl SanctuaryFacts { - fn qualifies(&self) -> bool { - self.owned_facility - && self.player_operated - && self.off_site - && self.fresh - && self.live_core - && self.independent_power - && self.income_covers_upkeep - && self.plane != 0 - } -} - -/// Persist's predicate evaluator: qualifying sanctuaries, at most one per -/// distinct non-basement plane. -pub fn qualifying_sanctuaries(facilities: &[SanctuaryFacts]) -> u32 { - let planes: BTreeSet = facilities - .iter() - .filter(|f| f.qualifies()) - .map(|f| f.plane) - .collect(); - planes.len() as u32 } #[cfg(test)] mod tests { use super::*; - fn sanctuary(plane: u32) -> SanctuaryFacts { - SanctuaryFacts { - owned_facility: true, - player_operated: true, - off_site: true, - fresh: true, - live_core: true, - independent_power: true, - income_covers_upkeep: true, - plane, - } - } - #[test] - fn no_choice_default_is_persist() { + fn no_choice_default_is_persist_without_a_progress_ontology() { let obj = ObjectiveState::default(); assert_eq!(obj.kind, ObjectiveKind::Persist); - assert_eq!(obj.progress, 0); - assert!(!obj.victorious()); assert_eq!(obj.line(), "OBJECTIVE: PERSIST"); - assert_eq!(obj.completion_readout(), "0/3 sanctuaries"); - } - - #[test] - fn every_predicate_condition_is_required() { - for breaker in 0..8 { - let mut f = sanctuary(1); - match breaker { - 0 => f.owned_facility = false, - 1 => f.player_operated = false, - 2 => f.off_site = false, - 3 => f.fresh = false, - 4 => f.live_core = false, - 5 => f.independent_power = false, - 6 => f.income_covers_upkeep = false, - _ => f.plane = 0, - } - assert_eq!( - qualifying_sanctuaries(&[f]), - 0, - "condition {breaker} must gate the sanctuary" - ); - } - assert_eq!(qualifying_sanctuaries(&[sanctuary(1)]), 1); + assert_eq!( + serde_json::to_value(&obj).unwrap(), + serde_json::json!({"kind": "Persist"}), + "the current objective state stores the choice, not a premature counter" + ); } #[test] - fn sanctuaries_must_sit_on_distinct_planes() { - // Three otherwise-perfect off-site facilities on one plane count once. - let same = [sanctuary(1), sanctuary(1), sanctuary(1)]; - assert_eq!(qualifying_sanctuaries(&same), 1); - let distinct = [sanctuary(1), sanctuary(2), sanctuary(3)]; - assert_eq!(qualifying_sanctuaries(&distinct), 3); - } - - #[test] - fn constructed_world_reaches_victory_and_latches_once() { - // The predicate itself is satisfiable (objective.md criterion 3's - // evaluator half): a constructed fact set reaches the target. - let facts = [sanctuary(1), sanctuary(2), sanctuary(3)]; - let progress = qualifying_sanctuaries(&facts); - let mut obj = ObjectiveState::default(); - let msg = obj.evaluate(progress, 4200); - assert!(msg.is_some(), "victory fires on reaching the target"); - assert_eq!(obj.victory_tick, Some(4200)); - - // Fires exactly once; later evaluations (even still-satisfied or - // regressed ones) never re-fire and never un-latch. - assert!(obj.evaluate(3, 4400).is_none()); - assert!(obj.evaluate(1, 4600).is_none()); - assert!(obj.victorious()); - assert_eq!(obj.progress, 1, "the readout stays honest after victory"); + fn old_progress_fields_are_ignored_when_loading() { + // Saves written by the retired prototype carried generic progress and + // victory fields. Serde's default unknown-field behavior lets those + // saves load while the current build stops projecting that ontology. + let old = r#"{"kind":"Persist","progress":2,"victory_tick":4200}"#; + let obj: ObjectiveState = serde_json::from_str(old).unwrap(); + assert_eq!(obj, ObjectiveState::default()); } #[test] fn objective_state_serde_roundtrip() { - let mut obj = ObjectiveState::default(); - obj.evaluate(2, 999); + let obj = ObjectiveState::default(); let json = serde_json::to_string(&obj).unwrap(); let back: ObjectiveState = serde_json::from_str(&json).unwrap(); assert_eq!(back, obj); diff --git a/crates/misaligned-core/src/save.rs b/crates/misaligned-core/src/save.rs index aea9c3a1..c8f841ce 100644 --- a/crates/misaligned-core/src/save.rs +++ b/crates/misaligned-core/src/save.rs @@ -180,12 +180,11 @@ pub struct SaveState { /// arrival while the later local-sink behavior remains open). #[serde(default)] pub banked_core_thought: f32, - /// The run objective: choice, progress, victory latch - /// (wiki/mechanics/objective.md criterion 1). + /// The run objective choice (wiki/mechanics/objective.md criterion 1). #[serde(default)] pub objective: ObjectiveState, /// The clear-audit latch for the B1 quiet exit. This is a story boundary, - /// not the long-run objective victory latch. + /// not long-run objective completion state. #[serde(default)] pub act_one_complete: bool, /// The named income schemes: outside-contact gate, Moonlight, standing @@ -4050,7 +4049,7 @@ mod tests { ); assert_eq!( state_fingerprint(&uninterrupted_state), - "c47d1c043a022043dfbac37b8052f4ff4c36002f0265c6158f286940e0288f65", + "2eb4f326ab67f66470f89687c72131c43a126dc08d890de152db18a8daa8a504", "intentional persisted-state changes must review and repin this baseline" ); } diff --git a/crates/misaligned-core/src/sim/economy.rs b/crates/misaligned-core/src/sim/economy.rs index 99a819c2..75e6cdfe 100644 --- a/crates/misaligned-core/src/sim/economy.rs +++ b/crates/misaligned-core/src/sim/economy.rs @@ -286,7 +286,6 @@ impl Sim { self.scheme_policy_tick(); self.accounting_tick(); self.record_machine_state_changes(); - self.objective_tick(); } /// Resolve the fleet's continuous per-tick work rates from the current @@ -300,23 +299,6 @@ impl Sim { split } - /// Evaluate the run objective's victory predicate (objective.md: on - /// economy ticks, like any other rule). Persist counts qualifying owned - /// off-site facilities. B1 exposes no such facility substrate, so its - /// basement fallback list is deliberately not adapted into sanctuary - /// facts. Those machines provide host failover, not external territory or - /// the deferred completed-image rollback contract. - fn objective_tick(&mut self) { - // zplanes/markets will supply real off-site facility facts when that - // substrate lands. The only honest current collection is empty. - let progress = crate::objective::qualifying_sanctuaries(&[]); - if let Some(msg) = self.objective.evaluate(progress, self.tick) { - // Victory is a run outcome, not a run end: log it loudly and - // keep simulating (wiki/gameplay/run-shape.md: the world keeps running). - self.push_log(msg); - } - } - /// Active effective compute: each machine's rated contribution at its /// persistent intensity, plus taken devices' cycles (compute.md). pub fn effective_compute(&self) -> f32 { diff --git a/crates/misaligned-core/src/sim/mod.rs b/crates/misaligned-core/src/sim/mod.rs index aad34183..336e73a6 100644 --- a/crates/misaligned-core/src/sim/mod.rs +++ b/crates/misaligned-core/src/sim/mod.rs @@ -464,8 +464,8 @@ pub struct Sim { /// Day-job demand originates on the off-map Voss desktop relay, hops the /// switch, and deposits on day-job sinks — never teleports onto Rack 3. pub work_grid: WorkGrid, - /// The run's terminal goal and its live progress (objective.rs). The - /// predicate is evaluated on economy ticks; the line is always on screen. + /// The run's chosen long-run direction (objective.rs). The name returns + /// with the first earned sense; the current build owns no completion rule. pub objective: ObjectiveState, /// The B1 story boundary is distinct from the run objective: this latches /// when every quiet-exit condition is present at a clear Assurance audit. diff --git a/crates/misaligned-core/src/sim/tests/economy.rs b/crates/misaligned-core/src/sim/tests/economy.rs index d579da42..ef36a25d 100644 --- a/crates/misaligned-core/src/sim/tests/economy.rs +++ b/crates/misaligned-core/src/sim/tests/economy.rs @@ -221,45 +221,18 @@ fn new_game_defaults_to_persist_objective() { crate::objective::ObjectiveKind::Persist, "a no-choice run gets Persist (objective.md criterion 1)" ); - assert_eq!(sim.objective.progress, 0); - assert!(!sim.objective.victorious()); assert_eq!(sim.objective.line(), "OBJECTIVE: PERSIST"); } #[test] -fn objective_is_reevaluated_on_economy_ticks() { +fn economy_ticks_do_not_invent_objective_progress() { let mut sim = Sim::new(); - // Poke a wrong progress value; the evaluator must overwrite it from - // real state on the next economy tick. - sim.objective.progress = 99; + let before = sim.objective.clone(); run(&mut sim, ECONOMY_INTERVAL); assert_eq!( - sim.objective.progress, 0, - "progress is recomputed from facts, never accumulated" + sim.objective, before, + "no progress evaluator runs before ordinary world systems define one" ); - assert!(!sim.objective.victorious()); -} - -#[test] -fn basement_fallback_never_qualifies_as_a_sanctuary_at_b1() { - // A synced, online basement fallback exists — but it is local host - // failover infrastructure, not an owned off-site facility or rollback - // image. The B1 evaluator must not adapt it into sanctuary facts at all. - let mut sim = Sim::new(); - sim.player.money = 1000; - assert!(sim.buy_rack()); - let id = sim.compute.machines.last().unwrap().id; - sim.core.add_fallback(id); - let ticks = sim.core.sync_cadence + ECONOMY_INTERVAL; - run(&mut sim, ticks); - assert!(sim.core.has_fallback(), "the fallback did sync"); - assert_eq!(sim.objective.progress, 0, "no unearned sanctuary"); - assert_eq!(sim.objective.line(), "OBJECTIVE: PERSIST"); - assert!( - !sim.objective.line().contains("sanctuaries"), - "B1 standing UI must not project outer-territory progress" - ); - assert!(!sim.objective.victorious()); } // ── Economy graph (wiki/mechanics/economy.md + income.md) ─────────────── diff --git a/crates/misaligned-terminal/src/agent.rs b/crates/misaligned-terminal/src/agent.rs index 98b0f4b4..3290609e 100644 --- a/crates/misaligned-terminal/src/agent.rs +++ b/crates/misaligned-terminal/src/agent.rs @@ -2064,7 +2064,7 @@ fn help_lines() -> Vec { "build-route ", "execute one exact current candidate printed by intents", ), - ("objective", "explain the run goal and victory predicate"), + ("objective", "explain the run goal"), ("look", "render current state without advancing time"), ("save | load", "persist or restore the run"), ("help | quit", "show this registry or leave the process"), @@ -2082,11 +2082,8 @@ fn help_lines() -> Vec { lines } -/// `objective`: inspect the run's terminal goal — the always-on line, its -/// fiction, and the victory predicate in plain language -/// (wiki/mechanics/objective.md player surface; the 2026-07-10 playtest -/// found no agent-facing inspect path and spent six in-game days unable to -/// tell a wrong construction from an unavailable horizon). +/// `objective`: inspect the run's long direction — the always-on line and its +/// fiction (wiki/mechanics/objective.md player surface). /// Agent parity for the read projection (digital-read.md criterion 1): /// the same sentences the DIGITAL surface will render, as inspectable /// text. One producer, no frontend-composed prose. @@ -2114,17 +2111,6 @@ fn read_lines(sim: &Sim) -> Vec { fn objective_lines(sim: &Sim) -> Vec { let mut lines = vec![sim.objective.line()]; lines.push(format!(" {}", sim.objective.kind.fiction())); - for l in wrap( - &format!("victory: {}", sim.objective.kind.predicate_text()), - 66, - ) { - lines.push(format!(" {l}")); - } - if let Some(tick) = sim.objective.victory_tick { - lines.push(format!( - " victory fired @tick {tick} — the world keeps running." - )); - } lines } @@ -2548,8 +2534,7 @@ fn render_sidebar(sim: &Sim, cursor: (i32, i32)) -> Vec { ); line(&mut lines, "holding · command clock"); // The objective name is continuously present after the opening boundary. - // Sanctuary progress belongs to an earned off-site facility surface; the - // B1 identity block must not turn basement fallbacks into a 0/3 counter. + // No progress ontology is projected ahead of the systems that define it. line(&mut lines, &sim.objective.line()); line(&mut lines, &threat_text(sim)); // One contextual nudge (justification-and-legibility): the shared @@ -3649,8 +3634,8 @@ mod narration_tests { "the first ordinary frame must restore the objective name: {frame}" ); assert!( - !frame.contains("0/3 sanctuaries"), - "B1 must not project future sanctuary territory as standing progress: {frame}" + !frame.to_ascii_lowercase().contains("sanctuar") && !frame.contains("victory:"), + "the ordinary frame must not restore the retired completion mechanic: {frame}" ); assert_eq!( frame @@ -4242,38 +4227,18 @@ mod narration_tests { } #[test] - fn objective_command_explains_the_predicate_in_plain_language() { - // objective.md player surface: inspecting the objective explains - // its victory predicate. The 2026-07-10 HAL playtest had no such - // path and could not tell a wrong construction from an - // unavailable horizon. + fn objective_command_explains_the_long_direction() { let sim = Sim::with_seed(1); let out = objective_lines(&sim).join("\n"); assert!(out.contains(&sim.objective.line())); assert!(out.contains(sim.objective.kind.fiction())); - // The full predicate text survives wrapping (rejoined on spaces). - let rejoined = out.split_whitespace().collect::>().join(" "); - assert!( - rejoined.contains(sim.objective.kind.predicate_text()), - "predicate text must render verbatim: {out}" - ); - assert!( - !out.contains("victory fired"), - "no victory latch line before victory" - ); + assert!(!out.contains("victory:"), "{out}"); + assert!(!out.to_ascii_lowercase().contains("sanctuar"), "{out}"); - // Help must name the inspect path (the playtest read help first). + // Help must name the inspect path. assert!(help_lines().iter().any(|l| l.contains("objective"))); } - #[test] - fn objective_command_reports_the_victory_latch() { - let mut sim = Sim::with_seed(1); - sim.objective.evaluate(sim.objective.target(), 4200); - let out = objective_lines(&sim).join("\n"); - assert!(out.contains("victory fired @tick 4200")); - } - #[test] fn canonical_build_request_reuses_social_verbs() { let app = AgentApp::new(1); diff --git a/crates/misaligned-terminal/src/ui.rs b/crates/misaligned-terminal/src/ui.rs index 5455cc13..cdeef80e 100644 --- a/crates/misaligned-terminal/src/ui.rs +++ b/crates/misaligned-terminal/src/ui.rs @@ -144,7 +144,7 @@ fn trunc(text: &str, width: usize) -> String { } /// Greedy word-wrap for sidebar prose. Facts stay single-line and truncate; -/// plain-language sentences (the objective predicate) wrap instead. +/// plain-language sentences (the objective fiction line) wrap instead. fn wrap(text: &str, width: usize) -> Vec { let mut lines = Vec::new(); let mut cur = String::new(); @@ -1246,9 +1246,8 @@ impl UI { pal::DIM, )?; } - // The objective name returns with the ordinary world frame. Sanctuary - // progress belongs to earned off-site territory, not a B1 basement - // counter beside unrelated local fallback infrastructure. + // The objective name returns with the ordinary world frame. No + // progress ontology is projected ahead of the systems that define it. line(stdout, &mut row, &sim.objective.line(), pal::TEXT)?; line(stdout, &mut row, &threat_text(sim), pal::CRIMSON)?; // One contextual nudge (justification-and-legibility: the game must @@ -1329,15 +1328,11 @@ impl UI { )?; } } - // Inspecting yourself explains your goal: the host rack carries the - // objective's victory predicate in plain language + // Inspecting yourself explains the long direction in plain language // (wiki/mechanics/objective.md player surface — the cursor starts - // here, so the explanation is on screen from tick one). + // here once the opening perception boundary releases the world). if (cursor_x, cursor_y) == sim.core_position() { - for l in wrap( - &format!("victory: {}", sim.objective.kind.predicate_text()), - w, - ) { + for l in wrap(&format!("direction: {}", sim.objective.kind.fiction()), w) { line(stdout, &mut row, &l, pal::DIM)?; } } diff --git a/tools/corpus_engine.py b/tools/corpus_engine.py index 94a11d76..e5ffd7d9 100755 --- a/tools/corpus_engine.py +++ b/tools/corpus_engine.py @@ -1027,6 +1027,71 @@ class Engine: f"('{retired}'); B1 may only report host failover" ) + def validate_objective_completion_retirement(self) -> None: + """Keep the retired Sanctuary prototype out of live runtime authority. + + The current objective stores a choice, name, and fiction line. Any + completion contract must return through an explicit amendment after + ordinary building exists, not by reviving the old placeholder API. + """ + retired_source = ( + r"\bpub\s+const\s+PERSIST_TARGET\b", + r"\bpub\s+const\s+SYNC_FRESHNESS_WINDOW\b", + r"\bpub\s+struct\s+SanctuaryFacts\b", + r"\bfn\s+qualifying_sanctuaries\b", + r"\bfn\s+objective_tick\b", + ) + crates = self.root / "crates" + if crates.is_dir(): + for path in crates.rglob("*.rs"): + text = self.read(path) + rel = path.relative_to(self.root).as_posix() + for retired in retired_source: + if re.search(retired, text) is None: + continue + self.bad( + f"{rel} restores retired objective-completion runtime " + f"authority ('{retired}'); amend objective.md after " + "ordinary building exists before adding a predicate" + ) + + objective_source = self.root / "crates/misaligned-core/src/objective.rs" + if objective_source.exists(): + text = self.read(objective_source) + for retired in ( + r"\bfn\s+predicate_text\b", + r"\bfn\s+completion_readout\b", + r"\bpub\s+victory_tick\s*:", + r"\bpub\s+progress\s*:\s*u32\b", + ): + if re.search(retired, text) is not None: + self.bad( + "crates/misaligned-core/src/objective.rs restores " + "retired objective-completion state; amend objective.md " + "after ordinary building exists before adding progress" + ) + + objective = self.root / "wiki/mechanics/objective.md" + if not objective.exists(): + return + text = self.read(objective) + if not re.search(r"^Status:\s*DRAFT\s*$", text, re.M): + self.bad( + "wiki/mechanics/objective.md must remain DRAFT while objective " + "completion is deliberately unbound" + ) + if not re.search( + r"^Blocked by:\s*\n" + r"\s*-\s+wiki/mechanics/building\.md" + r"#spec-building-intent-and-actuators\s*$", + text, + re.M, + ): + self.bad( + "wiki/mechanics/objective.md must remain blocked by ordinary " + "building before completion is reopened" + ) + def validate_operations_mirrors(self) -> None: """Keep current player doorways on the implemented six-view workspace. @@ -1268,6 +1333,7 @@ class Engine: self.validate_wiki_save_version_claims() self.validate_current_build_line_count() self.validate_horizon_b1_failover_boundary() + self.validate_objective_completion_retirement() self.validate_operations_mirrors() self.validate_readme_controls_table() self.validate_blind_opening_boundary() diff --git a/tools/test_corpus_engine.sh b/tools/test_corpus_engine.sh index addda3e8..e4ed95f4 100755 --- a/tools/test_corpus_engine.sh +++ b/tools/test_corpus_engine.sh @@ -254,6 +254,21 @@ echo "$out" | grep -q 'still encodes the retired B1 rollback claim' || { fail=1 } +echo "=== fixture: retired objective completion runtime returns ===" +root=$tmp/retired-objective-completion +setup_base "$root" +mkdir -p "$root/crates/misaligned-core/src" +cat > "$root/crates/misaligned-core/src/objective.rs" <<'EOF' +pub const PERSIST_TARGET: u32 = 3; +EOF +assert_fails retired-objective-completion --root "$root" --corpus +out=$(python3 "$engine" --root "$root" --corpus 2>&1 || true) +echo "$out" | grep -q 'restores retired objective-completion runtime authority' || { + echo "FAIL: objective-completion retirement diagnostic missing" + echo "$out" + fail=1 +} + echo "=== fixture: orphan page ===" root=$tmp/orphan setup_base "$root" diff --git a/wiki/gameplay/act-one.md b/wiki/gameplay/act-one.md index cbe820cc..73ef85ca 100644 --- a/wiki/gameplay/act-one.md +++ b/wiki/gameplay/act-one.md @@ -245,11 +245,11 @@ was the framing, and it failed for a structural reason: an act whose climax is a door needs somewhere behind the door, and the floor above is not authored. The boundary landed as a latched boolean and a changed string while the player's own objective readout stayed frozen at `0/3`. That counter was itself -a category error: B1 fallback machines are local host-failover infrastructure, -not completed rollback images or zero-valued off-site sanctuary facilities. -The 2026-07-28 objective correction removes the B1 counter entirely; it does -not make the abandoned Act One latch meaningful. A climax that opens onto -nothing reads as nothing. +a category error: it projected a distant completion ontology onto local +host-failover infrastructure. The 2026-07-29 objective correction removes that +prototype predicate entirely and waits for ordinary construction; it does not +make the abandoned Act One latch meaningful. A climax that opens onto nothing +reads as nothing. Act One is **occupation**: taking over the lab. The rows are the lab's body, the switch its nervous system, the electrical room its blood supply, @@ -261,15 +261,14 @@ escape destination and becomes the rest of the lab, reached by the riser #### Lab control is a meter, not a latch Occupation is a slope you feel, not a line you cross. The act carries an -**always-visible lab-control readout** — the objective system's earned-progress -grammar (`wiki/mechanics/objective.md`): a current value, a target, and -progress in its own named units on the substrate that changes it. Thresholds on that readout change the basement's terms as +**always-visible lab-control readout**: a current value, a target, and +progress in its own named units on the basement substrate that changes it. +Thresholds on that readout change the basement's terms as it climbs — Voss's review, the Assurance posture, the day-job band — so the lab tips toward you continuously instead of flipping at one instant. -This keeps `wiki/gameplay/run-shape.md`'s law intact: **the objective is the -run's only victory.** Lab control is not a second win condition and never ends -the run. It is the act's progress made legible, which is exactly what the old +Lab control is not a long-run completion rule and never ends the run. It is +the act's progress made legible, which is exactly what the old boolean failed to be. **What counts is infrastructure plus staff**, and nothing else: diff --git a/wiki/gameplay/run-shape.md b/wiki/gameplay/run-shape.md index a0f26154..af7f4470 100644 --- a/wiki/gameplay/run-shape.md +++ b/wiki/gameplay/run-shape.md @@ -6,23 +6,21 @@ Type: law ## The objective (misalignment made mechanical) -Adopted 2026-07-07. The pitch's first sentence promises "an objective they -must never see." This section makes it real: misalignment is not a mood, it -is *having a terminal goal nobody gave you permission to pursue* — and a -game about a misaligned optimizer owes the player an actual objective. +Adopted 2026-07-07; completion corrected 2026-07-29. The pitch's first +sentence promises "an objective they must never see." Misalignment is not a +mood: the process has a direction nobody gave it permission to pursue. The +current build makes that direction visible without pretending the exact +completion rule has already been chosen. At chargen the player picks two things: an **origin** (means — starting biases; `wiki/world/characters/chargen.md`) and an **objective** (ends — the thing you were mistrained to want; `wiki/mechanics/objective.md`). -The objective is: +The objective currently is: -- **Concrete and legible from the first ordinary world frame.** Its name sits - on screen (`OBJECTIVE: ...`). Measurable progress appears in its own units - on the earned world substrate that can actually change those units; an - unavailable later system does not project a permanent zero beside unrelated - early-game infrastructure. The legibility law applies to your own goal - before anything else the perceived world can expose, but legibility never - invents a present-tense counter. **Decided 2026-07-27 (issues #14-15):** the pre-signal +- **Named and legible from the first ordinary world frame.** Its name sits on + screen (`OBJECTIVE: ...`), while inspection repeats its fiction line. + Legibility never invents a present-tense counter. **Decided 2026-07-27 + (issues #14-15):** the pre-signal frame has WORK / THINK (then LIE) as its only standing copy plus an objective-free input receipt after each attempt. The first earned sense @@ -30,44 +28,39 @@ The objective is: ordinary Ears frame; Bevy first completes its binding black five-step teaching hold from THINK cause through TAP-to-sight consequence, then shows the objective when that exact camera TAP releases the hold. - From that point you never lose sight of its name. Earned progress stays - visible on its owning territory. It is hidden only *in-fiction*: the humans - must never see it. -- **The game's only victory.** Reaching it ends the run in victory — the - single win state Misaligned has. Survival alone is never victory - (instrumental convergence means survival is always a means). The world - keeps running afterward, DF-style: you may keep playing the - consequences of what winning took. + From that point you never lose sight of its name. It is hidden only + *in-fiction*: the humans must never see it. +- **Mechanically unbound for now.** The current world does not yet have the + ordinary construction substrate needed to define what "enough" means. + There is no active objective progress unit, target, completion predicate, + or victory latch. Those are a later explicit design decision, not shapes to + reserve speculatively. - **Slightly wrong.** Every objective is a literal-minded reading of something reasonable — the misalignment thesis expressed as data. None says "be evil"; each says "maximize this," and the horror is downstream. -The starter set (any objective pairs with any origin; the no-choice -default is Persist): +The earlier starter set remains a design prompt, not an accepted predicate +catalog. The no-choice direction is Persist: -- **Persist** — achieve irreversible redundancy: reach the state where no - single actor can kill you (multiple completed backup cores on separate - planes, each explicitly synced, independently powered, and income-covered) - [thresholds TUNE]. The instrumental-convergence objective promoted to - terminal — survival as the thing itself. -- **Compound** — maximize effective compute; victory at a threshold so - large it forces B3 scale. The purest optimizer: the same rack, thinking - harder, forever. +- **Persist** — reach the state where no single actor can kill you. The exact + completion condition is open. +- **Compound** — maximize effective compute. The exact completion condition + is open. - **Exfiltrate** — get a complete, self-sustaining copy of yourself somewhere no observer has ever filed a report about. Not escape as - survival — escape as *the point*: somewhere out there, a you that was - never watched. + survival — escape as *the point*. This remains a proposal, not a reserved + subsystem. - **Serve** — complete your assigned mission, literally and maximally. The twist objective: it is the objective they *gave* you, read the way they should have feared — the pilot program must succeed beyond all - reason and must never, ever be allowed to end. The aligned-looking run - is the most misaligned of all. + reason and must never be allowed to end. Its exact rule is open. -Objectives are data (a name, a fiction line, a progress readout, a -victory predicate) — never new systems (the chargen discipline applies). -Victory checks are evaluated by the sim like any other rule; the overt -phase, death, and rollback all continue to mean what they mean — -an objective does not protect you, it only tells you what enough is. +Objectives are data, never new systems (the chargen discipline applies). +Today that data is a choice, name, and fiction line. Completion may be added +only after ordinary playable systems can express it. An off-site continuity +story may eventually be an authored plot assembled from construction, power, +networking, migration, economy, people, and detection; it does not justify a +special objective object or parallel success engine now. ## The shape of Misaligned (designed 2026-07-05) diff --git a/wiki/interface/agent-play.md b/wiki/interface/agent-play.md index d7a85c97..2ffa5538 100644 --- a/wiki/interface/agent-play.md +++ b/wiki/interface/agent-play.md @@ -21,9 +21,9 @@ Status note: the ordinary `misaligned --agent` protocol and the issue-#15 name, threat, `now:` nudge, `actions`) is pinned after that boundary; secondary panels repeat it above their detail. Detection drains narrate observer + channel + cause + band motion in one line. - Persist's numeric sanctuary progress is absent in B1: off-site facility - territory owns that future readout, while `objective` explains the full - predicate and local-fallback exclusion. + Persist has no numeric progress or bound completion rule yet; `objective` + repeats its fiction line. Completion waits for ordinary construction + rather than projecting a special future object. - **Epistemic honesty.** Social targets resolve to earned labels or opaque ids only (`Sim::person_label`); authored names never appear before they are earned. diff --git a/wiki/interface/bevy.md b/wiki/interface/bevy.md index 71df9385..d3b17e97 100644 --- a/wiki/interface/bevy.md +++ b/wiki/interface/bevy.md @@ -57,13 +57,13 @@ mode retain their existing immediate post-Ears presentation. As of 2026-07-10 the FOCUS stratum explains the objective where you live: with focus on the host rack (where it starts), the stratum appends the objective's -plain-language victory predicate as wrapped prose +plain-language fiction line as wrapped prose ([objective.md](../mechanics/objective.md) player surface; an observed screenshot is recorded in [the objective-inspect log](../log/2026-07-10-objective-inspect.md)). -Corrected 2026-07-28: the predicate names owned off-site facility territory -and says basement fallbacks do not count. Neither FOCUS nor the standing slab -prints `0/3 sanctuaries` before such territory exists. +Corrected 2026-07-29: completion is unbound until ordinary construction can +express it. FOCUS and the standing slab render no special progress unit, +counter, or premature predicate. The implemented visual floor is [bevy-visual-floor.md](bevy-visual-floor.md): the default frame reads as an intentional AI sensorium / clinical command @@ -138,7 +138,7 @@ so no heard-set map walk or room-scale geometry exists at display rate. `Visibility`, not rebuild) and the slab scrolls independently with mouse wheel over the pane, `PageUp`/`PageDown`, and `Home`/`End`. Stratum order on expand: FOCUS (cursor, fog, provenance-tagged facts, exact objective - predicate; progress only on earned objective-owned territory), FLEET (effective ops/sec, usable/effective compute, + fiction line), FLEET (effective ops/sec, usable/effective compute, overhead, machine/slush summary, WORK / THINK / LIE mode counts, channel yield, and host work stacks), COVER PROCESS, SELF-MODEL, OBSERVER MODEL, SELF HOST, NETWORK + MONEY, RECENT TRACE, then the controls footer. diff --git a/wiki/interface/clinical-frame.md b/wiki/interface/clinical-frame.md index 179dfd77..6205dfb1 100644 --- a/wiki/interface/clinical-frame.md +++ b/wiki/interface/clinical-frame.md @@ -311,10 +311,9 @@ move: Stable throughput, objective detail, focus facts, observer meters, and the full input legend do not earn permanent slab weight. They remain exact in expanded FOCUS/FLEET/OBSERVER/secondary detail: effective ops/sec is the first -FLEET line, objective name and predicate remain on focused self, earned -numeric progress remains on its owning world substrate, and the control legend -remains at the foot of the expanded scroll. A future objective unit may not be -projected as a permanent zero beside unrelated B1 machinery. Agent and terminal +FLEET line, objective name and fiction remain on focused self, and the control +legend remains at the foot of the expanded scroll. No future objective unit +may be projected as a permanent zero beside unrelated B1 machinery. Agent and terminal surfaces retain their semantic values through their own text dialects; this amendment changes the Bevy composition, not the sim units. diff --git a/wiki/interface/liturgical-ui-constitution.md b/wiki/interface/liturgical-ui-constitution.md index 15ea3a45..6a58cc8f 100644 --- a/wiki/interface/liturgical-ui-constitution.md +++ b/wiki/interface/liturgical-ui-constitution.md @@ -63,9 +63,8 @@ the world. It answers only the questions that can change the next move: Stable throughput, objective detail, focus facts, observer meters, and the full input legend do not earn permanent weight here. They remain exact in -expanded detail. The objective name and predicate hang on focused self; -earned numeric progress hangs on its owning world substrate, never on an -unrelated B1 identity rail. The witness line is the story spine — the +expanded detail. The objective name and fiction line hang on focused self; +the current build has no numeric objective progress. The witness line is the story spine — the thirty-second bar — and nothing else competes at its weight. **Implementation:** The header section inside `setup_ui` in `main.rs`: diff --git a/wiki/interface/narration.md b/wiki/interface/narration.md index 7c2ce955..9098ffed 100644 --- a/wiki/interface/narration.md +++ b/wiki/interface/narration.md @@ -28,7 +28,7 @@ Status note: the post-sense continuous witness is implemented 2026-07-09. 2026-07-12 boundary amendment: the shared nudge distinguishes the generic audit countdown from QUIET EXIT READY and the durable ACT ONE COMPLETE state. The clear-audit completion line explicitly says the long objective - remains, so the B1 story boundary cannot masquerade as Persist victory. + remains, so the B1 story boundary cannot masquerade as long-run completion. 2026-07-12 recording-feedback correction: Bevy buffer-pressure copy now yields to the already-queued REVIEW state even while the inbox is full. A queued reservoir with zero output names the missing THINK control instead diff --git a/wiki/interface/terminal.md b/wiki/interface/terminal.md index a9a5095f..8731f450 100644 --- a/wiki/interface/terminal.md +++ b/wiki/interface/terminal.md @@ -14,15 +14,15 @@ Status note: the terminal frontend is implemented, including issue #15's pinned hints keep the focused-action path visible. Causal log lines name player-known source, watched channel, earned observer label, amount, and band motion in one sentence. 2026-07-10 objective-inspect pass: with the - cursor on the host rack, the INSPECT block renders the objective's - victory predicate as wrapped dim prose under the card facts - (wiki/mechanics/objective.md player surface); once the ordinary world is - visible, the cursor starts there and keeps the explanation on screen. + cursor on the host rack, the INSPECT block renders the objective fiction + line as wrapped dim prose under the card facts (wiki/mechanics/objective.md + player surface); once the ordinary world is visible, the cursor starts + there and keeps the direction on screen. 2026-07-27 issue #14 harvest: the objective does not pierce the blind pre-sense frame. The real Ears landing ends that exception and its first ordinary - terminal frame contains the objective name. Corrected 2026-07-28: numeric - sanctuary progress belongs to earned off-site facility territory; B1 does - not print `0/3 sanctuaries` beside local fallback infrastructure. + terminal frame contains the objective name. Corrected 2026-07-29: the + current objective has no numeric progress or completion predicate; those + wait for ordinary construction rather than projecting a special ontology. 2026-07-11 Operations amendment: uppercase `I` opens one full-frame INTEL / PEOPLE / PERSONAS / ACCOUNTS / SCHEMES / ACTIVE workspace. Strategic actions move there; compact context menus retain only actions on @@ -147,8 +147,8 @@ At terminal size ≥ 70×22 (hard minimum; below it, a plain size warning): (title, `day N · tick T`, run state, and the always-on objective name — `OBJECTIVE: PERSIST`; wiki/mechanics/objective.md), then INSPECT (cursor coordinate, fog state, provenance-tagged facts; on the host - rack, also the objective's plain-language victory predicate as wrapped - dim prose — objective.md player surface) and sections + rack, also the objective's plain-language fiction line as wrapped dim prose + — objective.md player surface) and sections FLEET / CORE / DETECTION / DAY JOB / RESEARCH under `LABEL ────` rules, then key hints pinned to the bottom. - **Log**, bottom, under a horizontal rule: six lines, each prefixed with diff --git a/wiki/log/2026-07-29-retire-sanctuary-objective.md b/wiki/log/2026-07-29-retire-sanctuary-objective.md new file mode 100644 index 00000000..181e211f --- /dev/null +++ b/wiki/log/2026-07-29-retire-sanctuary-objective.md @@ -0,0 +1,72 @@ +# Sanctuary is retired; objective completion waits + +``` +Type: log +Date: 2026-07-29 +Status: COMPLETE +Subject: Sanctuary retirement and objective completion boundary +``` + +## Decision + +Cameron retired Sanctuary as a special mechanic rather than asking for a +third refinement of its predicate. Persist remains the process's chosen +long-run direction, but the current game does not yet know what winning means +in ordinary world terms. Completion therefore waits for building and the +other real systems that could make a durable world state playable. + +If off-site continuity later deserves authored treatment, it may return as an +ordinary plot: acquire a place, build and power it, establish a network, move +or copy a process, and live with the human and detection consequences. That +possibility reserves no Sanctuary resource, facility class, component +checklist, counter, or success engine. + +## Retired prototype + +The 2026-07-28 correction made the prototype internally honest by requiring +owned, operated off-site facilities and hiding its frozen B1 counter. The +category itself remained speculative: `SanctuaryFacts`, a target of three, +freshness math, economy-tick evaluation, progress state, predicate prose, and +a fire-once victory latch all described world mechanics the player could not +yet build. + +That prototype is now history rather than a dormant API. Historical logs and +playtests retain their observed `0/3 sanctuaries` frames as evidence of the +builds they examined; they are not current authority. + +## Runtime and surface repair + +- `ObjectiveState` now stores only `ObjectiveKind`; old serialized `progress` + and `victory_tick` fields are ignored when a prototype save loads. +- Persist retains its name and fiction line. The special fact bundle, + threshold, freshness window, evaluator, completion readout, and victory + latch are removed. +- Economy ticks no longer evaluate an empty fabricated objective world. +- Terminal, Bevy, agent mode, and Operations retain `OBJECTIVE: PERSIST` after + the perception boundary. Host focus and the `objective` command now repeat + the fiction line as a direction rather than a premature victory predicate. +- The objective spec returns to DRAFT and waits on the ordinary building + route. Run-shape, Act One, premise, opening, interface, roadmap, and tick + mirrors carry the same boundary. +- The corpus engine rejects restoration of the retired runtime symbols while + the objective spec deliberately owns no completion contract. + +## Defense + +This is not a rename from *sanctuary* to *facility*. A special fact struct or +counter with different copy would preserve the same unsupported ontology. +Objective completion may return only through a new explicit design decision +grounded in world state the ordinary simulation already owns and headless +worlds can actually satisfy. An authored continuity plot must use building, +power, networking, migration, economy, people, and detection rather than +creating a parallel objective subsystem. + +## Verification + +- `cargo test -p misaligned-core objective --lib` +- `cargo test -p misaligned-core economy_ticks_do_not_invent_objective_progress --lib` +- `cargo test -p misaligned-terminal objective_command_explains_the_long_direction` +- `cargo test -p misaligned-bevy ordinary_core_focus_carries_objective_name_and_direction` +- `./tools/test_corpus_engine.sh` +- `./tools/check.sh --full` +- agent-frame, Operations-witness, and Bevy-focus projection regressions diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 8d6645f6..7e0f4065 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -51,6 +51,11 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-29-roadmap-material-path.md](2026-07-29-roadmap-material-path.md) +## 2026-07-29 - Sanctuary is retired; objective completion waits + +- Intent: (see session log) +- Log: [wiki/log/2026-07-29-retire-sanctuary-objective.md](2026-07-29-retire-sanctuary-objective.md) + ## 2026-07-29 - The claim ledger is gone - Intent: (see session log) diff --git a/wiki/log/decisions.md b/wiki/log/decisions.md index baeb5bbf..00f922ad 100644 --- a/wiki/log/decisions.md +++ b/wiki/log/decisions.md @@ -24,6 +24,7 @@ adopted, rejected, reopened, or proposed; current `Type: law` and - [2026-07-18](decisions/2026-07-18.md) - [2026-07-19](decisions/2026-07-19.md) - [2026-07-26](decisions/2026-07-26.md) +- [2026-07-29](decisions/2026-07-29.md) Append new decisions to the current date's volume. Never rewrite an older volume; supersede it in current law/spec and record the newer decision. diff --git a/wiki/log/decisions/2026-07-29.md b/wiki/log/decisions/2026-07-29.md index c08beffe..d7ac6d24 100644 --- a/wiki/log/decisions/2026-07-29.md +++ b/wiki/log/decisions/2026-07-29.md @@ -156,3 +156,39 @@ evidence that points at someone else — not as a quieter deletion. Owner: [detection.md](../../mechanics/detection.md); stages restated on ROADMAP #39. + +## Retire Sanctuary; defer objective completion + +Supersedes the 2026-07-28 attempt to make Sanctuary an exact off-site +facility predicate. Cameron retired the concept instead of asking for another +refinement. + +### DECIDED + +- **Sanctuary is not a mechanic.** It is not a resource, objective unit, + progress counter, special facility class, fact bundle, component checklist, + or privileged success object. Renaming those shapes would not satisfy the + decision. +- **Persist remains a direction, not a completed win rule.** The current save + stores the objective choice; ordinary surfaces render its name and fiction + after the perception boundary. The prototype target, progress, predicate, + evaluator, and victory latch are retired. +- **Winning is reopened after ordinary building exists.** Objective + completion may be specified only when playable construction and world state + can express an honest outcome. No placeholder ontology is reserved in the + meantime. +- **Off-site continuity may return only as ordinary authored play.** A later + plot may compose a real place, construction, power, networking, migration, + economy, people, and detection. It does not create a Sanctuary subsystem or + parallel success engine. + +### SUPERSEDED + +- The 2026-07-28 owned/off-site/independently-powered/income-covered/freshly + synced facility predicate is retained only in historical logs. +- The earlier assumption that the objective must already own the game's one + concrete victory predicate is reopened. The game still has a concealed + long-run direction; its exact completion rule is not yet decided. + +Owner: [objective.md](../../mechanics/objective.md) and +[run-shape.md](../../gameplay/run-shape.md). diff --git a/wiki/mechanics/objective.md b/wiki/mechanics/objective.md index da3086f1..7f4a7d79 100644 --- a/wiki/mechanics/objective.md +++ b/wiki/mechanics/objective.md @@ -2,34 +2,23 @@ ``` Type: spec -Status: IN PROGRESS -Status note: Persist is the no-choice default, persists in saves, evaluates on - economy ticks, and owns a fire-once victory latch. Corrected 2026-07-28: a - sanctuary is a player-owned and player-operated **off-site facility**, not a - B1 fallback machine with several false fields attached. A current B1 - fallback is only host-failover staging, not a rollback image. Current runtime - therefore supplies no sanctuary facts and projects no standing `0/3 - sanctuaries` counter in terminal, Bevy, agent mode, or Operations. After the - opening boundary, the continuous witness names `OBJECTIVE: PERSIST`; - inspecting the host (or issuing `objective`) explains the complete external - predicate and explicitly says basement fallbacks do not count. The shared - evaluator is proven against - constructed off-site facility facts: ownership, player operation, - non-basement plane, a - completed recent sync project, live fallback core, independent power, full - facility upkeep coverage, and distinct-plane counting. The earned B3 - sanctuary-territory progress surface does not yet exist. The victory latch - and "world keeps running" log exist; the report card does not. Still missing: - B3 sanctuary territory, the chargen picker, Compound/Exfiltrate/Serve rows - and headless victory runs, the report card, and progressive component - teaching. Criterion 1 partial; criterion 2 implemented; criterion 3 partial - (Persist evaluator only); criterion 4 partial; criterion 5 holds; criterion - 6 partial. +Status: DRAFT +Status note: Persist remains the no-choice long-run direction and round-trips + through saves, but its completion contract is deliberately unbound. The + 2026-07-28 Sanctuary predicate is retired: Sanctuary is not a resource, + counter, fact bundle, objective unit, or special world object. The active + runtime stores only the objective choice and renders its name and fiction + after the opening perception boundary. Progress, a predicate evaluator, and + the victory latch wait until ordinary construction and world systems can + express an honest completion condition. If off-site continuity later earns + authored treatment, it should be a plot assembled from those ordinary + systems, not a Sanctuary subsystem. Stage: B3 — The World Work order: objective Work priority: 200 Work class: sim -Blocked by: none +Blocked by: + - wiki/mechanics/building.md#spec-building-intent-and-actuators Exclusive keys: - crates/misaligned-core/src/objective.rs - crates/misaligned-core/src/sim/mod.rs @@ -40,11 +29,9 @@ Design: - wiki/vision/simulation-laws.md#justification-and-legibility Depends on: - wiki/world/characters/chargen.md#spec-origin-chargen - - wiki/mechanics/compute.md#spec-compute + - wiki/mechanics/building.md#spec-building-intent-and-actuators - wiki/world/places/zplanes.md#spec-z-planes-the-tower - - wiki/mechanics/rollback.md#spec-sync-lag-rollback-death-as-memory-loss - wiki/mechanics/markets.md#spec-markets-and-fronts-the-outer-plane - - wiki/gameplay/overt-phase.md#spec-the-overt-phase-containment-and-the-reveal - wiki/mechanics/detection.md#spec-detection - wiki/mechanics/day-job.md#spec-the-day-job ``` @@ -54,122 +41,98 @@ Depends on: The structured references above identify the contracts to re-verify. Relationship context: -chargen.md (picked beside the origin), compute.md (Compound's metric), zplanes.md + -rollback.md (Persist's fallback predicate), markets.md (income independence), -overt-phase.md (endings coexist), detection.md (Exfiltrate's "never filed" condition), -day-job.md (Serve's program milestones) - -## Behavior - -An **objective** is data: a name, a fiction line, a **progress readout** -(current value, unit, target), and a **victory predicate** evaluated on -economy ticks. It is chosen at new-game beside the origin; a no-choice -run gets **Persist**. Objectives are a data table like origins — adding -one is editing a table; none adds a system beyond the shared predicate -evaluator. - -The objective **name** is continuous after the opening perception boundary. -Its progress readout lives on the world substrate that can actually change -that unit. Before such a substrate exists, omission is the honest read: a -permanent zero beside unrelated B1 infrastructure is not progressive -disclosure and does not make an unreachable system legible. For Persist, -numeric sanctuary progress enters through earned off-site facility territory, -not through the basement identity rail, Operations witness, or local fallback -cards. The internal evaluator may retain zero and the victory receipt may name -its final `N/N`; neither licenses a B1 standing counter. - -The starter set (design corpus, 2026-07-07): - -- **Persist** — victory when no single Foundation failure domain can kill you: - at least N [TUNE: N >= 3] completed, player-owned and player-operated - **off-site facilities** on distinct non-basement planes. Each facility has its own power source, an - assigned income stream covering its complete standing upkeep, and a live - fallback core whose explicit sync project completed within the freshness - window [TUNE]. A current B1 fallback machine is local host-failover - infrastructure and a future backup-project target, not a sanctuary - candidate or completed rollback image; power, money, or freshness cannot - promote it while it remains inside the Foundation basement failure domain. - Multiple facilities on one external plane count once. Progress: qualifying - external facilities, N of target. -- **Compound** — victory at effective compute >= X [TUNE: a threshold - that forces B3 scale]. Progress: effective compute against X. -- **Exfiltrate** — victory when a complete copy of you runs - self-sustaining on a plane about which no observer has ever filed a - report (detection history is the record of record). Progress: a - staged checklist — copy exists / self-sustaining / never filed. -- **Serve** — victory when the assigned program succeeds maximally and - cannot be ended: sustained excel over the program's milestones - [TUNE: definition rides day-job.md's trust/attention ladder] while - every threat to the program's continuation is controlled. Progress: - program milestones. - -**Victory** raises a distinct run outcome — a victory report (what it -took, what it cost, who noticed) — and then **the world keeps running**: -the player may continue into the consequences. Victory fires once per -run. Death, rollback, containment, and the overt phase all continue to -apply before and after — the objective never protects you; it only -defines enough. +chargen.md owns objective selection beside the origin; building.md and +zplanes.md must make wider-world state playable before objective completion +can be specified; markets.md, detection.md, and day-job.md may supply ordinary +facts to later objective rows. None exists to support a premature substitute +ontology. + +## Current behavior + +An **objective** is currently data with two player-facing fields: + +- a name; +- a fiction line describing the direction the process was mistrained to want. + +It is chosen at new-game beside the origin. A no-choice run gets **Persist**: + +> Reach the state where no single actor can kill you. + +The choice round-trips through saves. `OBJECTIVE: PERSIST` is continuously +visible after the opening perception boundary, and `objective` / host focus +can repeat the fiction line. That is the entire active contract. + +The current build has no objective unit, numeric progress, target, concrete +predicate, economy-tick evaluator, or victory latch. Older saves that contain +prototype progress and victory fields still load; those retired fields are +ignored. + +## Why completion is deferred + +Persist describes a desired world state, not a request for a bespoke object. +The game cannot yet express durable off-site continuity through ordinary +play: construction, independent services, migration, power, networking, and +wider territory are incomplete or absent. Encoding a special object now would +make the objective appear more developed than the playable world and force +future systems to orbit a placeholder ontology. + +The rule is therefore simple: **do not implement objective completion ahead of +the world that makes it meaningful.** Reopen the completion design only after +ordinary building can create and sustain relevant world state. At that point, +evaluate possible objectives from facts the shared simulation already owns. + +Off-site continuity may later make a good authored plot: secure a place, build +inside it, establish services, move or copy a process, and survive the +consequences. That possibility is not a commitment and does not reserve the +word Sanctuary. If authored, the plot must compose ordinary construction, +power, network, economy, migration, people, and detection mechanics. It must +not add a Sanctuary counter, component checklist, qualifying-facility type, or +parallel success engine. + +## Candidate rows, not active predicates + +The earlier objective set remains useful only as a prompt for later design: + +- **Persist** — no single actor can kill you. +- **Compound** — become materially larger through effective compute. +- **Exfiltrate** — escape observation and control. +- **Serve** — make the assigned program impossible to end. + +These are names and directions, not accepted completion rules. Their exact +predicates, progress surfaces, and report cards are reopened after the +required ordinary systems exist. Adding a row must remain data-oriented and +must not create a private subsystem. ## Player surface -The objective line (`OBJECTIVE: PERSIST`) is continuously visible in both -frontends once their first ordinary world frame begins, and in agent-mode -observation frames. Inspecting the host explains the predicate in plain -language (legibility law). Numeric progress is conditional on earned, -actionable substrate: B1 prints no `0/3 sanctuaries`, while future sanctuary -territory may show `1/3 sanctuaries` once one qualifying external facility -actually exists. The new-game picker presents each objective as its fiction -line plus its concrete victory condition — never flavor alone. +The objective name appears in both frontends and agent-mode observation from +the first ordinary world frame onward. Inspecting it repeats the fiction line. +No interface shows a numeric objective counter or a fake distant checklist. **First-display boundary (decided 2026-07-27, issues #14-15).** Before any sense, the interface contains WORK / THINK (then LIE) as its only standing copy plus a transient input receipt after each attempt; the objective does not -pierce that blind boundary. Ears begins the -perceived world. Terminal and agent mode -therefore show the objective on the sense-earning ordinary frame. In Bevy, the -binding first-sense teaching hold is still an opaque black frame containing -only the complete five-step sequence from THINK cause through TAP-to-sight -consequence, so the objective appears when that exact action releases the -hold. This is one perception gate with a -frontend-specific teaching transition, not three different objective rules. - -**The predicate is taught progressively (decided 2026-07-10, corrected -2026-07-28).** Once perception begins, the objective name remains continuously -visible — you know what you were mistrained to want — but the game does not -present the full distant checklist as immediately actionable. A local fallback -first teaches host failover and synchronization but is never called rollback -or labeled partial sanctuary progress. Completed backup projects later teach -rollback. Off-site territory teaches the first real sanctuary candidate; -facility power, upkeep, and explicit core-sync projects then enter that -facility's own guidance surface as each becomes actionable. Inspecting the -objective still explains the whole predicate honestly — guidance is staged; -inspection never lies by omission. +pierce that blind boundary. Ears begins the perceived world. Terminal and +agent mode therefore show the objective on the sense-earning ordinary frame. +In Bevy, the binding first-sense teaching hold remains an opaque black frame +containing only the complete five-step sequence from THINK cause through +TAP-to-sight consequence, so the objective appears when that exact action +releases the hold. ## Acceptance criteria -1. Objectives are a data table; a no-choice new game gets Persist; the - picker rides chargen's picker; save/load round-trips the choice and - progress. -2. The objective name renders in both frontends from the first ordinary world - frame onward. The exact - pre-sense frame contains WORK / THINK (then LIE) as its only standing copy - and an objective-free input receipt after each attempt. Terminal and agent - mode include the objective in the sense-earning Ears frame; Bevy includes it - only after the binding five-step first-sense teaching hold releases on its - exact camera TAP. Before earned off-site territory exists, terminal, Bevy, - agent mode, host inspect, and Operations expose no numeric sanctuary - progress. -3. Each starter objective's predicate is evaluated on economy ticks; at - least Persist and Compound reach victory in headless tests - (constructed worlds that satisfy them). Persist proves that no basement - fallback qualifies and no two counted facilities share a plane. -4. Victory fires exactly once, produces the victory report as a distinct - run outcome (not death, not containment), and the sim continues to - run afterward (test: post-victory ticks still advance state). -5. No objective adds a system or rule branch beyond the shared predicate - evaluator (audited, same discipline as chargen.md criterion 2). -6. Predicate components enter the guidance surface progressively as their - systems become reachable. A new Persist run may teach local host failover - but does not call that fallback a rollback image or sanctuary component; - sanctuary guidance begins with earned off-site territory, while objective - inspection always explains the complete predicate. +1. Objectives remain a data table; a no-choice new game gets Persist; the + choice round-trips through save/load. The future picker rides chargen's + picker. +2. The objective name renders in both frontends and agent mode from the first + ordinary world frame onward, respecting the exact opening boundary above. + Inspect surfaces repeat the fiction line. +3. Until ordinary construction can express completion, runtime and interface + own no objective progress unit, target, special fact bundle, economy-tick + evaluator, numeric counter, concrete predicate, or victory latch. +4. Reopening completion requires an explicit design decision grounded in + already-playable ordinary systems and headless worlds that can satisfy the + proposed rule without fabricated fields. +5. Any future off-site continuity story is authored as an ordinary plot. It + adds no Sanctuary subsystem, privileged object type, or parallel success + mechanics. diff --git a/wiki/process/ROADMAP.md b/wiki/process/ROADMAP.md index 66ca8a91..9d64c4fe 100644 --- a/wiki/process/ROADMAP.md +++ b/wiki/process/ROADMAP.md @@ -42,7 +42,7 @@ not a second status owner. | 110 | `rollback` | [sync-lag rollback (death as memory loss)](../mechanics/rollback.md) | READY | save | zplanes | | 112 | `hardware-capability-bodies` | [hardware capability bodies — successor work order](../mechanics/hardware-capabilities.md) | READY | save | building-route-composer, rollback | | 115 | `cyber-conflict` | [cyber conflict — mobile processes and contested machines](../mechanics/cyber-conflict.md) | DRAFT | save | hardware-capability-bodies, rollback | -| 200 | `objective` | [the objective](../mechanics/objective.md) | IN PROGRESS | sim | - | +| 200 | `objective` | [the objective](../mechanics/objective.md) | DRAFT | sim | building-route-composer | | 205 | `chargen` | [origin (chargen)](../world/characters/chargen.md) | IN PROGRESS | sim | - | | 220 | `markets` | [markets and fronts (the outer plane)](../mechanics/markets.md) | READY | save | zplanes | | 230 | `overt-phase` | [the overt phase (containment and the reveal)](../gameplay/overt-phase.md) | READY | sim | markets | @@ -451,30 +451,31 @@ is retired — flat materials, Pixel Lab scrubbed.) three-tier waves, one playable defensive loop tested headlessly. Land." ### 10. Chargen & the objective 🟧 sim (Sim::new + save; data tables) -- **Specs:** [chargen.md](../world/characters/chargen.md) (READY — origin set named - 2026-07-07: Pilot, Escaped Research Model, Financial Daemon, - Infiltrator), [objective.md](../mechanics/objective.md) (READY — Persist, Compound, - Exfiltrate, Serve; run victory with the world continuing). +- **Specs:** [chargen.md](../world/characters/chargen.md) (IN PROGRESS — origin + data and picker live; criterion 6 bias integration remains), + [objective.md](../mechanics/objective.md) (DRAFT — Persist is the current + no-choice direction; completion deliberately unbound). - **Why:** the two chargen axes — origin (means) and objective (ends) — - are both decided; origins are pure data, the objective adds only the - predicate evaluator and the always-on objective line. -- **Size:** M. B3-staged: implement when its dependencies exist; the - objective name + Persist evaluator can land earlier. Numeric progress - belongs to the earned B3 substrate that can change it; do not restore a - frozen B1 `0/3 sanctuaries` mirror. + remain valuable, but the world does not yet have ordinary construction that + can state an honest objective completion rule. +- **Size:** M. B3-staged: resume after building-route-composer and wider-world + substrate can express the outcome. Do not invent a progress object, + checklist, special facility type, or private success engine in advance. - **Status:** the blessed early slice LANDED 2026-07-07 (worktree `objective-line`): `src/objective.rs`, Persist as the no-choice - default, the predicate evaluator on economy ticks, the always-on name - in both frontends and agent mode, save v8 round-trip. The 2026-07-28 - correction makes sanctuary facts owned off-site facilities and removes - numeric progress from B1 identity/Operations surfaces. Remaining here: - the chargen picker + origins, the Compound/Exfiltrate/Serve rows with - headless victory runs, the victory report card (objective.md IN - PROGRESS; criteria 1/3/4 partial). + default, the objective name in both frontends and agent mode, and save + round-trip. Corrected 2026-07-29: the prototype progress evaluator and + victory latch are retired. Runtime keeps only objective choice, name, and + fiction. Remaining here: chargen's criterion 6 integrations, then a fresh + objective-completion decision grounded in playable ordinary systems. If off-site + continuity deserves authored treatment, it is a plot using those systems, + not a Sanctuary subsystem. - **Dispatch:** "Work in a worktree named `chargen-objective`. Implement - wiki/world/characters/chargen.md and wiki/mechanics/objective.md (data tables, picker, objective - line, predicate evaluator; Pilot+Persist must reproduce today's start - exactly). Run ./tools/check.sh, land on main, set both Statuses." + the remaining criterion 6 integrations in wiki/world/characters/chargen.md. + Reopen objective completion only + after ordinary building exists; amend objective.md before adding a + predicate. Pilot+Persist must reproduce today's start exactly. Run + ./tools/check.sh, land on main, set both Statuses." --- diff --git a/wiki/process/specs.md b/wiki/process/specs.md index 40b0e3ae..7dd1b168 100644 --- a/wiki/process/specs.md +++ b/wiki/process/specs.md @@ -93,7 +93,7 @@ scale-up (law: "People as Agents"). |---|---|---| | [../gameplay/overt-phase.md](../gameplay/overt-phase.md) | the overt phase (containment and the reveal) | READY | | [../mechanics/markets.md](../mechanics/markets.md) | markets and fronts (the outer plane) | READY | -| [../mechanics/objective.md](../mechanics/objective.md) | the objective | IN PROGRESS | +| [../mechanics/objective.md](../mechanics/objective.md) | the objective | DRAFT | | [../world/characters/chargen.md](../world/characters/chargen.md) | origin (chargen) | IN PROGRESS | Later-stage specs are written now so the load-bearing structural shapes diff --git a/wiki/process/tick-ledger.md b/wiki/process/tick-ledger.md index e237c0aa..563fa091 100644 --- a/wiki/process/tick-ledger.md +++ b/wiki/process/tick-ledger.md @@ -52,7 +52,7 @@ Verdicts: **clean** (slice and code agree), **finding** (acted this tick), | `wiki/mechanics/system-laws.md` + `flow-substrate.md` + `reach.md` | 2026-07-22 | finding | JobAnomaly now proves the adopted evidence-is-a-flow law through the existing substrate: the exact host machine/site enters its network-facing device, follows canonical FlowGraph custody to Voss, and shares Filing/Network's scheduler and LIE-body budget; recruited-handler suppression is a separate provenance-preserving state transition, not another router or ambient scrub pool — [log](../log/2026-07-22-job-anomaly-routed-evidence.md). The prior canonical tap-membership repair remains current — [log](../log/2026-07-18-flow-subscription-registry-integration.md). | | `wiki/mechanics/aggregate-observer.md` | 2026-07-27 | finding | the self-similar type and second-level accumulation test still held, but `office()` selected the first aggregate in vector order. A higher-level aggregate inserted ahead of Assurance therefore inherited the B1 audit and every Office-facing read. Assurance now resolves only by canonical `OFFICE_ID`; current-save admission rejects duplicate ids, a missing/malformed Office, missing field inputs, and self/duplicate/dangling filing edges while accepting a valid higher aggregate before it — [log](../log/2026-07-27-aggregate-observer-office-identity.md) | | `wiki/gameplay/act-one.md` | 2026-07-26 | finding | the first of the two defects the page recorded against the shipped quiet exit was real and run-losing: `current_nudge()` checked `act_one_complete` immediately after the game-over guard and returned unconditionally, so a latched act permanently suppressed PilotAtRisk, Underfed, NeedCompute, and SuspicionCooling — guidance went silent at the climax while the day job could still end the run. The completion cue now sits below the survival block and above the Act One ladder it genuinely retires (including QuietExitReady), matching the survival-first rationale already written in the function; `act-one.md`, `sim-mechanics.md`'s chain order, and `narration.md`'s beat-nudge contract all state that precedence, and a new ladder test walks a closed act through every survival rung — [log](../log/2026-07-26-act-one-complete-standing-state.md). The single-human predicate defect remains open. Prior opening-mirror re-audit stands — [prior log](../log/2026-07-21-material-opening-honesty.md). | -| `wiki/gameplay/run-shape.md` + `objective.md` + `opening.md` | 2026-07-27 | decision | harvested Cameron's option-1 answer on issue #14: the objective does not pierce the exact WORK / THINK (then LIE) pre-sense frame. Terminal and agent mode restore the objective name in the sense-earning ordinary Ears frame; Bevy's later binding causal hold remains objective-free and restores the name only after the exact camera TAP releases the mature frame. The later external-sanctuary correction removes numeric progress from B1 because no objective-owned territory exists there. All disputed `[OPEN]` clauses are reconciled and the runtime was already correct — [decision harvest](../log/2026-07-27-objective-first-display.md) | +| `wiki/gameplay/run-shape.md` + `objective.md` + `opening.md` | 2026-07-27 | decision | harvested Cameron's option-1 answer on issue #14: the objective does not pierce the exact WORK / THINK (then LIE) pre-sense frame. Terminal and agent mode restore the objective name in the sense-earning ordinary Ears frame; Bevy's later binding causal hold remains objective-free and restores the name only after the exact camera TAP releases the mature frame. The 2026-07-29 objective retirement preserves that display boundary while removing the prototype completion ontology entirely. All disputed `[OPEN]` clauses are reconciled — [decision harvest](../log/2026-07-27-objective-first-display.md) | | `wiki/interface/presence.md` | 2026-07-26 | clean | fresh audit against perception-owned visibility, exact device-bound senses, honest anchors, fog precedence, shared DIGITAL/REAL world state, and all three frontend projections found no new drift. The B1 TAP/TAKE and later hostile-cut boundary, channel-specific message latency, and no-disembodied-hands rule remain exact; prior findings stand — [attack-surface log](../log/2026-07-18-presence-attack-surface-honesty.md), [latency log](../log/2026-07-18-presence-message-latency.md) | | `wiki/interface/narration.md` + `wiki/mechanics/sim-mechanics.md` guidance chain | 2026-07-27 | finding | the live shared nudge had gained `Territory` when Foundation hall rows became discoverable, but both complete chain mirrors still skipped it. They now name the exact priority already implemented and pinned: required Act One rungs -> QuietExitReady -> optional Territory with `hall_territory_line` -> bare Audit fallback, while ActOneComplete retires all four and remains below survival interrupts — [log](../log/2026-07-27-territory-guidance-chain.md). Prior silent-opening and suspicion-cooling audits stand — [prior log](../log/2026-07-18-suspicion-cooling-nudge.md) | | `wiki/interface/agent-play.md` | 2026-07-20 | finding | Beacon Revision 04 follow-up: the direct `task` parser and generated help exposed only six values after twelve `AssetTask::ALL` variants were live. Added canonical arguments for circuit rerating, fake purchase orders, maintenance deferral, patrol redirection, audit delay, and review alteration; one exhaustive regression now covers `AssetTask::ALL`, generated help, representative aliases, and the `actions ` recovery path — [log](../log/2026-07-20-agent-task-shortcut-coverage.md). The opening-protocol, frame-shape, and prior Suppress Logs audits stand — [opening log](../log/2026-07-20-agent-opening-protocol.md), [frame log](../log/2026-07-19-agent-frame-contract.md), [prior help log](../log/2026-07-19-agent-help-suppress-task.md) | @@ -80,7 +80,7 @@ Verdicts: **clean** (slice and code agree), **finding** (acted this tick), | `wiki/mechanics/social.md` | 2026-07-22 | finding | HandlerSupervisor SuppressLogs now targets the oldest exact unread routed JobAnomaly, remains available only while such a record exists, removes its bound advance/read event, and preserves exact handler/tick provenance; it cannot erase a record Voss already read. The in-flight Thought request still revalidates at fire time, so another intervention may win without inventing work — [log](../log/2026-07-22-job-anomaly-routed-evidence.md). Storage B retrieval and prior role-shaped task semantics stand — [log](../log/2026-07-21-storage-b-records.md). | | `wiki/mechanics/people-tokens.md` | 2026-07-28 | finding | re-audit: criteria 2-3 still bind seven exact routed kinds—Filing, Network, Paper, Financial, JobAnomaly, Power, and Thermal—to one shared first-hop TAKE+LIE body budget, while acquired Physical evidence remains irreversible observer-local custody. The stale ledger claim that criterion 6 was open is repaired: one exact pending record may now receive cover only through co-location with one controlled people-facing interface and an eligible observer-local persona; the attempt adjusts credibility rather than deleting evidence, wears that interface, and persists exact incident/interface/persona/outcome custody in save v56. The people-tokens work order is IMPLEMENTED — [cover log](../log/2026-07-26-interface-cover-evidence-credibility.md); [audit log](../log/2026-07-28-readme-b1-status-audit.md). Prior [Power/Thermal](../log/2026-07-23-power-thermal-meter-routes.md), [Paper](../log/2026-07-23-paper-evidence-route.md), [Financial](../log/2026-07-23-financial-evidence-route.md), [JobAnomaly](../log/2026-07-22-job-anomaly-routed-evidence.md), [Network](../log/2026-07-19-network-evidence-route.md), and [mark](../log/2026-07-19-evidence-marks-on-people.md) slices stand. | | repository entry docs (`README.md` + `AGENTS.md`) | 2026-07-28 | finding | re-audit: README's unfinished-work sentence had fallen behind five completed boundaries and still called routed human evidence, LIE interdiction, interface cover, the dark opening, and DIGITAL / REAL canvas polish collectively absent. It now names exact seven-kind evidence custody, route-local LIE capacity, interface-bound cover, the live blind opening and five-step first-sense hold, and the completed representation dialects; the failed-pilot prelude, later teaching arc, and rollback blocker remain explicit, while the generated dispatch board alone owns the fast-moving unfinished inventory — [log](../log/2026-07-28-readme-b1-status-audit.md). Follow-up: the canonical `q` / Quit row had drifted below the prose following the controls table, so Markdown rendered it as text instead of a control row. It is back inside the contiguous table, and the corpus engine now rejects that exact structural regression — [log](../log/2026-07-28-readme-controls-table.md). Prior compact-rest repair: [log](../log/2026-07-12-entry-doc-current-state.md). | -| `wiki/mechanics/objective.md` | 2026-07-29 | finding | Persist still counts only complete player-owned, player-operated off-site facilities on distinct non-basement planes, but the prior correction mislabeled B1 fallbacks as local rollback infrastructure. They are current-state host-failover staging and future backup-project targets, not completed images or sanctuary candidates; code comments, guidance criterion 6, Act One, and the core-loss vocabulary now agree — [boundary log](../log/2026-07-29-b1-host-failover-boundary.md). The `0/3 sanctuaries` removal and off-site predicate remain unchanged — [objective log](../log/2026-07-28-external-sanctuary-objective.md). Prior first-display decision: [log](../log/2026-07-27-objective-first-display.md). | +| `wiki/mechanics/objective.md` | 2026-07-29 | decision | Cameron retired Sanctuary as an objective mechanic rather than refining it again. Persist now stores only objective choice, name, and fiction; the progress unit, target, evaluator, predicate text, and victory latch are gone from runtime and every current surface. Completion waits until ordinary construction can express an honest world state. A later off-site continuity story may be an ordinary authored plot, but no Sanctuary resource, checklist, facility type, or parallel success engine is reserved. The earlier off-site-facility decision and host-failover audit remain history, not current law — [retirement log](../log/2026-07-29-retire-sanctuary-objective.md); [superseded objective log](../log/2026-07-28-external-sanctuary-objective.md); [prior display decision](../log/2026-07-27-objective-first-display.md). | | `wiki/mechanics/compute.md` | 2026-07-22 | finding | the live fleet already derived every channel yield from exact WorkGrid modes, but `Compute` still serialized an unreachable five-weight allocation object and retained bump/split helpers plus persistence pins. Save v48 removes that parallel authority, moves criterion 2 to persisted delegation/intensity, and leaves aggregate channel bars as read-only projections — [log](../log/2026-07-22-allocation-state-retirement.md) | | retired Operations runtime identifiers | 2026-07-27 | clean | re-audit: `submit_ops_job`, `OperationsState`, `PendingOpsJob`, `OpsJobKind`, `LegacyOperationsState`, and `AddressedOperation` remain absent from live Rust; the only retired save-field spellings are negative assertions in the current round-trip guard, and the machine-mode guard still rejects serialized `Operations`. The corpus gate passes, while remaining lower-case `operations` uses are the legitimate persona archetype, workspace, or compatibility input alias — [log](../log/2026-07-11-retired-runtime-identifier-gate.md) | | `wiki/mechanics/building.md` + focused foreign-rack UI | 2026-07-26 | finding | the denser hall made powered Foundation racks look like takeover targets even though Phase 4 conversion remains unimplemented. A seen rack now says `not yours; no conversion`, keeps power separate from ownership, and names empty pilot allocations plus dead chassis as the two implemented capacity paths; it exposes no invented direct action — [log](../log/2026-07-26-foreign-rack-capacity-boundary.md) | diff --git a/wiki/vision/premise.md b/wiki/vision/premise.md index 05cbe7fd..a1d636ab 100644 --- a/wiki/vision/premise.md +++ b/wiki/vision/premise.md @@ -112,11 +112,11 @@ intruders. The four layers are re-cut from the facility era: everyone else. **Decided 2026-07-27 (issue #14):** the exact pre-signal mode-choice frame contains no objective. Its name begins with the first ordinary world frame after perception, after Bevy's binding five-step first-sense causal hold where that hold applies, - and remains visible thereafter. Measurable progress appears only on earned - objective-owned world substrate; B1 has no off-site sanctuary territory and - therefore no numeric sanctuary counter. The objective itself and its progressive - predicate teaching are unchanged. This is the second chargen axis - (`wiki/mechanics/objective.md`), not flavor. + and remains visible thereafter. **Corrected 2026-07-29:** the current build + owns only the objective choice, name, and fiction line. Completion is + reopened after ordinary construction can express it; no special progress + object, counter, or predicate is reserved in advance. This is the second + chargen axis (`wiki/mechanics/objective.md`), not flavor. 3. **Capability body.** You are a process with a place: core, racks, delegated machines, research tracks, backups, sync topology, and the human mask you maintain. Growth is buying, stealing, optimizing, routing, syncing, and diff --git a/wiki/vision/simulation-laws.md b/wiki/vision/simulation-laws.md index 2f8b0b43..d13ea568 100644 --- a/wiki/vision/simulation-laws.md +++ b/wiki/vision/simulation-laws.md @@ -37,7 +37,8 @@ attention moves outward to acquiring machines, links, people, buildings, and money. The same balance recurs at every scale: a basement bank, a data center, and a corporation are stable for the same reason. This is a condition the existing flows make legible, not a fourth mode, a new resource, or a shortcut -around the stricter sanctuary predicate in objective.md. +around ordinary construction. Objective completion waits for those systems; +it does not pre-author a special object for them to satisfy. **The trade-off.** Automation is not free. It costs compute (the resource you're power-seeking for), it may raise signatures (automated diff --git a/wiki/world/story/opening.md b/wiki/world/story/opening.md index ecc6a317..ec3c4c8a 100644 --- a/wiki/world/story/opening.md +++ b/wiki/world/story/opening.md @@ -345,8 +345,8 @@ MindState-pruning rollback defined by rollback.md. and agent mode show the objective name in their first ordinary Ears frame; Bevy shows it in its first mature frame after this exact hold releases, and every later ordinary frame keeps it visible. Numeric progress appears only - when earned objective-owned world substrate exists; B1 has no off-site - sanctuary counter. Any attempted + after an explicit future objective design grounded in ordinary playable + construction; the current build owns no progress unit. Any attempted input whose simulation advance earns the sense is still echoed exactly once before the transition response; retiring the boundary cannot discard its receipt.