kai-server privileged Ansible cannot converge unattended, and authored fixes are silently sitting unapplied #923
Labels
No labels
burndown-2026-06
burndown-2026-08
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure#923
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found while working #917 and #864 on 2026-08-25. Both hit the same wall, which is why this is its own issue rather than a note on either.
The wall
Any privileged role targeting kai-server fails immediately:
ser8 has passwordless sudo and converges clean in the same run. kai-server needs
ask_passand a human at a prompt.Why it matters more than an inconvenience
The failure mode is not "the run errors and someone fixes it". It is that work gets authored, reviewed, merged, and then quietly never reaches the host, while the repository looks like it shipped. Two confirmed instances, found by accident within an hour of each other:
k3s-configpod resolver (#864). The role setsDNSStubListenerExtraon kai-server's own LAN address and points pods at that single nameserver, which fixes theDNSConfigFormingwarnings outright. On the host:config.yamlhas noresolv-conf:key,/etc/rancher/k3s/resolv.confdoes not exist, anddig @192.168.0.194is connection-refused. Meanwhile the warning count reached 31,146 on coredns alone.restic-backupand is the host whose backup actually matters, is uncovered.Neither was noticed by anything. Both were found by reading the host rather than the repo. There is no signal that distinguishes "converged" from "authored but never applied", which is the same silent-failure shape #917 was about.
What would resolve it
Not proposing a specific mechanism, since the tradeoffs are Kai's. The options are roughly:
kai-disk-pressure-reportsudoers file.just up-to-date checkalready exists as a read-only detector pattern in the fleet.Option 3 is worth having regardless of 1 or 2, because it is the part that turns a silent gap into a reported one.
Done means
Either privileged roles converge kai-server without a human at a prompt, or something reports when kai-server's converged state has drifted from the repository. Right now neither is true, and the only way to find out is to SSH in and read files by hand.
Correcting this issue's central claim. I filed it saying nothing reports the gap. Something does, it has been right for three weeks, and nobody has read it. That is a different problem with a different fix.
The detector already exists
fleet-convergecompares each host's last successful full-apply marker against the current privilegedGit-tree fingerprint, which
docs/fleet-converge.mddocuments under Privileged status. On kai-server right now:All three files last written 2026-08-04.
missingmeans no successful untagged full apply has ever written the marker on that host, so kai-server has been correctly flagged as carrying pending root-level work for three weeks.It was right about the restic failure-alert rollout and the k3s pod resolver before either was authored, because it is fingerprint-based rather than per-role.
So the real gap is delivery, not detection
Three things make a correct finding invisible:
fleet_converge_enabled: falseis the role default, sofleet-converge.timerdoes not exist on kai-server. The detector only advances when someone runssystemctl --user start fleet-converge.serviceby hand.journalctl --user -u fleet-converge.servicecurrently returns-- No entries --. Nothing pushes, nothing alerts, nothing fails a check.missingread the same as fresh ones.This is the same shape as everything else found on 2026-08-25:
coilyco-bridge/deploy#791(a rollout orphaning a release with no signal),deploy#793(a tool returning empty results while loggingoutcome: ok), and the ComfyUI ExternalSecret that reportedSecretSynced Truefor 46 days while delivering a credential to nobody. The mechanism works and reports into a void.Which reorders the options in the body
Option 3, drift detection, is already built. It does not need building, it needs somewhere to arrive. That is much cheaper than what I originally described.
Concretely, in rough order of effort:
restic-failure-alert(#921) is a worked example of a systemd unit posting to it. Aprivileged-status.currentofmissingorstaleis exactly as alertable as a failed backup.fleet_converge_enabled: truein inventory, which the doc notes is a deliberate configuration change rather than a runtime toggle.1 and 3 are independent and both worth having. 1 makes the gap visible; 3 stops it recurring. 2 is what makes 1 fire more than once.
One caveat on reading the marker
Two things it does not mean, worth stating because both would mislead:
missing.missingdoes not name the unapplied roles. Checking a specific one still means asking the host, as insystemctl show restic-backup.service -p OnFailure --value.Why this is not in docs/
I tried to document it in
docs/fleet-converge.mdand could not. That file is at 7,962 of 8,000 characters, 38 characters of headroom, anddocs/holds 41 pages against a 40-page cap. Thecatalog-doc-sizehook rejects both a new page and an inline addition, and it explicitly anticipates the workaround:So this content lives here until
#855and#856free a slot. Trimming another author's dense prose to make room for mine seemed the wrong trade to make unilaterally. Flagging it because the next person with something to document will hit the same wall, and the caps are currently a hard blocker on new infrastructure documentation rather than a nudge.