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.
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.
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
| # | Stage | Now | Detail | Health |
|---|---|---|---|---|
| 1 | Test run | 8/12 | corpora running on simulators | OK |
| 2 | Grade — failed utterances | 450 | 0 clustered · 450 awaiting clustering | needs attention |
| 3 | Cluster into defects | ? | 0 assigned to fix units so far | needs attention |
| 4 | Fix units | 0 | 0 awaiting prompt · 0 entered from requests, not tests | — |
| 5 | Prompts | 0 | ready for analysis · 0 being written right now | — |
| 6 | Analysis — build the fix on a copy | 0 | code + simulator trial on a private branch · 0 in sim trial now | — |
| 7 | Done, queued to land | 0 | 0 waiting behind a busy fix area | needs attention |
| 8 | Landing in the app | 0 | 0 of 17 fix areas landing · short in-app test | needs attention |
| 9 | Gate + review | 0 | reviewing now · 0 rejected · 0 parked all-time | needs attention |
| 10 | Merged · last 24h | 0 app | 0 machine — counted separately, never added | needs attention |
| 11 | Rebuild the app | 324f4ab3 | fast bundle swap · built 6h ago · what Test run tests next | needs attention |
Right noweach figure carries the time of its own source
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).
| Unit | Region | Title | When | Merge |
|---|---|---|---|---|
N1 | R9 | Deixis/pending residue (post-92b) | 2026-07-25T12:38:28.528Z | — |
TESTS-CERTIFY-UNSHIPPED-APPTSX | R1 | ⛔ 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-LOG | R1 | ⛔ 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-LIST | R1 | ⛔ 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-SWEEP | R6 | Ongoing: identify GOOD old code (frozen file+old services) not wired into the new shell, port/wire it; feed MIGRATION_LEDGER | 2026-07-25T12:38:06.026Z | — |
W1 | R12 | Garbage-guard completion (NEXT IN QUEUE) | 2026-07-25T12:38:05.901Z | — |
F11 | R2 | Pending-answer reparse (planner crash surfaced to user) | 2026-07-25T12:38:05.784Z | — |
DF-7a920dfa722c | R5 | fail2fix: food-corpus-typed / WRITE-TRUTH FAIL — IMPLAUSIBLE: 530 kcal | 2026-07-24T13:19:52.183Z | 0c06baa05b8e |
DF-f9fda9fd88af | R14 | fail2fix: util-corpus-a / Did not toggle state — no confirmation o | 2026-07-24T13:18:22.407Z | 0c06baa05b8e |
WKT-EDIT | R12 | Workout set-editing: route contextual edits (update weight/reps, last set) to workout + execute the update — DB-verified 39% routing + module gap | 2026-07-24T13:15:51.247Z | b9425ae236ee |
DF-cd5b2c1bd6ad | R4 | fail2fix: notes-todos-lists-a / OVER-ASK — asked instead of delete (no n | 2026-07-24T13:12:13.761Z | bc439d632928 |
DF-ccdc6b030035 | R6 | fail2fix: notes-todos-lists-a / MISROUTE — general/no-module dead-end (s | 2026-07-24T13:09:44.979Z | bc439d632928 |
DF-3ce8a078131d | R11 | fail2fix: notes-todos-lists-a / Reported could-not-confirm (write-confir | 2026-07-24T13:09:44.979Z | bc439d632928 |
DF-1656fe6f489f | R6 | fail2fix: util-corpus-a / WRITE-TRUTH FAIL — misroute-into-food: U | 2026-07-24T13:08:15.475Z | bc439d632928 |
DF-afe9a8e43cfb | R6 | fail2fix: food-corpus-mixed-f / WRONG item vs seeded default/key — no sa | 2026-07-24T12:06:59.455Z | 034b00ef2d06 |
DF-df1a74f4f936 | R11 | fail2fix: food-corpus-mixed-g / WRONG item vs seeded default/key — no sa | 2026-07-24T12:06:59.455Z | 034b00ef2d06 |
DF-b6a40d8497c8 | R1 | fail2fix: food-corpus-mixed-c / Did not apply the setting — no confirmat | 2026-07-24T12:06:59.455Z | 034b00ef2d06 |
DF-3e2366a140f2 | R14 | fail2fix: util-corpus-a / Did not write — misroute-into-food; no n | 2026-07-24T11:31:32.839Z | 034b00ef2d06 |
DF-b4b798b5ee86 | R4 | fail2fix: food-corpus-mixed-d / WRONG item vs seeded default/key — no sa | 2026-07-24T11:12:27.743Z | f6e051b24e93 |
WCFN2 | R7 | Write-confirm false-neg NOT resolved by WCFN (self-test passed, corpus bucket unchanged 8->8) — fix general verifier, corpus-proof acceptance | 2026-07-24T07:30:50.357Z | b530a231c297 |
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 verified | Last hour | Last 24 hours | Last 7 days |
|---|---|---|---|
| Fixes to the appwhat a user would feel | 0 | 0 | 0 |
| Fixes to the machinethe pipeline fixing itself | 0 | 0 | 0 |
| Cross-check: merges recorded in the app's own historycounted a different way, from the code history | 0 | 0 | 0 |
Merged in the last 24 hours0 in total
- Nothing has been merged in the last 24 hours.
Testing in progressas of Aug 2, 6:35 PM
| Script | Area | State | Answers captured | Last 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
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.
| Script | Score | Detail | Answers | Graded |
|---|---|---|---|---|
| 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
| Id | Report | State | Age | Max age | Generator | Detail |
|---|---|---|---|---|---|---|
| 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.
| Check | State | What it saw | Since |
|---|---|---|---|
| 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
| Program | What it does | State | If 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.
| Component | State | Reason 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… |