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
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.
| In this GitHub repo | On the private operator machine |
|---|---|
| Supervisor, watchdog, stop and recover scripts, docs | Live plant, Forge console, living memory, real cycle body |
| A mock / reference worker you can run | Host 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.
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.
| What | Limit | Evidence |
|---|---|---|
| Layout and compile of this tree | Does not start the private plant | python -u scripts/demo_local_smoke.py · docs/PUBLIC_DEMO.md |
| Reference mouth closes; a mock pulse keeps advancing | Mock worker. This is the public slice of plant clock ≠ chat. CI does not run this script | python -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-Windows | CI 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 supervisor | Assurance 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 plant | CI 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 one | Assurance 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 PARTIAL | CI on 395643e (run 35695450920) runs tests/test_atomic_state_writes.py and tests/test_interrupted_state_writes.py · docs/RELEASE_GATE_ASSURANCE.md |
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 language | What it does not prove | Receipt |
|---|---|---|
Talk-face text has no visible [MODEL_REASONING] tag. Absolute /living/ cites are rewritten or refused | Does not publish plant source. Copilot is not the mouth | scrub, gate, accept |
Direct-answer contract accepted by Cover and Architect. soft_ACCEPT is false. dual_bank is false | Does not unlock L7 or LIVE_RSI | gate, accept |
| A kill is refused when the process start time does not match, even if the command line still looks right | OS PID-number reuse was not observed. Tests in this repo do not flip that plant gate | gate |
| Four named kill sites pass that start time and refuse a mismatch | Not every future kill site. Start time is not the only identity check | gate |
| Supervised clock ran 30 minutes with the mouth closed and the tick advanced | Longer runs stay locked | gate |
| An identity-checked Windows Job Object stop ended an assigned process tree | Proved on Windows (operator plant). Locked on non-Windows. Not the only stop path. Linux CI does not re-prove it. Toolhelp is not retired | gate |
| Export hash census, with an explicit parity decision | The decision on the receipt is PRIVATE_AHEAD, so public ≠ plant | gate |
| Resume / stop / watchdog record is dual-banked | The receipt has no claim sentence (claim_wording is null). No stop or relaunch behavior is claimed. Not a portable control plane | gate |
gate_full_program_asset_class_v1 is in this reposoft_ACCEPT, LIVE_RSI, L7Python 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.
| Doc | Why |
|---|---|
| FINAL_STATE_BRIEF.md | Evidence index (real / proved / pending / locked) |
| docs/CLOSEOUT.md | Receipt tables and exclusions |
| docs/CLAIMS_TAXONOMY.md | Front labels and finer labels |
| docs/RELEASE_GATE_ASSURANCE.md | PASS / PARTIAL / FAIL |
| docs/GLOSSARY.md | Plant clock, mouth, HOLD, Forge |
| docs/WHY.md | Problem and non-goals |
| docs/ARCHITECTURE.md | Layers |
| docs/RUNTIME_CONTRACT.md | Heartbeat, STOP, recover |
| SETUP.md | What a full local root still needs |
| docs/SCENARIO_30S.md | The crash-and-hold picture, and what this clone can show |
| Term | Plain meaning |
|---|---|
| Plant clock | Detached supervised job runtime |
| Mouth / Talk-face | Optional local chat or operator UI |
| Forge | Private operator console |
| Tick / cycle | One bounded unit of work |
| HOLD | Fail-closed pause until an operator acts |
| Cover / Architect | Two accept roles on a plant receipt. Both accepted means the receipt says so. It is not an outside audit |
MIT © 2026 Denis Rigsby / Aetheria Project
78 commits
7 commits
Python
94.7%
PowerShell
1.8%
CSS
1.5%
JavaScript
1.2%
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
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.
| In this GitHub repo | On the private operator machine |
|---|---|
| Supervisor, watchdog, stop and recover scripts, docs | Live plant, Forge console, living memory, real cycle body |
| A mock / reference worker you can run | Host 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.
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.
| What | Limit | Evidence |
|---|---|---|
| Layout and compile of this tree | Does not start the private plant | python -u scripts/demo_local_smoke.py · docs/PUBLIC_DEMO.md |
| Reference mouth closes; a mock pulse keeps advancing | Mock worker. This is the public slice of plant clock ≠ chat. CI does not run this script | python -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-Windows | CI 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 supervisor | Assurance 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 plant | CI 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 one | Assurance 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 PARTIAL | CI on 395643e (run 35695450920) runs tests/test_atomic_state_writes.py and tests/test_interrupted_state_writes.py · docs/RELEASE_GATE_ASSURANCE.md |
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 language | What it does not prove | Receipt |
|---|---|---|
Talk-face text has no visible [MODEL_REASONING] tag. Absolute /living/ cites are rewritten or refused | Does not publish plant source. Copilot is not the mouth | scrub, gate, accept |
Direct-answer contract accepted by Cover and Architect. soft_ACCEPT is false. dual_bank is false | Does not unlock L7 or LIVE_RSI | gate, accept |
| A kill is refused when the process start time does not match, even if the command line still looks right | OS PID-number reuse was not observed. Tests in this repo do not flip that plant gate | gate |
| Four named kill sites pass that start time and refuse a mismatch | Not every future kill site. Start time is not the only identity check | gate |
| Supervised clock ran 30 minutes with the mouth closed and the tick advanced | Longer runs stay locked | gate |
| An identity-checked Windows Job Object stop ended an assigned process tree | Proved on Windows (operator plant). Locked on non-Windows. Not the only stop path. Linux CI does not re-prove it. Toolhelp is not retired | gate |
| Export hash census, with an explicit parity decision | The decision on the receipt is PRIVATE_AHEAD, so public ≠ plant | gate |
| Resume / stop / watchdog record is dual-banked | The receipt has no claim sentence (claim_wording is null). No stop or relaunch behavior is claimed. Not a portable control plane | gate |
gate_full_program_asset_class_v1 is in this reposoft_ACCEPT, LIVE_RSI, L7Python 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.
| Doc | Why |
|---|---|
| FINAL_STATE_BRIEF.md | Evidence index (real / proved / pending / locked) |
| docs/CLOSEOUT.md | Receipt tables and exclusions |
| docs/CLAIMS_TAXONOMY.md | Front labels and finer labels |
| docs/RELEASE_GATE_ASSURANCE.md | PASS / PARTIAL / FAIL |
| docs/GLOSSARY.md | Plant clock, mouth, HOLD, Forge |
| docs/WHY.md | Problem and non-goals |
| docs/ARCHITECTURE.md | Layers |
| docs/RUNTIME_CONTRACT.md | Heartbeat, STOP, recover |
| SETUP.md | What a full local root still needs |
| docs/SCENARIO_30S.md | The crash-and-hold picture, and what this clone can show |
| Term | Plain meaning |
|---|---|
| Plant clock | Detached supervised job runtime |
| Mouth / Talk-face | Optional local chat or operator UI |
| Forge | Private operator console |
| Tick / cycle | One bounded unit of work |
| HOLD | Fail-closed pause until an operator acts |
| Cover / Architect | Two accept roles on a plant receipt. Both accepted means the receipt says so. It is not an outside audit |
MIT © 2026 Denis Rigsby / Aetheria Project
78 commits
7 commits
Python
94.7%
PowerShell
1.8%
CSS
1.5%
JavaScript
1.2%