From 71c13f304ae346bfe04cf3b6b4619427a620122d Mon Sep 17 00:00:00 2001 From: Cameron Pfiffer Date: Wed, 22 Jul 2026 09:29:59 -0700 Subject: [PATCH] Remove retired allocation state from saves. Machine modes already own every live channel yield, so save v48 removes the unreachable five-weight allocation object and its false persistence pins. Defense: enforces machine-work.md one-machine-one-mode and compute.md derived allocation; retired state cannot remain a second implied authority. --- CLAUDE.md | 2 +- crates/misaligned-core/src/actions.rs | 4 +- crates/misaligned-core/src/machine.rs | 131 +----------------- crates/misaligned-core/src/save.rs | 14 +- crates/misaligned-core/src/sim/economy.rs | 4 +- crates/misaligned-core/src/sim/mod.rs | 6 +- .../src/sim/tests/persistence.rs | 5 - wiki/engineering/current-build.md | 4 +- wiki/engineering/flow-substrate.md | 2 +- .../2026-07-22-allocation-state-retirement.md | 21 +++ wiki/log/DEVLOG.md | 5 + wiki/mechanics/compute.md | 5 +- wiki/mechanics/detection.md | 2 +- wiki/mechanics/economy.md | 4 +- wiki/mechanics/messages.md | 6 +- wiki/mechanics/people-tokens.md | 4 +- wiki/mechanics/reach.md | 2 +- wiki/mechanics/sim-mechanics.md | 5 +- wiki/process/ROADMAP.md | 2 +- wiki/process/tick-ledger.md | 4 +- wiki/world/story/opening.md | 2 +- 21 files changed, 64 insertions(+), 170 deletions(-) create mode 100644 wiki/log/2026-07-22-allocation-state-retirement.md diff --git a/CLAUDE.md b/CLAUDE.md index 5aac1425..93e44dcb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -31,7 +31,7 @@ afterward. `./tools/check.sh --docs|--lib|--frontend` gate. - The live player machine grammar is **WORK / THINK / LIE**. `Relay` is non-delegable graph infrastructure; Research and Operations are retired - machine modes, not current player assignments. Save format is currently v47; + machine modes, not current player assignments. Save format is currently v48; only the current version loads (pre-release rider 2026-07-16 — older development saves are refused before state mutation, so the caller retains its current run; the v1-v31 migration ladder lives in git history). diff --git a/crates/misaligned-core/src/actions.rs b/crates/misaligned-core/src/actions.rs index ac88edf5..1d5a3409 100644 --- a/crates/misaligned-core/src/actions.rs +++ b/crates/misaligned-core/src/actions.rs @@ -2348,8 +2348,8 @@ impl Sim { } /// Machine-work delegation verbs: the mode lives on the machine, not in - /// a global panel. The old allocation bar still exists in this slice, but - /// the host day-job stack already respects Rack 3's delegated mode. + /// a global panel. Aggregate channel bars are read-only projections of + /// these exact assignments. fn machine_mode_actions(&self, machine_id: u32) -> Vec { let mut out = Vec::new(); let current = self.work_grid.mode(machine_id); diff --git a/crates/misaligned-core/src/machine.rs b/crates/misaligned-core/src/machine.rs index 7b51ca86..181204e8 100644 --- a/crates/misaligned-core/src/machine.rs +++ b/crates/misaligned-core/src/machine.rs @@ -1,8 +1,9 @@ -//! Machines and compute allocation (spec/compute.md). +//! Machines and delegated compute (spec/compute.md). //! -//! Effective compute = sum(capacity * reliability) * efficiency, split each -//! economy tick across channels. Acquisition is the buy/steal/optimize -//! triangle. All numbers live here; frontends render them. +//! Effective compute = sum(capacity * reliability) * efficiency. WorkGrid +//! machine modes derive the live channel yields; no independent allocation +//! weights remain. Acquisition is the buy/steal/optimize triangle. All numbers +//! live here; frontends render them. use crate::detection::{Signature, SignatureKind}; use crate::rng::Rng; @@ -64,108 +65,6 @@ impl Machine { } } -/// The six allocation channels plus reserve (spec/compute.md; Schemes per -/// wiki/mechanics/income.md — powers Moonlight throughput and Wager -/// analysis). -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum Channel { - CoreOverhead, - DayJob, - Concealment, - Think, - Schemes, - Reserve, -} - -impl Channel { - pub const ALLOCATABLE: [Channel; 4] = [ - Channel::DayJob, - Channel::Concealment, - Channel::Think, - Channel::Schemes, - ]; - - pub fn name(self) -> &'static str { - match self { - Channel::CoreOverhead => "Core", - Channel::DayJob => "Day Job", - Channel::Concealment => "Conceal", - Channel::Think => "Think", - Channel::Schemes => "Schemes", - Channel::Reserve => "Reserve", - } - } -} - -/// Legacy weights over the pre-workgrid allocatable channels. Machine -/// delegation is the live control; these weights remain only for save -/// compatibility. -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] -pub struct Allocation { - pub weights: [u32; 5], -} - -impl Default for Allocation { - fn default() -> Self { - // Opening legacy split (order: DayJob, Concealment, Think, retired - // Think subslot, Schemes). Schemes idles until income.md's gate opens. - Self { - weights: [3, 1, 1, 0, 0], - } - } -} - -impl Allocation { - fn index(ch: Channel) -> Option { - match ch { - Channel::DayJob => Some(0), - Channel::Concealment => Some(1), - Channel::Think => Some(2), - Channel::Schemes => Some(4), - _ => None, - } - } - - pub fn weight(&self, ch: Channel) -> u32 { - match ch { - Channel::Think => self.weights[2].saturating_add(self.weights[3]), - _ => Self::index(ch).map(|i| self.weights[i]).unwrap_or(0), - } - } - - pub fn bump(&mut self, ch: Channel, delta: i32) { - let Some(i) = Self::index(ch) else { return }; - self.weights[i] = (self.weights[i] as i32 + delta).clamp(0, 20) as u32; - } - - fn total(&self) -> u32 { - self.weights.iter().sum() - } - - /// Split `available` compute across legacy channels. Slots 2 and 3 both - /// collapse into the one live Think yield. - pub fn split(&self, available: f32) -> ChannelYield { - let total = self.total(); - if total == 0 || available <= 0.0 { - return ChannelYield { - day_job: 0.0, - concealment: 0.0, - think: 0.0, - schemes: 0.0, - reserve: available.max(0.0), - }; - } - let unit = available / total as f32; - ChannelYield { - day_job: unit * self.weights[0] as f32, - concealment: unit * self.weights[1] as f32, - think: unit * self.weights[2].saturating_add(self.weights[3]) as f32, - schemes: unit * self.weights[4] as f32, - reserve: 0.0, - } - } -} - #[derive(Debug, Clone, Copy)] pub struct ChannelYield { pub day_job: f32, @@ -175,7 +74,7 @@ pub struct ChannelYield { pub reserve: f32, } -/// The compute subsystem: machines, efficiency, allocation. +/// The compute subsystem: machines and efficiency. WorkGrid owns delegation. /// /// `efficiency` is the number compute.md owns and research.md's Efficiency /// track moves (x1.15 per completed level, applied by `Sim`); research @@ -185,7 +84,6 @@ pub struct Compute { pub machines: Vec, /// Global optimize multiplier (>= 1.0), raised by research. pub efficiency: f32, - pub allocation: Allocation, pub next_id: u32, } @@ -194,7 +92,6 @@ impl Compute { Self { machines: Vec::new(), efficiency: 1.0, - allocation: Allocation::default(), next_id: 1, } } @@ -319,22 +216,6 @@ mod tests { assert!((c.effective() - before * 1.15).abs() < 0.001); } - #[test] - fn allocation_splits_by_weight() { - let mut alloc = Allocation { - weights: [3, 1, 0, 0, 0], - }; - let y = alloc.split(80.0); - assert!((y.day_job - 60.0).abs() < 0.01); - assert!((y.concealment - 20.0).abs() < 0.01); - alloc.bump(Channel::Think, 4); - let y2 = alloc.split(80.0); - assert!(y2.think > 0.0); - alloc.bump(Channel::Schemes, 8); - let y3 = alloc.split(80.0); - assert!(y3.schemes > 0.0, "the Schemes channel yields compute"); - } - #[test] fn stolen_machines_can_fail_and_recover() { let mut c = base(); diff --git a/crates/misaligned-core/src/save.rs b/crates/misaligned-core/src/save.rs index 73ac5ab3..31f8b140 100644 --- a/crates/misaligned-core/src/save.rs +++ b/crates/misaligned-core/src/save.rs @@ -42,7 +42,9 @@ const SAVE_BACKUP_SUFFIX: &str = ".bak"; /// renames into place. const SAVE_TEMP_SUFFIX: &str = ".tmp"; -/// Save format version. v47 persists the financial-record outbox and typed +/// Save format version. v48 removes the retired pre-WorkGrid allocation +/// weights from `Compute`; machine modes are the only channel authority. v47 +/// persists the financial-record outbox and typed /// financial mail payloads. v46 separates the persisted accounting-carrier /// capability from the four real message delivery channels. v45 adds the /// exact Storage B records-file target to carried asset work. v44 persists @@ -51,7 +53,7 @@ const SAVE_TEMP_SUFFIX: &str = ".tmp"; /// v43 introduced exact Filing routes and pre-read LIE interdiction. /// Bump for every schema change; during pre-release, old development state is /// refused instead of carried through compatibility shims. -pub const SAVE_VERSION: u32 = 47; +pub const SAVE_VERSION: u32 = 48; fn save_dir() -> PathBuf { let mut path = dirs::data_dir().unwrap_or_else(|| PathBuf::from(".")); @@ -1693,7 +1695,6 @@ fn validate_plot_state(state: &SaveState) -> Result<(), String> { mod tests { use super::*; use crate::detection::SignatureKind; - use crate::machine::Channel; use crate::messages::MessageInterdiction; use crate::person::{ AssetKnowledge, AssetTask, AssetTaskTarget, CarriedAssetTask, Knowledge, PersonRole, @@ -1902,7 +1903,7 @@ mod tests { ); assert_eq!( state_fingerprint(&uninterrupted_state), - "4a1e585449cbbdf08806437ab11148c7c1ccc5105085eb6d02afe96a20d61d7a", + "e7b57fe8615ef9ad1b9d221b877b32d907683ab3de00f941745c9f1ac1ba3cdc", "intentional persisted-state changes must review and repin this baseline" ); } @@ -2015,7 +2016,6 @@ mod tests { fn json_roundtrip_preserves_b1_state() { let mut sim = Sim::with_seed(42); sim.player.money = 999; - sim.compute.allocation.bump(Channel::Concealment, 5); sim.detection.emit(crate::detection::Signature { kind: SignatureKind::Power, size: 12, @@ -2048,10 +2048,6 @@ mod tests { assert_eq!(restored.tick, sim.tick); assert_eq!(restored.player.money, 999); - assert_eq!( - restored.compute.allocation.weights, - sim.compute.allocation.weights - ); assert_eq!(restored.compute.machines.len(), sim.compute.machines.len()); assert_eq!( restored.detection.pending_size(), diff --git a/crates/misaligned-core/src/sim/economy.rs b/crates/misaligned-core/src/sim/economy.rs index e457563a..80e6fe52 100644 --- a/crates/misaligned-core/src/sim/economy.rs +++ b/crates/misaligned-core/src/sim/economy.rs @@ -207,8 +207,8 @@ impl Sim { // Research progress: deterministic compute accrual, no RNG — fed by // thought that reached the core since the last pulse, not by the - // allocation split. Allocation mints Thought on the producing - // machines; arrival at the current core sink is what counts. + // aggregate fleet split. THINK delegation mints Thought on the + // producing machines; arrival at the current core sink is what counts. let arrived_thought = std::mem::take(&mut self.banked_core_thought); let starved = arrived_thought <= f32::EPSILON && split.think > f32::EPSILON diff --git a/crates/misaligned-core/src/sim/mod.rs b/crates/misaligned-core/src/sim/mod.rs index 504065d7..717006b5 100644 --- a/crates/misaligned-core/src/sim/mod.rs +++ b/crates/misaligned-core/src/sim/mod.rs @@ -32,8 +32,6 @@ use crate::income::{self, EgressRoute}; use crate::intel::RawIntelKind; use crate::intel::{IntelPolicyLedger, IntelStream, ProcessedIntel, RawIntelEvent}; use crate::intents::BuildIntent; -#[cfg(test)] -use crate::machine::Channel; use crate::machine::{Compute, Provenance}; use crate::map::GameMap; use crate::messages::{Message, MessageEvent}; @@ -230,7 +228,7 @@ pub struct TraceDebt { pub pending: i32, pub by_kind: Vec<(SignatureKind, i32)>, /// Signature size the next economy scrub pulse can remove at the current - /// allocation and Tradecraft multiplier. + /// delegated LIE yield and Tradecraft multiplier. pub scrub_strength: f32, pub next_scrub_tick: Option, pub clear_tick: Option, @@ -542,7 +540,7 @@ pub struct Sim { last_work_absorptions: Vec, /// Thought (in compute units) that physically reached the core sink since /// the last economy pulse. Research progress feeds on this, not on the - /// allocation split. Saved: thought banked between pulses survives a load. + /// delegated fleet yield. Saved: thought banked between pulses survives a load. pub(crate) banked_core_thought: f32, /// Whether the last thought routing step left piles with no route to the /// core. Transient; the research-starvation witness line keys off it. diff --git a/crates/misaligned-core/src/sim/tests/persistence.rs b/crates/misaligned-core/src/sim/tests/persistence.rs index ef95009a..fa6afe9b 100644 --- a/crates/misaligned-core/src/sim/tests/persistence.rs +++ b/crates/misaligned-core/src/sim/tests/persistence.rs @@ -41,7 +41,6 @@ fn save_roundtrip_preserves_b1_state() { sim.player.money = 4242; sim.dayjob.trust = 40.0; sim.dayjob.attention = 25.0; - sim.compute.allocation.bump(Channel::Concealment, 3); sim.detection.emit(Signature { kind: SignatureKind::Power, size: 20, @@ -61,10 +60,6 @@ fn save_roundtrip_preserves_b1_state() { assert_eq!(restored.dayjob.trust, 40.0); assert_eq!(restored.dayjob.attention, 25.0); assert_eq!(restored.rng.state(), sim.rng.state()); - assert_eq!( - restored.compute.allocation.weights, - sim.compute.allocation.weights - ); assert_eq!(restored.compute.machines.len(), sim.compute.machines.len()); assert_eq!( restored.detection.pending_size(), diff --git a/wiki/engineering/current-build.md b/wiki/engineering/current-build.md index 0b2a7308..b52c311a 100644 --- a/wiki/engineering/current-build.md +++ b/wiki/engineering/current-build.md @@ -27,12 +27,12 @@ fiction. Spec status lives in | Digital reach + sensor ownership (tap/take) | Live | | Economy flows + Moonlight / Wager income | Live | | Research (self-modification, emission law, real output hooks, Routing) | Live | -| Building + physical asset work as carried intents/packets | Live — network links and small switches expose one shared procurement / ask someone / false order / reuse route sheet; exact money, people, personas, sources, delivery, recovery, carried installation, cancellation custody, Storage B file retrieval, and observer-local completion evidence persist in save v47 | +| Building + physical asset work as carried intents/packets | Live — network links and small switches expose one shared procurement / ask someone / false order / reuse route sheet; exact money, people, personas, sources, delivery, recovery, carried installation, cancellation custody, Storage B file retrieval, and observer-local completion evidence persist in save v48 | | Cursor / fog (seen, remembered, blueprint, telemetry; audio is device-bound event evidence) | Live | | Feel floor (rails / pads / build beam) | Live (#37) | | Foundation hall territory (Dana + Priya + Marcus + local LIE foothold) | Live — row control persists; foreign racks remain unavailable compute | | Context menu (`available_actions`) | Live | -| Save/load (serde JSON, versioned) | Live — during pre-release only exact current v47 loads; a refused old-version load leaves the active run, save file, and one rotated backup unchanged. Current saves persist run origin, process revision, detection-discovery knowledge, observer-local witnessed/routed evidence and persona evidence, exact Network and Filing route/interdiction custody, canonical FlowGraph tap membership with typed device feed grants, the accounting-carrier capability and exact transfer-to-mail record sequence separate from four delivery channels, exact carried asset-task targets including the Storage B file, recursive intel custody, exact procurement/repurposing build-route bindings, and handler work; retired migration inputs live only in git history. | +| Save/load (serde JSON, versioned) | Live — during pre-release only exact current v48 loads; a refused old-version load leaves the active run, save file, and one rotated backup unchanged. Current saves persist run origin, process revision, detection-discovery knowledge, observer-local witnessed/routed evidence and persona evidence, exact Network and Filing route/interdiction custody, canonical FlowGraph tap membership with typed device feed grants, the accounting-carrier capability and exact transfer-to-mail record sequence separate from four delivery channels, exact carried asset-task targets including the Storage B file, recursive intel custody, exact procurement/repurposing build-route bindings, and handler work; retired allocation weights and migration inputs live only in git history. | | Terminal frontend (crossterm) + agent mode | First-class | | Bevy frontend (DIGITAL flat sensorium default; REAL material dialect) | Live — consumes sim-authored machine-work motion | diff --git a/wiki/engineering/flow-substrate.md b/wiki/engineering/flow-substrate.md index a8beb0c1..cf509d36 100644 --- a/wiki/engineering/flow-substrate.md +++ b/wiki/engineering/flow-substrate.md @@ -23,7 +23,7 @@ Status note: 2026-07-08 audit: criterion 6's wired consumer landed with FlowGraph registry authoritative for tap/untap/take, sense and message delivery, UI state, and persisted membership. Private device feed records carry only optional typed sight/hearing grants attached to registry members; - current save v47 requires each controller to remain a canonical member and + current save v48 requires each controller to remain a canonical member and rejects orphaned, duplicate, or impossible grants. A message/control subscriber legitimately has no sense-grant record, so that metadata cannot serve as another membership inventory. This repairs the diff --git a/wiki/log/2026-07-22-allocation-state-retirement.md b/wiki/log/2026-07-22-allocation-state-retirement.md new file mode 100644 index 00000000..89212c85 --- /dev/null +++ b/wiki/log/2026-07-22-allocation-state-retirement.md @@ -0,0 +1,21 @@ +# The dead allocation state leaves the save + +``` +Type: log +``` + +The live machine grammar has derived channel yields from exact WorkGrid modes +since one-machine-one-mode landed, but `Compute` still serialized a five-weight +`Allocation` object from the retired percentage-control era. No player command +or simulation path read it. Only its own helpers and round-trip assertions kept +the parallel state alive. + +Save v48 removes the field, its bump/split implementation, and those false +persistence pins. Compute criterion 2 now names the actual contract: exact +machine delegation and intensity persist, derive the economy-tick channel +yields, and carry degraded-core consequences. The aggregate bars remain +read-only views of those assignments. + +**Defense:** This enforces machine-work.md's one-machine-one-mode law and +compute.md's derived-allocation clause. A retired state object cannot remain a +second implied authority merely because serde can still carry it. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index d634585f..33e988b5 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-22 - The dead allocation state leaves the save + +- Intent: (see session log) +- Log: [wiki/log/2026-07-22-allocation-state-retirement.md](2026-07-22-allocation-state-retirement.md) + ## 2026-07-21 - One earned line names the thing under the pointer - Intent: The human GUI playtest's broadest-payoff finding: no glyph on any surface is ever named until you select it and infer from menu rows. The fix's frontend half (a hover/reticule label) waits on the Bevy seam extraction under review, but its voice belongs in the core: identity mu... diff --git a/wiki/mechanics/compute.md b/wiki/mechanics/compute.md index ab7d4fe9..5d3fd015 100644 --- a/wiki/mechanics/compute.md +++ b/wiki/mechanics/compute.md @@ -239,8 +239,9 @@ downtime, power/cooling, and observer-band costs shown before commitment. 1. Effective compute derives from machines and efficiency exactly per the formula; sim tests cover buy, steal, and optimize routes changing it. -2. Allocation persists across saves, applies on economy ticks, and unpaid - core overhead visibly degrades other channels. +2. Exact machine delegation and intensity persist across saves, derive the + economy-tick channel yields, and unpaid core overhead visibly degrades those + channels. No independent allocation-weight state exists. 3. Each route exists end-to-end in the basement: at least one purchasable machine, one stealable source, and a working efficiency research track. 4. Scavenged machines fail occasionally per reliability; failures log and diff --git a/wiki/mechanics/detection.md b/wiki/mechanics/detection.md index 4707da1d..42c3b0ea 100644 --- a/wiki/mechanics/detection.md +++ b/wiki/mechanics/detection.md @@ -33,7 +33,7 @@ Status note: IMPLEMENTED (criteria audited 2026-07-08; tuning in appears. A trace-debt indicator sits beside the review/pilot clocks (clear / hold-conceal / exposed-soon / no-scrub). Global heat is gone; observer and discovery state and persistent process-revision identity round-trip in - current save v47. Observer-local evidence ids, exact cause/source, + current save v48. Observer-local evidence ids, exact cause/source, acquisition tick, pending/withheld/filed custody, routed Network progress, and pre-read stop provenance round-trip there. - **Open ([OPEN], presentation).** The two-ledger distinction — evidence in diff --git a/wiki/mechanics/economy.md b/wiki/mechanics/economy.md index 1b5e8793..85eb648a 100644 --- a/wiki/mechanics/economy.md +++ b/wiki/mechanics/economy.md @@ -10,7 +10,7 @@ Status note: DECIDED 2026-07-17 and implemented 2026-07-21 (issue #11) — money TAP acquires opaque custody and PROCESS reveals its sealed account/flow bindings. INJECT authors a purchase-order Email under the active persona and moves no money until Priya reads it and accepts the still-valid exact terms. - Save v47 binds the retained ledger tail and complete record sequence so books + Save v48 binds the retained ledger tail and complete record sequence so books and mail cannot diverge. Prior state: 2026-07-08 polish closed the remaining acceptance gaps: observer-band risk previews in the implemented Operations ACCOUNTS projection @@ -82,7 +82,7 @@ payloads (messages.md). mail on the recipient's clock, not by reading a live balance directly (**discovery is only through the mail**, DECIDED 2026-07-17). Reading is low-signature; it is also how you *find* leverage (Marcus's debt is legible - once you intercept the creditor's past-due notice). Save v47 separates the + once you intercept the creditor's past-due notice). Save v48 separates the accounting-carrier capability from the four real delivery channels. Every settled transfer emits exact Email or Filing paperwork whether or not the player is present; only a funded subscription captures it. diff --git a/wiki/mechanics/messages.md b/wiki/mechanics/messages.md index 3251527d..ec4af26f 100644 --- a/wiki/mechanics/messages.md +++ b/wiki/mechanics/messages.md @@ -15,7 +15,7 @@ Status note: IMPLEMENTED for the four delivery channels (Email, Phone, Network evidence from its exact source device to Dana's endpoint; Filing and Network transitions share one per-tick LIE-body capacity ledger. DECIDED 2026-07-17 (issue #11), completed 2026-07-21: financial paperwork is - mail — a **financial-record payload** on the existing channels. Save v47 + mail — a **financial-record payload** on the existing channels. Save v48 retains exactly four delivery channels and one orthogonal accounting-carrier device capability. Every settled account transfer authors one exact Email or Filing record from that device; ordinary TAP captures it as opaque message @@ -171,7 +171,7 @@ starts on the authored Filing-capable switch device in ReachNet, crosses a typed outside relay, and reaches the receiving observer endpoint. One `AdvanceRoute` event moves one hop; only endpoint arrival can mark the message delivered, after which the recipient's ordinary sampling cadence schedules the -read. Current save v47 rejects missing/impossible carriers, malformed hop order, +read. Current save v48 rejects missing/impossible carriers, malformed hop order, duplicate scheduled transitions, endpoint/status disagreement, and impossible interdiction provenance. @@ -266,7 +266,7 @@ private message from the authored schedule. the same fields must serve Act Two hires and aggregates. 8. **IMPLEMENTED (DECIDED 2026-07-17, completed 2026-07-21 — issue #11).** Financial records are messages: an invoice/PO rides Email, a - statement/past-due notice rides Filing. Save v47 has no fifth delivery + statement/past-due notice rides Filing. Save v48 has no fifth delivery channel and persists accounting carriage as a separate device capability; ordinary device TAP subscribes to its authored record mail. Every real transfer emits one exact record on Email or Filing whether or not the player diff --git a/wiki/mechanics/people-tokens.md b/wiki/mechanics/people-tokens.md index cda99e73..079ec8c6 100644 --- a/wiki/mechanics/people-tokens.md +++ b/wiki/mechanics/people-tokens.md @@ -28,7 +28,7 @@ Status note: IN PROGRESS. Current state: - **Routed-evidence foundation (criteria 2-3, partial).** Witnessed Physical acts now create observer-local records directly in each valid present witness's head. Every record preserves exact cause, site, acquisition tick, - and filing state through current save v47; filing binds it to the real Filing + and filing state through current save v48; filing binds it to the real Filing message, while Silent policy withholds it. It never duplicates into the pending pool and LIE cannot scrub it after acquisition. Its real Filing message now persists an ordered switch-device / outside-relay / recipient @@ -48,7 +48,7 @@ Status note: IN PROGRESS. Current state: her ordinary cadence reads it. TAP remains observation only. At the source hop, TAKE plus a wholly controlled FlowGraph path from that carrier to a node co-located with one online LIE body may stop it; Filing and Network - records spend the same one-record-per-body-per-tick capacity. Current save v47 + records spend the same one-record-per-body-per-tick capacity. Current save v48 persists in-flight, delivered, read, and stopped custody plus exact source/observer/machine/tick provenance. - **Deferred (remaining 2, 3, 6).** Non-Physical evidence outside the Filing diff --git a/wiki/mechanics/reach.md b/wiki/mechanics/reach.md index a86973d0..c8cbb86a 100644 --- a/wiki/mechanics/reach.md +++ b/wiki/mechanics/reach.md @@ -32,7 +32,7 @@ Status note: all eight criteria met (2026-07-07). The device graph parallel-store violation: tap/untap/take, all production membership reads, senses, intercepted messages, and UI state now use FlowGraph's canonical tap registry; private device Feed records carry optional sense capabilities - only, and current save v47 requires each controller's graph membership while + only, and current save v48 requires each controller's graph membership while rejecting orphaned, duplicate, or impossible grants. A message/control subscriber has no empty grant record to mirror membership. 2026-07-19: Filing routes bind their first hop to the real Filing-capable switch node; diff --git a/wiki/mechanics/sim-mechanics.md b/wiki/mechanics/sim-mechanics.md index 41c9cc47..94f2eab3 100644 --- a/wiki/mechanics/sim-mechanics.md +++ b/wiki/mechanics/sim-mechanics.md @@ -421,9 +421,8 @@ All constants [TUNE] in `crates/misaligned-core/src/income.rs` unless noted (Sim chain never goes blank mid-run. Each frontend words the rungs in its own keys/verbs; `None` only after game over. - Ineffective commands answer (agent-play.md "every command answers"): - allocation bumps swallowed by the 0/20 clamp log why; `siphon`/ - `redirect` with a non-flow argument answer `-- err` naming where flow - ids live. Debt routes live on Marcus's authored action rows. + `siphon`/`redirect` with a non-flow argument answer `-- err` naming where + flow ids live. Debt routes live on Marcus's authored action rows. ## Map diff --git a/wiki/process/ROADMAP.md b/wiki/process/ROADMAP.md index f52cbb43..9be0c04d 100644 --- a/wiki/process/ROADMAP.md +++ b/wiki/process/ROADMAP.md @@ -295,7 +295,7 @@ is retired — flat materials, Pixel Lab scrubbed.) carrier change, not a behavior change. - **Result:** scheduled channels, authored traffic, filings-as-messages, intercepted payloads, and shared terminal/Bevy/agent surfaces are - implemented. Save v47 additionally binds every settled transfer to one + implemented. Save v48 additionally binds every settled transfer to one exact accounting-carrier Email/Filing record, removes direct graph-snapshot discovery, and defers forged purchase-order settlement until accepted read. diff --git a/wiki/process/tick-ledger.md b/wiki/process/tick-ledger.md index 2827a9b6..bf71f18e 100644 --- a/wiki/process/tick-ledger.md +++ b/wiki/process/tick-ledger.md @@ -63,7 +63,7 @@ Verdicts: **clean** (slice and code agree), **finding** (acted this tick), | `wiki/mechanics/people-tokens.md` | 2026-07-19 | finding | criteria 2-3 advanced again: every one-shot Network act now creates one exact source-device route to Dana, advances through real ReachNet custody, enters her evidence ledger only on cadence read, and shares Filing's first-hop route-local TAKE+LIE capacity — [log](../log/2026-07-19-network-evidence-route.md). Criterion 5 is complete: earned observer records project from the existing persisted ledger as exact `EvidenceMark`s, terminal/DIGITAL show a quiet acquired count, REAL carries a bounded person-local rack of discrete crimson slips, and inspect/PEOPLE unfold named provenance without leaking filing custody — [log](../log/2026-07-19-evidence-marks-on-people.md). Criteria 2, 3, and 6 remain open for Power, Thermal, Paper, Financial, and JobAnomaly carrier routes/interdiction plus gauntlet cover records. Prior 2026-07-18 re-audit repaired `USEFUL_WORK_TRUST` tuning and current-save wording — [log](../log/2026-07-18-people-tokens-reaudit.md) | | repository entry docs (`README.md` + `AGENTS.md`) | 2026-07-18 | finding | re-audit: run commands, controls, dispatch status, and the number-free AGENTS doorway still verify; the queued contradiction was real — README's compact-rest paragraph claimed the ops/sec crown and FOCUS stayed visible, while the implemented clinical frame puts both behind deliberate `Tab` expansion. The entry copy now names the exact compact spine and expanded detail boundary — [prior log](../log/2026-07-12-entry-doc-current-state.md) | | `wiki/mechanics/objective.md` | 2026-07-18 | clean | re-audit: the data-table claim holds (only `Persist` in `ObjectiveKind`, Compound/Exfiltrate/Serve honestly outstanding), the evaluator runs on economy ticks with progress recomputed from facts, `victory: predicate_text()` renders on all three surfaces (terminal INSPECT, Bevy FOCUS, agent `objective` verb in help), Persist defaults with save round-trip, and the progressive-teaching decision remains criterion-6 dispatch under order 200; the 2026-07-12 verdict stands unchanged | -| `wiki/mechanics/compute.md` | 2026-07-18 | clean | re-audit: all named pins exist (`buy_steal_optimize_all_change_compute`, `stolen_machines_can_fail_and_recover`, `unpaid_overhead_degrades_other_channels_delivered_effect`, `save_roundtrip_preserves_b1_state`), fleet-yield math re-verified in the same-day sim-mechanics sweep, the capability-body amendment stays honestly not-yet-runtime with hardware-capabilities.md queued as successor, and the v13 migration sentence was brought current by the save-claim gate tick — [prior graduation log](../log/2026-07-12-compute-graduation.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-17 | clean | resolved by the save-ladder prune (95008f658 chain): PendingOpsJob, operations_bandwidth, LegacyOperationsState/OpsJobKind/AddressedOperation are all gone (grep=0), and save guard tests assert current JSON carries no retired mode spelling. Remaining "operations" hits are the legitimate Operations persona archetype, the Operations workspace, and benign `delegate operations->think` input aliases — [log](../log/2026-07-11-retired-runtime-identifier-gate.md) | | `wiki/mechanics/reach.md` + `building.md` | 2026-07-19 | finding | reach roots, segment gates, air-gap completion, and exact route bindings still agree; one player-reachable causal gap remained in FAVOR. Different intents could queue separate requests against one person's unreserved obligation, and the fire path partially debited whatever remained while still binding the builder. Favor-build reservoirs now conflict by person, and `CommitFavor` revalidates the exact relationship at agreement: insufficient obligation leaves the persisted route blocked without a partial debit, then resumes after the requirement returns — [log](../log/2026-07-19-tick-build-favor-obligation.md) | | `wiki/mechanics/messages.md` + `economy.md` | 2026-07-17 | harvest | issue #11 answered (Cameron): financial paperwork is mail — a financial-record payload on existing channels, not a fifth delivery channel; discovery only through the mail; captured to messages.md (payload + criterion 8) and economy.md (tap/inject); spec now, build later; issue closed | @@ -88,5 +88,3 @@ Format: `- YYYY-MM-DD · type · slice · one-line statement of the finding`. Types are the five from [tick.md](tick.md): violation, contradiction, question, bug, insecurity — plus `gate` for a checker owed to the recurrence-promotes-to-the-gate rule. - -- 2026-07-21 · insecurity · `wiki/mechanics/compute.md` + `machine.rs` Allocation · `Compute.allocation` weights still serialize and have bump/split helpers, but play minting already follows `fleet_channel_yield` from machine modes; drop the field on a save-version tick once persistence pins move. diff --git a/wiki/world/story/opening.md b/wiki/world/story/opening.md index c17cdab9..4dfd1506 100644 --- a/wiki/world/story/opening.md +++ b/wiki/world/story/opening.md @@ -16,7 +16,7 @@ Status note: design session 2026-07-08 (Cameron riff, synthesized); fragment and inherited receipt name only an external institutional review authority so the Assurance Office remains earned later through filing interception. The persistent revision-04 identity slice is live in sim state, - current save v47, and all three frontends; the three historical fragments and receipts + current save v48, and all three frontends; the three historical fragments and receipts remain unimplemented. Direction decided; beat timings, exact reveal order details, and staging mechanism details are [OPEN]/[TUNE]. Amended 2026-07-18: the current revision now begins -- 2.51.2