feat(ops-agent): drift-detect kijkt ook naar de geïnstalleerde build #127
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "chore/drift-detect-installed-build"
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?
Het gat
check-ops-agent-drift.shvergeleek alleen/etc/ops-agent-config tegen de repo-baseline en keek nooit naar/opt/ops-agent. Daardoor bleef een twee weken oude agent-binary — zonder het complete, al gemergedecontrol-room-subsysteem — onzichtbaar voor precies het mechanisme dat drift moet vangen. Dit is een detector, geen fix: hij vindt de volgende stale component, wat dat ook blijkt te zijn.Mechanismekeuze: exacte vergelijking, geen mtime
setup.shinstalleert metrsync -a --deletevanuit<repo>/ops-agent/, dus de geïnstalleerde tree draagt zijn eigen bronkopie mee. Een sha256-manifest per bestand is daarmee een echte vergelijking die retroactief werkt — ook op installs die van vóór elke vorm van stempelen dateren.De voorgestelde mtime-heuristiek is bewust verworpen, met meting. Op 154:
ops-agent/commands.yml.exampleEen
git checkoutherschrijft mtimes zonder de inhoud te raken. De heuristiek zou hier dus drift melden op een gezonde host — en een check die op een gezonde host afgaat wordt binnen een week gemute. Dan is hij erger dan geen check, want hij ziet eruit als dekking.Vals-positief-analyse (verse install)
Gemeten, niet beredeneerd: na
setup.shis alles buitensrc/byte-identiek aan de repo, inclusiefpackage-lock.json(npm ci+npm prune --omit=devherschrijven die niet). De vier paden die by construction afwijken zijn expliciet uitgesloten:node_modules/npm ci/prunedraaien in de installdirdist/npx tsc.git/.install-provenanceOp een vers geïnstalleerde agent is de uitkomst dus exit 0, zonder note. Bewezen in test 2 hieronder.
Laag (b): provenance-stamp
setup.shschrijft nu/opt/ops-agent/.install-provenancemet de git TREE-hash vanops-agent/. Content-adressed, dus stabiel over rebases en cherry-picks en veranderend enkel wanneer de agent-bron echt verandert — geen ruis van niet-gerelateerde commits.Bewijs
/opt/ops-agentDRIFT: 19 file(s)— 0 config, 19 build; helecontrol-room/alsin repo source, NOT installednode_modules/dist-rommel + kloppende stamp)no drift, exit 0, geen notebuild:src/auth.ts — installed content differs from sourcebuild:src/verweesd.ts — installed, not in repo sourcebuild:provenance — installed tree deadbeefdead != source tree c13cc37f4f95install dir missing — agent never installedno drift, exit 0 — exact als voorheenTwee bugs die het bewijzen zelf boven water bracht
ops-agentis → plain git weigert metdetected dubious ownership, en de provenance-laag zou in productie nooit hebben gewerkt (test 3c faalde eerst stil). Opgelost door precies die ene repo te vertrouwen — nietsafe.directory='*'.Ruis-discipline
OPS_AGENT_SRC_DIR. Ongezet ⇒ build-check volledig overgeslagen, zodat max2 (dat dit script deelt) niet gaat piepen tot iemand het daar bewust wiret.Scope
/etc/ops-agenten/opt/ops-agentzijn niet aangeraakt; de agent is niet gedeployd — de huidige staleness is het testfixture. Nog niet gearmd: zie de review-notitie over het wiren van de systemd-unit.Testsuite
test/control-room-foundation.test.tsis rood (65 failed / 14 passed) — ook op onaangeraaktemain, identieke aantallen. Pre-existing, niet door deze PR veroorzaakt.De drift-check vergeleek alleen /etc/ops-agent-config tegen de repo-baseline en keek nooit naar wat er draait. Daardoor bleef een twee weken oude /opt/ops-agent — zonder het complete, al gemergede control-room-subsysteem — onzichtbaar voor precies het mechanisme dat drift moet vangen. Twee lagen, beide in deze commit: (a) Retroactief, werkt nu meteen. setup.sh installeert met `rsync -a --delete` vanuit <repo>/ops-agent/, dus de geinstalleerde tree draagt zijn eigen bronkopie mee. Een exacte manifest-vergelijking (sha256 per bestand) is daardoor mogelijk op installs die van voor elke vorm van stempelen dateren. Geen mtime-heuristiek: gemeten op 154 heeft ops-agent/commands.yml.example een repo-mtime van Jul 18 tegen een installed-mtime van Jul 17 met een IDENTIEKE sha256 — een git checkout herschrijft mtimes zonder de inhoud te raken, dus die heuristiek meldt drift op een gezonde host. Een check die op een gezonde host afgaat wordt binnen een week gemute, en is dan erger dan geen check. (b) Duurzaam: setup.sh stempelt de herkomst in /opt/ops-agent/.install-provenance (git TREE-hash van ops-agent/, dus content-adressed en ongevoelig voor rebases en niet-gerelateerde commits). Daarmee wordt het een exacte vergelijking in plaats van een afleiding. Vals-positief-oppervlak op een verse install is nul: alles buiten src/ is byte-identiek na setup.sh, inclusief package-lock.json (npm ci + prune herschrijven die niet). De vier paden die by construction afwijken — node_modules/, dist/, .git/ en de stamp zelf — zijn expliciet uitgesloten. Verder: - Opt-in via OPS_AGENT_SRC_DIR. Ongezet = de 2-argument-aanroep gedraagt zich exact als voorheen, zodat max2 (dat dit script deelt) niet gaat piepen. - Beide scripts draaien als root tegen een repo die van ops-agent is; plain git weigert die met "dubious ownership". Opgelost door precies die ene repo te vertrouwen, niet safe.directory='*'. - Ontbrekende stamp is bewust GEEN drift maar een note: anders alarmeert elke pre-stamp install elke nacht over iets dat geen redeploy kan verhelpen. Kan de bron-tree niet worden bepaald, dan zegt hij dat luid — een provenance-laag die stil stopt met vergelijken lijkt op eentje die slaagt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>Verdict: COMMENT
Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
deploy/ops-agent/check-ops-agent-drift.sh:127— De nieuwe installed-build drift-check bevat meerdere niet-triviale shellpaden (find/sha256sum/comm/join, ontbrekende install-dir, provenance met/zonder git checkout), maar de PR-diff toont geen bijbehorende tests of fixture-validatie. Voor monitoring/deploy-code is het risico vooral false positives of stille false negatives op hosts; voeg bij voorkeur een shelltest/fixture toe voor minimaal: identieke source/install, ontbrekend bestand, gewijzigd bestand, extra install-bestand en.install-provenancemet mismatch.Geen blokkerende architectuur- of patroonafwijking gevonden in de getoonde diff. De aanpak is opt-in via
OPS_AGENT_SRC_DIR, behoudt bestaand tweeargumenten-gedrag en vergelijkt content in plaats van mtimes, wat aansluit bij het doel om drift betrouwbaar te detecteren.