Failure-domain drills
11 drills · 8 executable · 1 executed runTen drills covering every declared failure domain. Two of them cannot be executed at all and say so with a reason rather than a shrug. One has ever been run against the real estate, and that run was a restore rather than a failover, so it proved a procedure and timed nothing. Everything else on this page is a prediction the dependency graph made and nobody has checked.
Nothing on this page is declared impact. A drill says what it takes away; what that costs is derived
from the dependency graph on every render, and the deadline it is judged against is the
tightest objective the classification makes about anything inside the blast radius.
Both are recomputed here, so neither can quietly go out of date while still validating. The console runs
nothing: inducing a fault needs a shell on a machine this process has no path to, and that belongs to
scripts/jarvisos-drill.mjs, which refuses every step this register declined to authorise.
Run this one next
ranked by what it would tell you, not by what is overdueHome internet is gone — With the house off the internet, what does the VPS keep serving on its own — and does anything at home notice it is now isolated rather than dead?
node scripts/jarvisos-drill.mjs plan --drill drill-uplink-loss node scripts/jarvisos-drill.mjs simulate --drill drill-uplink-loss
run is the verb that touches anything, and it refuses without --confirm.
Coverage by failure domain
a domain nothing exercises is a domain whose survival is theoretical| Failure domain | Kind | Drills | Ever executed | Last run |
|---|---|---|---|---|
| Home rack | site | drill-uplink-loss, drill-home1-loss, drill-home-rack-loss, drill-db-unavailable, drill-objectstore-outage | yes | 2026-07-12 |
| VPS provider | site | drill-vin-loss, drill-auth-outage | no | 2026-08-02 |
| VPS provider · nbg1 | site | drill-second-domain-loss | no | 2026-08-17 |
| Offsite object storage | site | drill-objectstore-outage | no | never |
| Private link plane | vendor-plane | drill-tunnel-loss | no | never |
| Public DNS plane | vendor-plane | drill-provider-api-outage | no | 2026-08-02 |
| Identity plane | vendor-plane | drill-idp-unreachable | no | never |
Coverage by capability
has this estate ever rehearsed living without it| Capability | Points | Taken away by | Ever actually lost in a run |
|---|---|---|---|
| Published web | 22 | drill-uplink-loss, drill-vin-loss, drill-provider-api-outage | no |
| Sign-in | 18 | drill-uplink-loss, drill-home1-loss, drill-home-rack-loss, drill-vin-loss, drill-auth-outage, drill-idp-unreachable | no |
| JarvisOS orchestration | 16 | drill-uplink-loss, drill-home1-loss, drill-home-rack-loss, drill-vin-loss, drill-auth-outage, drill-idp-unreachable | no |
| JarvisAI agent surface | 12 | drill-vin-loss | no |
| Data writes | 20 | drill-home1-loss, drill-home-rack-loss, drill-db-unavailable | yes |
| Data reads | 14 | nothing | no |
| On-site backups | 12 | drill-home-rack-loss, drill-objectstore-outage | no |
| Offsite recovery | 10 | drill-uplink-loss, drill-home-rack-loss, drill-objectstore-outage | no |
| Public name resolution | 14 | drill-uplink-loss, drill-provider-api-outage | no |
| Internal name resolution | 6 | drill-home1-loss, drill-home-rack-loss | no |
| Private access to the estate | 10 | drill-uplink-loss, drill-vin-loss | no |
| Knowing what is broken | 8 | drill-vin-loss | no |
Home internet is gone
Link never run executableWith the house off the internet, what does the VPS keep serving on its own — and does anything at home notice it is now isolated rather than dead?
- Takes away
- isp-uplink · unreachable
- Costs (derived)
- 90 of 162 capability points
- Deadline
- 15 min · set by caddy
- Measured
- never
- Cadence
- every 180 d
- Observed from
- vin
Losing ISP Uplink takes out 11 other things and costs 90 of 162 capability points: Published web, Sign-in, JarvisOS orchestration, Offsite recovery, Public name resolution, Private access to the estate (degraded: JarvisAI agent surface, Knowing what is broken).
Injection
wan-disconnect · reversible · needs a person
Unplug the WAN cable at the router. No configuration is edited: a drill that changes a firewall rule to fake an outage has changed the estate it was measuring.
Undo: Plug it back in and confirm the tunnel re-establishes without a manual restart.
The router keeps serving the LAN throughout. Anyone in the house should still be able to reach the rack; if they cannot, that is the finding.
Steps
-
Record the baseline proposedCapture which capabilities answer, and the age of the newest off-site object, before anything is unplugged.Verify: A baseline exists and names the off-site object it measured from.Undo: none — reading is not a change
-
Disconnect the WAN a personVerify: The public hostnames stop resolving to a working origin from a phone on mobile data.Undo: Reconnect the WAN cable.Start the stopwatch here, not when somebody notices.
-
Confirm the rack is alive from inside the house a personVerify: The control plane answers on the LAN address while VIN reports it down.Undo: none — reading is not a changeThis is the step that distinguishes an isolated estate from a dead one. Skipping it is how the drill becomes theatre.
-
Check what the estate said about itself proposedVerify: An incident was opened, and its stated cause is the uplink rather than nine separate hosts.Undo: none — reading is not a change
-
Reconnect and watch it come back by itself a personVerify: Every capability returns without a manual restart, and the off-site sync catches up on its own schedule.Undo: none — this is the rollback
Stop the drill when
-
The tunnel does not re-establish within 10 minutes of the cable going back in
Stop the drill and treat it as an incident. Restarting WireGuard by hand is recovery, not drill data.
-
A real fault is opened against anything outside the home rack during the window
Reconnect immediately. Two faults at once means the measurement is worthless and the risk is not.
What happened
Never run, in either mode. Everything above it on this card is a prediction the dependency graph made and nobody has checked.
- Runs best on a weekday evening with somebody physically at the rack, because the confirm-lan step needs a person on the LAN side.
The whole room is gone
Site never run executableWith home1 and the NAS both gone, what is left — and is the off-site copy the only thing standing between the estate and starting over?
- Costs (derived)
- 82 of 162 capability points
- Deadline
- 20 min · set by internal-dns
- Measured
- never
- Cadence
- every 365 d
- Observed from
- vin
Losing Home1 + NAS takes out 9 other things and costs 82 of 162 capability points: Sign-in, JarvisOS orchestration, Data writes, On-site backups, Offsite recovery, Internal name resolution.
Injection
graceful-shutdown · reversible · needs a person
Shut both hosts down cleanly, NAS last and only with the pool healthy. Never during a resilver.
Undo: Power on the NAS first, wait for the pool to import cleanly, then home1.
The pool-health precondition is not advice. A NAS shut down mid-resilver is how a drill turns into the data loss it was rehearsing.
Steps
-
Record the off-site recovery point proposedThe newest object in the off-site bucket, by name and timestamp. This is the state the estate would restart from.Verify: A specific object is named, not a bucket.Undo: none — reading is not a change
-
Refuse to start if the pool is not healthy proposedVerify: The pool is online, not degraded, and no resilver is in progress.Undo: none — this is a gate
-
Shut the room down a personVerify: Both heartbeats stop, and the console names the site rather than nine services.Undo: Power both hosts back on in NAS-first order.
-
Restore the crown jewels from the off-site copy, onto VIN a personNot from the NAS. The NAS is in the room this drill has just taken away, and a restore that reads from it has rehearsed nothing.Verify: A scratch database on VIN is built from the off-site copy and answers a known query.Undo: Delete the scratch restore. It never served traffic.This is the step the estate has never taken. Every restore drill on record so far read from the copy in the same room as the thing it protects.
-
Bring the room back a person restore-nasVerify: The pool imports clean, backups resume landing, and the off-site sync catches up.Undo: none — this is the rollback
Stop the drill when
-
The pool is degraded or resilvering at the pool-check step
checked automatically
Do not start. Reschedule after the resilver completes.
-
The off-site restore has not produced a readable dataset within 2 hours
Stop, bring the room back, and file the failure. A restore path that does not work is the finding; grinding at it for six hours is not.
What happened
Never run, in either mode. Everything above it on this card is a prediction the dependency graph made and nobody has checked.
- Annual, and the only drill here that answers the question the off-site bucket exists for.
- It is executable and has never been executed, which is the sharpest single line in this register.
Home1 disappears
Node never run executableHow long does it actually take to get orchestration and writes back on VIN, and does anybody have to look up a command while the clock runs?
- Takes away
- home1 · hard-down
- Costs (derived)
- 60 of 162 capability points
- Deadline
- 20 min · set by internal-dns
- Measured
- never
- Cadence
- every 180 d
- Observed from
- vin
Losing Home1 takes out 6 other things and costs 60 of 162 capability points: Sign-in, JarvisOS orchestration, Data writes, Internal name resolution.
Injection
graceful-shutdown · reversible · needs a person
Shut home1 down cleanly. Not a power pull: a dirty stop adds a filesystem check to the recovery time and the drill would be measuring fsck.
Undo: Power on at the rack, or over IPMI where that exists, and bring services up in the order on the recovery page.
Steps
-
Read the replica's lag before anything else proposedThis number decides whether the drill is a rehearsal or a data-loss event. It is read first and it is read again immediately before promotion.Verify: Lag is under the warn threshold and recorded.Undo: none — reading is not a change
-
Shut home1 down a personVerify: The heartbeat stops and an incident opens naming home1 as the root cause rather than six separate services.Undo: Power home1 back on.
-
Fence the old primary a personBefore anything is promoted, make it impossible for home1 to accept a write when it comes back. Split-brain here is unrecoverable.Verify: The old primary cannot be written to from the control plane's credentials.Undo: Unfence once the drill ends and the rebuild plan is agreed.
-
Promote the replica on VIN a person promote-postgres-replicaVerify: A write succeeds against the promoted primary and the control plane reconnects to it.Undo: There is none. Promotion is one-way until a fresh base backup is taken — which is the reason this step will never be automatic here.Destructive in the action catalogue. Automation may never run it, and this register cannot change that.
-
Bring up the standby control plane proposed failover-control-plane-to-vinVerify: The control plane accepts a task and places it on a worker.Undo: Stop the standby. It was not serving before the step.
-
Bring home1 back and rebuild, do not reattach a person restore-home1Verify: home1 is up, and the old database volume is rebuilt from a fresh base backup rather than reattached.Undo: none — this is the rollbackReattaching the old primary as-is is the single most expensive mistake available in this scenario.
-
Restart the internal resolver automatic restart-internal-dnsVerify: Internal names resolve from both sites.Undo: Stop the resolver. It was not answering before the step, so stopping it returns the estate to the state the step began in.
Stop the drill when
-
Replication lag is above the critical threshold when promotion is due
checked automatically
Do not promote. Restore home1 instead and record the drill as aborted — promoting a lagging replica loses every transaction in the gap, and doing it on purpose during a drill is worse than doing it in an incident.
-
home1 does not come back within 60 minutes
The drill is over and an incident has started. Stop measuring and start recovering.
What happened
Never run, in either mode. Everything above it on this card is a prediction the dependency graph made and nobody has checked.
- The expensive one. It promotes a database, so it needs a window, a person, and a fresh base backup budgeted for afterwards.
- Everything before the promote step is reversible. Everything from promote onward is not, which is why the step order is what it is.
Google will not sign anybody in
Vendor never run executableWith the upstream identity provider unreachable, does the estate keep serving everyone already signed in, and how long is that grace before it becomes a total outage?
- Takes away
- google-oauth · credential-denied
- Costs (derived)
- 34 of 162 capability points
- Deadline
- 30 min · set by jarvisos-auth
- Measured
- never
- Cadence
- every 180 d
- Observed from
- vin
Losing Google OAuth takes out 3 other things and costs 34 of 162 capability points: Sign-in, JarvisOS orchestration.
Injection
config-override · reversible · no person required
Point the auth service's OIDC discovery URL at an address that does not answer. No firewall rule, no DNS record and no key is touched — the estate's own policy forbids all three, and a drill that breaks that policy has changed the thing it was measuring.
Undo: Restore the discovery URL and confirm a fresh sign-in completes.
The override touches jarvisos-auth's configuration, which is inside the derived blast radius of this scenario — it is a thing the outage would break anyway, not collateral.
Steps
-
Record the session lifetime the estate actually issues proposedNot the configured value — the value on a token issued today. Those two disagree more often than anyone expects.Verify: An issued session's expiry is recorded.Undo: none — reading is not a change
-
Make the provider unreachable a personVerify: A fresh sign-in fails at the discovery step, not at the credential step.Undo: Restore the discovery URL.
-
Measure the grace period proposedHow long the estate keeps working for people already inside it. That number is the degraded mode the identity register claims, checked.Verify: An existing session keeps working, and the moment it stops is recorded.Undo: none — reading is not a change
-
Restore the discovery URL a personVerify: A fresh sign-in completes without restarting anything else.Undo: none — this is the rollback
Stop the drill when
-
The override cannot be reverted on the first attempt
Stop and work it as an incident: the estate is now in a real identity outage of its own making.
What happened
Never run, in either mode. Everything above it on this card is a prediction the dependency graph made and nobody has checked.
- The only drill here whose fault is genuinely somebody else's, and therefore the only one where the recovery step is 'wait' — which is why the grace period, not the RTO, is the number it exists to produce.
- config/auth-ha.json declares its own idp-outage drill covering the same scenario from the identity register's side. Two registers scheduling one rehearsal is how a drill gets run twice or, more usually, zero times. Consolidating them is a task, not a rename.
The auth service is down
Service never run executableEvery published route is forward-authed. When the thing doing the authing stops, is that a sign-in outage or a total one — and can an operator still reach the console to find out?
- Takes away
- jarvisos-auth · hard-down
- Costs (derived)
- 34 of 162 capability points
- Deadline
- 30 min · set by jarvisos-auth
- Measured
- never
- Cadence
- every 90 d
- Observed from
- vin
Losing JarvisOS Auth (SSO) takes out 2 other things and costs 34 of 162 capability points: Sign-in, JarvisOS orchestration.
Injection
container-stop · reversible · no person required
Stop the auth container on VIN. No configuration is edited and no key is touched.
Undo: Start the container and confirm a fresh sign-in completes end to end.
Steps
-
Establish one live session before injecting proposedWithout a session established beforehand there is no way to tell whether existing sessions survive, which is the entire question.Verify: A session exists and is making successful requests.Undo: none — reading is not a change
-
Stop the auth service a personVerify: A fresh sign-in fails.Undo: Start the auth container.
-
Test the session established in the baseline proposedVerify: The result is recorded either way: a surviving session and a dead one are both valid answers, and only one of them matches what the identity register claims.Undo: none — reading is not a change
-
Confirm the recovery console still renders proposedThis is the page an operator opens during an auth outage. If it needed auth, it would be unopenable exactly when it is needed.Verify: The console renders over loopback with the auth service stopped.Undo: none — reading is not a change
-
Restart auth proposed restart-authVerify: A fresh sign-in completes and the control plane recovers without its own restart.Undo: none — this is the rollback
Stop the drill when
-
The auth service does not come back on the first restart
Stop the drill and work the incident. A key or store problem surfacing here is a real fault that the drill merely uncovered.
What happened
Never run, in either mode. Everything above it on this card is a prediction the dependency graph made and nobody has checked.
- Cheap and high-value: it is the only drill that checks the console's own independence from auth, which is a design property that would otherwise be tested for the first time during an auth outage.
The object store stops answering
Store never run executableWith the backup and artifact plane gone, what silently stops being protected — and how long before anybody would have found out?
- Takes away
- nas-backups, gwscli-s3-offsite · hard-down
- Costs (derived)
- 22 of 162 capability points
- Deadline
- 120 min · set by nas-backups
- Measured
- never
- Cadence
- every 180 d
- Observed from
- vin
Losing NAS backup dataset + Offsite backup replica takes out 0 other things and costs 22 of 162 capability points: On-site backups, Offsite recovery.
Injection
dataset-unmount · reversible · no person required
Unmount the backup dataset on the NAS. The pool is untouched and no object is deleted.
Undo: Remount the dataset and let the next scheduled backup land normally.
Only the on-site half can be injected. The off-site bucket belongs to a provider, so an executed run of this drill is always a partial rehearsal of the scenario it describes — and the register would rather say that than round it up to a pass.
Steps
-
Record the newest object in both copies proposedVerify: A named object and timestamp for the on-site copy and for the off-site one.Undo: none — reading is not a change
-
Unmount the backup dataset a personVerify: Writes to the dataset fail.Undo: Remount the dataset.
-
Wait for a scheduled backup and see whether it complains proposedThe question is not whether the backup fails. It is whether anybody finds out, and when.Verify: The failure produced a signal that reached a person or an incident, with the delay recorded.Undo: none — reading is not a changeA backup that fails silently is indistinguishable from one that succeeded, until the day it matters.
-
Remount and let it land proposed remount-nas-backupsVerify: The next scheduled backup completes and the dataset holds a newer object than the baseline.Undo: none — this is the rollback
-
Re-run the off-site sync and confirm it catches up automatic rerun-offsite-syncVerify: The off-site copy holds the object the on-site copy gained during the drill.Undo: Stop the sync. It copies and never deletes, so a stopped sync leaves the off-site copy exactly as it was.
Stop the drill when
-
The pool reports a fault at any point during the drill
checked automatically
Remount immediately and stop. A storage fault during a storage drill is an incident wearing the drill's clothes.
-
The drill has run 48 hours without a scheduled backup attempting the dataset
Remount and file it: a backup schedule that does not fire is a bigger finding than the one this drill went looking for.
What happened
Never run, in either mode. Everything above it on this card is a prediction the dependency graph made and nobody has checked.
- The longest-running drill here by design. Its most valuable measurement is a delay — how long a silent backup failure stays silent — and that cannot be measured in a maintenance window.
The private link between the sites drops
Link never run executableThe graph claims losing WireGuard costs nothing because tailscaled is a second private path. Is that true, or is it true only on paper?
- Takes away
- wireguard-tunnel · unreachable
- Costs (derived)
- 0 of 162 capability points
- Deadline
- 15 min · set by wireguard-tunnel
- Measured
- never
- Cadence
- every 90 d
- Observed from
- vin
Losing WireGuard (Home1 <-> VIN) takes out 2 other things but every declared capability survives it (degraded: JarvisOS orchestration).
The graph derives no capability loss from this scenario at all — which is a claim worth testing rather than a reason not to.
Injection
unit-stop · reversible · no person required
Stop the WireGuard unit on VIN. The peer configuration is not touched.
Undo: Start the unit and confirm the handshake completes without editing anything.
Steps
-
Record replication lag and the second path proposedVerify: Lag is under the warn threshold and the tailnet path answers before anything is stopped.Undo: none — reading is not a change
-
Stop the tunnel a personVerify: The handshake counter stops advancing.Undo: Start the WireGuard unit.
-
Prove the second private path still gets you in proposedVerify: An operator reaches home1 over the tailnet while WireGuard is down.Undo: none — reading is not a changeIf this fails, private-access is a single point of failure the graph does not know about, and that finding is worth more than the rest of the drill.
-
Bring the worker back once the link returns automatic restart-workerVerify: The worker accepts a dispatched task and the control plane stops queueing.Undo: Stop the worker again. It was not serving before the step, so stopping it returns the estate to exactly the state the step began in.Safe in the action catalogue and undoable, so automation may run it inside a drill it did not start.
-
Restart the tunnel and let replication catch up proposed restart-wireguardVerify: Replication lag returns under the warn threshold without a resync.Undo: none — this is the rollback
Stop the drill when
-
Replication lag exceeds the critical threshold and is still climbing 15 minutes after the tunnel returns
checked automatically
Stop the drill. A replica that cannot catch up is a data-resilience incident, not a link drill.
-
The tailnet path is also down
checked automatically
Restart the tunnel immediately: the estate would have no private path in at all, which is not a state to explore on purpose.
What happened
Never run, in either mode. Everything above it on this card is a prediction the dependency graph made and nobody has checked.
- The cheapest drill in the register and the one with the most surprising claim attached to it — zero capability points lost. A claim that cheap to test and never tested is the definition of what this register is for.
The VPS is gone
Node simulated only simulate onlyWith the only public-ingress node gone, how much of the estate is still doing useful work — and who would notice, given the thing that watches the estate runs on it?
- Takes away
- vin · hard-down
- Costs (derived)
- 86 of 162 capability points
- Deadline
- 15 min · set by caddy
- Measured
- never
- Cadence
- every 180 d · due in 165 d
- Observed from
- home1
Losing VIN / VPS takes out 12 other things and costs 86 of 162 capability points: Published web, Sign-in, JarvisOS orchestration, JarvisAI agent surface, Private access to the estate, Knowing what is broken.
Why it cannot be executed
-
self-observing
This console runs on vin, which the scenario takes down. Its own record of the drill would stop at the moment the drill began.
Injection
provider-stop · reversible · needs a person
Stop the instance from the provider console.
Undo: Start the instance and let the units come up in their declared order.
Steps
-
Put a watcher outside both sites a personA phone on mobile data, or anything off-fleet. Without it this drill has no observer at all.Verify: The external watcher records the exact second the published hostname stops answering.Undo: none — reading is not a change
-
Stop the instance a personVerify: The public hostname stops answering and the LAN-side services do not.Undo: Start the instance.
-
Record what noticed, and how a personThe interesting answer is usually 'a person, eventually'. Writing that down is what makes the case for an off-fleet dead-man's switch.Verify: The first notification of the outage is named, with its source and its timestamp.Undo: none — reading is not a change
-
Start the instance and verify the edge proposed reboot-vinVerify: Published hostnames answer, sign-in completes, and the console renders without a manual restart of anything.Undo: none — this is the rollback
Stop the drill when
-
The instance does not return within 15 minutes of being started
Treat it as an incident and rebuild from the crown-jewels backup. The 15 minute RTO on VIN is a rebuild time, and this is the one chance to find out whether it is real.
What happened
-
2026-08-02
simulated
passed · homelab-operator · nothing timedA walk of the model, not of the estate. It agreed with the dependency graph, which is the least surprising possible result — the simulation and the graph are the same arithmetic.It did establish the thing that keeps this drill from being executed: 86 of 162 capability points go, and every observer the estate owns is inside them.Finding: There is nothing off-fleet that would notice VIN stopped answering. The estate's only detector of a VIN outage is a process running on VIN. Until an external dead-man's switch exists, the detection time for this scenario is 'whenever a person happens to look'. filed as HOST-023
- Not executable from this console, and the register derives that rather than being told: the console runs on VIN, so it would stop recording at the moment the drill began.
- Executing it needs the observer moved off-fleet first. That is a real prerequisite and it is tracked as one.
The provider control plane is unreachable
Vendor simulated only simulate onlyWith the DNS provider's API and console gone, what can still be changed — and does anything already running actually stop?
- Takes away
- cloudflare-dns · unreachable
- Costs (derived)
- 36 of 162 capability points
- Deadline
- 15 min · set by caddy
- Measured
- never
- Cadence
- every 365 d · due in 350 d
- Observed from
- vin
Losing Public DNS takes out 1 other thing and costs 36 of 162 capability points: Published web, Public name resolution.
Why it cannot be executed
-
no-injection
There is no way to induce this fault. It belongs to somebody else, and the estate’s own policy forbids faking it by editing DNS, firewall rules or the Caddyfile. This drill is a simulation by construction.
Injection
none · not reversible · needs a person
There is no way to induce this. Faking it would mean editing DNS records or a firewall rule, and this estate's policy forbids both — a drill that breaks managed configuration to simulate an outage has caused one. So this drill is simulate-only, derived rather than declared, and the register says so on the page rather than quietly listing it beside the ones that can be run.
Steps
-
Record the TTL on every published record proposedThe TTL is the length of the grace period. A five-minute TTL and a one-hour TTL are two entirely different outages.Verify: Every published name has its TTL recorded.Undo: none — reading is not a change
-
Find the next certificate renewal deadline proposedDNS-01 renewal needs the provider API. An outage that outlasts a renewal window turns a name-resolution problem into a TLS failure two days later, and nobody connects the two.Verify: The nearest renewal date is recorded, with the margin to it.Undo: none — reading is not a change
-
Walk the scenario against the model proposedVerify: The derived blast radius is recorded and compared against the last run's.Undo: none — simulation changes nothing
-
List every recovery step that needs this API proposedThe output is a list of failovers that are unavailable during this outage. That list is the drill's real product.Verify: Each recovery action in the catalogue is marked as needing the provider control plane or not.Undo: none — reading is not a change
Stop the drill when
-
Somebody proposes inducing this by editing a DNS record
Stop. That is a change to managed configuration and it is not a drill. The simulation is the drill.
What happened
-
2026-08-02
simulated
passed · homelab-operator · nothing timedSimulation only, and permanently so. The steps that produce this drill's real value — the TTL inventory, the certificate deadline and the dependency audit — are reading exercises that do not need the outage to be real.The dependency audit was not completed in this run, so the list of recovery actions that need the provider control plane does not exist yet.Finding: The VPS-loss scenario's degraded mode assumes published names can be re-pointed. This scenario removes exactly that ability. The two drills have never been considered together, and the combination is more likely than either alone if the cause is a billing or account action. filed as HOST-016
- The compute provider's API — the one that would be used to rebuild VIN — is not a declared entity, so this drill cannot cover it. That gap is real and it belongs to the inventory, not to this register.
The second failure domain is gone
Node simulated only simulate onlyIf the only compute domain that is neither the home rack nor VIN disappears, what does the estate actually lose — and would anybody find out?
- Takes away
- vps1 · hard-down
- Costs (derived)
- 0 of 162 capability points
- Deadline
- 60 min · set by vps1
- Measured
- never
- Cadence
- every 365 d · due in 365 d
- Observed from
- vin
Losing VPS1 / de-james-vps1 takes nothing else with it and costs no declared capability.
The graph derives no capability loss from this scenario at all — which is a claim worth testing rather than a reason not to.
Why it cannot be executed
-
no-injection
There is no way to induce this fault. It belongs to somebody else, and the estate’s own policy forbids faking it by editing DNS, firewall rules or the Caddyfile. This drill is a simulation by construction.
Injection
none · not reversible · needs a person
There is no permitted way to induce this. Powering off vps1 would take down another operator's authentik, mail server and 13 published hostnames, none of which belong to this estate, to measure a loss this estate has already derived as zero. That is not a drill, it is an outage with a clipboard. If estate workloads are ever placed here, this injection becomes "stop the estate's containers only" and the drill becomes executable — that transition is the thing to watch for.
Steps
-
Confirm the second domain can execute work at all proposedBefore asking what its loss costs, establish that it currently gives anything. Run the second-domain canary: a container on vps1 with --network none that must return the SHA-256 of a nonce it has never seen. Network-isolated on purpose — an answer proves the node produced it without help from VIN, home1, DNS or the internet.Verify: `jarvisos-independence.mjs canary --node vps1 --confirm` returns the expected digest, and the register records the receipt.Undo: none — the container is --rm and holds no state
-
Derive the blast radius before touching anything proposedWalk the dependency graph for the loss of vps1 and write down the predicted capability loss. If it is not empty, this drill has found something and the rest of it changes.Verify: The derived capability loss is recorded, and it matches what this drill declares it expects.Undo: none — reading is not a change
-
Ask what would notice a personName the signal that would change if the node stopped existing, with its source. "A person, when they next open the page" is a valid and expensive answer.Verify: The first detector of a vps1 outage is named, or its absence is.Undo: none — reading is not a change
Stop the drill when
-
Anybody proposes inducing this for real while another operator's workloads are on the node
Stop. The injection is declared none for a reason, and it stays none until the estate owns something on this node that can be stopped on its own.
What happened
-
2026-08-17
simulated
passed · jarvisos-worker · nothing timedThe readiness step was executed for real against the live node; the injection was not, and may not be. So this is recorded as simulated with two steps actually run, rather than as an executed drill.Readiness passed: a --network none container on vps1 returned the correct SHA-256 of a fresh nonce in 281ms on a 4-vCPU host. The node executes work and needed nothing outside itself to do it.The derivation agreed with the declaration: losing vps1 costs no declared capability, because no declared capability touches it.A drill that costs nothing is measuring an asset nothing uses. The value of this run is the baseline: the next time it is run, a non-empty capability loss means the estate has genuinely started depending on its second domain.Finding: Nothing would notice. There is no JarvisOS agent on vps1 and no credential for its Coolify, so the estate's detection time for the loss of its own second failure domain is "whenever a person runs the probe". The console shows the node as unknown, and it would show exactly the same thing if the machine were destroyed. filed as HOST-025
- This is the first drill in the register whose domain was added because a machine was measured rather than because a machine was planned.
- It is deliberately cheap and deliberately boring. The expensive drill — lose fd-home-rack and fd-vps together and serve something from vps1 — cannot be written until the estate places a workload there, and placing one is an owner decision about a shared machine.
Open gaps
true statements about the estate, printed rather than failed-
never-run · drill-uplink-loss
Home internet is gone has never been run in any mode. Everything this register says about it is a prediction.
-
never-run · drill-tunnel-loss
The private link between the sites drops has never been run in any mode. Everything this register says about it is a prediction.
-
never-run · drill-home1-loss
Home1 disappears has never been run in any mode. Everything this register says about it is a prediction.
-
never-run · drill-home-rack-loss
The whole room is gone has never been run in any mode. Everything this register says about it is a prediction.
-
never-executed · drill-vin-loss
The VPS is gone has only ever been simulated. A fixpoint over a JSON file has never found a wedged unit, a full standby disk, or a runbook step naming a host that no longer exists.
-
never-executed · drill-second-domain-loss
The second failure domain is gone has only ever been simulated. A fixpoint over a JSON file has never found a wedged unit, a full standby disk, or a runbook step naming a host that no longer exists.
-
never-run · drill-auth-outage
The auth service is down has never been run in any mode. Everything this register says about it is a prediction.
-
never-run · drill-idp-unreachable
Google will not sign anybody in has never been run in any mode. Everything this register says about it is a prediction.
-
never-run · drill-objectstore-outage
The object store stops answering has never been run in any mode. Everything this register says about it is a prediction.
Accepted
decisions on record, never hidden-
never-executed · drill-provider-api-outage
The provider control plane is unreachable has only ever been simulated. A fixpoint over a JSON file has never found a wedged unit, a full standby disk, or a runbook step naming a host that no longer exists.There is no way to execute it. The fault belongs to a provider and the only ways to fake it are edits to DNS or firewall rules, which this estate's policy forbids and which would change the thing being measured. The simulation is the drill, and it is the honest ceiling of what can be known here. — homelab-operator, review 2027-08-01
How this register behaves
- Expected impact is never written here. It is derived from config/dependency-graph.json on every render, so it cannot drift away from the estate. The expect block below is a second opinion, kept precisely so a disagreement is visible.
- Simulated and executed are two different clocks. A simulation walks a fixpoint over a JSON file; it has never once found a wedged systemd unit, a standby with a full disk, or a runbook step naming a host that was decommissioned in March.
- The most valuable output of a drill is not pass or fail. It is a contradiction: something the model said would survive and did not. A contradiction with no task filed against it will be rediscovered by the next drill at the same price.
- A drill measures from fault injection to capability restored, observed from outside the thing that broke. A service reporting its own recovery is measuring the wrong clock.
Boundaries. A drill may stop a process, unmount a dataset, unplug a cable or point a service at an address that does not answer. It may never edit the Caddyfile, a firewall rule or a DNS record — those are managed configuration, and a change made to fake an outage is how a rehearsal becomes one. Where a fault can only be produced by touching one of those, the drill is simulate-only and says so.
Approval. Anything that stops a critical-tier entity needs the operator present and a maintenance window on the calendar. Automation may run only the steps this register derives as safe-with-an-undo, and it runs them inside a drill it did not start.