@startuml change-lifecycle
!include _theme.iuml

[*] --> Candidate : declared field and observed state
Candidate --> NoDrift : equivalent values
Candidate --> Blocked : unreadable, unavailable or unsafe
Candidate --> Executable : readable drift and capability evidence
NoDrift --> [*] : omitted from report
Blocked --> ReportedOnly : reason retained
ReportedOnly --> [*] : never passed to applier
Executable --> Planned : included in displayed plan
Planned --> [*] : plan command is read-only
Planned --> Declined : apply confirmation refused
Planned --> Attempting : confirmed or --yes
Declined --> [*] : no mutation
Attempting --> Succeeded : endpoint group succeeds
Attempting --> Failed : endpoint group fails
Succeeded --> [*] : outcome reported
Failed --> [*] : error reported; no automatic rollback
@enduml
