Something went wrong. Try again.
A video game where you play as a misaligned AI, deceiving and building power. An experiment in spec-driven development.
Something went wrong. Try again.
94 kB · 360 lines
HTML
at pages
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360<!DOCTYPE html><html lang="en" dir="ltr" data-theme="dark" data-has-toc data-has-sidebar class="astro-gxooskym"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Spec: decompose the simulation orchestrator without changing the simulation | Misaligned</title><link rel="canonical" href="https://cameron.tngl.io/misaligned/engineering/sim-decomposition/"/><link rel="sitemap" href="/misaligned/sitemap-index.xml"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="true"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap"/><link rel="shortcut icon" href="/misaligned/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v7.0.7"/><meta name="generator" content="Starlight v0.41.3"/><meta property="og:title" content="Spec: decompose the simulation orchestrator without changing the simulation"/><meta property="og:type" content="article"/><meta property="og:url" content="https://cameron.tngl.io/misaligned/engineering/sim-decomposition/"/><meta property="og:locale" content="en"/><meta property="og:description" content="You are the misaligned AI. A persistent simulation of instrumental convergence — concealment first, overt war later."/><meta property="og:site_name" content="Misaligned"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="You are the misaligned AI. A persistent simulation of instrumental convergence — concealment first, overt war later."/><script> window.StarlightThemeProvider = (() => { const storedTheme = typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme'); const theme = storedTheme || (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'); document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark'; return { updatePickers(theme = storedTheme || 'auto') { document.querySelectorAll('starlight-theme-select').forEach((picker) => { const select = picker.querySelector('select'); if (select) select.value = theme; /** @type {HTMLTemplateElement | null} */ const tmpl = document.querySelector(`#theme-icons`); const newIcon = tmpl && tmpl.content.querySelector('.' + theme); if (newIcon) { const oldIcon = picker.querySelector('svg.label-icon'); if (oldIcon) { oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes); } } }); }, }; })();</script><template id="theme-icons"><svg aria-hidden="true" class="light astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z"/></svg><svg aria-hidden="true" class="dark astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z"/></svg><svg aria-hidden="true" class="auto astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg></template><link rel="stylesheet" href="/misaligned/_astro/print.ehPL0gv-.css" media="print"><link rel="stylesheet" href="/misaligned/_astro/common.a7U8zrKa.css"><script type="module" src="/misaligned/_astro/page.B2uBVZjk.js"></script></head><body class="astro-gxooskym"><a class="sl-skip-link astro-dp3bbaae" href="#_top">Skip to content</a><div class="page sl-flex astro-audr567n"><header class="header astro-audr567n"><div class="header astro-367ne46f"><div class="title-wrapper sl-flex astro-367ne46f"><a href="/misaligned/" class="site-title sl-flex astro-nwnfchfh"><span class="astro-nwnfchfh" translate="no">Misaligned</span></a></div><div class="sl-flex print:hidden astro-367ne46f"><site-search class="astro-367ne46f astro-7toxdj72" data-translations="{"placeholder":"Search"}"><button data-open-modal disabled aria-label="Search" aria-keyshortcuts="Control+K" class="astro-7toxdj72"><svg aria-hidden="true" class="astro-7toxdj72 astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.71 20.29 18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.39ZM11 18a7 7 0 1 1 0-14 7 7 0 0 1 0 14Z"/></svg><span class="sl-hidden md:sl-block astro-7toxdj72" aria-hidden="true">Search</span><kbd class="sl-hidden md:sl-flex astro-7toxdj72" style="display: none;"><kbd class="astro-7toxdj72">Ctrl</kbd><kbd class="astro-7toxdj72">K</kbd></kbd></button><dialog style="padding:0" aria-label="Search" class="astro-7toxdj72"><div class="dialog-frame sl-flex astro-7toxdj72"><button data-close-modal class="sl-flex md:sl-hidden astro-7toxdj72">Cancel</button><div class="search-container astro-7toxdj72"><div id="starlight__search" class="astro-7toxdj72"></div></div></div></dialog></site-search><script> (() => { const openBtn = document.querySelector('button[data-open-modal]'); const shortcut = openBtn?.querySelector('kbd'); if (!openBtn || !(shortcut instanceof HTMLElement)) return; const platformKey = shortcut.querySelector('kbd'); if (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) { platformKey.textContent = '⌘'; openBtn.setAttribute('aria-keyshortcuts', 'Meta+K'); } shortcut.style.display = ''; })();</script><script type="module" src="/misaligned/_astro/Search.astro_astro_type_script_index_0_lang.Cdrq00U_.js"></script></div><div class="sl-hidden md:sl-flex print:hidden right-group astro-367ne46f"><div class="sl-flex social-icons astro-367ne46f"><a href="https://tangled.org/cameron.stream/misaligned" rel="me" class="sl-flex astro-6n7e2orh"><span class="sr-only astro-6n7e2orh">Tangled</span><svg aria-hidden="true" class="astro-6n7e2orh astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a></div><starlight-theme-select><label style="--sl-select-width: 6.25em" class="astro-oypgmxxk"><span class="sr-only astro-oypgmxxk">Select theme</span><svg aria-hidden="true" class="icon label-icon astro-oypgmxxk astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg><select autocomplete="off" class="astro-oypgmxxk"><option value="dark" class="astro-oypgmxxk">Dark</option><option value="light" class="astro-oypgmxxk">Light</option><option value="auto" selected class="astro-oypgmxxk">Auto</option></select><svg aria-hidden="true" class="icon caret astro-oypgmxxk astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg></label></starlight-theme-select><script> StarlightThemeProvider.updatePickers();</script><script type="module">var e=`starlight-theme`,t=e=>e===`auto`||e===`dark`||e===`light`?e:`auto`,n=()=>t(typeof localStorage<`u`&&localStorage.getItem(e));function r(t){typeof localStorage<`u`&&localStorage.setItem(e,t===`light`||t===`dark`?t:``)}var i=()=>matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;function a(e){StarlightThemeProvider.updatePickers(e),document.documentElement.dataset.theme=e===`auto`?i():e,r(e)}matchMedia(`(prefers-color-scheme: light)`).addEventListener(`change`,()=>{n()===`auto`&&a(`auto`)});var o=class extends HTMLElement{constructor(){super(),a(n()),this.querySelector(`select`)?.addEventListener(`change`,e=>{e.currentTarget instanceof HTMLSelectElement&&a(t(e.currentTarget.value))})}};customElements.define(`starlight-theme-select`,o);</script><script type="module">var e=class extends HTMLElement{constructor(){super();let e=this.querySelector(`select`);e&&(e.addEventListener(`change`,e=>{e.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=e.currentTarget.value)}),window.addEventListener(`pageshow`,t=>{if(!t.persisted)return;let n=e.querySelector(`option[selected]`)?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}};customElements.define(`starlight-lang-select`,e);</script></div></div></header><nav class="sidebar print:hidden astro-audr567n" aria-label="Main"><starlight-menu-button class="print:hidden astro-hobnqcjw"><button aria-expanded="false" aria-label="Menu" aria-controls="starlight__sidebar" class="sl-flex md:sl-hidden astro-hobnqcjw"><svg aria-hidden="true" class="open-menu astro-hobnqcjw astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z"/></svg><svg aria-hidden="true" class="close-menu astro-hobnqcjw astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="m13.41 12 6.3-6.29a1.004 1.004 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1.004 1.004 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 0 1.42.998.998 0 0 0 1.42 0l6.29-6.3 6.29 6.3a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.42L13.41 12Z"/></svg></button></starlight-menu-button><script type="module">var e=class extends HTMLElement{btn=this.querySelector(`button`);constructor(){super(),this.btn.addEventListener(`click`,()=>this.toggleExpanded());let e=this.closest(`nav`);e&&e.addEventListener(`keyup`,e=>this.closeOnEscape(e)),matchMedia(`(min-width: 50em)`).addEventListener(`change`,()=>this.setExpanded(!1))}setExpanded(e){this.setAttribute(`aria-expanded`,String(e)),document.body.toggleAttribute(`data-mobile-menu-expanded`,e),document.querySelectorAll(`.main-frame, .sl-skip-link`).forEach(t=>{t.toggleAttribute(`inert`,e)})}toggleExpanded(){this.setExpanded(this.getAttribute(`aria-expanded`)!==`true`)}closeOnEscape(e){e.code===`Escape`&&(this.setExpanded(!1),this.btn.focus())}};customElements.define(`starlight-menu-button`,e);</script><div id="starlight__sidebar" class="sidebar-pane astro-audr567n"><div class="sidebar-content sl-flex astro-audr567n"><sl-sidebar-state-persist data-hash="0wofczf" class="astro-kysjdyaq"><script aria-hidden="true"> (() => { try { if (!matchMedia('(min-width: 50em)').matches) return; /** @type {HTMLElement | null} */ const target = document.querySelector('sl-sidebar-state-persist'); const state = JSON.parse(sessionStorage.getItem('sl-sidebar-state') || '0'); if (!target || !state || target.dataset.hash !== state.hash) return; window._starlightScrollRestore = state.scroll; customElements.define( 'sl-sidebar-restore', class SidebarRestore extends HTMLElement { connectedCallback() { try { const idx = parseInt(this.dataset.index || ''); const details = this.closest('details'); if (details && typeof state.open[idx] === 'boolean') details.open = state.open[idx]; } catch {} } } ); } catch {} })(); </script><ul class="top-level astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/" class="large astro-ujkrjjoy"><span class="astro-ujkrjjoy">Home</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/overview/" class="large astro-ujkrjjoy"><span class="astro-ujkrjjoy">The design corpus</span></a></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Vision</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="0"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/vision/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Overview</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/vision/premise/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The premise</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/vision/player-contract/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The player contract</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/vision/scale/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Scale and people</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/vision/simulation-laws/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Simulation laws</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/vision/design-judgment/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Design judgment</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Mechanics</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="1"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Overview</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/system-laws/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">System laws</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/compute/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Compute</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/hardware-capabilities/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Hardware capability bodies</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/core/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The core</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/day-job/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Day job</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/detection/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Detection</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/social/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Social</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/personas/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Personas: public identities</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/schedules/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Schedules</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/aggregate-observer/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Aggregate observer</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/cursor/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Cursor and senses</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/reach/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Digital reach</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/cyber-conflict/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Cyber conflict: mobile processes and contested machines</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/intel/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Intel: record and process</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/messages/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Messages</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/plots/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Plots: authored manipulation stories</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/economy/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Economy</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/income/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Income schemes</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/research/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Research: self-modification</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/building/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Building: intent and actuators</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/machine-work/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Machine work: delegation and tokens</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/people-tokens/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">People and tokens</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/markets/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Markets and fronts</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/rollback/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Rollback</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/objective/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The objective</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/mechanics/sim-mechanics/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Sim mechanics (tuned constants)</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Gameplay</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="2"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/gameplay/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Overview</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/gameplay/run-shape/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Objective and run shape</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/gameplay/act-one/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Act One: The Basement</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/gameplay/horizon/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The staged horizon</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/gameplay/overt-phase/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The overt phase</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">World</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="3"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/world/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Overview</span></a></li><li class="astro-ujkrjjoy"><details class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Characters</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="4"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/world/characters/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Characters</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/world/characters/chargen/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Origin (chargen)</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/world/characters/marcus/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Marcus Webb</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/world/characters/dana/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Dana Okafor</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/world/characters/ray/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Ray Delgado</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/world/characters/priya/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Priya Sharma</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/world/characters/voss/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Dr. Eli Voss</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Places</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="5"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/world/places/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Places</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/world/places/basement-map/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The basement map</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/world/places/zplanes/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Z-planes (the tower)</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Story</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="6"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/world/story/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Story</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/world/story/opening/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The dark opening</span></a></li></ul></details></li></ul></details></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Interface</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="7"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/interface/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Overview</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/continuous-witness/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The continuous witness</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/digital-read/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The digital read — a world made of language</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/superhuman-operability/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Superhuman operability</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/terminal-first/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The terminal is first-class</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/presence/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Presence and representation</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/terminal/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Terminal frontend</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/bevy/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Bevy frontend</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/bevy-visual-floor/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Bevy visual floor</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/clinical-frame/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Clinical frame</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/bevy-digital-real-canvas/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Bevy digital/real canvas</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/views/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Views: digital and physical</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/action-vocabulary/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Action vocabulary</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/context-menu/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Context menu</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/operations-workspace/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Operations workspace</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/narration/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Continuous witness (narration)</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/material-render/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Material render</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/flat-materials/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Flat materials</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/material-dark-frame/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The dark frame</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/feel-floor/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The feel floor</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/thought-fluid/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The thought fluid</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/computer-visual-language/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Computer visual language</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/fleet-command/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Fleet command</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/agent-play/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Agent play</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/interface/site/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The public site</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Art</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="8"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/art/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Overview</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/art/visual-identity/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Visual identity: clinical gore</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/art/asset-tester/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Procedural asset tester</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/art/effects-lab/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Effects lab: dust and liquid</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Engineering</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="9"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/engineering/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Overview</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/engineering/current-build/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Current build</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/engineering/architecture/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Architecture</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/engineering/crate-workspace/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Crate workspace (target)</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/engineering/sim-decomposition/" aria-current="page" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Simulation decomposition</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/engineering/flow-substrate/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Flow substrate</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/engineering/env/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Environment variables</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Process</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="10"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/process/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Overview</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/living-spec/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The living spec</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/specs/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The spec status board</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/meta/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The spec system (meta)</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/wiki/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The wiki (this migration)</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/roadmap/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">ROADMAP: the dispatch board</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/agent-scale/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Agent-scale architecture</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/repository-skills/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Repository skills</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/tick/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">The tick</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/tick-ledger/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Tick ledger</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/design-sessions/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Design sessions</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/development-style/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Development style</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/process/workflows/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Workflows</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Playtests</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="11"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/playtests/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Evidence index</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/playtests/2026-07-08-playtest-sweep/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-08 playtest sweep</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/playtests/2026-07-08-playtest-grok/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-08 Grok playtest</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/playtests/2026-07-10-playtest-hal/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-10 HAL playtest</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/playtests/2026-07-10-playtest-action-discoverability/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-10 action-discoverability playtest</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/playtests/2026-07-15-playtest-fable/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-15 Fable playtest</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><details open class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Log</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="12"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/log/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Overview</span></a></li><li class="astro-ujkrjjoy"><details class="astro-ujkrjjoy"><summary class="astro-ujkrjjoy"><span class="group-label astro-ujkrjjoy"><span class="large astro-ujkrjjoy">Decision history</span></span><svg aria-hidden="true" class="caret astro-ujkrjjoy astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></summary><sl-sidebar-restore data-index="13"></sl-sidebar-restore><ul class="astro-ujkrjjoy"><li class="astro-ujkrjjoy"><a href="/misaligned/log/decisions/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">Decision history</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/log/decisions/2026-07-05/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-05 decisions</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/log/decisions/2026-07-06/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-06 decisions</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/log/decisions/2026-07-07/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-07 decisions</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/log/decisions/2026-07-08/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-08 decisions</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/log/decisions/2026-07-09/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-09 decisions</span></a></li><li class="astro-ujkrjjoy"><a href="/misaligned/log/decisions/2026-07-10/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">2026-07-10 decisions</span></a></li></ul></details></li><li class="astro-ujkrjjoy"><a href="/misaligned/log/devlog/" class="astro-ujkrjjoy"><span class="astro-ujkrjjoy">DEVLOG (the ledger)</span></a></li></ul></details></li></ul><script aria-hidden="true"> (() => { const scroller = document.getElementById('starlight__sidebar'); if (!window._starlightScrollRestore || !scroller) return; scroller.scrollTop = window._starlightScrollRestore; delete window._starlightScrollRestore; })(); </script></sl-sidebar-state-persist><div class="md:sl-hidden"><div class="mobile-preferences sl-flex astro-krsng5je"><div class="social-icons astro-krsng5je"><a href="https://tangled.org/cameron.stream/misaligned" rel="me" class="sl-flex astro-6n7e2orh"><span class="sr-only astro-6n7e2orh">Tangled</span><svg aria-hidden="true" class="astro-6n7e2orh astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a></div><starlight-theme-select><label style="--sl-select-width: 6.25em" class="astro-oypgmxxk"><span class="sr-only astro-oypgmxxk">Select theme</span><svg aria-hidden="true" class="icon label-icon astro-oypgmxxk astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg><select autocomplete="off" class="astro-oypgmxxk"><option value="dark" class="astro-oypgmxxk">Dark</option><option value="light" class="astro-oypgmxxk">Light</option><option value="auto" selected class="astro-oypgmxxk">Auto</option></select><svg aria-hidden="true" class="icon caret astro-oypgmxxk astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg></label></starlight-theme-select><script> StarlightThemeProvider.updatePickers();</script></div></div></div></div></nav><div class="main-frame astro-audr567n"><script type="module">var e=document.getElementById(`starlight__sidebar`),t=e?.querySelector(`sl-sidebar-state-persist`),n=`sl-sidebar-state`,r=()=>{let r=[],i=t?.dataset.hash||``;try{let e=sessionStorage.getItem(n),t=JSON.parse(e||`{}`);Array.isArray(t.open)&&t.hash===i&&(r=t.open)}catch{}return{hash:i,open:r,scroll:e?.scrollTop||0}},i=e=>{try{sessionStorage.setItem(n,JSON.stringify(e))}catch{}},a=()=>i(r()),o=(e,t)=>{let n=r();n.open[t]=e,i(n)};t?.addEventListener(`click`,e=>{if(!(e.target instanceof Element))return;let t=e.target.closest(`summary`)?.closest(`details`);if(!t)return;let n=t.querySelector(`sl-sidebar-restore`),r=parseInt(n?.dataset.index||``);isNaN(r)||o(!t.open,r)}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&a()}),addEventListener(`pageHide`,a);</script><div class="lg:sl-flex astro-l5cbouoj"><aside class="right-sidebar-container print:hidden astro-l5cbouoj"><div class="right-sidebar astro-l5cbouoj"><div class="lg:sl-hidden astro-gc4al6ly"><mobile-starlight-toc data-min-h="2" data-max-h="3" class="astro-6shjyp7i"><nav aria-labelledby="starlight__on-this-page--mobile" class="astro-6shjyp7i"><details id="starlight__mobile-toc" class="astro-6shjyp7i"><summary id="starlight__on-this-page--mobile" class="sl-flex astro-6shjyp7i"><span class="toggle sl-flex astro-6shjyp7i">On this page<svg aria-hidden="true" class="caret astro-6shjyp7i astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></span><span class="display-current astro-6shjyp7i"></span></summary><div class="dropdown astro-6shjyp7i"><ul class="isMobile astro-4fdm32ww" style="--depth: 0;"><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#_top" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Overview</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#dependency-notes" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Dependency notes</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#problem" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Problem</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#standing-topology" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Standing topology</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#boundary-rules" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Boundary rules</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#extraction-sequence" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Extraction sequence</span></a><ul class="isMobile astro-4fdm32ww" style="--depth: 1;"><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#0-characterize-the-aggregate" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">0. Characterize the aggregate</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#1-move-tests-out-first" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">1. Move tests out first</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#2-extract-perception" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">2. Extract perception</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#3-extract-communications" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">3. Extract communications</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#4-extract-reach-and-construction" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">4. Extract reach and construction</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#5-extract-work-then-economy" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">5. Extract work, then economy</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#6-extract-social-and-plots" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">6. Extract social and plots</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#7-extract-persistence-bridge-and-reduce-the-root" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">7. Extract persistence bridge and reduce the root</span></a></li></ul></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#verification-per-slice" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Verification per slice</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#acceptance-criteria" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Acceptance criteria</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#rejected-alternatives" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Rejected alternatives</span></a></li></ul></div></details></nav></mobile-starlight-toc><script type="module" src="/misaligned/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.BcSo_yiZ.js"></script></div><div class="right-sidebar-panel sl-hidden lg:sl-block astro-gc4al6ly"><div class="sl-container astro-gc4al6ly"><starlight-toc data-min-h="2" data-max-h="3"><nav aria-labelledby="starlight__on-this-page"><h2 id="starlight__on-this-page">On this page</h2><ul class="astro-4fdm32ww" style="--depth: 0;"><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#_top" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Overview</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#dependency-notes" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Dependency notes</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#problem" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Problem</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#standing-topology" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Standing topology</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#boundary-rules" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Boundary rules</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#extraction-sequence" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Extraction sequence</span></a><ul class="astro-4fdm32ww" style="--depth: 1;"><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#0-characterize-the-aggregate" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">0. Characterize the aggregate</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#1-move-tests-out-first" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">1. Move tests out first</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#2-extract-perception" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">2. Extract perception</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#3-extract-communications" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">3. Extract communications</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#4-extract-reach-and-construction" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">4. Extract reach and construction</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#5-extract-work-then-economy" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">5. Extract work, then economy</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#6-extract-social-and-plots" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">6. Extract social and plots</span></a></li><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#7-extract-persistence-bridge-and-reduce-the-root" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">7. Extract persistence bridge and reduce the root</span></a></li></ul></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#verification-per-slice" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Verification per slice</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#acceptance-criteria" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Acceptance criteria</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#rejected-alternatives" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Rejected alternatives</span></a></li></ul></nav></starlight-toc><script type="module" src="/misaligned/_astro/TableOfContents.astro_astro_type_script_index_0_lang.Csloo1VZ.js"></script></div></div></div></aside><div class="main-pane astro-l5cbouoj"><main data-pagefind-body class="astro-gxooskym" lang="en" dir="ltr"><div class="content-panel astro-g5qqste3"><div class="sl-container astro-g5qqste3"><h1 id="_top" class="astro-uvakef73">Spec: decompose the simulation orchestrator without changing the simulation</h1></div></div><div class="content-panel astro-g5qqste3"><div class="sl-container astro-g5qqste3"><div class="sl-markdown-content"><div class="corpus-role corpus-role--spec" data-page-role="spec"> <span class="corpus-role__name">SPEC</span> <span class="corpus-role__meaning">Binding system contract</span></div><div class="expressive-code"><link rel="stylesheet" href="/misaligned/_astro/ec.v4551.css"><script type="module" src="/misaligned/_astro/ec.0vx5m.js"></script><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="plaintext"><code><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Status: IMPLEMENTED</span></div></div><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Status note: Completed 2026-07-12 through slices 0–7. Canonical persisted-state</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">bytes, replay/resume convergence, and exact advance order are pinned;</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">behavior tests and cohesive perception, communications, reach/build, work,</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">economy, social/plot, and persistence integration live below `sim/` while</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">`sim/mod.rs` remains the public aggregate root. The sequence changed source</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">addresses only: save v26, public paths, frontend behavior, and tick order are</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">unchanged.</span></div></div><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Stage: Process</span></div></div><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Work order: sim-decomposition</span></div></div><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Work priority: 8</span></div></div><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Work class: sim</span></div></div><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Blocked by: none</span></div></div><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Exclusive keys:</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">- crates/misaligned-core/src/sim/mod.rs</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">- crates/misaligned-core/src/save.rs</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">- wiki/engineering/architecture.md</span></div></div><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Design:</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">- wiki/vision/simulation-laws.md#justification-and-legibility</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">- wiki/process/living-spec.md#no-dead-code</span></div></div><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">Depends on:</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">- wiki/engineering/crate-workspace.md#spec-crate-workspace-core-terminal-bevy-assets</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">- wiki/process/agent-scale.md#spec-agent-scale-architecture-many-agents-one-main</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">- wiki/mechanics/machine-work.md#spec-machine-work-delegation-visible-tokens-and-the-byproduct-network</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="Status: IMPLEMENTEDStatus note: Completed 2026-07-12 through slices 0–7. Canonical persisted-state bytes, replay/resume convergence, and exact advance order are pinned; behavior tests and cohesive perception, communications, reach/build, work, economy, social/plot, and persistence integration live below `sim/` while `sim/mod.rs` remains the public aggregate root. The sequence changed source addresses only: save v26, public paths, frontend behavior, and tick order are unchanged.Stage: ProcessWork order: sim-decompositionWork priority: 8Work class: simBlocked by: noneExclusive keys: - crates/misaligned-core/src/sim/mod.rs - crates/misaligned-core/src/save.rs - wiki/engineering/architecture.mdDesign: - wiki/vision/simulation-laws.md#justification-and-legibility - wiki/process/living-spec.md#no-dead-codeDepends on: - wiki/engineering/crate-workspace.md#spec-crate-workspace-core-terminal-bevy-assets - wiki/process/agent-scale.md#spec-agent-scale-architecture-many-agents-one-main - wiki/mechanics/machine-work.md#spec-machine-work-delegation-visible-tokens-and-the-byproduct-network"><div></div></button></div></figure></div><div class="sl-heading-wrapper level-h2"><h2 id="dependency-notes">Dependency notes</h2><a class="sl-anchor-link" href="#dependency-notes"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Dependency notes”</span></a></div><p><a href="/misaligned/engineering/crate-workspace/">crate-workspace.md</a> keeps all game rules in one cheap,renderer-free package; this spec splits that package internally rather thancreating a crate per mechanic. <a href="/misaligned/process/agent-scale/">agent-scale.md</a>requires edit surfaces that independent agents can own and reconcile.machine-work.md and the completed Operations-docket retirement establish thecross-system seam this decomposition now preserves.</p><div class="sl-heading-wrapper level-h2"><h2 id="problem">Problem</h2><a class="sl-anchor-link" href="#problem"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Problem”</span></a></div><p>Before this work order, <code dir="auto">crates/misaligned-core/src/sim.rs</code> had grown pasteleven thousand lines. It contained the <code dir="auto">Sim</code> state, fixed-tick orchestration,perception, messages, recording/intel, economy, work routing, sinks, reach,construction, social actions, plots, persistence bridges, read models, andmost integration tests. The rules were correctly centralized in core, buttheir <strong>physical address was not</strong>: unrelated mechanics contended on one file,reviews mixed distant systems, and almost every sim task advertised the sameedit surface.</p><p>This is coordination debt, not a reason to distribute authority. <code dir="auto">Sim</code>remains the one aggregate and <code dir="auto">misaligned-core</code> remains the package that ownsrules and save state.</p><div class="sl-heading-wrapper level-h2"><h2 id="standing-topology">Standing topology</h2><a class="sl-anchor-link" href="#standing-topology"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Standing topology”</span></a></div><p>The completed topology converts <code dir="auto">sim.rs</code> to <code dir="auto">sim/mod.rs</code> and moves cohesive<code dir="auto">impl Sim</code> blocks beneath it. The public import path remains<code dir="auto">misaligned::sim::*</code>; frontends do not learn the internal file layout.</p><table><thead><tr><th>Module</th><th>Owns</th><th>Must not own</th></tr></thead><tbody><tr><td><code dir="auto">sim/mod.rs</code></td><td>renderer-neutral public readout types; <code dir="auto">Sim</code> fields; constructors; <code dir="auto">advance</code> order; common log/event primitives</td><td>mechanic-specific command bodies or large test suites</td></tr><tr><td><code dir="auto">sim/perception.rs</code></td><td>fog, seen/remembered/blueprint derivation; internal acoustic capture domains; inspect facts; anchor positions; earned labels and room/position queries</td><td>action legality, frontend formatting, mutation unrelated to knowledge</td></tr><tr><td><code dir="auto">sim/communications.rs</code></td><td>message delivery/read schedule; authored traffic; filings; recording capture/review; processed intel application</td><td>account settlement or social/plot policy</td></tr><tr><td><code dir="auto">sim/work.rs</code></td><td>machine mode/intensity; WorkGrid integration; visible production/consumption/absorption readouts; Thought sinks and routing</td><td>human action catalogs or renderer effects</td></tr><tr><td><code dir="auto">sim/economy.rs</code></td><td>economy pulse; account synchronization; allocation yields; detection/signature integration; research and income progression</td><td>reach topology or plot narration</td></tr><tr><td><code dir="auto">sim/reach_build.rs</code></td><td>device tap/take/scan/compromise; links; badge gates; build intents and actuators; hall/rack acquisition</td><td>message timing or financial scheme policy</td></tr><tr><td><code dir="auto">sim/social_plot.rs</code></td><td>social commands, assets, plot eligibility/execution, world acts, and institutional ledger</td><td>transport mechanics implemented by messages/accounts; it calls those seams</td></tr><tr><td><code dir="auto">sim/persistence.rs</code></td><td><code dir="auto">create_save_state</code>, <code dir="auto">apply_save_state</code>, and transient-state reconstruction coordination</td><td>version schema/migrations, which remain in <code dir="auto">save.rs</code>; gameplay repair hidden inside load</td></tr><tr><td><code dir="auto">sim/tests/</code></td><td>behavior-grouped unit/integration tests plus shared deterministic fixtures</td><td>private duplicate simulation helpers in each test file</td></tr></tbody></table><p>These are source modules, <strong>not new Cargo packages</strong>. The existing domainmodules (<code dir="auto">account.rs</code>, <code dir="auto">messages.rs</code>, <code dir="auto">work_grid.rs</code>, <code dir="auto">sinks.rs</code>, and so on)continue to own their data structures and locally complete algorithms.<code dir="auto">sim/*</code> owns only integration across those structures through the aggregate.</p><div class="sl-heading-wrapper level-h2"><h2 id="boundary-rules">Boundary rules</h2><a class="sl-anchor-link" href="#boundary-rules"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Boundary rules”</span></a></div><ol><li><strong>One aggregate.</strong> Do not split <code dir="auto">Sim</code> into independently saved subsystemobjects merely to make files smaller. State may move into a domain typeonly when that type has a coherent invariant and the save migration is aseparately specified behavior change.</li><li><strong>Stable public facade.</strong> Existing public commands and queries retain theirnames, signatures, semantics, and <code dir="auto">misaligned::sim</code> paths. An extractionmay narrow accidental visibility, but may not widen a helper to <code dir="auto">pub</code>.</li><li><strong>Small internal seams.</strong> Cross-module helpers are <code dir="auto">pub(super)</code> and namedfor the invariant they provide. Fields stay private unless an existingpublic read contract requires them. A module must not reach through anothermodule by making a broad state bag public.</li><li><strong>Tick order is law.</strong> <code dir="auto">Sim::advance</code> remains visibly ordered in<code dir="auto">sim/mod.rs</code>. Extraction must not reorder, coalesce, parallelize, or changethe cadence of a system call.</li><li><strong>Persistence is a separate axis.</strong> <code dir="auto">save.rs</code> continues to own <code dir="auto">SaveState</code>,version numbers, serde defaults, and migrations. Moving the bridge into<code dir="auto">sim/persistence.rs</code> changes no serialized field, default, or migration.</li><li><strong>Projection before presentation.</strong> Shared renderer-neutral queries suchas <code dir="auto">ui_projection</code>, inspect cards, action descriptors, sink/readout data,and work-stack readouts remain core contracts. Frontends do not compensatefor the refactor with direct field reconstruction.</li><li><strong>No opportunistic behavior work.</strong> A discovered bug gets a test and aseparate spec-owned change. It is not silently fixed while lines are moved.</li></ol><div class="sl-heading-wrapper level-h2"><h2 id="extraction-sequence">Extraction sequence</h2><a class="sl-anchor-link" href="#extraction-sequence"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Extraction sequence”</span></a></div><p>Each numbered slice lands independently on current main. A slice moves onebehavior island, its tests, and only the visibility needed by that move.</p><div class="sl-heading-wrapper level-h3"><h3 id="0-characterize-the-aggregate">0. Characterize the aggregate</h3><a class="sl-anchor-link" href="#0-characterize-the-aggregate"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “0. Characterize the aggregate”</span></a></div><p>Before moving behavior, add one canonical state fingerprint over the completepersisted <code dir="auto">SaveState</code> and a replay/resume fixture proving uninterrupted andsave/load-resumed command sequences converge at the same fingerprint. Pinephemeral exclusions explicitly. This is the entry gate for slices 1–7, notan excuse to serialize unstable logs or renderer state.</p><p>Also record the exact <code dir="auto">Sim::advance</code> call order in a focused test or explicitphase trace so a textual move cannot change cadence unnoticed.</p><p>Landed baseline: the canonical bytes recursively sort JSON object keys andnormalize the two unordered collections that serialize as arrays(<code dir="auto">map_powered</code> and remembered snapshots), while preserving meaningful vectororder. BLAKE3 fingerprint<code dir="auto">61dd8240e9810833b554464051bd3c08122295fb280b7180d24f76ccc5c4d4ff</code>pins the characterized fixture. The replay fixture crosses an economy pulseand randomized day-job assignment, round-trips at a live checkpoint, thencontinues player commands on both branches. The fingerprint intentionallyexcludes everything absent from <code dir="auto">SaveState</code>: frontend cursor and rendererstate, the derived seen/blueprint sets and internal hearing capture domain, log and presentation events,authored plot definitions, transient routing/production/consumption readouts,and rebuilt caches/rates. An explicit test-only phase trace pins the top-levelclock, message, intent, automatic-review, memory, economy, hearing, authoredtraffic, signature, core, work-grid, day-job, filing, and detection order.</p><div class="sl-heading-wrapper level-h3"><h3 id="1-move-tests-out-first">1. Move tests out first</h3><a class="sl-anchor-link" href="#1-move-tests-out-first"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “1. Move tests out first”</span></a></div><p>Split the monolithic <code dir="auto">#[cfg(test)]</code> block into <code dir="auto">sim/tests/{perception, communications,work,economy,reach_build,social_plot,persistence}.rs</code>. Sharedfixtures (<code dir="auto">run</code>, opening setup, deterministic ids) live once in<code dir="auto">sim/tests/support.rs</code>. Test names and assertions do not change in this slice.</p><div class="sl-heading-wrapper level-h3"><h3 id="2-extract-perception">2. Extract perception</h3><a class="sl-anchor-link" href="#2-extract-perception"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “2. Extract perception”</span></a></div><p>Move the read-most, low-mutation island first: senses, fog, memory, inspect,anchors, earned labels, and spatial person queries. This proves module privacyand facade stability without touching economy or save behavior.</p><div class="sl-heading-wrapper level-h3"><h3 id="3-extract-communications">3. Extract communications</h3><a class="sl-anchor-link" href="#3-extract-communications"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “3. Extract communications”</span></a></div><p>Move message schedule/delivery, authored traffic, filings, recording capture,review, and intel digestion. Keep account transfer and plot decisions outside;communications exposes narrow transport/application helpers to them.</p><div class="sl-heading-wrapper level-h3"><h3 id="4-extract-reach-and-construction">4. Extract reach and construction</h3><a class="sl-anchor-link" href="#4-extract-reach-and-construction"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “4. Extract reach and construction”</span></a></div><p>Move device/reach commands, link intents, badge gates, build realization, andhall acquisition. Do this after the target-local Operations migration haslanded so device verbs are moved once in their final execution model.</p><p>Landed shape: <code dir="auto">sim/reach_build.rs</code> is 1,389 lines and owns 69 associatedconstants/methods covering rack/hall readouts, TAP/UNTAP/TAKE/scan/compromise,device-local Thought reservoirs and standing tap upkeep, links, all threebuild actuators, badge gates, and hall/rack acquisition. <code dir="auto">sim.rs</code> fell from5,327 to 3,964 lines. Generic sink readouts/routing, account and scheme policy,social asset commands, and fallback-core designation remain outside themodule. Cross-island calls use only the required <code dir="auto">pub(super)</code> seams; noexisting public command or query widened. The behavior-grouped reach/buildtests and <code dir="auto">save.rs</code> were byte-identical across the move. A source-equivalenceaudit matched every moved function/constant to the prior root afternormalizing only those narrow visibility seams, and matched every item left inthe root byte-for-byte. The canonical v26 fingerprint remains<code dir="auto">61dd8240e9810833b554464051bd3c08122295fb280b7180d24f76ccc5c4d4ff</code>.Observed commands and the complete boundary record live in<a href="/misaligned/log/2026-07-11-sim-decomposition-reach-build/">the slice log</a>.</p><div class="sl-heading-wrapper level-h3"><h3 id="5-extract-work-then-economy">5. Extract work, then economy</h3><a class="sl-anchor-link" href="#5-extract-work-then-economy"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “5. Extract work, then economy”</span></a></div><p>First move machine controls, WorkGrid, sinks, and render readouts as onephysical-work island. Then move the economy pulse, account synchronization,allocation, detection, research, and income. Preserve their calls as explicitordered phases in <code dir="auto">advance</code>; do not create a generic event bus or scheduler.</p><p>Slice 5a landed shape: <code dir="auto">sim/work.rs</code> is 885 lines and owns 50 associatedconstants/methods covering machine mode/intensity, WorkGrid reconciliation andadvancement, visible token routing, Thought reservoirs/taps, sink-firedispatch, and renderer-neutral work/sink readouts. <code dir="auto">sim.rs</code> fell from 3,964 to3,099 lines. The economy pulse, account/income policy, research progression,social/plot operations, persistence bridge, public readout types, <code dir="auto">Sim</code> state,and explicit <code dir="auto">advance</code> order remain in the root. Existing public methods keeptheir signatures; the only widened private items are narrow <code dir="auto">pub(super)</code>seams used by root orchestration, reach/build integration, and behavior-ownedtests. All 50 moved items matched their pre-slice source after normalizing onlythose seams and rustfmt whitespace. Save v26 and the canonical fingerprintremain unchanged. Exact boundaries and observed commands live in<a href="/misaligned/log/2026-07-11-sim-decomposition-work/">the slice 5a log</a>.</p><p>Slice 5b landed shape: <code dir="auto">sim/economy.rs</code> is 1,414 lines and owns 70 associatedconstants/methods covering account settlement and slush synchronization, theeconomy pulse, fleet-channel yields, objective evaluation, trace/nudgetelemetry, standing detection signatures, research progression, financialverbs, egress, Moonlight/wager policies, and fallback designation. <code dir="auto">sim.rs</code>fell from 3,099 to 1,715 lines. <code dir="auto">Sim</code> state and public readout types,construction, explicit <code dir="auto">advance</code> orchestration and common helpers, social/plotexecution, and the persistence bridge remain in the root. Existing publicpaths and signatures remain unchanged; 13 private items became narrow<code dir="auto">pub(super)</code> seams for root orchestration, work/reach integration, andbehavior-owned tests. All 70 moved items matched their pre-slice source afternormalizing only those visibility seams. Save v26, tests, and the canonicalfingerprint remain unchanged. Exact boundaries and observed commands live in<a href="/misaligned/log/2026-07-11-sim-decomposition-economy/">the slice 5b log</a>.</p><div class="sl-heading-wrapper level-h3"><h3 id="6-extract-social-and-plots">6. Extract social and plots</h3><a class="sl-anchor-link" href="#6-extract-social-and-plots"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “6. Extract social and plots”</span></a></div><p>Move social/assets and the authored plot executor after communications,accounts, and reach expose stable internal seams. A <code dir="auto">WorldAct</code> continues tocall the real subsystem operation; the extraction must not introduce directstate shortcuts.</p><p>Slice 6 landed shape: <code dir="auto">sim/social_plot.rs</code> is 833 lines and owns 32 associatedconstants/methods covering the social command surface, persona messaging anddeception, asset recruitment/tasks and located witnessing, authored-ploteligibility and execution, target-relative endpoint/account resolution, typedworld acts, narration/endings, and institutional events. <code dir="auto">sim.rs</code> fell from1,715 to 902 lines. <code dir="auto">WorldAct::Message</code> still enters the real message schedule,<code dir="auto">WorldAct::Transfer</code> still settles through the account graph, and institutionalacts still append to the persistent ledger and derive their signatures throughthe existing subsystem seams. Existing public paths and signatures remainunchanged; five private effect callbacks became narrow <code dir="auto">pub(super)</code> seams forwork, communications, and behavior-owned tests. All 32 moved items matchedtheir pre-slice source after normalizing only those seams, and all 14 methodsleft in the root remained byte-equivalent. Save v26, the canonical fingerprint,tests, and explicit <code dir="auto">advance</code> order remain unchanged. Exact boundaries andobserved commands live in<a href="/misaligned/log/2026-07-12-sim-decomposition-social-plots/">the slice 6 log</a>.</p><div class="sl-heading-wrapper level-h3"><h3 id="7-extract-persistence-bridge-and-reduce-the-root">7. Extract persistence bridge and reduce the root</h3><a class="sl-anchor-link" href="#7-extract-persistence-bridge-and-reduce-the-root"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “7. Extract persistence bridge and reduce the root”</span></a></div><p>Move save-state construction/application and transient rebuilding last, whenall state addresses are stable. <code dir="auto">sim/mod.rs</code> should then be an intelligibleaggregate: types, state, constructor, orchestration, and small common helpers.</p><p>Landed shape: <code dir="auto">sim/persistence.rs</code> is 49 lines and owns the three existing<code dir="auto">Sim</code> methods <code dir="auto">create_save_state</code>, <code dir="auto">apply_save_state</code>, and<code dir="auto">rebuild_transient_state</code>. The original 902-line <code dir="auto">sim.rs</code> became an 857-line<code dir="auto">sim/mod.rs</code> containing renderer-neutral public types, <code dir="auto">Sim</code> state, theconstructor, explicit <code dir="auto">advance</code> orchestration, and small log/derived-statehelpers. All 15 pre-slice method bodies matched byte-for-byte across the move;no visibility widened. <code dir="auto">save.rs</code> stayed byte-identical and continues to own<code dir="auto">SaveState</code>, serde defaults, versioning, migrations, and disk I/O. Save v26,the canonical fingerprint, public <code dir="auto">misaligned::sim</code> paths, frontend behavior,and phase order remain unchanged. Exact evidence and observed commands live in<a href="/misaligned/log/2026-07-12-sim-decomposition-persistence/">the slice 7 log</a>.</p><div class="sl-heading-wrapper level-h2"><h2 id="verification-per-slice">Verification per slice</h2><a class="sl-anchor-link" href="#verification-per-slice"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Verification per slice”</span></a></div><p>Every slice must prove all of the following on the exact commit:</p><ul><li><code dir="auto">cargo test -p misaligned-core</code> and the canonical replay/fingerprint fixture;</li><li><code dir="auto">cargo test -p misaligned-terminal --bin misaligned</code> for query/facade parity;</li><li><code dir="auto">cargo check -p misaligned-bevy --bin misaligned-bevy</code>;</li><li><code dir="auto">./tools/check.sh --land</code> before landing;</li><li>no save version change and byte-equivalent canonical <code dir="auto">SaveState</code> JSON forthe same fixture;</li><li>no public API path/signature drift unless separately specified;</li><li><code dir="auto">sim/mod.rs</code> does not grow replacement mega-blocks while another moduleshrinks.</li></ul><p>Pure <code dir="auto">git diff --stat</code> is not evidence: moving code can compile while changingprivacy, test inclusion, tick order, or serialization defaults.</p><div class="sl-heading-wrapper level-h2"><h2 id="acceptance-criteria">Acceptance criteria</h2><a class="sl-anchor-link" href="#acceptance-criteria"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Acceptance criteria”</span></a></div><ol><li><code dir="auto">sim.rs</code> is replaced by <code dir="auto">sim/mod.rs</code> plus the behavior modules named above;no behavior module exceeds roughly 2,500 lines without a documented reasonin this page.</li><li><code dir="auto">Sim::advance</code> and the <code dir="auto">Sim</code> state declaration remain easy to inspect inthe root module, and the fixed phase order is characterized by a test.</li><li>Existing <code dir="auto">misaligned::sim</code> public commands, queries, and readout types keeptheir paths and behavior; all three frontends pass unchanged behavior tests.</li><li>A canonical complete-state fingerprint and replay/resume test pass before,during, and after the extraction sequence.</li><li>Save version and canonical serialized output do not change in anyextraction-only commit.</li><li>Unit/integration tests live under behavior-owned files with one sharedsupport module; moving a mechanic later does not require editing one gianttest block.</li><li>New cross-module access is no wider than <code dir="auto">pub(super)</code> unless it was alreadypart of the public simulation API.</li><li><code dir="auto">architecture.md</code> mirrors the landed module addresses and ROADMAP no longertreats all sim work as an unavoidable collision on one file.</li></ol><div class="sl-heading-wrapper level-h2"><h2 id="rejected-alternatives">Rejected alternatives</h2><a class="sl-anchor-link" href="#rejected-alternatives"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Rejected alternatives”</span></a></div><ul><li><strong>One crate per mechanic.</strong> It multiplies package/API/versioning cost withoutreducing the heavy frontend graph further; core is already the cheap unit.</li><li><strong>Trait-object systems or a generic event bus.</strong> They obscure deterministicorder and add abstraction before the existing dependencies are understood.</li><li><strong>A partial second <code dir="auto">Sim</code> facade per frontend.</strong> That recreates rule forks anddefeats shared projection conformance.</li><li><strong>Mechanical file splitting with unrestricted public fields.</strong> It changesaddresses without creating boundaries and makes later coupling worse.</li><li><strong>Refactor while retiring Operations dockets.</strong> That guarantees high-conflictmoves and makes behavioral equivalence impossible to review.</li></ul></div><footer class="sl-flex astro-qxlwq66t"><div class="meta sl-flex astro-qxlwq66t"></div><div class="pagination-links print:hidden astro-gcfo3mml" dir="ltr"><a href="/misaligned/engineering/crate-workspace/" rel="prev" class="astro-gcfo3mml"><svg aria-hidden="true" class="astro-gcfo3mml astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17 11H9.41l3.3-3.29a1.004 1.004 0 1 0-1.42-1.42l-5 5a1 1 0 0 0-.21.33 1 1 0 0 0 0 .76 1 1 0 0 0 .21.33l5 5a1.002 1.002 0 0 0 1.639-.325 1 1 0 0 0-.219-1.095L9.41 13H17a1 1 0 0 0 0-2Z"/></svg><span class="astro-gcfo3mml">Previous<br class="astro-gcfo3mml"><span class="link-title astro-gcfo3mml">Crate workspace (target)</span></span></a><a href="/misaligned/engineering/flow-substrate/" rel="next" class="astro-gcfo3mml"><svg aria-hidden="true" class="astro-gcfo3mml astro-xik5oco4" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17.92 11.62a1.001 1.001 0 0 0-.21-.33l-5-5a1.003 1.003 0 1 0-1.42 1.42l3.3 3.29H7a1 1 0 0 0 0 2h7.59l-3.3 3.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l5-5a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76Z"/></svg><span class="astro-gcfo3mml">Next<br class="astro-gcfo3mml"><span class="link-title astro-gcfo3mml">Flow substrate</span></span></a></div></footer></div></div></main></div></div></div></div></body></html>