diff --git a/.gitignore b/.gitignore index c659135..ea1c965 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,7 @@ _tmp/ # agent runtime output (plans the agent writes during /plan runs) .hermes/ + +# packed npm tarballs (npm pack output) — the registry is the distribution +# channel, not the repo +*.tgz diff --git a/README.md b/README.md index 9132689..4f30608 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,18 @@ Two things make it different from the rest of the terminal-agent shelf: **Aether Agent is in beta.** Updates are shipping quickly. +> **What `npm i -g` gives you today: 0.1.0.** The npm `latest` dist-tag is still +> `0.1.0`; **0.2.0 is on `main` but not yet published**. So the features described +> under [v0.2.0 in the release notes](RELEASE_NOTES.md) — portable handoffs, +> `--resume` reaching the brain, `aether agent --local ""` working straight +> after an install — are **not** in the package the command above installs. Until +> the 0.2.0 release is cut, build from source to get them: +> +> ```bash +> git clone https://github.com/AetherAI3/aether-agent +> cd aether-agent && npm ci && npm run build && npm link +> ``` + ## Carry the work across models and machines ```bash @@ -89,7 +101,7 @@ aether agent --local # …same terminal, nothing leaves the machi > Running the separate Python brain instead — Aether's open-source (Apache-2.0) **[Unlimited Context](https://github.com/AetherAI3/Unlimited-Context-LLM)** engine, which gives an Ollama model a billion-token working memory — is opt-in with `AETHER_LOCAL_BRAIN=python` once you have installed it. It is not bundled with the npm package. -> Prefer the installer UI? Download [`install.sh`](install.sh) or [`install.ps1`](install.ps1), inspect it, then run it locally. Set `AETHER_VERSION=0.2.0` (shell) or `-Version 0.2.0` (PowerShell) to pin an exact release. The canonical npm command above verifies registry integrity and disables lifecycle scripts; there are no native or runtime dependencies and no daemon. +> Prefer the installer UI? Download [`install.sh`](install.sh) or [`install.ps1`](install.ps1), inspect it, then run it locally. Both follow npm's `latest` dist-tag, which today is **0.1.0**; `AETHER_VERSION=` (shell) or `-Version ` (PowerShell) pins an exact **published** release, so a version that is not on the registry yet — 0.2.0 included — will fail with `No matching version found`. The canonical npm command above verifies registry integrity and disables lifecycle scripts; there are no native or runtime dependencies and no daemon. ## Models & pricing diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index b521887..f0bc61b 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,49 @@ +# Aether Agent v0.2.0 — the work outlives the session + +**August 19, 2026** + +Start a task on one model. Finish it on another, on another machine. Your tests +decide when it's done. + +- **Handoffs** — `aether resume export` writes one portable file: the task, the + model that ran it, the verify gate's verdict, how many tests were still + failing, the files that changed, the verification command, and the repository + it belongs to. Copy it anywhere and continue with `aether agent --resume + `, on whatever model you want. Nothing in it is keyed to an absolute + path, so the receiving checkout does not have to live where the work started — + and no file contents, shell commands, or credential-shaped values ride along. +- **`--resume` now reaches the brain** — the prior session is summarized into a + continuation brief the model reads before its own instruction, rather than + being replayed only for the human. With no new task, the run continues the + original one. No re-pasted chat history. +- **`aether agent --local ""` works after a plain npm install** — the + one-shot offline form used to spawn the separately-installed Python brain and + die with `spawn python ENOENT`. It now drives the Ollama brain that ships in + the package. `AETHER_LOCAL_BRAIN=python` opts back in. +- **Session logs stopped redacting your file paths** — the credential filter + matched `pat` inside `path`, so every edited file in every log read + `[REDACTED]`. Real credential keys are still redacted. +- **A run that never reached your tests no longer reports a failing one.** +- **`npm run demo:handoff`** — a five-second deterministic proof of all of it: + two sessions, two models, two checkouts, one verify gate, no account and no + model download. See [`docs/demo/handoff.md`](docs/demo/handoff.md). + +**Availability.** 0.2.0 is on `main`, but it is **not yet published to npm** — +the registry’s `latest` dist-tag still resolves to 0.1.0, so a plain +`npm i -g aether-agents` installs 0.1.0 and none of the above. Until the 0.2.0 +release is cut, build it from source: + +```bash +git clone https://github.com/AetherAI3/aether-agent +cd aether-agent && npm ci && npm run build && npm link +``` + +Once 0.2.0 is published, `npm i -g aether-agents --ignore-scripts` will upgrade in +place: no configuration changes, no migration, and 0.1.x session logs are read +unchanged. + +--- + # Aether Agent — your artifacts get an identity, and doctor stops guessing **August 14, 2026** @@ -37,40 +83,6 @@ Nothing to do on upgrade: `output open ` keeps working and existing history migrates on first read. Full detail in [docs/releases/2026-08-14.md](docs/releases/2026-08-14.md). ---- - -# Aether Agent v0.2.0 — the work outlives the session - -**August 19, 2026** - -Start a task on one model. Finish it on another, on another machine. Your tests -decide when it's done. - -- **Handoffs** — `aether resume export` writes one portable file: the task, the - model that ran it, the verify gate's verdict, how many tests were still - failing, the files that changed, the verification command, and the repository - it belongs to. Copy it anywhere and continue with `aether agent --resume - `, on whatever model you want. Nothing in it is keyed to an absolute - path, so the receiving checkout does not have to live where the work started — - and no file contents, shell commands, or credential-shaped values ride along. -- **`--resume` now reaches the brain** — the prior session is summarized into a - continuation brief the model reads before its own instruction, rather than - being replayed only for the human. With no new task, the run continues the - original one. No re-pasted chat history. -- **`aether agent --local ""` works after a plain npm install** — the - one-shot offline form used to spawn the separately-installed Python brain and - die with `spawn python ENOENT`. It now drives the Ollama brain that ships in - the package. `AETHER_LOCAL_BRAIN=python` opts back in. -- **Session logs stopped redacting your file paths** — the credential filter - matched `pat` inside `path`, so every edited file in every log read - `[REDACTED]`. Real credential keys are still redacted. -- **A run that never reached your tests no longer reports a failing one.** -- **`npm run demo:handoff`** — a five-second deterministic proof of all of it: - two sessions, two models, two checkouts, one verify gate, no account and no - model download. See [`docs/demo/handoff.md`](docs/demo/handoff.md). - -Upgrade with `npm i -g aether-agents --ignore-scripts`. No configuration -changes, no migration; 0.1.x session logs are read unchanged. --- diff --git a/aether-agents-0.2.0.tgz b/aether-agents-0.2.0.tgz deleted file mode 100644 index 8cbb596..0000000 Binary files a/aether-agents-0.2.0.tgz and /dev/null differ diff --git a/commands.jsx b/commands.jsx deleted file mode 100644 index 43db436..0000000 --- a/commands.jsx +++ /dev/null @@ -1,504 +0,0 @@ -/* global React, ReactDOM, AetherLogo, CloudAgent, IconInstall, IconCloud, IconLocal */ -const { useState, useEffect, useRef, useCallback } = React; - -/* ============================================================ - Copyable command block - ============================================================ */ -function CommandBlock({ lines }) { - const [copied, setCopied] = useState(false); - const text = lines.map(l => l.t).join("\n"); - - const copy = useCallback(() => { - const done = () => { setCopied(true); setTimeout(() => setCopied(false), 1400); }; - if (navigator.clipboard && navigator.clipboard.writeText) { - navigator.clipboard.writeText(text).then(done).catch(done); - } else { done(); } - }, [text]); - - return ( -
- {lines.map((l, i) => ( -
- {l.p && {l.p} } - {l.cmd} - {l.arg && {l.arg}} -
- ))} - - {copied ? '✓ copied' : 'copy'} - -
- ); -} - -/* ============================================================ - Hidden thinking tokens — reasoning model panel - ============================================================ */ -const THINKING = `the task is an async/await refactor of src/auth.ts — first I should -not trust my memory of the file, so I scan: 142 lines, 4 callback -sites in login(), refresh(), expiry guard, and a bad-token branch. -grep_symbol confirms 7 call sites across 2 files. converting the -callbacks naively would drop the error path, so each await needs a -try/catch; refresh() shares state with expiry — order matters there. -I'll stage 4 hunks + 1 test file (login · refresh · expiry · bad -token), keep edits path-guarded inside the working dir, and let the -host run the test command for ground truth rather than declaring -"done" myself. confidence on the plan: 0.93 → accept.`; - -function ThinkingPanel({ active }) { - const [open, setOpen] = useState(false); - const [shown, setShown] = useState(0); - const raf = useRef(null); - - useEffect(() => { - if (!open) { setShown(0); return; } - let i = 0; - const tick = () => { - i += 2; - setShown(i); - if (i < THINKING.length) raf.current = setTimeout(tick, 12); - }; - tick(); - return () => clearTimeout(raf.current); - }, [open]); - - const tokens = Math.round(THINKING.length / 0.62); // believable token count - const streaming = open && shown < THINKING.length; - - return ( -
- - -
-
- {THINKING.slice(0, shown)} - {streaming && } -
-
-
- ); -} - -/* ============================================================ - Live agent strip — scan → reason → verify - ============================================================ */ -const STAGES = [ - { - key: 'SCAN', delay: 0, - lines: [ - { kind: 'sub', t: 'mapping imports of src/auth.ts' }, - { kind: 'tool', t: 'read_file', meta: 'src/auth.ts · 142 lines · 4 callbacks' }, - { kind: 'tool', t: 'grep_symbol', meta: 'find all callers before the rewrite' }, - { kind: 'ok', t: 'mapped 2 files · 7 call sites', tail: 'stage complete' }, - ], - }, - { - key: 'REASON', delay: 1500, - lines: [ - { kind: 'sub', t: 'planning the async/await conversion' }, - { kind: 'think' }, - { kind: 'ok', t: 'plan locked · 4 hunks + 1 test file', tail: 'converged' }, - ], - }, - { - key: 'VERIFY', delay: 3400, - lines: [ - { kind: 'sub', t: 'host runs your test command — exit code is ground truth' }, - { kind: 'ok', t: '6 passed in 0.42s', tail: 'green' }, - ], - }, -]; - -function StageHeader({ name, active }) { - return ( -
- - ={'='}[ {name} ]={'='} - - (๑•ᴗ•)ﻭ✎ -
- ); -} - -function Line({ l }) { - if (l.kind === 'sub') { - return ( -
- - {l.t} -
- ); - } - if (l.kind === 'tool') { - return ( -
- * - {l.t} - {' '}{l.meta} -
- ); - } - if (l.kind === 'ok') { - return ( -
- [OK]{' '} - {l.t} - {l.tail && {' '}({l.tail})} -
- ); - } - return null; -} - -function AgentStrip() { - const [step, setStep] = useState(0); // global count of revealed lines - const [runKey, setRunKey] = useState(0); - - // Flatten stages -> list of {stageIdx, line} - const flat = []; - STAGES.forEach((s, si) => s.lines.forEach(line => flat.push({ si, line }))); - - useEffect(() => { - setStep(0); - const timers = []; - let acc = 350; - flat.forEach((_, i) => { - // thinking line pauses a touch longer - const isThink = flat[i].line.kind === 'think'; - acc += isThink ? 620 : 480; - timers.push(setTimeout(() => setStep(i + 1), acc)); - }); - return () => timers.forEach(clearTimeout); - // eslint-disable-next-line - }, [runKey]); - - const reasonActive = (() => { - const idx = flat.findIndex(f => f.line.kind === 'think'); - return step > idx; // think line revealed - })(); - const done = step >= flat.length; - - let lastStage = -1; - - return ( -
-
-
- aether agent - - /opus - * - /effort - code-pro - - - refactor src/auth.ts → async/await + tests - -
- -
- -
- {flat.map((f, i) => { - if (i >= step) return null; - const showHeader = f.si !== lastStage; - lastStage = f.si; - const isLastRevealed = i === step - 1 && !done; - return ( -
- {showHeader && ( - = step - 1 && !done} /> - )} - {f.line.kind === 'think' - ?
- : } - {isLastRevealed && f.line.kind !== 'think' && ( - - )} -
- ); - })} -
- - {/* context meter */} -
- anchoring context _ϕ(°-°=) -
-
-
- 412.6M / 1.17B -
- - -
- ); -} - -/* ============================================================ - Install cards - ============================================================ */ -const CARDS = [ - { - n: '01', tag: 'INSTALL', Icon: IconInstall, - title: 'Drop it in', - sub: 'one global install · Node ≥ 24', - lines: [ - { p: '$', cmd: 'npm i -g aether-agents' }, - ], - foot: 'or curl install.sh · no native deps', - }, - { - n: '02', tag: 'HOSTED', Icon: IconCloud, - title: 'Run on the fleet', - sub: 'Claude · GPT · DeepSeek · Neo', - lines: [ - { p: '$', cmd: 'aether auth login' }, - { p: '$', cmd: 'aether agent ', arg: '"refactor src/auth.ts"' }, - ], - foot: 'your code stays local — only context leaves', - }, - { - n: '03', tag: 'LOCAL', Icon: IconLocal, - title: 'Go fully offline', - sub: 'any Ollama model · no account or network', - lines: [ - { p: '$', cmd: 'ollama pull qwen2.5-coder:7b' }, - { p: '$', cmd: 'aether agent --local ', arg: '"same task"' }, - ], - foot: 'nothing leaves the machine', - }, -]; - -function InstallCard({ c }) { - const [hover, setHover] = useState(false); - return ( -
setHover(true)} - onMouseLeave={() => setHover(false)} - style={{ - position: 'relative', - background: 'var(--panel)', - border: `1px solid ${hover ? 'var(--line-strong)' : 'var(--line)'}`, - borderRadius: 14, padding: '16px 15px 14px', - display: 'flex', flexDirection: 'column', gap: 11, - transform: hover ? 'translateY(-4px)' : 'none', - boxShadow: hover ? '0 18px 44px -22px rgba(34,211,238,0.5)' : '0 10px 30px -26px rgba(0,0,0,0.8)', - transition: 'transform .22s ease, box-shadow .22s ease, border-color .22s ease', - overflow: 'hidden', - }} - > -
-
-
- - {c.tag} -
- {c.n} -
- -
-
{c.title}
-
{c.sub}
-
- - - -
- - {c.foot} -
-
- ); -} - -/* ============================================================ - App - ============================================================ */ -function App() { - return ( -
- {/* window chrome card */} -
- {/* title bar */} -
- - - - - aether agent — coding session - - v0.1.0 -
- - {/* clean header — cloud + AETHER as one unit inside the terminal */} -
- -
-

- An open-source coding agent for your terminal — cloud or --local. - It scans, plans, edits, and runs your tests on its own. - And with QOPC 🧠 it learns from what you accept or discard — getting better the more you use it. -

-
- - {/* live agent strip */} -
- -
- - {/* install cards */} -
-
-
Install in three moves
-
- pick a brain — hosted or local, both behave identically -
-
-
- {CARDS.map(c => )} -
- - - - - -
-
View the source on GitHub
-
- star it, fork it, ship it -
-
- - github.com - -
-
- - - -
-
- ); -} - -ReactDOM.createRoot(document.getElementById('root')).render(); diff --git a/_loopstate/LOOP-01/sc-a0-2026-08-19/AUDIT-ARTIFACT.md b/docs/loops/LOOP-01/sc-a0-2026-08-19/AUDIT-ARTIFACT.md similarity index 100% rename from _loopstate/LOOP-01/sc-a0-2026-08-19/AUDIT-ARTIFACT.md rename to docs/loops/LOOP-01/sc-a0-2026-08-19/AUDIT-ARTIFACT.md diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/AUDIT-ARTIFACT.md b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/AUDIT-ARTIFACT.md similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/AUDIT-ARTIFACT.md rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/AUDIT-ARTIFACT.md diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/hosted-ci-repair.md b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/hosted-ci-repair.md similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/hosted-ci-repair.md rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/hosted-ci-repair.md diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-1.json b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-1.json similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-1.json rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-1.json diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-2.json b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-2.json similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-2.json rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-2.json diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-3.json b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-3.json similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-3.json rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-3.json diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-4.json b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-4.json similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-4.json rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-4.json diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-5.json b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-5.json similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-5.json rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-5.json diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-6.json b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-6.json similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-6.json rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-6.json diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-7.json b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-7.json similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-7.json rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-7.json diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-8.json b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-8.json similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-8.json rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-8.json diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-9.json b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-9.json similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/node-9.json rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/node-9.json diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/topology-drift.md b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/topology-drift.md similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/topology-drift.md rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/topology-drift.md diff --git a/_loopstate/LOOP-07/2026-07-20T13-53-25-0400/trace.md b/docs/loops/LOOP-07/2026-07-20T13-53-25-0400/trace.md similarity index 100% rename from _loopstate/LOOP-07/2026-07-20T13-53-25-0400/trace.md rename to docs/loops/LOOP-07/2026-07-20T13-53-25-0400/trace.md diff --git a/_loopstate/LOOP-11/2026-07-20T14-04-43-0400/AUDIT-ARTIFACT.md b/docs/loops/LOOP-11/2026-07-20T14-04-43-0400/AUDIT-ARTIFACT.md similarity index 100% rename from _loopstate/LOOP-11/2026-07-20T14-04-43-0400/AUDIT-ARTIFACT.md rename to docs/loops/LOOP-11/2026-07-20T14-04-43-0400/AUDIT-ARTIFACT.md diff --git a/_loopstate/LOOP-11/2026-07-20T14-04-43-0400/config.md b/docs/loops/LOOP-11/2026-07-20T14-04-43-0400/config.md similarity index 100% rename from _loopstate/LOOP-11/2026-07-20T14-04-43-0400/config.md rename to docs/loops/LOOP-11/2026-07-20T14-04-43-0400/config.md diff --git a/_loopstate/LOOP-11/2026-07-20T14-04-43-0400/round-0-intake.md b/docs/loops/LOOP-11/2026-07-20T14-04-43-0400/round-0-intake.md similarity index 100% rename from _loopstate/LOOP-11/2026-07-20T14-04-43-0400/round-0-intake.md rename to docs/loops/LOOP-11/2026-07-20T14-04-43-0400/round-0-intake.md diff --git a/_loopstate/LOOP-11/2026-07-20T14-04-43-0400/round-1-critique.md b/docs/loops/LOOP-11/2026-07-20T14-04-43-0400/round-1-critique.md similarity index 100% rename from _loopstate/LOOP-11/2026-07-20T14-04-43-0400/round-1-critique.md rename to docs/loops/LOOP-11/2026-07-20T14-04-43-0400/round-1-critique.md diff --git a/_loopstate/LOOP-11/2026-07-20T14-04-43-0400/round-1-revision.md b/docs/loops/LOOP-11/2026-07-20T14-04-43-0400/round-1-revision.md similarity index 100% rename from _loopstate/LOOP-11/2026-07-20T14-04-43-0400/round-1-revision.md rename to docs/loops/LOOP-11/2026-07-20T14-04-43-0400/round-1-revision.md diff --git a/_loopstate/LOOP-11/2026-07-20T14-04-43-0400/round-2-score.md b/docs/loops/LOOP-11/2026-07-20T14-04-43-0400/round-2-score.md similarity index 100% rename from _loopstate/LOOP-11/2026-07-20T14-04-43-0400/round-2-score.md rename to docs/loops/LOOP-11/2026-07-20T14-04-43-0400/round-2-score.md diff --git a/_loopstate/LOOP-11/2026-07-20T14-04-43-0400/trace.md b/docs/loops/LOOP-11/2026-07-20T14-04-43-0400/trace.md similarity index 100% rename from _loopstate/LOOP-11/2026-07-20T14-04-43-0400/trace.md rename to docs/loops/LOOP-11/2026-07-20T14-04-43-0400/trace.md diff --git a/_loopstate/LOOP-11/2026-07-20T14-04-43-0400/verdict.md b/docs/loops/LOOP-11/2026-07-20T14-04-43-0400/verdict.md similarity index 100% rename from _loopstate/LOOP-11/2026-07-20T14-04-43-0400/verdict.md rename to docs/loops/LOOP-11/2026-07-20T14-04-43-0400/verdict.md diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/AUDIT-ARTIFACT.md b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/AUDIT-ARTIFACT.md similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/AUDIT-ARTIFACT.md rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/AUDIT-ARTIFACT.md diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/chaos-grade-matrix.md b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/chaos-grade-matrix.md similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/chaos-grade-matrix.md rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/chaos-grade-matrix.md diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/coverage-gap-map.md b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/coverage-gap-map.md similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/coverage-gap-map.md rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/coverage-gap-map.md diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/mutation-report.md b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/mutation-report.md similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/mutation-report.md rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/mutation-report.md diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-1.json b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-1.json similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-1.json rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-1.json diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-2.json b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-2.json similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-2.json rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-2.json diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-3.json b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-3.json similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-3.json rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-3.json diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-4.json b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-4.json similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-4.json rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-4.json diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-5.json b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-5.json similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-5.json rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-5.json diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-6.json b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-6.json similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-6.json rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-6.json diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-7.json b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-7.json similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-7.json rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-7.json diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-8.json b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-8.json similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-8.json rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-8.json diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-9.json b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-9.json similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/node-9.json rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/node-9.json diff --git a/_loopstate/LOOP-12/2026-07-20T14-12-13-0400/trace.md b/docs/loops/LOOP-12/2026-07-20T14-12-13-0400/trace.md similarity index 100% rename from _loopstate/LOOP-12/2026-07-20T14-12-13-0400/trace.md rename to docs/loops/LOOP-12/2026-07-20T14-12-13-0400/trace.md diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/AUDIT-ARTIFACT.md b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/AUDIT-ARTIFACT.md similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/AUDIT-ARTIFACT.md rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/AUDIT-ARTIFACT.md diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/complexity-report.md b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/complexity-report.md similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/complexity-report.md rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/complexity-report.md diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/delta-report.md b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/delta-report.md similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/delta-report.md rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/delta-report.md diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/duplication-dead-surface.md b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/duplication-dead-surface.md similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/duplication-dead-surface.md rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/duplication-dead-surface.md diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-1.json b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-1.json similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-1.json rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-1.json diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-2.json b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-2.json similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-2.json rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-2.json diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-3.json b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-3.json similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-3.json rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-3.json diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-4.json b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-4.json similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-4.json rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-4.json diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-5.json b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-5.json similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-5.json rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-5.json diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-6.json b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-6.json similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-6.json rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-6.json diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-7.json b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-7.json similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/node-7.json rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/node-7.json diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/scorecard.md b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/scorecard.md similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/scorecard.md rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/scorecard.md diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/structural-drift.md b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/structural-drift.md similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/structural-drift.md rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/structural-drift.md diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/target-architecture.json b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/target-architecture.json similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/target-architecture.json rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/target-architecture.json diff --git a/_loopstate/LOOP-13/2026-07-20T14-19-07-0400/trace.md b/docs/loops/LOOP-13/2026-07-20T14-19-07-0400/trace.md similarity index 100% rename from _loopstate/LOOP-13/2026-07-20T14-19-07-0400/trace.md rename to docs/loops/LOOP-13/2026-07-20T14-19-07-0400/trace.md diff --git a/_loopstate/LOOP-13/debt-trend.md b/docs/loops/LOOP-13/debt-trend.md similarity index 100% rename from _loopstate/LOOP-13/debt-trend.md rename to docs/loops/LOOP-13/debt-trend.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/AUDIT-ARTIFACT.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/AUDIT-ARTIFACT.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/AUDIT-ARTIFACT.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/AUDIT-ARTIFACT.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-1-attempt.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-1-attempt.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-1-attempt.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-1-attempt.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-1-candidates.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-1-candidates.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-1-candidates.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-1-candidates.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-2-attempt.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-2-attempt.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-2-attempt.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-2-attempt.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-2-candidates.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-2-candidates.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-2-candidates.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-2-candidates.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-3-attempt.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-3-attempt.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-3-attempt.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-3-attempt.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-3-candidates.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-3-candidates.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-3-candidates.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-3-candidates.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-4-attempt.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-4-attempt.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-4-attempt.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-4-attempt.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-4-candidates.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-4-candidates.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-4-candidates.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-4-candidates.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-5-attempt.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-5-attempt.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-5-attempt.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-5-attempt.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-5-candidates.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-5-candidates.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-5-candidates.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-5-candidates.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-6-attempt.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-6-attempt.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-6-attempt.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-6-attempt.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-6-candidates.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-6-candidates.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-6-candidates.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-6-candidates.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-7-attempt.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-7-attempt.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-7-attempt.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-7-attempt.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-7-candidates.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-7-candidates.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-7-candidates.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-7-candidates.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-8-attempt.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-8-attempt.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-8-attempt.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-8-attempt.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-8-candidates.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-8-candidates.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-8-candidates.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/breaker-round-8-candidates.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-1-fix.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-1-fix.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-1-fix.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-1-fix.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-1-intake.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-1-intake.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-1-intake.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-1-intake.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-2-fix.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-2-fix.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-2-fix.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-2-fix.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-2-intake.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-2-intake.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-2-intake.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-2-intake.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-3-fix.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-3-fix.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-3-fix.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-3-fix.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-3-intake.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-3-intake.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/builder-round-3-intake.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/builder-round-3-intake.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-1.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-1.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-1.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-1.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-2.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-2.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-2.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-2.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-3.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-3.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-3.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-3.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-4.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-4.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-4.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-4.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-5.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-5.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-5.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-5.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-6.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-6.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-6.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-6.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-7.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-7.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-7.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-7.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-8.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-8.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-8.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/convergence-round-8.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/human-report.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/human-report.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/human-report.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/human-report.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/queue.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/queue.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/queue.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/queue.md diff --git a/_loopstate/LOOP-17/2026-07-20T13-58-39-0400/trace.md b/docs/loops/LOOP-17/2026-07-20T13-58-39-0400/trace.md similarity index 100% rename from _loopstate/LOOP-17/2026-07-20T13-58-39-0400/trace.md rename to docs/loops/LOOP-17/2026-07-20T13-58-39-0400/trace.md diff --git a/_loopstate/governance-ledger.md b/docs/loops/governance-ledger.md similarity index 100% rename from _loopstate/governance-ledger.md rename to docs/loops/governance-ledger.md diff --git a/docs/specs/2026-07-20-devops-production-hardening-design.md b/docs/specs/2026-07-20-devops-production-hardening-design.md index d2407ee..d00ca68 100644 --- a/docs/specs/2026-07-20-devops-production-hardening-design.md +++ b/docs/specs/2026-07-20-devops-production-hardening-design.md @@ -56,7 +56,7 @@ This file began as the starting point and now records the completed run. - A production verifier enforcing manifest, package allowlist/size, workflow, release, installer, and installed-CLI invariants. - A Windows portability repair for workspace containment when runner temp paths use an alias; lexical traversal and canonical symlink guards remain independently enforced. - Operations, rollback, backup, observability, ownership, and required-administrator-control documentation. -- Full loop artifacts and governance trail under `_loopstate/LOOP-07`, `LOOP-17`, `LOOP-11`, `LOOP-12`, and `LOOP-13`. +- Full loop artifacts and governance trail under `docs/loops/LOOP-07`, `LOOP-17`, `LOOP-11`, `LOOP-12`, and `LOOP-13`. ## Remaining operator gate diff --git a/install.sh b/install.sh index 28f37a7..0b65917 100644 --- a/install.sh +++ b/install.sh @@ -8,8 +8,10 @@ set -eu -# Pin a specific release with AETHER_VERSION=0.2.0. The default follows npm's -# latest dist-tag, while the quoted package spec prevents shell interpretation. +# Pin a specific PUBLISHED release with AETHER_VERSION=, e.g. 0.1.0. +# The default follows npm's latest dist-tag, while the quoted package spec +# prevents shell interpretation. A version that is not on the registry yet +# cannot be installed this way — build from source instead (see README). AETHER_VERSION="${AETHER_VERSION:-latest}" case "$AETHER_VERSION" in ""|*[!0-9A-Za-z.+-]*) @@ -116,6 +118,12 @@ fi if ! npm install -g "aether-agents@${AETHER_VERSION}" --ignore-scripts; then error "Install failed. Check your network and npm permissions." echo "" + if [ "$AETHER_VERSION" != "latest" ]; then + info "If you see 'No matching version found', ${AETHER_VERSION} is not on the" + info "registry yet. Published versions: npm view aether-agents versions" + info "To run an unpublished version, build from source — see the README." + echo "" + fi info "If you see EACCES errors, try one of:" info " npm install -g aether-agents@${AETHER_VERSION} --ignore-scripts --prefix ~/.local" info " Or install Node with a version manager from https://nodejs.org/en/download" diff --git a/src/generated/agent_capabilities.ts b/src/generated/agent_capabilities.ts index 119118c..04cacc4 100644 --- a/src/generated/agent_capabilities.ts +++ b/src/generated/agent_capabilities.ts @@ -3,7 +3,17 @@ // Source commit: 97eacd3e9aca4df226cae638f8f8868b8219fe88 // Contract version: 1 // Canonical sha256: 8da094234a370a28dfd6206f039425f086307aa9ca0a67bc004d3d453716ac04 -// Regenerate: node scratchpad gen_fallback.mjs (see docs/releases/skills-health notes) +// Regenerate (no generator script is checked in; this is the whole procedure): +// 1. Take contracts/agent-capabilities.v1.json from the source repo at the +// commit you want to pin. +// 2. Paste it as AGENT_CAPABILITIES_FALLBACK below, and set the header's +// "Source commit" to that commit. +// 3. Recompute AGENT_CAPABILITIES_DIGEST as the sha256 of the CANONICAL +// encoding — JSON with object keys sorted recursively, no whitespace: +// sha256(JSON.stringify(sortKeysDeep(contract))) +// and copy it into the "Canonical sha256" header line too. +// 4. Update AGENT_CAPABILITIES_SOURCE.commit / .contractVersion to match. +// The digest below was verified to reproduce under exactly that recipe. /** Offline fallback snapshot of the canonical agent capability contract. */ export const AGENT_CAPABILITIES_FALLBACK = {