denisrigsby/Aetheria

A Windows-local, fail-closed supervisor for long-running AI work loops. Plant clock ≠ chat — chat is a mouth; the work clock is not the chat.

Python

2

85 commits

updated Sep 22, 2026

See the code

See what people are saying

README

Aetheria

CI License: MIT Python 3.10+ Release

A local supervisor for long-running AI work on one Windows PC. The chat window is optional. The work schedule is a separate process plus files on disk.

Plant clock ≠ chat. "Plant clock" means that schedule. "Chat" (also called the mouth, or Talk-face) does not own it. Closing the chat does not stop the schedule.

This repository is a public control-plane export. It is not the live operator plant. The parity label is PRIVATE_AHEAD (public export ≠ live plant): docs/EXPORT_PARITY.md.

P1–P5 are internal certification labels used on the operator plant. They are not an outside audit, and this repo does not treat them as one.

This repo and the private plant

In this GitHub repoOn the private operator machine
Supervisor, watchdog, stop and recover scripts, docsLive plant, Forge console, living memory, real cycle body
A mock / reference worker you can runHost paths, credentials, private measurements
Scrubbed receipt copies under measurements/public_index/The mouth and plant code those receipts describe

Cloning this repo does not give you the live plant. A full multi-hour run needs a complete local operator root. That root is private by design.

Real, proved, pending, locked

Finer labels (Tests, Mock, Untested, Private) live in docs/CLAIMS_TAXONOMY.md. The four words below are the ones that matter on this page. A receipt or a named CI check sits beside each claim, and the exclusion sits in the same row. One PASS cell is that row only. The evidence index is FINAL_STATE_BRIEF.md.

Real (in this repository, or the CI workflow on main runs it)

WhatLimitEvidence
Layout and compile of this treeDoes not start the private plantpython -u scripts/demo_local_smoke.py · docs/PUBLIC_DEMO.md
Reference mouth closes; a mock pulse keeps advancingMock worker. This is the public slice of plant clock ≠ chat. CI does not run this scriptpython -u scripts/demo_continuity.py · docs/CONTINUITY_DEMO.md
Process identity rejects the wrong role or a junk PID. Windows tasklist liveness uses the PID column"Unrelated processes survive stale-PID recovery" stays PARTIAL. The PID-column test does not flip gate_stale_pid_reuse_v1. OS PID-number reuse was not observed. This row is not a tree-kill. Tree-kill and Job Object stop are Proved on Windows only where a receipt says so, and Locked on non-WindowsCI runs tests/test_lh_process_identity.py and tests/test_pid_liveness_exact.py · docs/RELEASE_GATE_ASSURANCE.md
A raced start and recover admit one supervisorAssurance row is PASS for that test (exactly one spawn) on the Ubuntu and Windows CI jobs. It is not a tree-kill and not a watchdog relaunch. Tree-kill and Job Object stop are Locked on non-Windows. Corrupted / unknown-version → HOLD and clean stop ≠ crash stay PARTIAL. The test is not the live plantCI runs tests/test_two_controller_concurrency.py · docs/RELEASE_GATE_ASSURANCE.md
An interrupted JSON state write leaves the previous valid document or the new oneAssurance row is PASS for that test. Private plant ≠ this tree. No L7 / LIVE_RSI. No soft_ACCEPT. PID and STOP files are short in-place text. Append-only JSONL is out of scope. research/ artifacts are out of scope. HOLD and clean stop stay PARTIALCI on 395643e (run 35695450920) runs tests/test_atomic_state_writes.py and tests/test_interrupted_state_writes.py · docs/RELEASE_GATE_ASSURANCE.md

Proved (a receipt is in this repo)

These were accepted on the operator plant. The JSON files are scrubbed copies. Cloning does not re-run them. Exclusions in full: docs/CLOSEOUT.md.

Claim, in plain languageWhat it does not proveReceipt
Talk-face text has no visible [MODEL_REASONING] tag. Absolute /living/ cites are rewritten or refusedDoes not publish plant source. Copilot is not the mouthscrub, gate, accept
Direct-answer contract accepted by Cover and Architect. soft_ACCEPT is false. dual_bank is falseDoes not unlock L7 or LIVE_RSIgate, accept
A kill is refused when the process start time does not match, even if the command line still looks rightOS PID-number reuse was not observed. Tests in this repo do not flip that plant gategate
Four named kill sites pass that start time and refuse a mismatchNot every future kill site. Start time is not the only identity checkgate
Supervised clock ran 30 minutes with the mouth closed and the tick advancedLonger runs stay lockedgate
An identity-checked Windows Job Object stop ended an assigned process treeProved on Windows (operator plant). Locked on non-Windows. Not the only stop path. Linux CI does not re-prove it. Toolhelp is not retiredgate
Export hash census, with an explicit parity decisionThe decision on the receipt is PRIVATE_AHEAD, so public ≠ plantgate
Resume / stop / watchdog record is dual-bankedThe receipt has no claim sentence (claim_wording is null). No stop or relaunch behavior is claimed. Not a portable control planegate

Pending (not PASS on main)

  • Re-run of the receipts above inside this clone. The mouth and the plant body are not in this tree. docs/CLOSEOUT.md
  • Same Talk Face session, no gate file: Standby vs Offline labels, one desktop shortcut, windowed Edge instead of a frameless app window. Operator notes only. docs/CLOSEOUT.md
  • Assurance rows that are still PARTIAL: unrelated processes surviving stale-PID recovery; corrupted or unknown-version state ending in HOLD; clean stop distinguished from a crash; localhost mutations requiring authorization; a general "no secrets" scan (the CI path scan is narrower — see the assurance table). docs/RELEASE_GATE_ASSURANCE.md
  • Job Object containment on this repo's CI (PARTIAL). The plant receipt above is Proved on Windows only. It does not make the CI row PASS, and it is Locked on non-Windows.
  • Watchdog relaunch of a process tree. No gate file. Windows is the reference. Pending on non-Windows. Not a portable stop.
  • Held-out L5 "6/6" after the dual-face cut. No scrubbed receipt in this repo. docs/CLAIMS.md

Locked (not claimed)

  • This tree equals the live plant
  • Dual-bank full program. No receipt for gate_full_program_asset_class_v1 is in this repo
  • soft_ACCEPT, LIVE_RSI, L7
  • Copilot as the plant mouth
  • Federation, swarm, autonomy, self-healing, gated self-modification
  • Production-ready, enterprise, enterprise-grade, revolutionary
  • A second clock, automatic dispatch, live model hot-swap
  • Endurance past the 30-minute receipt
  • Job Object as the only stop path
  • A portable control plane: tree-kill, Job Object stop, or watchdog relaunch on non-Windows
  • A wider spawn wrap
  • P1–P5 as external accreditation

Run and check

Python 3.10+. Windows is the reference OS for stop, tree-kill, Job Object, and relaunch. The smoke commands below can run on other systems. They do not make stop or relaunch portable.

git clone https://github.com/denisrigsby/Aetheria.git
cd Aetheria

# 1. Run — layout and compile. No private plant.
python -u scripts/demo_local_smoke.py

# 2. Test — reference mouth closes; the mock pulse still advances.
python -u scripts/demo_continuity.py

# 3. Local checks — identity, single-flight start/recover, and fault injection.
python -m pip install pytest
python -m pytest tests/test_lh_process_identity.py tests/test_pid_liveness_exact.py tests/test_two_controller_concurrency.py tests/test_fault_injection_public.py -q

Windows wrappers for steps 1 and 2: Demo-Local.bat, Demo-Continuity.bat.

CI runs the files named in .github/workflows/ci.yml, including tests/test_lh_process_identity.py, tests/test_pid_liveness_exact.py, tests/test_two_controller_concurrency.py, tests/test_atomic_state_writes.py, and tests/test_interrupted_state_writes.py. It does not run demo_continuity.py, tests/test_fault_injection_public.py, or tests/test_talk_face_ref_allowlist.py. Those three are local checks. The workflow file is the list.

On a full local root, read-only status is python -u scripts/status_report.py. Stop is python -u scripts/aetheria.py stop (Windows tree-kill / Job Object; Locked on non-Windows). Recover is a different command from start: docs/OPERATIONS.md. The CI start/recover test is one supervisor admitted. It is not an OS relaunch.

DocWhy
FINAL_STATE_BRIEF.mdEvidence index (real / proved / pending / locked)
docs/CLOSEOUT.mdReceipt tables and exclusions
docs/CLAIMS_TAXONOMY.mdFront labels and finer labels
docs/RELEASE_GATE_ASSURANCE.mdPASS / PARTIAL / FAIL
docs/GLOSSARY.mdPlant clock, mouth, HOLD, Forge
docs/WHY.mdProblem and non-goals
docs/ARCHITECTURE.mdLayers
docs/RUNTIME_CONTRACT.mdHeartbeat, STOP, recover
SETUP.mdWhat a full local root still needs
docs/SCENARIO_30S.mdThe crash-and-hold picture, and what this clone can show

Glossary (short)

TermPlain meaning
Plant clockDetached supervised job runtime
Mouth / Talk-faceOptional local chat or operator UI
ForgePrivate operator console
Tick / cycleOne bounded unit of work
HOLDFail-closed pause until an operator acts
Cover / ArchitectTwo accept roles on a plant receipt. Both accepted means the receipt says so. It is not an outside audit

License

MIT © 2026 Denis Rigsby / Aetheria Project

aetheria
agent
agent-runtime
automation
control-plane
fail-closed
local-ai
long-horizon
persistent-agents
process-supervision
python
reliability
watchdog
windows

Contributors

denisrigsby

78 commits

denis

7 commits

denisrigsby/Aetheria

A Windows-local, fail-closed supervisor for long-running AI work loops. Plant clock ≠ chat — chat is a mouth; the work clock is not the chat.

Python

2

85 commits

updated Sep 22, 2026

See the code

See what people are saying

README

Aetheria

CI License: MIT Python 3.10+ Release

A local supervisor for long-running AI work on one Windows PC. The chat window is optional. The work schedule is a separate process plus files on disk.

Plant clock ≠ chat. "Plant clock" means that schedule. "Chat" (also called the mouth, or Talk-face) does not own it. Closing the chat does not stop the schedule.

This repository is a public control-plane export. It is not the live operator plant. The parity label is PRIVATE_AHEAD (public export ≠ live plant): docs/EXPORT_PARITY.md.

P1–P5 are internal certification labels used on the operator plant. They are not an outside audit, and this repo does not treat them as one.

This repo and the private plant

In this GitHub repoOn the private operator machine
Supervisor, watchdog, stop and recover scripts, docsLive plant, Forge console, living memory, real cycle body
A mock / reference worker you can runHost paths, credentials, private measurements
Scrubbed receipt copies under measurements/public_index/The mouth and plant code those receipts describe

Cloning this repo does not give you the live plant. A full multi-hour run needs a complete local operator root. That root is private by design.

Real, proved, pending, locked

Finer labels (Tests, Mock, Untested, Private) live in docs/CLAIMS_TAXONOMY.md. The four words below are the ones that matter on this page. A receipt or a named CI check sits beside each claim, and the exclusion sits in the same row. One PASS cell is that row only. The evidence index is FINAL_STATE_BRIEF.md.

Real (in this repository, or the CI workflow on main runs it)

WhatLimitEvidence
Layout and compile of this treeDoes not start the private plantpython -u scripts/demo_local_smoke.py · docs/PUBLIC_DEMO.md
Reference mouth closes; a mock pulse keeps advancingMock worker. This is the public slice of plant clock ≠ chat. CI does not run this scriptpython -u scripts/demo_continuity.py · docs/CONTINUITY_DEMO.md
Process identity rejects the wrong role or a junk PID. Windows tasklist liveness uses the PID column"Unrelated processes survive stale-PID recovery" stays PARTIAL. The PID-column test does not flip gate_stale_pid_reuse_v1. OS PID-number reuse was not observed. This row is not a tree-kill. Tree-kill and Job Object stop are Proved on Windows only where a receipt says so, and Locked on non-WindowsCI runs tests/test_lh_process_identity.py and tests/test_pid_liveness_exact.py · docs/RELEASE_GATE_ASSURANCE.md
A raced start and recover admit one supervisorAssurance row is PASS for that test (exactly one spawn) on the Ubuntu and Windows CI jobs. It is not a tree-kill and not a watchdog relaunch. Tree-kill and Job Object stop are Locked on non-Windows. Corrupted / unknown-version → HOLD and clean stop ≠ crash stay PARTIAL. The test is not the live plantCI runs tests/test_two_controller_concurrency.py · docs/RELEASE_GATE_ASSURANCE.md
An interrupted JSON state write leaves the previous valid document or the new oneAssurance row is PASS for that test. Private plant ≠ this tree. No L7 / LIVE_RSI. No soft_ACCEPT. PID and STOP files are short in-place text. Append-only JSONL is out of scope. research/ artifacts are out of scope. HOLD and clean stop stay PARTIALCI on 395643e (run 35695450920) runs tests/test_atomic_state_writes.py and tests/test_interrupted_state_writes.py · docs/RELEASE_GATE_ASSURANCE.md

Proved (a receipt is in this repo)

These were accepted on the operator plant. The JSON files are scrubbed copies. Cloning does not re-run them. Exclusions in full: docs/CLOSEOUT.md.

Claim, in plain languageWhat it does not proveReceipt
Talk-face text has no visible [MODEL_REASONING] tag. Absolute /living/ cites are rewritten or refusedDoes not publish plant source. Copilot is not the mouthscrub, gate, accept
Direct-answer contract accepted by Cover and Architect. soft_ACCEPT is false. dual_bank is falseDoes not unlock L7 or LIVE_RSIgate, accept
A kill is refused when the process start time does not match, even if the command line still looks rightOS PID-number reuse was not observed. Tests in this repo do not flip that plant gategate
Four named kill sites pass that start time and refuse a mismatchNot every future kill site. Start time is not the only identity checkgate
Supervised clock ran 30 minutes with the mouth closed and the tick advancedLonger runs stay lockedgate
An identity-checked Windows Job Object stop ended an assigned process treeProved on Windows (operator plant). Locked on non-Windows. Not the only stop path. Linux CI does not re-prove it. Toolhelp is not retiredgate
Export hash census, with an explicit parity decisionThe decision on the receipt is PRIVATE_AHEAD, so public ≠ plantgate
Resume / stop / watchdog record is dual-bankedThe receipt has no claim sentence (claim_wording is null). No stop or relaunch behavior is claimed. Not a portable control planegate

Pending (not PASS on main)

  • Re-run of the receipts above inside this clone. The mouth and the plant body are not in this tree. docs/CLOSEOUT.md
  • Same Talk Face session, no gate file: Standby vs Offline labels, one desktop shortcut, windowed Edge instead of a frameless app window. Operator notes only. docs/CLOSEOUT.md
  • Assurance rows that are still PARTIAL: unrelated processes surviving stale-PID recovery; corrupted or unknown-version state ending in HOLD; clean stop distinguished from a crash; localhost mutations requiring authorization; a general "no secrets" scan (the CI path scan is narrower — see the assurance table). docs/RELEASE_GATE_ASSURANCE.md
  • Job Object containment on this repo's CI (PARTIAL). The plant receipt above is Proved on Windows only. It does not make the CI row PASS, and it is Locked on non-Windows.
  • Watchdog relaunch of a process tree. No gate file. Windows is the reference. Pending on non-Windows. Not a portable stop.
  • Held-out L5 "6/6" after the dual-face cut. No scrubbed receipt in this repo. docs/CLAIMS.md

Locked (not claimed)

  • This tree equals the live plant
  • Dual-bank full program. No receipt for gate_full_program_asset_class_v1 is in this repo
  • soft_ACCEPT, LIVE_RSI, L7
  • Copilot as the plant mouth
  • Federation, swarm, autonomy, self-healing, gated self-modification
  • Production-ready, enterprise, enterprise-grade, revolutionary
  • A second clock, automatic dispatch, live model hot-swap
  • Endurance past the 30-minute receipt
  • Job Object as the only stop path
  • A portable control plane: tree-kill, Job Object stop, or watchdog relaunch on non-Windows
  • A wider spawn wrap
  • P1–P5 as external accreditation

Run and check

Python 3.10+. Windows is the reference OS for stop, tree-kill, Job Object, and relaunch. The smoke commands below can run on other systems. They do not make stop or relaunch portable.

git clone https://github.com/denisrigsby/Aetheria.git
cd Aetheria

# 1. Run — layout and compile. No private plant.
python -u scripts/demo_local_smoke.py

# 2. Test — reference mouth closes; the mock pulse still advances.
python -u scripts/demo_continuity.py

# 3. Local checks — identity, single-flight start/recover, and fault injection.
python -m pip install pytest
python -m pytest tests/test_lh_process_identity.py tests/test_pid_liveness_exact.py tests/test_two_controller_concurrency.py tests/test_fault_injection_public.py -q

Windows wrappers for steps 1 and 2: Demo-Local.bat, Demo-Continuity.bat.

CI runs the files named in .github/workflows/ci.yml, including tests/test_lh_process_identity.py, tests/test_pid_liveness_exact.py, tests/test_two_controller_concurrency.py, tests/test_atomic_state_writes.py, and tests/test_interrupted_state_writes.py. It does not run demo_continuity.py, tests/test_fault_injection_public.py, or tests/test_talk_face_ref_allowlist.py. Those three are local checks. The workflow file is the list.

On a full local root, read-only status is python -u scripts/status_report.py. Stop is python -u scripts/aetheria.py stop (Windows tree-kill / Job Object; Locked on non-Windows). Recover is a different command from start: docs/OPERATIONS.md. The CI start/recover test is one supervisor admitted. It is not an OS relaunch.

DocWhy
FINAL_STATE_BRIEF.mdEvidence index (real / proved / pending / locked)
docs/CLOSEOUT.mdReceipt tables and exclusions
docs/CLAIMS_TAXONOMY.mdFront labels and finer labels
docs/RELEASE_GATE_ASSURANCE.mdPASS / PARTIAL / FAIL
docs/GLOSSARY.mdPlant clock, mouth, HOLD, Forge
docs/WHY.mdProblem and non-goals
docs/ARCHITECTURE.mdLayers
docs/RUNTIME_CONTRACT.mdHeartbeat, STOP, recover
SETUP.mdWhat a full local root still needs
docs/SCENARIO_30S.mdThe crash-and-hold picture, and what this clone can show

Glossary (short)

TermPlain meaning
Plant clockDetached supervised job runtime
Mouth / Talk-faceOptional local chat or operator UI
ForgePrivate operator console
Tick / cycleOne bounded unit of work
HOLDFail-closed pause until an operator acts
Cover / ArchitectTwo accept roles on a plant receipt. Both accepted means the receipt says so. It is not an outside audit

License

MIT © 2026 Denis Rigsby / Aetheria Project

aetheria
agent
agent-runtime
automation
control-plane
fail-closed
local-ai
long-horizon
persistent-agents
process-supervision
python
reliability
watchdog
windows

Contributors

denisrigsby

78 commits

denis

7 commits

Languages

Python

94.7%

PowerShell

1.8%

CSS

1.5%

JavaScript

1.2%