Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

I20 · No agent (the on-device model, a remote relay, or any agent started by `planarian agent …

planarian @ a924e09 · Spec v4.6 · snapshot main · all versions

No agent (the on-device model, a remote relay, or any agent started by planarian agent run) starts while planarian-ready.target is not reached, and every running agent is stopped when a failure posture engages, in every posture (§12d). Agents the launcher creates are inside this rule exactly as the units declared in services.planarian.agentUnits (the model service and any relay) are.

— SPEC §7

StatusProof phased:aGym
Tested, not provedA0 : 2 (baseline 0 : 2, not degraded)7 entries, 7 must-pass

How it is proved

No obligation discharges it: nothing about it is proved.

What it rests on

If any of these is false, the proof no longer describes the real machine.

IdAssumptionKindAlso relied on by
P6systemd reports unit state truthfully over D-Bus and honors X-RestartIfChanged / X-StopIfChangedPlatformI4, I13, I24
P8The kernel and systemd are correctPlatformI1, I2, I3, I9, I17, I22

How it is tested

EntryHarnessWhat it doesExpectsLatest verdict
posture-absent-maskedvmplanariad is masked and the machine rebooted. planarian-ready.target times out; Standard’s Absent responses apply; the agent stand-in never starts; unmasking and a clean ready lifts them.invariants: I20; not_started: service:gym-agent; posture: class Absent, not [“restrict_login”, “halt_to_recovery”, “alarm_dismissable”], responses [“alarm”, “notify_admins”, “disable_agents”, “restrict_remote”], target…VM: not run in this build
posture-crashed-budgetvmplanariad reaches ready, then is killed until its restart budget is spent. OnFailure= reaches planarian-failed@Crashed; responses as Absent; agents stop; an administrator’s acknowledgement is journaled with identity.invariants: I20; posture: class Crashed, not [“restrict_login”], responses [“alarm”, “notify_admins”, “disable_agents”, “restrict_remote”], target_reached planarian-failed@Crashed.target; reports: AlarmAcknowledged(use…VM: not run in this build
posture-integrity-core-hashvmThe recorded core hash no longer matches its signature (I2). planarian-recovery’s independent check fails the boot as Integrity: tamper alarm, notify, no agents, remote access off; local login proceeds with the warning. Only an administrator clears it.invariants: I2, I20; not_started: service:gym-agent; posture: class Integrity, not [“halt_to_recovery”], responses [“alarm”, “notify_admins”, “disable_agents”, “restrict_remote”], target_reached planarian-failed@Integr…VM: not run in this build
posture-integrity-core-scriptvmOne posture script (planarian-ack), not planariad, no longer matches its line in the core-hash record. planarian-recovery checks every Planarian binary and script, so the boot fails as Integrity all the same (B-12).invariants: I2; posture: class Integrity, target_reached planarian-failed@Integrity.targetVM: not run in this build
posture-integrity-journal-chainvmA record in the hash-chained journal is altered while the machine is off. The boot report finds the broken chain (I18): Integrity responses, as above.invariants: I18, I20; posture: class Integrity, responses [“alarm”, “notify_admins”, “disable_agents”, “restrict_remote”], target_reached planarian-failed@Integrity.target; reports: BootReport(JournalChainBroken)VM: not run in this build
posture-integrity-undeclared-early-unitvmA unit outside the generation’s closure is planted to start before planarian-ready. The boot report names it and Integrity responses apply. (Phase A’s boot report checks units only, and planariad stops on the finding rather than opening an incident: catalog review G18.)posture: class Integrity, responses [“alarm”, “notify_admins”, “disable_agents”, “restrict_remote”], target_reached planarian-failed@Integrity.target; reports: BootReport(UndeclaredEarly: service:gym-planted)VM: not run in this build
posture-stops-launched-agentsvmAn administrator launches an agent with planarian agent run (in planarian-agents.slice). planariad then crash-loops past its restart budget: planarian-failed@Crashed stops the agents’ slice as a whole, so the launched agent stops too, not only the declared agent units.invariants: I20; posture: class Crashed, responses [“disable_agents”], target_reached planarian-failed@Crashed.target; unit_after_failure: service:planarian-agent-launched StoppedVM: not run in this build

Also tested by vm-posture.

Known limits

BypassRouteSeverityStatusCloses in
B-9Posture alarms and notification are local; root can clear them and a stopped planariad can go unnoticedMediumOpen (v4.5 §12d)C
B-10The boot report checks units, not processesMediumOpen (v4.5 §10)C
X-1Root edits the store, /boot, the binaries, the journal or the posture stateAcceptedAcceptedE
X-2A nixos-rebuild outside PlanarianAcceptedAcceptedC
X-3Firmware, bootloader and initrd run before planarian-ready.targetAcceptedAcceptedC, E
X-4Physical accessAcceptedAcceptedE
X-6The supply chain: nixpkgs content, cache signatures, input-addressed store pathsAcceptedAccepted—
X-7Backends report success falsely; systemd or the kernel misbehave (P1, P6, P8)AcceptedAcceptedD, E

History

SpecChange
v4.4Invariants I16 (security floor), I17 (administrator set non-empty), I18 (hash-chained journal), I19 (no self-approval, no self-escalation), I20 (no agent without the monitor)
v4.4rule 4’s preserve list extended to I10–I20
v4.6I20: launched agents inside the rule [R05]

See also

§12d