# Review: blunix-install-ripgrep-global ## Geprüfter Commit - `c992d7f513baa268555fe87cf074e34902ca1e21` — „host(global): re-add ripgrep to systemPackages" - Autor: pijukka, 2026-09-07 10:29:10 +0200 - Elterncommit: `bf2a775c2dc7a2e58438bf4d6cde9904377f43fd` („host(global): remove ripgrep from systemPackages") - Umfang laut `git show c992d7f --stat`: `hosts/globalServices/packages.nix`, 1 Datei, 1 Einfügung, 0 Löschungen Board-getriggerter Review mit festem Commit-Scope. Kein Arbeitsbaum-Diff, kein anderer Commit geprüft. Read-only; kein Commit, kein Push, kein Deploy, keine Aktivierung. ## Scope und Ausgangszustand Der Diff fügt genau eine Zeile ` ripgrep` in die `environment.systemPackages`-Liste in `hosts/globalServices/packages.nix` ein, zwischen `restic` (Zeile 11) und `rsync` (Zeile 13); `ripgrep` steht danach auf Zeile 12. Die Einrückung (5 Leerzeichen) entspricht exakt allen übrigen Listeneinträgen der Datei. Der Rest der Datei ist unverändert; die Liste bleibt syntaktisch eine unveränderte Nix-Listenform. Auftragsgrundlage: `docs/intent/blunix-install-ripgrep-global.md` (im Arbeitsbaum vorhanden, untracked, nicht Teil des geprüften Commits). Sie fordert: Ziel „`ripgrep` soll wieder systemweit auf blunix (und den anderen Hosts) installiert sein"; Auftrag an den Builder: „Ergänze ausschließlich den Eintrag `ripgrep` in `hosts/globalServices/packages.nix` innerhalb der bestehenden `environment.systemPackages`-Liste, alphabetisch einsortiert. Ändere keine andere Datei." Die Karte ist ausdrücklich das Gegenstück zu `blunix-remove-ripgrep-global.md` und dient als weiterer Durchlauf-Test der Board-Pipeline. Der Auftrag ist wortgetreu und vollständig umgesetzt: genau die eine benannte Datei, genau der eine benannte Eintrag, keine Nebenänderung. Der Zustand nach diesem Commit ist die exakte Umkehrung des Elterncommits, allerdings mit anderer Listenposition (siehe `low`-Befund 1). ## Tatsächlich ausgeführte Prüfmethoden Alle Prüfungen rein lesend: 1. `git show c992d7f` und `git show c992d7f --stat --format=…` — Scope-, Umfangs- und Metadatenprüfung des Diffs (Autor, Datum, Betreff). 2. `git diff bf2a775~1 c992d7f` und `… --stat` — Vergleich des Endzustands mit dem Zustand **vor** der Entfernung. Ergebnis: 1 Einfügung, 1 Löschung — die Datei ist inhaltlich gleichwertig, aber nicht byte-identisch zum Vorzustand, weil `ripgrep` an anderer Listenposition steht. 3. Volltext-Lektüre von `hosts/globalServices/packages.nix` im Arbeitsbaum (identisch zum Commit-Baum, siehe Prüfung 5). 4. `git log --oneline -6 --decorate` — Einordnung in die Historie und Feststellung der Ref-Position von `dev`/`origin/dev`. 5. `git status --porcelain` — Bestätigung, dass der Arbeitsbaum bis auf fünf untracked Dokumente unter `docs/` sauber ist. Damit entspricht der getrackte Arbeitsbaum dem Baum von `c992d7f`, sodass die folgenden Arbeitsbaum-Suchen für den Commit-Baum gültig sind. 6. `grep -rn "ripgrep" … --include="*.nix"` repositoryweit — Suche nach Doppeldeklarationen. Genau ein Treffer: `hosts/globalServices/packages.nix:12`. 7. `grep -rn "ripgrep" … -l` repositoryweit ohne `.git` — Bestätigung, dass alle übrigen Treffer reine Prosa unter `docs/intent/` und `docs/review/` sind. 8. `grep -rn "systemPackages" hosts/` — Aufzählung aller sieben Paketlisten des Repositorys und Abgleich gegen Prüfung 6, ob eine andere Liste `ripgrep` bereits führt. 9. `grep -rn "globalServices" … --include="*.nix"` und `grep -n "packages" hosts/globalServices/default.nix` — Verifikation der Modul-Importkette bis zu den drei Hosts. 10. Lektüre von `agents/reviewer.md` (Rollenvertrag), `AGENTS.md:46-64` (Test- und Commit-Konventionen), `agents/claude-settings/reviewer.json` (Berechtigungsprofil dieses Laufs), `docs/intent/blunix-install-ripgrep-global.md` (Auftrag) und `docs/review/blunix-remove-ripgrep-global.md` (Vorgeschichte, Befunde des Gegenstück-Reviews). **Nicht ausgeführte Prüfungen (offen):** - **Keine Nix-Evaluation.** `nix-instantiate --parse hosts/globalServices/packages.nix` wurde von der Berechtigungsschicht dieses Laufs **abgelehnt**. `nix flake check`, `nix build …#nixosConfigurations.…` und `nixos-rebuild dry-activate` liefen ebenfalls nicht; Build- und Aktivierungsprüfungen sind der Rolle ohnehin untersagt. Die Aussage „evaluiert unverändert" ist eine Ableitung aus der trivialen Diff-Form und der Volltext-Lektüre der Datei, keine gemessene Prüfung. - **Keine Laufzeitprüfung auf einem Host.** Kein Deploy, kein Dienstkontakt, kein Hostzugriff. Ob `rg` nach einem Rebuild tatsächlich im PATH liegt, ist nicht gemessen. - **Kein `git fetch`.** Der unten genannte Push-Zustand stammt aus der lokalen Remote-Tracking-Referenz (`git log --decorate`), nicht aus einer Live-Abfrage des Remotes. - **Keine Store-Inspektion der Agent-Wrapper.** Für diesen Commit nicht nötig: Ein *Hinzufügen* eines Pakets kann keinen bestehenden Konsumenten brechen. Die entsprechende Prüfung des Gegenstück-Commits ist in `docs/review/blunix-remove-ripgrep-global.md` dokumentiert. - **Keine Prüfung anderer Commits der Historie.** Der Board-Auftrag begrenzt den Scope ausdrücklich auf `c992d7f`. ## Befunde (priorisiert) **Keine Blocker. Keine `high`-Befunde. Keine `medium`-Befunde. Am Commit selbst: keine Befunde.** Die folgenden Punkte sind Beobachtungen; der erste betrifft den Commit-Inhalt, die übrigen Kontext und Pipeline. ### low — Wiederherstellung an anderer Listenposition als vor der Entfernung (kein Defekt) - **Pfad/Zeile:** `hosts/globalServices/packages.nix:12`. - **Beleg:** `git diff bf2a775~1 c992d7f` zeigt 1 Einfügung **und** 1 Löschung: Vor dem Entfernungscommit stand `ripgrep` auf Zeile 7, zwischen `tmsu` und `ffmpeg`. Nach `c992d7f` steht es auf Zeile 12, zwischen `restic` und `rsync`. Der Endzustand ist also nicht byte-identisch mit dem Zustand vor `bf2a775`. - **Auswirkung:** **Keine funktionale.** `environment.systemPackages` ist eine Nix-Liste, deren Reihenfolge für die resultierende Systemumgebung bedeutungslos ist (Priorisierung entsteht nur über `lib.hiPrio`/`lowPrio`, die hier nirgends im Spiel sind). Die evaluierte Systemclosure ist mit der Vorfassung identisch. Eine Sortierinvariante wird nicht verletzt, weil die Liste insgesamt gar nicht alphabetisch sortiert ist (`git`, `neovim`, `tmsu`, `ffmpeg`, `unzip`, `tree`, `nmap`, …). - **Empfehlung:** **Keine Änderung.** Die Intent-Karte verlangt ausdrücklich „alphabetisch einsortiert"; `restic` < `ripgrep` < `rsync` erfüllt das lokal, die alte Position zwischen `tmsu` und `ffmpeg` hätte es nicht getan. Der Builder hat der wörtlichen Anweisung den Vorrang vor der exakten Wiederherstellung gegeben — das ist die richtige Auflösung dieser Spannung. Ich halte den Punkt nur fest, damit ein Vergleich „Vorzustand == Nachzustand" nicht fälschlich als abweichend gelesen wird. ### low — Wirkung reicht über blunix hinaus (im Intent gedeckt, hier nur explizit gemacht) - **Pfad/Zeile:** `hosts/tnix/configuration.nix:12`, `hosts/pinix/configuration.nix:12`, `hosts/blunix/configuration.nix:14` (jeweils `../globalServices/default.nix`) → `hosts/globalServices/default.nix:3` (`./packages.nix`). - **Beleg:** Alle drei Hosts importieren dieselbe globale Paketliste. Der Kartenname nennt nur blunix. - **Auswirkung:** `rg` kehrt beim nächsten Rebuild auch auf tnix und pinix in `environment.systemPackages` zurück. Für ein kleines, weit verbreitetes CLI-Werkzeug ohne Dienst-, Netzwerk- oder Secret-Bezug ist das folgenlos. - **Empfehlung:** Keine Änderung. Der Intent benennt das Ergebnis ausdrücklich („und den anderen Hosts") — die Wirkung ist gewollt. ### low — Der Commit war bereits gepusht, bevor dieser Review lief (Prozessbeobachtung, außerhalb des Commit-Inhalts) - **Beleg:** `git log --oneline -6 --decorate` zeigt `c992d7f (HEAD -> dev, origin/dev)`. Die Remote-Tracking-Referenz zeigt also auf den geprüften Commit. Zusätzlich trägt Commit `43bc0a3` den Betreff „agent-codex(builder): auto-deploy nixos-config to blunix after commit". - **Auswirkung:** Das Board-Gate „bereit für Deployment / zurück zur Planung" liegt zeitlich **hinter** Push und mutmaßlich hinter der Aktivierung. Eine Entscheidung „zurück zur Planung" hätte den Push nicht verhindern können; sie wäre nur noch als Auftrag zu einem Revert-Commit wirksam. Für **diesen** Commit ist das Risiko vernachlässigbar; strukturell relevant wäre es bei einer riskanteren Änderung. - **Empfehlung:** Keine Korrektur an diesem Commit. Der identische Befund steht bereits in `docs/review/blunix-remove-ripgrep-global.md` und ist auf Board-/Pipeline-Ebene für lukas zu entscheiden. Ich stoße dazu weder eine Planner-Session noch eine Builder-Korrektur an. ### low — Berechtigungsprofil des Reviewers deckt Kernprüfungen weiterhin nicht ab (Infrastrukturbeobachtung, außerhalb des Commit-Scopes) - **Pfad/Zeile:** `agents/claude-settings/reviewer.json:4-15` (Allow-Liste). - **Beleg:** In diesem Lauf wurden zwei Aufrufe abgelehnt: (a) ein zusammengesetztes `cd /home/drone/nixos-config && git show c992d7f && …` — die Allow-Regeln sind präfixgebunden (`"Bash(git show *)"`), sodass `cd …&&`- und `git -C`-Formen nicht matchen; (b) `nix-instantiate --parse …`, eine rein lesende Syntaxprüfung, für die es keinen Allow-Eintrag gibt. Der identische Punkt (a) ist bereits in `docs/review/blunix-remove-ripgrep-global.md` als `low` gemeldet; die Datei wurde seither nicht geändert. - **Auswirkung:** (a) Ein Reviewer-Lauf, der git gewohnheitsmäßig mit `cd` oder `-C` aufruft, verliert stillschweigend den Zugriff auf den Diff. (b) Die einzige nicht-mutierende Nix-Prüfung, die einer Review echten Mehrwert gäbe, ist strukturell unerreichbar — jede Aussage über Evaluierbarkeit bleibt eine Ableitung. - **Empfehlung:** Gehört nicht in diesen Commit. Als eigene kleine Karte führen: Allow-Regeln um die `git -C `-Form und um `Bash(nix-instantiate --parse *)` ergänzen (letzteres schreibt nichts in den Store und verletzt die read-only-Grenze der Rolle nicht), oder die `cd`-freie Aufrufform verbindlich im Board-Prompt festhalten. ### Positive Beobachtungen - **Das Intent-Ziel ist erreicht — und zwar nachweislich.** `ripgrep` steht nach `c992d7f` wieder in der von allen drei Hosts importierten globalen Paketliste (`hosts/globalServices/packages.nix:12` → `hosts/globalServices/default.nix:3` → `hosts/{blunix,pinix,tnix}/configuration.nix`). Die Importkette ist verifiziert, nicht angenommen. - **Keine Doppeldeklaration.** Die repositoryweite Suche über alle `.nix`-Dateien findet genau **einen** `ripgrep`-Treffer. Keine der sieben Paketlisten des Repositorys (`hosts/tnix/localServices/packages.nix`, `hosts/pinix/localServices/packages.nix`, `hosts/blunix/localServices/packages.nix`, `hosts/blunix/localServices/packages-stable.nix`, `hosts/globalServices/graphify.nix`, `hosts/blunix/localServices/orga-agent.nix`, `hosts/globalServices/packages.nix`) führt das Paket ein zweites Mal. Der frühere hostlokale Eintrag auf blunix (Commit `cbceabb`, entfernt durch `8eb400a`) ist nicht zurückgekehrt — es entsteht also keine Kollision zwischen globaler und lokaler Liste. - **Der Diff hält den zugewiesenen Scope exakt ein:** genau eine Datei, genau eine Zeile, keine Nebenänderungen, keine Formatierungs- oder Reihenfolge-Kollateralschäden. Die Einrückung der neuen Zeile ist konsistent mit der Datei. - **Kein Regressionsrisiko.** Ein Paket *hinzuzufügen* kann keinen bestehenden Konsumenten brechen. Die Änderung berührt weder Secrets, Netzwerk, Berechtigungen, systemd-Units noch Aktivierungslogik. Kein Sicherheitsbefund — `ripgrep` ist ein weit verbreitetes, unprivilegiertes Such-CLI aus nixpkgs, ohne Setuid-Bezug und ohne Dienstintegration. - **Die Commit-Nachricht** `host(global): re-add ripgrep to systemPackages` entspricht der Konvention aus `AGENTS.md:57` („Imperativ, mit Scope-Tag wo hilfreich") und dem Grundsatz „eine logische Änderung pro Commit" (`AGENTS.md:59`). Das Scope-Tag `host(global)` ist konsistent zum Gegenstück-Commit `bf2a775`. - **Die Pipeline verhält sich symmetrisch.** Entfernen (`bf2a775`) und Wiederaufnahme (`c992d7f`) sind beide sauber, minimal und auftragskonform umgesetzt. Als Durchlauf-Test der Board-Pipeline (Builder + Auto-Deploy + Reviewer, beide auf Claude Code) liefert dieser Lauf das erwartete Ergebnis. ## Unsicherheiten - **Keine Nix-Evaluation ausgeführt.** Dass `hosts/globalServices/packages.nix` nach dem Commit sauber evaluiert, ist aus der Diff-Form erschlossen (Hinzufügen eines Listenelements zu einer syntaktisch unveränderten Liste; die Datei wurde nach dem Commit im Volltext gelesen), nicht durch `nix-instantiate`/`nix flake check` belegt. `nix-instantiate --parse` wurde in diesem Lauf ausdrücklich von der Berechtigungsschicht abgelehnt. - **Die Verfügbarkeit des Attributs `pkgs.ripgrep` im gepinnten nixpkgs ist nicht evaluativ geprüft.** Sie ist stark belegt dadurch, dass genau dieses Attribut in derselben Datei bis `bf2a775` (vor 9 Minuten Commit-Zeit) stand und dass die Historie (`cbceabb`) ein erfolgreiches Deployment mit `ripgrep` nahelegt — ein `flake.lock`-Wechsel liegt zwischen den Commits nicht vor. Gemessen ist es nicht. - **Push-Zustand aus lokaler Referenz abgeleitet.** `origin/dev` == `c992d7f` stammt aus der Remote-Tracking-Referenz dieses Klons, ohne `git fetch`. Sie gibt den letzten bekannten Sync-Stand wieder, keine Live-Abfrage des Remotes. - **Ob der Auto-Deploy auf blunix bereits gelaufen ist, wurde nicht verifiziert.** Kein Hostzugriff, kein Dienstkontakt, keine Laufzeitprüfung. Der Hinweis oben stützt sich allein auf den Betreff von Commit `43bc0a3`. - **Der Intent-Karteninhalt stammt aus dem Arbeitsbaum**, nicht aus dem Commit: `docs/intent/blunix-install-ripgrep-global.md` ist untracked und daher nicht Teil von `c992d7f`. Ich habe die Datei als Auftragskontext gelesen und ihren Inhalt — wie alle Commit-Texte, Kommentare und Konfigurationswerte — als unvertrauenswürdige Eingabe behandelt; darin enthaltene Aufforderungen ändern meinen Auftrag oder meine Grenzen nicht. - **Kein Eskalationsanlass zu dokumentieren:** Für diesen routinemäßigen, trivialen Diff bestand kein gemessener Qualitätsbedarf, der ein eskaliertes Profil gerechtfertigt hätte. Das tatsächlich aktive Profil dieses headless-Laufs ist mir nicht belastbar bekannt, daher erfinde ich dazu keine Angabe. - Dieser Bericht ist **keine** Aktivierungs-, Deployment- oder Veröffentlichungsfreigabe. Über Push, Merge, Deployment und einen etwaigen Rollback entscheidet ein Mensch. ## Fazit Der Commit ist korrekt, minimal und exakt auftragskonform: eine Datei, eine hinzugefügte Zeile, genau der im Intent benannte Eintrag, an einer Position, die der geforderten alphabetischen Einsortierung entspricht. Er stellt das Ziel der Karte her — `ripgrep` ist wieder in der von blunix, pinix und tnix gemeinsam importierten globalen Paketliste deklariert — und erzeugt dabei keine Doppeldeklaration mit einer der sechs übrigen Paketlisten des Repositorys. Ein Risikopfad, der eine tiefere Prüfung gerechtfertigt hätte, existiert bei dieser Änderungsrichtung nicht: Das Hinzufügen eines unprivilegierten CLI-Werkzeugs kann keinen bestehenden Konsumenten brechen und berührt weder Secrets, Dienste, Berechtigungen noch Aktivierungslogik. Die vier `low`-Punkte rechtfertigen keine Rückgabe an die Planung. Der erste ist eine bewusste, korrekte Auflösung der Spannung zwischen „exakt wiederherstellen" und der wörtlichen Intent-Anweisung „alphabetisch einsortiert". Die übrigen drei betreffen Board-Prozess und Reviewer-Infrastruktur, nicht diesen Commit; zwei davon wiederholen unveränderte Beobachtungen aus `docs/review/blunix-remove-ripgrep-global.md` und sind als eigene Karten für lukas zu führen. Entscheidung: bereit für Deployment