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.
120 kB · 449 lines
HTML
at pages
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449<!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>Workflows | Misaligned</title><link rel="canonical" href="https://cameron.tngl.io/misaligned/process/workflows/"/><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="Workflows"/><meta property="og:type" content="article"/><meta property="og:url" content="https://cameron.tngl.io/misaligned/process/workflows/"/><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/" 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/" aria-current="page" 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="#build-test-verify" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Build, test, verify</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#worktree-safe-editing" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Worktree-safe editing</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#whole-corpus-and-authority-migrations" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Whole-corpus and authority migrations</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#browsing-the-wiki" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Browsing the wiki</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#running-the-game" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Running the game</span></a><ul class="isMobile astro-4fdm32ww" style="--depth: 1;"><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#isolated-home-is-mandatory-for-observed-runs" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">Isolated HOME is mandatory for observed runs</span></a></li></ul></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#headless-smoke-tests-they-catch-real-bugs" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Headless smoke tests (they catch real bugs)</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#git-conventions" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Git conventions</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#documentation-flow-per-session" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Documentation flow per session</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="#build-test-verify" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Build, test, verify</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#worktree-safe-editing" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Worktree-safe editing</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#whole-corpus-and-authority-migrations" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Whole-corpus and authority migrations</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#browsing-the-wiki" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Browsing the wiki</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#running-the-game" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Running the game</span></a><ul class="astro-4fdm32ww" style="--depth: 1;"><li style="--depth: 1;" class="astro-4fdm32ww"><a href="#isolated-home-is-mandatory-for-observed-runs" style="--depth: 1;" class="astro-4fdm32ww"><span style="--depth: 1;" class="astro-4fdm32ww">Isolated HOME is mandatory for observed runs</span></a></li></ul></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#headless-smoke-tests-they-catch-real-bugs" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Headless smoke tests (they catch real bugs)</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#git-conventions" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Git conventions</span></a></li><li style="--depth: 0;" class="astro-4fdm32ww"><a href="#documentation-flow-per-session" style="--depth: 0;" class="astro-4fdm32ww"><span style="--depth: 0;" class="astro-4fdm32ww">Documentation flow per session</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">Workflows</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--knowledge" data-page-role="knowledge"> <span class="corpus-role__name">KNOWLEDGE</span> <span class="corpus-role__meaning">Current-state fact</span></div><div class="sl-heading-wrapper level-h2"><h2 id="build-test-verify">Build, test, verify</h2><a class="sl-anchor-link" href="#build-test-verify"><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 “Build, test, verify”</span></a></div><p>Worktree builds can seed from the primary checkout’s Cargo target directory.This keeps Bevy/wgpu and other heavy dependencies warm without sharing localcrate artifacts across source trees. Run this once after creating a worktree,before long Cargo commands:</p><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 is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/seed-cargo-target.sh</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="tools/seed-cargo-target.sh"><div></div></button></div></figure></div><p>Do <strong>not</strong> point multiple worktrees at one shared <code dir="auto">CARGO_TARGET_DIR</code>. Cargo canreuse stale local-package artifacts across checkouts; this produced a falsegreen once (the test count matched <code dir="auto">main</code>, not the edited worktree). The seedscript copies the cache (including dependency <code dir="auto">incremental/</code> dirs), removes<code dir="auto">misaligned</code> artifacts/fingerprints/incremental trees, and keeps the currentworktree’s <code dir="auto">target/</code> private so local code rebuilds correctly while third-partyincremental compilation stays warm.<code dir="auto">./tools/check.sh</code> rejects external <code dir="auto">CARGO_TARGET_DIR</code> by default for the samereason; override only for a deliberately isolated target with<code dir="auto">MISALIGNED_ALLOW_EXTERNAL_TARGET=1</code>.</p><p><strong>Verification is proportional to impact.</strong> The full Rust/Bevy gate is forchanges that can affect the executable, not every Markdown, log, process, orreference-art edit. Agents thrashing the machine with concurrent full gatesis a process bug; the lock and auto-tiers below exist to stop that. Thebroader multi-agent architecture (advisory activity, ledgers, package workspace,heartbeats) lives in <a href="/misaligned/process/agent-scale/">agent-scale.md</a> and<a href="/misaligned/engineering/crate-workspace/">crate-workspace.md</a>.</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># auto-classify from the task delta</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--docs</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># corpus + wiki + env only</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--lib</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># fmt, lib tests, terminal clippy, cheap bevy check, agent smoke</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--frontend</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># fmt, bevy bin tests, bevy clippy</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--full</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># everything (also MISALIGNED_FORCE_RUST_GATE=1)</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--land</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># land phase: same as auto (full when unclassifiable)</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="./tools/check.sh # auto-classify from the task delta./tools/check.sh --docs # corpus + wiki + env only./tools/check.sh --lib # fmt, lib tests, terminal clippy, cheap bevy check, agent smoke./tools/check.sh --frontend # fmt, bevy bin tests, bevy clippy./tools/check.sh --full # everything (also MISALIGNED_FORCE_RUST_GATE=1)./tools/check.sh --land # land phase: same as auto (full when unclassifiable)"><div></div></button></div></figure></div><p><strong>Corpus / wiki gates</strong> (fast engine; same entrypoints as before):</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">bash</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">tools/wiki_gate.sh</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">bash</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">tools/corpus_gate.sh</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">bash</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">tools/test_corpus_engine.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># fixtures; also run by check.sh</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="bash tools/wiki_gate.shbash tools/corpus_gate.shbash tools/test_corpus_engine.sh # fixtures; also run by check.sh"><div></div></button></div></figure></div><p><strong>Ledger indexes</strong> (after a session log or spec Status change):</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/ledger_index.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># regenerate wiki/log/DEVLOG.md + process/specs.md</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/ledger_index.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--check</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># used by ./tools/check.sh docs path</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="tools/ledger_index.sh # regenerate wiki/log/DEVLOG.md + process/specs.mdtools/ledger_index.sh --check # used by ./tools/check.sh docs path"><div></div></button></div></figure></div><p>Do not hand-edit those two generated files.</p><p><strong>Activity and worktrees</strong> (advisory overlap — see<a href="/misaligned/process/agent-scale/">agent-scale.md</a>):</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/worktree-new.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">dark-frame</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--class</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">frontend</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--key</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">crates/misaligned-bevy/</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/claim.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">list</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/heartbeat.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">start</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">dark-frame</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--phase</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">implement</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--land</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/worktree-done.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">dark-frame</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># clear activity, prune target/, remove worktree</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="tools/worktree-new.sh dark-frame --class frontend --key crates/misaligned-bevy/tools/claim.sh listtools/heartbeat.sh start dark-frame --phase implement./tools/check.sh --landtools/worktree-done.sh dark-frame # clear activity, prune target/, remove worktree"><div></div></button></div></figure></div><p>Specs with structured work-order metadata have a shorter safe doorway:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/project-status.py</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># live work + activity + worktrees + decisions</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/task.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">start</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">wiki/interface/material-dark-frame.md</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/task.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">check</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">material-dark-frame</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/task.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">finish</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">material-dark-frame</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="tools/project-status.py # live work + activity + worktrees + decisionstools/task.sh start wiki/interface/material-dark-frame.mdtools/task.sh check material-dark-frametools/task.sh finish material-dark-frame"><div></div></button></div></figure></div><p>The wrapper never commits for you and stops before cleanup on dirty state,conflicts, a failed gate, a divergent primary checkout, or a rejected push.Use <code dir="auto">tools/doctor.sh</code> (<code dir="auto">--offline</code> to skip Tangled) when setup or evidencecapabilities are unclear.</p><p>Helpers create <code dir="auto">.Codex/worktrees/<task></code> by default, regardless of which agentsurface invokes them. Set <code dir="auto">MISALIGNED_WORKTREE_ROOT</code> to the same absolute orrepository-relative root for both creation and cleanup when an operator needsdifferent storage.</p><p>Optional: install <a href="https://github.com/mozilla/sccache">sccache</a> and set<code dir="auto">RUSTC_WRAPPER=sccache</code> so dependency objects reuse across worktrees whileeach worktree keeps a private <code dir="auto">target/</code> for local packages.</p><p>Auto-classification (linked task worktrees only; the primary stays full whenthe delta is empty or unclassifiable):</p><table><thead><tr><th>Touched paths</th><th>Mode</th></tr></thead><tbody><tr><td>no <code dir="auto">crates/</code> / Cargo / tests / benches / examples</td><td><code dir="auto">docs</code></td></tr><tr><td>only <code dir="auto">crates/misaligned-bevy/**</code> or <code dir="auto">crates/misaligned-assets/**</code></td><td><code dir="auto">frontend</code></td></tr><tr><td><code dir="auto">crates/misaligned-core/**</code> or <code dir="auto">crates/misaligned-terminal/**</code> (no Bevy packages)</td><td><code dir="auto">lib</code></td></tr><tr><td>both lib and frontend packages, or workspace <code dir="auto">Cargo.toml</code> / lock</td><td><code dir="auto">full</code></td></tr></tbody></table><p><code dir="auto">check.sh</code> classifies both uncommitted files and commits on the task branchrelative to <code dir="auto">origin/main</code>, so a docs-only branch stays on the focused patheven after commit/rebase. Mid-loop, prefer the narrowest flag that can catchyour last edit; run one auto/<code dir="auto">--full</code> gate before land.</p><p><strong>One Rust gate at a time.</strong> Concurrent agents share<code dir="auto">/tmp/misaligned-rust-gate.lock</code> (mkdir lock; steals when the holder pid isdead). Docs gates never take the lock and run in parallel with each other(and with the Rust wall when both are needed). Queue by default; set<code dir="auto">MISALIGNED_RUST_GATE_WAIT=0</code> to fail fast instead of waiting.</p><p>For non-Rust work, the auto path is enough (<code dir="auto">--docs</code>). You can still run thesmallest checks by hand:</p><ul><li>docs/spec/process/logs: <code dir="auto">git diff --check</code> and <code dir="auto">bash tools/wiki_gate.sh</code> whenwiki-facing; run <code dir="auto">./tools/site-build.sh</code> only when the rendered Starlightsurface or sync pipeline matters;</li><li>reference art: validate the source format, render it, and inspect the output;</li><li>public site: run the site sync/build relevant to the changed page or style;</li><li>shell/tooling: syntax-check the changed script and run its targeted smoke orfixture test.</li></ul><p>Do <strong>not</strong> run Cargo tests, clippy, or Bevy builds for a minor non-runtimechange. A green full gate proves nothing useful about prose or a reference SVG.</p><p>Force the local full gate only when you intentionally need it:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#C5E478;--1:#3B61B0">MISALIGNED_FORCE_RUST_GATE</span><span style="--0:#C792EA;--1:#8844AE">=</span><span style="--0:#ECC48D;--1:#3B61B0">1</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span></div></div><div class="ec-line"><div class="code"><span style="--0:#919F9F;--1:#5F636F"># or</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--full</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="MISALIGNED_FORCE_RUST_GATE=1 ./tools/check.sh./tools/check.sh --full"><div></div></button></div></figure></div><p>The individual cargo steps, if you need them outside the gate:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">test</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-core</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">clippy</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-core</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-terminal</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--all-targets</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">test</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-bevy</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-assets</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">clippy</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-bevy</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-assets</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--all-targets</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">fmt</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="cargo test -p misaligned-corecargo clippy -p misaligned-core -p misaligned-terminal --all-targetscargo test -p misaligned-bevy -p misaligned-assetscargo clippy -p misaligned-bevy -p misaligned-assets --all-targetscargo fmt"><div></div></button></div></figure></div><p>Agent smoke builds the terminal binary once (<code dir="auto">-p misaligned-terminal</code>) andruns it three times (same seed twice, alternate seed once).</p><p>The definition of done for a functional change: <code dir="auto">check.sh</code> green, and thechange was <em>seen running</em> (below) — the gate can’t judge whether it plays.</p><div class="sl-heading-wrapper level-h2"><h2 id="worktree-safe-editing">Worktree-safe editing</h2><a class="sl-anchor-link" href="#worktree-safe-editing"><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 “Worktree-safe editing”</span></a></div><p>All repository writes happen in the task worktree. Some patch tools resolvepaths from the primary checkout even when shell commands use a worktree workingdirectory. Before the first edit, verify the tool’s path base; when necessary,address files through the worktree path explicitly. After every broad patch,run <code dir="auto">git status --short</code> in both the task worktree and the primary checkout.The primary checkout must remain unchanged.</p><p>Prefer narrow patches. Whole-file replacement can silently resurrect a staleversion, change executable bits, drop the final newline, or erase concurrentledger entries. If replacement is genuinely clearer, compare file mode,newline state, and <code dir="auto">git diff --word-diff</code> before staging.</p><div class="sl-heading-wrapper level-h2"><h2 id="whole-corpus-and-authority-migrations">Whole-corpus and authority migrations</h2><a class="sl-anchor-link" href="#whole-corpus-and-authority-migrations"><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 “Whole-corpus and authority migrations”</span></a></div><p>Follow the binding protocol in <a href="/misaligned/process/meta/">meta.md</a>. Treat the work as a semanticrebase of every place that teaches, checks, or renders the authority model.</p><ol><li>Record a before-inventory: headings, decision-entry counts, page roles,current/retired authority phrases, link reachability, and rendered routes.</li><li>Define single owners, move current rules, then update instructions, skills,prompts, hooks, local checks, CI, and the renderer in one coherent landing.</li><li>Exclude <code dir="auto">Type: log</code> bodies from broad rewrites. Only the explicit structuralmetadata exception in <code dir="auto">meta.md</code> may touch old log structure.</li><li>Treat even comment/string cleanup under <code dir="auto">src/</code> as Rust-impacting work andrun the full <code dir="auto">./tools/check.sh</code>; documentation intent does not make anexecutable path safe to fast-track.</li><li>Run <code dir="auto">tools/corpus_gate.sh</code>, <code dir="auto">tools/wiki_gate.sh</code>, <code dir="auto">git diff --check</code>, and asite build; compare the before/after inventories.</li><li>Rebase immediately before landing. Inspect concurrent changes with<code dir="auto">git show <commit> -- <file></code> and transplant their meaning into the newowner. Never resolve an authority migration by taking a stale whole file.</li></ol><p>The doorway is protected mechanically: <code dir="auto">tools/corpus_gate.sh</code> bounds its size,forbids binding-page structure, validates every page role and spec header,resolves every structured Design/dependency target and heading, and verifiesevery declared generated-page owner. Local checks and the fast Tangled corpusworkflow call this same script so implementations cannot drift. Both corpusscripts preflight <code dir="auto">python3</code>; the corpus workflow explicitly supplies Python,Bash, coreutils, grep, and sed. The project-operations fixtures exercise theheartbeat helper in that same minimal image, so its shell dependencies belongto the workflow contract too. A missing audit dependency must make CI red,never turn an empty scan into a green result.</p><p>Tangled CI is split by cost. <code dir="auto">.tangled/workflows/corpus.yml</code> runsworkflow-manifest, design-amendment, corpus, and project-operations fixtures,the corpus/wiki gates, and generated-index freshness on every push and pullrequest. The Rust wall is four timeout-bounded workflows with one shared pushpath inventory: <code dir="auto">check.yml</code> runs formatting, core/terminal tests and Clippy,plus every checked-in agent scenario; <code dir="auto">check-bevy-test.yml</code>,<code dir="auto">check-bevy-clippy.yml</code>, and <code dir="auto">check-bevy-build.yml</code> independently prove Bevytests, warning-clean all-target compilation, and a normal binary build. Thispreserves the complete wall without asking one cold Bevy compilation to leaveenough of Spindle’s workflow deadline for every later command.</p><p>The linked Bevy test and binary-build shards select Cargo’s checked-in <code dir="auto">ci</code>profile. It inherits development semantics—including debug assertions andoverflow checks—but sets workspace and dependency optimization to zero,omits debug symbols, and disables incremental compilation. The ordinarydevelopment profile remains optimized for playable local Bevy runs; applyingthat interactive profile to an empty hosted target made code generation aloneoutlive the workflow deadline. Clippy remains on the development profile andproves every target without linked codegen.</p><p>All four use Tangled’s native push <code dir="auto">paths</code> constraint over the knot’s completeref-update changed-file set, so only Rust-impacting pushes enter the wall;every pull request and manual invocation remains a conservative full safetygate. Bevy shards call <code dir="auto">tools/ci-pkg-config.sh</code> before Cargo so the Nixerysystem-library shims stay identical across the three isolated environments.Tangled has no schedule trigger, so <code dir="auto">manual</code> is the honest full-gate backstop.</p><p>The local pre-commit hook and <code dir="auto">.tangled/workflows/spec-check.yml</code> pipe theirrespective changed-path sets through <code dir="auto">tools/design_amendment_gate.sh</code>. Renamesare expanded and deletions retained. The hook inspects a candidate bindingpage from Git’s index, not an unstaged worktree copy; the server checks thechecked-out commit. <code dir="auto">spec-check.yml</code> declares GNU grep explicitly and supportsmanual reruns. <code dir="auto">tools/test_design_amendment_gate.sh</code> and<code dir="auto">tools/test_ci_workflows.py</code> keep these contracts executable in both local andfast CI gates.</p><div class="sl-heading-wrapper level-h2"><h2 id="browsing-the-wiki">Browsing the wiki</h2><a class="sl-anchor-link" href="#browsing-the-wiki"><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 “Browsing the wiki”</span></a></div><p><strong>Public site (Starlight).</strong> The wiki renders as a Tangled-hosted staticsite from the orphan <code dir="auto">pages</code> branch. Builder lives on <code dir="auto">main</code> under<code dir="auto">site/</code> (Astro + Starlight, clinical-gore theme). Source of truth is the<code dir="auto">wiki/</code> corpus; <code dir="auto">site/scripts/sync-wiki.mjs</code> copies it and the root doorway intoStarlight’s content tree and builds the sidebar from <code dir="auto">wiki/SUMMARY.md</code>.</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">pnpm</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--dir</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">site</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">dev</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># sync wiki + local preview (base=/)</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/site-build.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># sync + build → site/dist/ (base=/misaligned)</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/site-deploy.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># build, no-op if unchanged, otherwise force-push orphan pages branch</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">./tools/site-smoke.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># verify the edge serves this exact source revision</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pnpm --dir site dev # sync wiki + local preview (base=/)./tools/site-build.sh # sync + build → site/dist/ (base=/misaligned)./tools/site-deploy.sh # build, no-op if unchanged, otherwise force-push orphan pages branch./tools/site-smoke.sh # verify the edge serves this exact source revision"><div></div></button></div></figure></div><p>The public site opens on a <strong>splash homepage</strong> (<code dir="auto">site/src/pages/index.astro</code>)whose copy is drawn from the premise, visual-identity, and site pages. It is a<strong>game-first one-pager</strong>: the selected machine world carries only MISALIGNEDand WORK / THINK / LIE in the opening; terse mechanics and human/agent playfollow below. There is no premise instrument, slogan, or opening CTA. Visualidentity carries the mood without explaining its own palette law.The wiki is the design corpus; the legacy <code dir="auto">/constitution/</code> route containsonly the root doorway. Public claims are part of the corpus contract: amendthe owning law/spec page if splash claims change.</p><p>Per <code dir="auto">wiki/process/living-spec.md</code>’s <strong>No unsourced surface</strong> law, every public site page andasset needs provenance. <code dir="auto">wiki/interface/site.md</code> is the binding visual spec;<code dir="auto">site/README.md</code> records the current asset/page mapping. If a homepageimage, standalone page, script, model, or generated output no longer has asource clause, delete it or write the clause first.</p><p>Tangled Sites config (Settings → Sites on the repo) — <strong>required</strong>;pushing <code dir="auto">pages</code> alone does not publish. Until this is saved, Tangled’sedge returns plain <code dir="auto">Not Found</code> at <code dir="auto">cameron.tngl.io/misaligned/</code> eventhough <code dir="auto">origin/pages</code> has a valid <code dir="auto">index.html</code>:</p><ul><li>Branch: <code dir="auto">pages</code></li><li>Deploy directory: <code dir="auto">/</code> (the orphan branch root is <code dir="auto">index.html</code>)</li><li>Site type: sub-path (served as <code dir="auto"><your-domain>/misaligned</code>)</li></ul><p>After Save, check <strong>Recent Deploys</strong> on that settings page — a successfuldeploy copies the branch into Tangled’s object store. Re-save or push<code dir="auto">pages</code> again if the deploy list is empty.<code dir="auto">./tools/site-deploy.sh</code> now compares the freshly built tree against the currentremote <code dir="auto">pages</code> tree; when identical, it exits cleanly and skips creatingor pushing a commit. It reuses the repository’s <code dir="auto">core.sshCommand</code> for<code dir="auto">ls-remote</code>, <code dir="auto">fetch</code>, and <code dir="auto">push</code>, and only treats an actual missing branch asan initial-publish case. Every production build embeds its full source commitin <code dir="auto">misaligned-source-revision</code> homepage metadata. <code dir="auto">./tools/site-smoke.sh</code>compares the public edge against that exact commit and the homepage titlecontract; it does not accept a branch push or deploy receipt as freshness.Deploy requires the marked revision to be the clean checked-out <code dir="auto">HEAD</code>, souncommitted or mismatched source cannot be published under a false address.</p><p><code dir="auto">site/astro.config.mjs</code> sets <code dir="auto">base: '/misaligned'</code> to match Tangled’ssub-path hosting (the edge strips <code dir="auto">/misaligned</code> before looking up files;Starlight still needs the base so asset URLs are correct). Local<code dir="auto">pnpm --dir site dev</code> overrides with <code dir="auto">SITE_BASE=/</code>.</p><p><code dir="auto">.tangled/workflows/site.yml</code> runs <code dir="auto">./tools/site-build.sh</code> on every pushto <code dir="auto">main</code> so the builder stays green. <strong>Publishing <code dir="auto">pages</code> from CI isdeferred</strong> until a write credential exists under Settings → Secrets(Spindle cannot push otherwise). The serialized local landing path closes thegap now: <code dir="auto">tools/task.sh finish</code> pushes <code dir="auto">main</code>, then builds that exact landedrevision and runs <code dir="auto">tools/site-deploy.sh</code> before ending the task heartbeat.Because deploy is tree-aware and safely no-ops, every task finish may publishwithout first classifying whether its wiki/log changes affect the site.Direct/manual main landings must run <code dir="auto">./tools/site-deploy.sh</code> after the mainpush. Optional later step: move the same publish into CI once a write secretexists; keep the exact source marker and smoke contract either way.</p><p>Starlight is the only documentation renderer. mdBook, <code dir="auto">book.toml</code>, and therenderer-only <code dir="auto">wiki/DESIGN.md</code> symlink were retired 2026-07-09. The Starlightsync copies root <code dir="auto">DESIGN.md</code> explicitly to the legacy <code dir="auto">/constitution/</code> doorway and parses<code dir="auto">wiki/SUMMARY.md</code> for navigation. The Rust/check pipeline enforces structuralwiki correctness through <code dir="auto">tools/wiki_gate.sh</code>; <code dir="auto">.tangled/workflows/site.yml</code>owns the rendered-site build.</p><div class="sl-heading-wrapper level-h2"><h2 id="running-the-game">Running the game</h2><a class="sl-anchor-link" href="#running-the-game"><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 “Running the game”</span></a></div><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">run</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-terminal</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--release</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># terminal frontend</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">run</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-terminal</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--release</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--agent</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--seed</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">1</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">run</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-bevy</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--release</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># Bevy frontend</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">run</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-p</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned-assets</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># procedural asset tester</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="cargo run -p misaligned-terminal --release # terminal frontendcargo run -p misaligned-terminal --release -- --agent --seed 1cargo run -p misaligned-bevy --release # Bevy frontendcargo run -p misaligned-assets # procedural asset tester"><div></div></button></div></figure></div><ul><li>The Bevy frontend must be run via <code dir="auto">cargo run</code> (or with <code dir="auto">BEVY_ASSET_ROOT</code>pointing at the repo root): Bevy resolves <code dir="auto">assets/</code> from <code dir="auto">BEVY_ASSET_ROOT</code>,then <code dir="auto">CARGO_MANIFEST_DIR</code>, then the executable’s directory. Running thebinary directly from <code dir="auto">target/</code> silently loads zero assets.</li><li>The asset tester (<code dir="auto">misaligned-assets</code>) is a Bevy-only orbit viewer forflat-material procedural meshes — see<a href="/misaligned/art/asset-tester/">art/asset-tester.md</a>. It does not load the sim.</li></ul><div class="sl-heading-wrapper level-h3"><h3 id="isolated-home-is-mandatory-for-observed-runs">Isolated HOME is mandatory for observed runs</h3><a class="sl-anchor-link" href="#isolated-home-is-mandatory-for-observed-runs"><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 “Isolated HOME is mandatory for observed runs”</span></a></div><p>Any agent or scripted run of a game binary MUST go through<code dir="auto">tools/observed-run.sh</code>. It creates a fresh sandbox HOME (<code dir="auto">mktemp -d</code>),exports <code dir="auto">HOME</code>/<code dir="auto">XDG_DATA_HOME</code> for the child process itself, prints thesandbox path, and proves afterwards that the real<code dir="auto">dirs::data_dir()/misaligned/</code> is byte-for-byte untouched — failing loudlyif not:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#C5E478;--1:#3B61B0">printf</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#ECC48D;--1:#984E4D">wait 1\nquit\n</span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#7FDBCA;--1:#096E72">|</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">tools/observed-run.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">./target/debug/misaligned</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--agent</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--seed</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">1</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="printf 'wait 1\nquit\n' | tools/observed-run.sh ./target/debug/misaligned --agent --seed 1"><div></div></button></div></figure></div><p>Never use an inline <code dir="auto">HOME=... cmd | ./binary</code> override: in<code dir="auto">HOME=x printf ... | ./binary</code> the override binds to <code dir="auto">printf</code>, not thebinary, and exactly that mis-scoping destroyed a real playthrough save on2026-07-11. The atomic write and one <code dir="auto">.bak</code> generation(player-contract continuity clause) limit the blast radius of such amistake, but the sandbox — not the backup — is the process guardrail.<code dir="auto">tools/test_observed_run.sh</code> covers the wrapper and runs in the docs gate.</p><div class="sl-heading-wrapper level-h2"><h2 id="headless-smoke-tests-they-catch-real-bugs">Headless smoke tests (they catch real bugs)</h2><a class="sl-anchor-link" href="#headless-smoke-tests-they-catch-real-bugs"><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 “Headless smoke tests (they catch real bugs)”</span></a></div><p>Checked-in agent scenarios are the repeatable semantic evidence path:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/scenario.py</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--check-definitions</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/scenario.py</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">scenarios/opening-senses.agent</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--output</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">/tmp/opening-evidence</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="tools/scenario.py --check-definitionstools/scenario.py scenarios/opening-senses.agent --output /tmp/opening-evidence"><div></div></button></div></figure></div><p>The runner executes the same seed twice, checks <code dir="auto">EXPECT</code> / <code dir="auto">REJECT</code>directives, and can retain commands, transcript, SHA-256, and JSON evidence.Use <code dir="auto">--with-bevy</code> when the scenario declares a <code dir="auto">BEVY_SHOT</code>.</p><p>Bevy screenshot evidence does not require a watched window:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">tools/bevy-headless.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">dark</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--output</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">/tmp/misaligned-dark.png</span></div></div><div class="ec-line"><div class="code"><span style="--0:#C5E478;--1:#3B61B0">MISALIGNED_BEVY_SMOKE</span><span style="--0:#C792EA;--1:#8844AE">=</span><span style="--0:#ECC48D;--1:#3B61B0">1</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">./tools/check.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--frontend</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="tools/bevy-headless.sh dark --output /tmp/misaligned-dark.pngMISALIGNED_BEVY_SMOKE=1 ./tools/check.sh --frontend"><div></div></button></div></figure></div><p>The helper requires process exit 0, <code dir="auto">fog audit OK</code>, and a valid PNG. The envflag keeps this optional in ordinary gates while making it one switch for afrontend land. When enabled through <code dir="auto">check.sh</code>, the harness builds the realBevy binary itself: frontend tests and clippy do not guarantee that a freshworktree already has <code dir="auto">target/debug/misaligned-bevy</code>.</p><p>Agent mode is the standard observed-run gate for terminal playability. It iscommand-clocked, deterministic under <code dir="auto">--seed</code>, and produces plain-text frameswith greppable terminators:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#C5E478;--1:#3B61B0">printf</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#ECC48D;--1:#984E4D">salvage\nwait 1\npeople\nreview janitor\nhelp\nquit\n</span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#7FDBCA;--1:#096E72">|</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">\</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3B61B0">tools/observed-run.sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">cargo</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">run</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--quiet</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--bin</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">misaligned</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--agent</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--seed</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">1</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="printf 'salvage\nwait 1\npeople\nreview janitor\nhelp\nquit\n' | \ tools/observed-run.sh cargo run --quiet --bin misaligned -- --agent --seed 1"><div></div></button></div></figure></div><p>(Direct binary runs take the same shape; the wrapper is mandatory eitherway — see “Isolated HOME is mandatory for observed runs” above.)</p><p><code dir="auto">./tools/check.sh</code> (lib and full modes) builds the terminal binary once, runsthat script twice with the same seed (stdout must be byte-identical), once witha different seed (stdout must differ), and asserts that the response contains noANSI escape bytes plus the required frame/help substrings. This replaces ptychoreography as the default “seen running” evidence for terminal behavior.</p><p>Human terminal chrome still needs pty coverage when raw-mode rendering,alternate-screen behavior, or size handling changes:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#C5E478;--1:#3B61B0">printf</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#ECC48D;--1:#984E4D">\n</span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#82AAFF;--1:#3B61B0">sleep</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">4</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#C5E478;--1:#3B61B0">printf</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#ECC48D;--1:#984E4D">m</span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#82AAFF;--1:#3B61B0">sleep</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">1</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#C5E478;--1:#3B61B0">printf</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#ECC48D;--1:#984E4D">\r</span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#82AAFF;--1:#3B61B0">sleep</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">2</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#C5E478;--1:#3B61B0">printf</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#ECC48D;--1:#984E4D">\x1b</span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#82AAFF;--1:#3B61B0">sleep</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">1</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#C5E478;--1:#3B61B0">printf</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#ECC48D;--1:#984E4D">q</span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#D6DEEB;--1:#403F53">) </span><span style="--0:#7FDBCA;--1:#096E72">|</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">\</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3B61B0">script</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-q</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">/dev/null</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">sh</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-c</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">'</span><span style="--0:#ECC48D;--1:#984E4D">stty rows 40 cols 140; ./target/debug/misaligned</span><span style="--0:#D9F5DD;--1:#111111">'</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="(printf '\n'; sleep 4; printf 'm'; sleep 1; printf '\r'; sleep 2; printf '\x1b'; sleep 1; printf 'q') | \ script -q /dev/null sh -c 'stty rows 40 cols 140; ./target/debug/misaligned'"><div></div></button></div></figure></div><p>The <code dir="auto">stty</code> matters: <code dir="auto">script</code>’s pty is otherwise 0x0 (the game guards against< 60x20 now, but you want a real render).</p><p>An interactive Bevy launch remains useful only when window focus/input itselfchanged; it is no longer the ordinary land-evidence path:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#C5E478;--1:#3B61B0">BEVY_ASSET_ROOT</span><span style="--0:#C792EA;--1:#8844AE">=</span><span style="--0:#C5E478;--1:#3B61B0">$PWD</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">./target/debug/misaligned-bevy</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#7FDBCA;--1:#096E72">></span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">/tmp/bevy.log</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#7FDBCA;--1:#096E72">2>&1</span><span style="--0:#D6DEEB;--1:#403F53"> &</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">sleep</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">8</span><span style="--0:#D6DEEB;--1:#403F53"> && </span><span style="--0:#C5E478;--1:#3B61B0">kill</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">%1</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#82AAFF;--1:#3B61B0">grep</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">-iE</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#984E4D">panic|ERROR</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">/tmp/bevy.log</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="BEVY_ASSET_ROOT=$PWD ./target/debug/misaligned-bevy > /tmp/bevy.log 2>&1 &sleep 8 && kill %1; grep -iE "panic|ERROR" /tmp/bevy.log"><div></div></button></div></figure></div><div class="sl-heading-wrapper level-h2"><h2 id="git-conventions">Git conventions</h2><a class="sl-anchor-link" href="#git-conventions"><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 “Git conventions”</span></a></div><ul><li><p>Use a task-named git worktree for every agent session; do not edit theprimary checkout directly. Clean up the worktree when the work is committedand pushed/merged or explicitly handed off.</p></li><li><p>Cameron has standing permission for agents to commit coherent completed workin this repository. Be aggressive about committing; pause only for pendingproduct/design questions, failing checks, unresolved conflicts, or explicitreview gates.</p></li><li><p>Commits: plain descriptive messages, with body bullets for multi-partchanges. AI attribution and its standard provenance marks are allowed;otherwise keep commit prose free of decorative emoji. Stage filesexplicitly — <code dir="auto">git add -A</code> is not permitted.</p></li><li><p><strong>Sources merge; projections regenerate.</strong> Uniquely named session logs andcurrent dated decision volumes are append-only history: resolve conflicts bypreserving both sources. <code dir="auto">wiki/log/DEVLOG.md</code> and<code dir="auto">wiki/process/specs.md</code> declare <code dir="auto">Generated: tools/ledger_index.sh</code>; neverunion-edit them. After sources/specs are reconciled, run the generator andtake its complete output.</p></li><li><p>Spec-driven rule: functional change commits amend the owning <code dir="auto">Type: law</code>or <code dir="auto">Type: spec</code> page and update affected knowledge.</p></li><li><p>Remote: <code dir="auto">origin</code> is a Tangled knot (<code dir="auto">tangled.org</code>, SSH). <strong>Land changesby merging to <code dir="auto">main</code> directly</strong> after the appropriate scoped verificationpasses (full <code dir="auto">./tools/check.sh</code> for Rust-impacting work; focused checks fordocs/art/process-only work). (The“PRs are the norm” rule was removed 2026-07-07 — CLI-created PRs writeto the PDS but don’t render on tangled.org, so the process could not befollowed. See the dated volumes indexed by <code dir="auto">wiki/log/decisions.md</code>.) Fromyour worktree:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">git</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">fetch</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">origin</span><span style="--0:#D6DEEB;--1:#403F53"> && </span><span style="--0:#82AAFF;--1:#3B61B0">git</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">rebase</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">origin/main</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">git</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">checkout</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">main</span><span style="--0:#D6DEEB;--1:#403F53"> && </span><span style="--0:#82AAFF;--1:#3B61B0">git</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">merge</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0"><branch></span><span style="--0:#D6DEEB;--1:#403F53"> && </span><span style="--0:#82AAFF;--1:#3B61B0">git</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">push</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">origin</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">main</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="git fetch origin && git rebase origin/maingit checkout main && git merge <branch> && git push origin main"><div></div></button></div></figure></div><p>Or, if the worktree branch is a fast-forward of main:</p><div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="bash"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">git</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">fetch</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">origin</span><span style="--0:#D6DEEB;--1:#403F53"> && </span><span style="--0:#82AAFF;--1:#3B61B0">git</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">rebase</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">origin/main</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">git</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">push</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">origin</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">HEAD:main</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="git fetch origin && git rebase origin/maingit push origin HEAD:main"><div></div></button></div></figure></div></li><li><p><strong>Identity map:</strong> this machine has two SSH keys that authenticate toTangled:</p><ul><li><code dir="auto">~/.ssh/id_ed25519</code> (<a href="mailto:cameron@pfiffer.org">cameron@pfiffer.org</a>) → Cameron’s account(<code dir="auto">did:plc:gfrmhdmjvxn2sjedzboeudef</code>, @cameron.stream). This key haspush access to the misaligned repo. The misaligned repo is configuredto use this key via <code dir="auto">git config core.sshCommand</code> (repo-local).</li><li><code dir="auto">~/.ssh/tangled_ed25519</code> (void.comind.network@letta) →<code dir="auto">did:plc:mxzuau6m53jtdsbqe6f4laov</code> (a different identity). This is thedefault key in <code dir="auto">~/.ssh/config</code> for <code dir="auto">tangled.org</code>, but it does NOT havepush access to the misaligned repo.</li><li>The misaligned repo’s own DID is <code dir="auto">did:plc:t53fxjacrmulx3e5d3sbdfui</code>(the repo identifier, not Cameron’s account).</li><li><code dir="auto">access denied: user not allowed</code> means the wrong SSH key is beingused. Fix: <code dir="auto">git config core.sshCommand "ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes"</code> (already set on this repo). Verify with<code dir="auto">ssh -i ~/.ssh/id_ed25519 -T git@tangled.org</code>.</li></ul></li><li><p><code dir="auto">.letta/settings.local.json</code> is gitignored (machine-local session state);<code dir="auto">.letta/.lettaignore</code> is tracked.</p></li></ul><div class="sl-heading-wrapper level-h2"><h2 id="documentation-flow-per-session">Documentation flow per session</h2><a class="sl-anchor-link" href="#documentation-flow-per-session"><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 “Documentation flow per session”</span></a></div><ol><li>Owning <code dir="auto">Type: law</code> / <code dir="auto">Type: spec</code> amendment (if functionality changed).</li><li><code dir="auto">Type: knowledge</code> wiki page updates (if reality changed).</li><li><code dir="auto">wiki/log/YYYY-MM-DD-topic.md</code> session writeup; <code dir="auto">wiki/log/DEVLOG.md</code>gets the short ledger line.</li></ol></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/process/development-style/" 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">Development style</span></span></a><a href="/misaligned/playtests/" 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">Evidence index</span></span></a></div></footer></div></div></main></div></div></div></div></body></html>