The Machine Problem 9 good · 1 watch · 7 problem testing build 324f4ab3 · built 6h ago as of Aug 2, 6:51 PM

Heartbeat: newest graded test row is 0 min old.

This is the whole machine on one page. The eight boxes are one loop: a problem is found by testing the real app, grouped with others like it, written up as a job, built by an AI coder, checked twice, merged, and rebuilt — then tested again. The five boxes underneath are what watches the loop. Every lamp is live. Point at any box for a plain-English description.

The loop — ten stages where the work turns What watches the loop Features & requests 1 Test run 8 scripts running on 4 simulators 2 Grade 450 failed utterances 0 clustered · 450 awaitin… 3 Cluster into defects unknown 0 assigned to fix units 4 Fix units 0 active fix units 0 awaiting prompt · 0 fro… 5 Prompts 0 writing 0 queued for analysis 6 Analysis 0 in analysis 0 done · queued to land 7 Land into app 0 landing now 0 of 17 areas · max 1 each 8 Gate + review 0 reviewing 0 rejected · 0 parked 9 Merge 0 app fixes in 24h 0 machine fixes in 24h 10 Rebuild the app build 324f4ab3 built 6h ago Health monitor 9 good · 1 watch · 7 bad checked 1 min ago Permanence guard 6 of 6 required up 3 off on purpose Off-machine alarm not receiving local pulse 20s ago Ledger 526 items 265 still open Publisher red renders + pushes your pages DrawingThe machine — live schematicDrawn atAug 2, 6:51 PMApp under test324f4ab3 · Aug 2, 12:50 PMLoopTurning · 8 things in motion

Hover a box to read it · click to keep it open · Esc closesTap a box to read it · the diagram scrolls sideways · the dashes are moving because work is moving

The pipeline, stage by stageterms per GLOSSARY.md · every count is deterministic

Left to right, Howard's model: test runs yield failed utterances, which are clustered into defects, which become fix units (features & requests enter here too), which get prompts written, then analysis — the whole fix developed and sim-tested on a copy — then land into the app at most one per fix area (17 areas) with a short in-app test, then gate + review, then merge, then the app is rebuilt and tested again. If a stage looks starved or jammed, the page says so below the strip.

Test run
8/12
corpora on simulators
Grade → failed
450
0 clustered · 450 awaiting clustering
Defects
unknown
0 assigned to fix units so far
Fix units
0
0 awaiting prompt · 0 from requests
Prompts
0
ready for analysis · 0 being written now
Analysis
0
fix built + sim-tested on a copy · 0 in sim trial
Queued to land
0
0 behind a busy fix area
Landing in app
0
0 of 17 areas · short in-app test
Gate + review
0
reviewing now · 0 rejected · 0 parked
Merged · 24h
0 app
0 machine — never added
Fix effectiveness
not yet measured
MERGED alone is not progress until outcome receipts land.

Second input — features & requests: 0 active work units did not come from a test failure (new features, requests, machine repairs). They enter at Fix units and follow the same line from there. A formal request intake (logged, statused, backlogged) is queued work.

The loop as a plain listtemporary — until the drawing above is redrawn in this 10-stage format

#StageNowDetailHealth
1Test run8/12corpora running on simulatorsOK
2Grade — failed utterances4500 clustered · 450 awaiting clusteringneeds attention
3Cluster into defects?0 assigned to fix units so farneeds attention
4Fix units00 awaiting prompt · 0 entered from requests, not tests
5Prompts0ready for analysis · 0 being written right now
6Analysis — build the fix on a copy0code + simulator trial on a private branch · 0 in sim trial now
7Done, queued to land00 waiting behind a busy fix areaneeds attention
8Landing in the app00 of 17 fix areas landing · short in-app testneeds attention
9Gate + review0reviewing now · 0 rejected · 0 parked all-timeneeds attention
10Merged · last 24h0 app0 machine — counted separately, never addedneeds attention
11Rebuild the app324f4ab3fast bundle swap · built 6h ago · what Test run tests nextneeds attention

Right noweach figure carries the time of its own source

Always-on programs
2 of 7
3 restart themselves if they die · 1 switched off on purpose
as of Aug 2, 6:51 PM
AI coders working now
0
0 different jobs picked up in 24h
as of Jul 29, 9:18 PM
Test scripts running
8 of 12
round 0 of the rotation
as of Aug 2, 6:35 PM
Simulators booted
4
8 running a copy of the app
as of Aug 2, 6:51 PM
Jobs in flight
undefined
0 on the board all-time
as of —
Ledger items
526
265 still open · last change 6d ago
as of Jul 27, 8:35 PM

Unanchored app merges DETERMINISTIC · requirements-linkage · as of 2026-07-25T21:41:28.563Z

36 unanchored app merge(s) — app-region work landed without a requirement or defect= anchor (Howard 07-25: stick to the requirements).

UnitRegionTitleWhenMerge
N1R9Deixis/pending residue (post-92b)2026-07-25T12:38:28.528Z
TESTS-CERTIFY-UNSHIPPED-APPTSXR1⛔ P1 THE TEST SUITE CERTIFIES CAPABILITIES BY REGEX-MATCHING App.tsx — A FILE THAT CANNOT RUN. This is why FOOD-ASYNC-PENDING-DEADEND shipped green. MECHANISM: 45 of 247 files under tests/ read App.tsx as a source-of-truth string (e.g. tests/asyncPendingFoodLogging.test.mjs:22 "const appSource = readFileSync(new URL(\"../App.tsx\", import.meta.url), \"utf8\")") and 22 of them make 299 CAPABILITY-PRESENCE assertions of the form assert.match(appSource, /…/). Since c1d8ddc36 (HOWARD RULING 2026-07-23) index.js:12 registers VoiceCoachNewShell and the App.tsx import is gone, so every one of those 299 assertions now proves only that dead text still exists on disk. PROOF THIS IS NOT THEORETICAL: tests/asyncPendingFoodLogging.test.mjs:407 asserts assert.match(appSource, /handleAsyncPendingFoodLog/) and PASSES, because App.tsx:29710 really does define handleAsyncPendingFoodLog and App.tsx:28303-28304 really does wire it into the legacy adapter. Meanwhile the SHIPPING shell has no implementation of that hook at all — foodModuleActionAppliers.ts:327 declares it, :1697 calls it, services/newShellResultApplierDeps.ts never supplies it — and 150 of 150 traces measured today dead-end on "I am looking that up — I will have an answer in a moment." The capability is green in CI and absent on the device. Same shape as ALIVE-BUT-STERILE: the health signal measured the wrong thing. REQUIRED: (1) inventory the 22 files / 299 assertions and repoint each at the shipping shell (src/shell, src/screens, src/services, src/modules) or delete it; (2) BOUNDARY-GUARD tests that assert App.tsx does NOT contain something are legitimate and must be kept — only presence assertions are invalid; (3) add a CI rule forbidding new capability-presence assertions against App.tsx while it remains unshipped.2026-07-25T12:38:06.406Z
CORRECTION-INTENT-SLOTTED-AS-NEW-LOGR1⛔ P1 "ACTUALLY …" CORRECTIONS ARE PARSED AS NEW LOGS, THE DISCOURSE MARKER LANDS IN THE EXERCISE SLOT, AND THE REFUSE MESSAGE ECHOES THE PARSER DEBRIS BACK AT THE USER. MECHANISM: a correction utterance is classified as a set-log, so the set-template filler puts the leading marker "actually" into exerciseName and DISCARDS the exercise the user actually named. workoutSetGarbageGuard.ts:44-45 COMMAND_DEBRIS_EXERCISE lists actually|undo|delete|change|correct|update|fix|make|log|record|add|did|got, so isGarbageExerciseName (:151-169) correctly refuses the write — refuse-don not-write is working — but the message template at :111-117 calls summarizeUnderstoodSlots (:268-300) which at :296 returns the quoted debris, producing "I understood \"actually\", but not a clear exercise name. What exercise should I log?". Two distinct defects: (1) NO CORRECTION ROUTE — "actually that was on the hack squat machine" names the exercise and the app throws it away, so a fully-determined correction becomes an ask; (2) MESSAGE LEAKS INTERNAL SLOT CONTENT — the user hears their own filler word quoted back as if it were their answer. WORSE CROSS-MODULE CASE, same class, silent wrong write: sim 9132BBA6 2026-07-25 07:17 "change it to 8 ounces of chicken breast" (a food-amount correction) → "Added chicken to Meal Prep. Say if that (Meal Prep) is the wrong list." — the correction was routed to LISTS and written as a new shopping-list item. EVIDENCE: workout-corpus-a-d58cef3f-c5-20260725 rows for "actually that was 90 pounds", "actually that was 8 reps", "Actually save that as warmup, not working set"; sim screenshot 9132BBA6 07:17. REQUIRED: route leading correction markers (actually / no wait / I meant / make that / change it to) to a correction intent BEFORE the set-template filler, carry the correction to the module that owns the last write, and never quote a stripped discourse marker back as the understood slot.2026-07-25T12:38:06.281Z
SHELL-SCAFFOLD-MESSAGE-LISTR1⛔ P0 THE SCREEN-DESTROYER (this is what Howard saw, and it is NOT App.tsx). MECHANISM: VoiceCoachNewShell.tsx:1815-1819 renders <NewShellCommandMessages messages={messages}/> as an IN-FLOW SIBLING of {activeScreen} inside ShellChrome, and ShellChrome.tsx:41 puts both in <View style={styles.content}> where shellStyles.ts:5 content={flex:1}. NewShellCommandMessages.tsx:7-11 is a bare fragment of up to 12 <Text> blocks — no maxHeight, no position:absolute, no ScrollView. messages is appended by 5 sites (VoiceCoachNewShell.tsx:358 appendAssistantMessage, :428 You-prefix, :475, :492, :1544), each capped slice(0,12), and NOTHING clears it. Because RN flex:1 implies flexShrink:1 while the Text blocks do not shrink, the active screen is squeezed toward zero height as messages accumulate; because RN Views default to overflow:visible, the squeezed screen then SPILLS over the chrome. EVIDENCE (sim screenshots 2026-07-25, all on stamped bundle d58cef3f): 858CCB21 + EB3592FD Food — macro row clipped mid-glyph, only the top halves of the digits render, everything below is bubbles; 360CDC05 Workout — VOLUME-TODAY label sheared in half; 1252A63D Food and 2879D175 Notes — zero product UI below the header; BE3A2AF6 + 2F726E19 Settings — the Preferred-name input is covered; 9132BBA6 at 07:17 Main — the VoiceCoach title block renders OVER the status bar and the header title. PROGRESSIVE: messages is component state reset on relaunch, so the app looks correct for the first 1-2 commands (CC5F1E27 Notes 07:11 shows the real UI with 2 bubbles) and is unusable by roughly the 6th. REQUIRED: delete the scaffold list (it duplicates the real transcript surfaces MainVoiceScreen Recent-transcript and ConversationScreen, which are already bounded and correct), or bind it to a fixed-height overlay. Do NOT merely shrink the cap. Landed 2026-07-03 in 91d43373c feat(shell)-scaffold-flagged-new-shell when the shell had no screens; never removed when c1d8ddc36 (2026-07-23) made the new shell the only root.2026-07-25T12:38:06.154Z
PORTING-SWEEPR6Ongoing: identify GOOD old code (frozen file+old services) not wired into the new shell, port/wire it; feed MIGRATION_LEDGER2026-07-25T12:38:06.026Z
W1R12Garbage-guard completion (NEXT IN QUEUE)2026-07-25T12:38:05.901Z
F11R2Pending-answer reparse (planner crash surfaced to user)2026-07-25T12:38:05.784Z
DF-7a920dfa722cR5fail2fix: food-corpus-typed / WRITE-TRUTH FAIL — IMPLAUSIBLE: 530 kcal2026-07-24T13:19:52.183Z0c06baa05b8e
DF-f9fda9fd88afR14fail2fix: util-corpus-a / Did not toggle state — no confirmation o2026-07-24T13:18:22.407Z0c06baa05b8e
WKT-EDITR12Workout set-editing: route contextual edits (update weight/reps, last set) to workout + execute the update — DB-verified 39% routing + module gap2026-07-24T13:15:51.247Zb9425ae236ee
DF-cd5b2c1bd6adR4fail2fix: notes-todos-lists-a / OVER-ASK — asked instead of delete (no n2026-07-24T13:12:13.761Zbc439d632928
DF-ccdc6b030035R6fail2fix: notes-todos-lists-a / MISROUTE — general/no-module dead-end (s2026-07-24T13:09:44.979Zbc439d632928
DF-3ce8a078131dR11fail2fix: notes-todos-lists-a / Reported could-not-confirm (write-confir2026-07-24T13:09:44.979Zbc439d632928
DF-1656fe6f489fR6fail2fix: util-corpus-a / WRITE-TRUTH FAIL — misroute-into-food: U2026-07-24T13:08:15.475Zbc439d632928
DF-afe9a8e43cfbR6fail2fix: food-corpus-mixed-f / WRONG item vs seeded default/key — no sa2026-07-24T12:06:59.455Z034b00ef2d06
DF-df1a74f4f936R11fail2fix: food-corpus-mixed-g / WRONG item vs seeded default/key — no sa2026-07-24T12:06:59.455Z034b00ef2d06
DF-b6a40d8497c8R1fail2fix: food-corpus-mixed-c / Did not apply the setting — no confirmat2026-07-24T12:06:59.455Z034b00ef2d06
DF-3e2366a140f2R14fail2fix: util-corpus-a / Did not write — misroute-into-food; no n2026-07-24T11:31:32.839Z034b00ef2d06
DF-b4b798b5ee86R4fail2fix: food-corpus-mixed-d / WRONG item vs seeded default/key — no sa2026-07-24T11:12:27.743Zf6e051b24e93
WCFN2R7Write-confirm false-neg NOT resolved by WCFN (self-test passed, corpus bucket unchanged 8->8) — fix general verifier, corpus-proof acceptance2026-07-24T07:30:50.357Zb530a231c297

What it producedtwo different things, never added together

"Fixes to the app" are changes a person using VoiceCoach could feel. "Fixes to the machine" are the pipeline repairing itself — real work, but invisible to a user. They are counted separately on purpose; adding them together is how a busy night can be made to look like a productive one. The bottom row counts the same thing from the app's own code history. The two rows are measured differently and will not always agree — when they diverge, the code history is the harder evidence.

Merged and verifiedLast hourLast 24 hoursLast 7 days
Fixes to the appwhat a user would feel 000
Fixes to the machinethe pipeline fixing itself 000
Cross-check: merges recorded in the app's own historycounted a different way, from the code history 000

Merged in the last 24 hours0 in total

Testing in progressas of Aug 2, 6:35 PM

ScriptAreaStateAnswers capturedLast progress
workout-corpus-a workout running 0 16 min ago
acceptance-corpus-conversational food running 0 16 min ago
notes-todos-lists-A notes running 0 16 min ago
acceptance-corpus-new-types food running 0 16 min ago
food-corpus-typed food running 0 16 min ago
util-corpus-a food running 0 16 min ago
workout-corpus-typed workout running 0 16 min ago
compound-dishes-A food running 0 16 min ago
food-corpus-b-FROZEN-20260712 food failed 0
food-corpus-a food failed 0
multifood-corpus-a food failed 0
food-corpus-mixed-C food failed 0
food-corpus-mixed-D food queued 0
query-frozen-A food queued 0
food-corpus-mixed-E food queued 0
food-corpus-mixed-F food queued 0
food-corpus-mixed-G food queued 0

How well the app is doingbuild 324f4ab3

DETERMINISTIC · continuous module scores (no nightly freeze)

Food: n/a · Workouts: n/a · Notes: n/a · Query: n/a (build e0a1efe8, 0 of 17 scripts complete)

Every completed corpus run: when it ran / which build / what score → corpus-runs.html

Food: · → · → 13.3 → ·

Workouts: · → · → · → ·

Notes: · → · → · → ·

Query: · → · → · → ·

80% of answers correct, across the 2 scripts that have finished running on build 324f4ab3 (110 of 138 answers). The other 16 are still mid-run and deliberately have no number yet.

A score is only shown when the whole script has finished AND every answer came from one single build of the app — the one under test. Anything else is marked "not attributable yet", because a number you cannot trace to one version of the app is worse than no number at all. The DETERMINISTIC nightly line above is the once-a-day settled score on a held build (03:00–05:00 America/New_York), so day-over-day numbers stay comparable.

ScriptScoreDetailAnswersGraded
notes-todos-lists-A not attributable yet still running 17 of 150 23s ago
compound-dishes-A not attributable yet still running 2 of 15 23s ago
food-corpus-typed not attributable yet still running 13 of 100 23s ago
acceptance-corpus-conversational not attributable yet still running 22 of 180 23s ago
workout-corpus-a not attributable yet still running 34 of 362 23s ago
util-corpus-a not attributable yet still running 4 of 44 23s ago
workout-corpus-typed not attributable yet still running 3 of 100 23s ago
acceptance-corpus-new-types not attributable yet still running 9 of 90 23s ago
food-corpus-mixed-F not attributable yet still running 183 of 200 16 min ago
food-corpus-mixed-G not attributable yet still running 176 of 200 16 min ago
food-corpus-mixed-E not attributable yet still running 196 of 200 27 min ago
food-corpus-mixed-D not attributable yet still running 198 of 201 32 min ago
food-corpus-mixed-C not attributable yet still running 197 of 201 46 min ago
food-corpus-a not attributable yet still running 200 of 201 51 min ago
food-corpus-b-FROZEN-20260712 not attributable yet still running 86 of 300 54 min ago
query-frozen-A 92% 72 of 78 answers correct 78 of 78 56 min ago
multifood-corpus-a 63% 38 of 60 answers correct 60 of 60 78 min ago
adversarial-corpus not attributable yet last graded 18h ago on an older build ((none)) unknown 18h ago

Required reportsreporting engine · live · 7s ago

Is the reporting engine working? Every page Howard is supposed to get is registered here with a generator, an artifact path, and a maximum age. Missing and stale are both RED. This section is part of machine health — not a footnote. A report not in the registry is invisible to the check (same rule as durable stores).

Reporting engine: Problem 7 green · 11 red · 18 required failing: corpus-drilldown:food-a, corpus-drilldown:food-b, corpus-drilldown:food-corpus-typed, corpus-drilldown:workout, corpus-drilldown:workout-corpus-typed,…

IdReportStateAgeMax ageGeneratorDetail
machine Machine report Good 16.6m 45m scripts/lane-h/build-machine-dashboard.mjs fresh: age 16.6m ≤ 45m (machine.json.generatedAt)
health Health page Good 0.9m 15m scripts/lane-h/health-monitor.mjs fresh: age 0.9m ≤ 15m (health-report.json.generatedAt)
owner Owner page Good 0.3m 120m scripts/lane-h/render-owner-page.mjs fresh: age 0.3m ≤ 120m (owner-meta.json.generatedAt)
testing-results Testing results page Good 16.7m 120m scripts/lane-h/publish-reports.mjs fresh: age 16.7m ≤ 120m (publish-meta.json.publishedAt)
testing-interactive Testing interactive scoreboard Good 0m 120m scripts/lane-h/build-testing-page.mjs fresh: age 0m ≤ 120m (mtime)
refactor-fleet Refactor / fleet dashboard Good 15.7m 60m scripts/lane-h/render-refactor-dashboard.mjs fresh: age 15.7m ≤ 60m (mtime)
settled-score Nightly settled score receipt Good 1m 2160m scripts/lane-h/nightly-settled-score.mjs fresh: age 1m ≤ 2160m (nightly-settled-window.json.updatedAtIso)
corpus-drilldown:food-a Corpus drill-down: food-a Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/food-a.html
corpus-drilldown:food-b Corpus drill-down: food-b Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/food-b.html
corpus-drilldown:food-corpus-typed Corpus drill-down: food-corpus-typed Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/food-corpus-typed.html
corpus-drilldown:workout Corpus drill-down: workout Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/workout.html
corpus-drilldown:workout-corpus-typed Corpus drill-down: workout-corpus-typed Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/workout-corpus-typed.html
corpus-drilldown:notes-todos-lists Corpus drill-down: notes-todos-lists Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/notes-todos-lists.html
corpus-drilldown:multifood Corpus drill-down: multifood Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/multifood.html
corpus-drilldown:utility Corpus drill-down: utility Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/utility.html
corpus-drilldown:adversarial Corpus drill-down: adversarial Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/adversarial.html
corpus-drilldown:acceptance-corpus-conversational Corpus drill-down: acceptance-corpus-conversational Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/acceptance-corpus-conversational.html
corpus-drilldown:acceptance-corpus-new-types Corpus drill-down: acceptance-corpus-new-types Problem 120m scripts/lane-h/build-testing-page.mjs missing artifact: outputs/status/testing-page/acceptance-corpus-new-types.html

Health registerfrom health-monitor · checked 1 min ago

These are the machine's own checks — the same ones the alarm uses. "Since" is how long the check has been in its current state. The reports-self-check row is the same required-report freshness answer as the section above.

CheckStateWhat it sawSince
Fix scheduler is alive and doing work Problem zero instances (not running) — confirmed by 50 consecutive observations 85 min ago
Test scheduler is alive and doing work Good log quiet ageMin=26 > staleMin=15 but process up + workEvidence (quietAtCap=false; not restart authority) 26 min ago
Ledger driver is alive and doing work Problem zero instances (not running) — confirmed by 50 consecutive observations 85 min ago
Publisher is alive and doing work Problem zero instances (not running) — confirmed by 50 consecutive observations 85 min ago
Build stamper Good log quiet ageMin=13353 > staleMin=15 but process up + workEvidence (quietAtCap=false; not restart authority) 87 min ago
Nothing is crashing and restarting in a loop Good no crash-looping VoiceCoach launchd jobs 4d ago
Work is actually moving through the queue Problem frozen: queuedWork=0 schedQueued=0 but no unit lastTransitionAt / lastMergeTrainAt within advanceWindow=30m (heartbeat-only does not count: queueUpda… 4d ago
draft-branch-resolve Good no DRAFT-READY/APPLYING units; draft-branch check idle 4d ago
Scores refer to a recent build of the app Problem CURRENT_BUILD ageMin=359 > freshRedMin=150 4h ago
The critical programs restart themselves Good durable=2 manual=0 noUnitDefined=0 other=3 9d ago
Disk space and log sizes are sane Watch log large fix-worker-F5-draft.log size=1474694549 ≥ warn=524288000 9d ago
AI coders are being launched successfully Good dispatch ok: hitsInWindow=0 (hitsIgnoredAsStale=15 hitsIgnoredPreAnchor=78 hitsIgnoredNoTime=0); historical/out-of-window noise does not pin RED (loo… 8d ago
Background jobs can find the tools they need Good env-equivalence node ok: 2 durable agent(s) resolve node; skipped/missing=3 · fable-binary ok: ~/.local/bin/claude (mode=fable-bin-override) 9d ago
No orphaned or over-limit test lanes Good fleet ok: orphans=0 running=2 cap=12 30h ago
Howard replies are being picked up Good no human-typed Howard unread older than 30m (last-scan) 8d ago
dev-lane-keepalive Problem triad dead missing=installed+running · recovery cooldown active remainingMs=28613 1 min ago
Required reports are being generated and are still fresh Problem failing: corpus-drilldown:food-a, corpus-drilldown:food-b, corpus-drilldown:food-corpus-typed, corpus-drilldown:workout, corpus-drilldown:workout-cor… 3d ago

The always-on programs

ProgramWhat it doesStateIf it dies
Fix scheduler Hands jobs to the AI coders and moves them through the pipeline. Not running started by hand
Test scheduler Keeps test scripts running on simulators, forever. Not running restarts itself
Build stamper Rebuilds the app and records which build is under test. Running restarts itself
Health monitor Checks the machine every couple of minutes. Running restarts itself
Permanence guard Makes sure the must-always-run parts are running. Not running started by hand
Ledger driver Chases commitments that have gone quiet. Not running started by hand
Publisher Renders and pushes the pages you read. Not running started by hand
Message delivery Pokes a worker thread when something needs attention. Off on purpose restarts itself

Must always runfrom permanence-guard

The difference between "broken" and "switched off on purpose" — every deliberate pause needs a written reason, recorded here.

ComponentStateReason on record
Fix scheduler Always on process up; launchd loaded; no disable-receipt
Test scheduler Always on process up; launchd loaded; no disable-receipt
Ledger driver Always on process up; launchd loaded; no disable-receipt
Publisher Always on process up; launchd loaded; no disable-receipt
Health monitor Always on process up; launchd loaded; no disable-receipt
daemon:fail2fix Always on process up; launchd loaded; no disable-receipt
Fleet liveness watchdog Off on purpose INTENTIONALLY_OFF: FLEET_KILL_SWITCH (repo root) + ~/.wakebus_disabled — automated AI-thread wake/poke banned; source-complete but must not be supervised keep-alive…
Blocked-work watchdog Off on purpose INTENTIONALLY_OFF: Cadence historically owned by fleet-liveness-watchdog; furnace ban parks that owner. Library remains callable; no independent keep-alive until a…
Message delivery Off on purpose INTENTIONALLY_OFF: ~/.msgdelivery_disabled and/or ~/.wakebus_disabled armed — process may exist under launchd StartInterval but must not re-enable AI wake; permanen…