//! Wires a machine's harness up to a didbot stack, and says what is //! wrong with one that is already wired. //! //! # What this is for //! //! The stack itself comes up from a checkout: five scripts, each finding the //! others by default. What does not come up from a checkout is everything //! around it — a binary on `PATH`, because the harness invokes the hook by //! name; hook entries in a settings file that belongs to a person rather than //! to this project; a scrobble host declared where the harness will look for //! it; and a restart, because hook configuration is read once at session //! start. //! //! That is the whole subject. It is small, and it is the part that is //! different on every machine. //! //! # The shape //! //! One list of changes, each of which can be described, probed, made and taken //! back. [`check`] asks whether each has been made. [`apply`] makes the ones //! that have not. [`apply::undo`] takes back the ones this crate made and //! nobody has edited since. Three commands, one description — because a doctor //! and an installer that state the same facts separately drift, and the //! failure looks like the doctor lying. //! //! Idempotence and resumability are not features here; they fall out of //! probing before acting. There is no checkpoint file, because the machine's //! own state is the checkpoint and a file would go stale the moment somebody //! edited a setting by hand. //! //! # What it will not do //! //! Restart the harness, install a certificate authority, or bind a privileged //! port. Those are named as steps and stopped on, with the command to run, //! rather than attempted quietly. #![forbid(unsafe_code)] pub mod apply; pub mod check; pub mod disk; pub mod edit; pub mod harness; pub mod ledger; pub mod verify; pub use check::{Finding, Findings, Level}; pub use harness::{ClaudeCode, Desired, Harness, Scope}; pub use ledger::Ledger;