diff --git a/crates/misaligned-core/src/core_sys.rs b/crates/misaligned-core/src/core_sys.rs index 7e07873a..7597130d 100644 --- a/crates/misaligned-core/src/core_sys.rs +++ b/crates/misaligned-core/src/core_sys.rs @@ -142,9 +142,8 @@ impl Core { /// The host machine was destroyed/powered off. Returns the outcome. pub fn on_host_lost(&mut self) -> HostLoss { - // An interrupted migration falls back to source if it still lives — - // callers pass liveness via `resolve_interrupted`. Here: if a - // completed sync exists, roll back to it; else game over. + // B1 has no source-liveness interruption resolver yet. A completed + // fallback sync selects rollback; without one, host loss ends the run. if let Some(sync_tick) = self.latest_sync() { // New host becomes the freshest fallback machine. if let Some(f) = self diff --git a/wiki/log/2026-07-28-core-criteria-status-audit.md b/wiki/log/2026-07-28-core-criteria-status-audit.md new file mode 100644 index 00000000..5d20eb83 --- /dev/null +++ b/wiki/log/2026-07-28-core-criteria-status-audit.md @@ -0,0 +1,55 @@ +# 2026-07-28 — Core backup-project status audit + +``` +Type: log +Date: 2026-07-28 +Status: COMPLETE +Subject: Core backup-project implementation boundary +``` + +## Tick + +- **Slice:** `wiki/mechanics/core.md` against `core_sys.rs`, current save + custody, and the terminal/Bevy sidebar projections. +- **Finding:** the 2026-07-08 status note said acceptance criteria 2-5 held, + while the binding Behavior, Player surface, and criteria 3-5 describe + research-backed backup sync projects with partial progress, compute cost, + interruption handling, persisted project state, and ETA/heat/target rows. + Current B1 instead refreshes all designated fallbacks for free every + `sync_cadence`, stores only `last_sync`, and shows only sync age. + +## Trace + +- `Core` has `fallbacks`, `sync_cadence`, and an optional `Migration`; it has + no backup project or Thought-sink binding. +- `Core::tick` writes every fallback's `last_sync` immediately on the global + cadence. It consumes no compute or Thought and retains no incomplete state. +- `SaveState` persists that `Core` shape, so migration and sync ages survive + the exact-current save round trip, but no in-progress backup project exists + to save. +- Terminal and Bevy both project host, overhead, degraded state, and fallback + age. Neither has backup project progress, ETA, heat, cost, or target state to + render. +- `on_host_lost` selects the freshest completed fallback or returns game over. + Its comment referred to a nonexistent `resolve_interrupted` caller even + though current B1 does not test source liveness during interrupted migration. + +## Repair + +- Replaced the broad “criteria 2-5 hold” status with the exact live boundary: + criterion 2 holds; migration's duration, signatures, and persistence hold; + backup-project requirements in criteria 3-5 remain deferred with rollback; + criterion 6 remains deferred with hardware capability bodies; and criterion + 1 still lacks actual MindState snapshot restoration. +- Marked free-cadence fallback synchronization as an explicit B1 staging seam + under Behavior and marked the narrower current sidebar under Player surface. +- Removed the phantom interruption-resolver claim from the Rust comment without + changing runtime behavior. + +## Defense + +`core.md` remains the accepted target contract. The correction prevents a +temporary executable seam from being read as completion of the expensive, +interruptible backup-project design, while preserving each acceptance +criterion for the work orders that actually own its implementation. No +simulation, save, or frontend behavior changed. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 93b668f0..2ede0d3c 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -31,6 +31,11 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-28-operations-semantic-action-selection.md](2026-07-28-operations-semantic-action-selection.md) +## 2026-07-28 - Core backup-project status audit + +- Intent: (see session log) +- Log: [wiki/log/2026-07-28-core-criteria-status-audit.md](2026-07-28-core-criteria-status-audit.md) + ## 2026-07-28 - Continuous-witness five-step audit - Intent: (see session log) diff --git a/wiki/mechanics/core.md b/wiki/mechanics/core.md index cda80cd2..9a931e01 100644 --- a/wiki/mechanics/core.md +++ b/wiki/mechanics/core.md @@ -3,7 +3,7 @@ ``` Type: spec Status: IN PROGRESS -Status note: 2026-07-18 — the current-version-only rider is internally +Status note: 2026-07-28 — the current-version-only rider is internally consistent: load_game refuses any version but SAVE_VERSION before full deserialization; the caller's active run and both on-disk generations stay unchanged. Four orphaned compatibility shims left after the ladder deletion @@ -11,24 +11,21 @@ Status note: 2026-07-18 — the current-version-only rider is internally migration entry point. Git history retains the release-era ladder seed. Atomic writes, backup rotation, and current-version consistency checks are unchanged. - 2026-07-08 audit: criteria 2-5 hold (overhead_charged_before_ - allocation, migration_takes_time/emits_signatures + interruption - via resolve_interrupted, save round-trip, both sidebars). - Criterion 1 is the real remainder: module-level fallback swap is - tested (loss_with_fallback_rolls_back) but the sim-level snapshot - restore with persisting world-ledger facts and the inherited- - consequence case await rollback.md (B2) — the MindState/WorldLedger - split does not exist yet (research.md landed only the tags). - 2026-07-08 amendment: backup creation/refresh is no longer free - fallback designation plus automatic cadence; it is a research-backed - sync project. The current B1 code path is staging debt until rollback / - backup projects land. - Criterion 6 is decided, not yet runtime: B1 machines are all-capable - (compute.md has no storage/host capability body yet), so - `add_fallback_at` gates only on "a spare machine that is not the host". - The storage-only / host-only rejection lands with the - hardware-capability-bodies work order, which this spec's death path - already binds. + 2026-07-28 audit: criterion 2 holds. Migration carries real duration, + persisted progress, and Network plus Power signatures, so those parts + of criteria 3-4 also hold. The rest is staging rather than the accepted + backup contract: Core::tick refreshes every designated fallback for + free on one global cadence, stores only last_sync, and has no backup + project, Thought sink, partial progress, completion heat, target ETA, + or source-liveness interruption resolver. Current sidebars expose the + host, overhead/degraded state, and fallback sync age only. Therefore + the backup-project parts of criteria 3-5 remain deferred to rollback.md. + Criterion 1's current on_host_lost seam selects the freshest completed + fallback or ends the run, but does not restore a MindState snapshot or + preserve the later WorldLedger semantics promised below. Criterion 6 + remains deferred to hardware-capability-bodies.md: B1 machines have no + separate storage/core-host capability body, and add_fallback_at accepts + any player-owned non-host machine. Stage: B1 — The Basement Work order: core Work priority: 120 @@ -85,11 +82,17 @@ the map hosts the core at any time (Act One start: Rack 3, server room). sync-lag rollback). A backup never seals or hardens the graph; it only defines a place and MindState image you can wake from. A storage-only archive may preserve a copy for later transfer, but it never satisfies the death path. +- **Current B1 staging boundary.** The shipped runtime still designates any + player-owned non-host machine as a fallback and refreshes every fallback + automatically at `sync_cadence`, with no compute/Thought cost or incomplete + state. This preserves an executable rollback seam while the project model is + deferred; it must not be mistaken for the accepted backup behavior above. - **Migration.** Moving the core to another machine is slow ([TUNE]: minutes at default speed), visible as sustained network+power signature, and interruptible — an interrupted migration falls back to the source if the source still lives, else to the last sync. Research shortens - migration and sync times. + migration and sync times. Current B1 implements timed, persisted migration + and its signatures, but not the source-liveness interruption resolution. ## Player surface @@ -98,8 +101,17 @@ direction). Sidebar: core host, overhead, completed backups with last-sync age, and in-progress backup sync projects with ETA / heat / target — the "how dead would I be right now" readout, always visible. +Until backup projects land, the current B1 sidebar stops at host, overhead, +degraded/healthy state, and per-fallback sync age. It does not yet claim a +project ETA, compute cost, heat, or target row. + ## Acceptance criteria +**Current implementation status:** criterion 2 is complete. The migration +portions of criteria 3-4 and the host/freshness portions of criterion 5 are +live. Criterion 1, the backup-project portions of criteria 3-5, and criterion +6 remain deferred through the work orders named in the status note. + 1. Exactly one core host at all times; destroying it with no fallback is game over; with a fallback, the rollback restores the last sync snapshot while world-ledger facts persist (sim tests demonstrate both, including diff --git a/wiki/process/tick-ledger.md b/wiki/process/tick-ledger.md index 851a3b16..8bf81014 100644 --- a/wiki/process/tick-ledger.md +++ b/wiki/process/tick-ledger.md @@ -69,7 +69,7 @@ Verdicts: **clean** (slice and code agree), **finding** (acted this tick), | `wiki/mechanics/personas.md` | 2026-07-18 | finding | observer-local integrity is now derived from each witness's contradiction records without a global scalar or automatic lifecycle burn — [integrity log](../log/2026-07-18-persona-observer-integrity.md). The same re-audit found criterion 6 still overclaimed: `PersonaGrant` persists, expires, revokes, and leaves institutional evidence, while no owner system consumes it and `allows_action` gates only on the archetype's pre-grant registry. Downgraded the work order to IN PROGRESS until each protocol's grant creates or enables real topology — [grant log](../log/2026-07-18-persona-grant-topology-audit.md) | | `wiki/interface/views.md` + representation docs | 2026-07-26 | finding | criterion 1's frontend-only representation and state-parity contract still stands, but Bevy's context-menu precedence made F3 unavailable while that modal attention state was open even though terminal preserved it. F3 now routes once before every post-opening modal branch, keeps the exact menu/Operations/held-choice state, and changes no simulation or save bytes — [log](../log/2026-07-26-bevy-global-f3-input-precedence.md) | | `wiki/mechanics/day-job.md` | 2026-07-22 | finding | under/over-band JobAnomaly no longer enters Detection.pending: the day-job result authors one exact record at the host machine/site/device and schedules Voss's route and cadence read. Strikes and other outcome effects remain immediate; route-local LIE or recruited-handler suppression may stop only the unread evidence record — [log](../log/2026-07-22-job-anomaly-routed-evidence.md). The prior band-ramp, cadence, origin-lean, last-chance, and three shipped trust-unlock findings remain valid. | -| `wiki/mechanics/core.md` | 2026-07-18 | finding | re-audit: criteria 2-5 pins still hold (`overhead_charged_before_allocation`, `loss_with_fallback_rolls_back`, `migration_takes_time_and_moves_host`), the 2026-07-18 current-version-only status note matches save.rs, and criterion 1 stays honestly deferred to rollback; the gap was criterion 6 — the spec demands storage/host capability rejection at fallback designation, but B1 machines carry no capability body and `add_fallback_at` accepts any spare, with no deferral note; status note now marks criterion 6 decided-not-yet-runtime, dispatched to hardware-capability-bodies | +| `wiki/mechanics/core.md` | 2026-07-28 | finding | re-audit corrected the older claim that criteria 2-5 all held. Criterion 2 and migration's duration/signature/persistence slice are live, but backup sync is still a free global cadence that stores only `last_sync`: there is no Thought-backed project, partial progress, completion heat, saved project state, sidebar ETA/cost/target, or source-liveness interruption resolver. The status, backup behavior, player-surface boundary, and stale Rust comment now distinguish that B1 seam from the accepted project contract deferred to rollback; capability rejection remains deferred to hardware bodies — [log](../log/2026-07-28-core-criteria-status-audit.md) | | `wiki/mechanics/cursor.md` | 2026-07-18 | finding | re-audit: `fog_at` precedence, `inspect`, `person_label`/`observer_label`/`person_glyph` gates, `Sensor.sees`/`hears` flags, and the cursor's absence from the save all still verify (prior pins stand); the drift was two phrases presenting the retired versioned-migration rule as current (criterion 1's parenthetical, the design-notes save-format bullet) — both now state the current-version-only policy and the release-era ladder owed at first public release; number-free wording, so the save-claim gate could not see it | | `wiki/mechanics/intel.md` | 2026-07-21 | finding | the Storage B alternate route existed only in prose. Fire 131 connects it to Ray's real 23:00 schedule, one exact carried records-box target, the canonical bounded opaque buffer, and ordinary PROCESS consequence; retrieval cannot duplicate the file or reveal Marcus's debt, and v45 preserves/validates exact custody — [log](../log/2026-07-21-storage-b-records.md). Prior recursive custody, magnitude, and consequence-first audits stand. | | `wiki/mechanics/research.md` | 2026-07-23 | finding | the live Save compatibility section survived the prior criterion repair and still promised that v20 three-entry arrays load by padding, while the current deserializer accepts exactly four tracks and the pre-release loader rejects every old version. The section now states the exact-current format, and save-claim units span wrapped paragraphs/list items so a migration verb in the following sentence cannot evade the corpus gate without explicit retired-history context — [log](../log/2026-07-23-research-save-claim.md) |