This repository has been archived on 2026-09-17. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
nixos-config/docs/review/blunix-remove-ripgrep-global.md
pijukka 05575df408 docs: commit backlog of already-resolved intent/review corpus files
board-agent's own README documents docs/intent/ and docs/research-intent/
as tracked corpus directories, and docs/review/<slug>.md as the reviewer's
persisted report per card - but the pipeline only writes these files to
the checkout, it never commits them itself. This had built up a backlog
of intent/review docs for cards already marked deployed or archiviert in
the live board state, which were sitting uncommitted in the working tree.

Adds that backlog as-is: the originating intents, their reviewer reports,
the research-intent/research pair for the board UX evaluation, and one
standalone process-retrospective report (board-review-pipeline-context-
overhead.md, same genre as the two already-tracked audit reports in
docs/review/). No code changes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T7UVrKsttMP9a6FiGFna9b
2026-09-10 12:06:53 +02:00

99 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Review: blunix-remove-ripgrep-global
## Geprüfter Commit
- `bf2a775c2dc7a2e58438bf4d6cde9904377f43fd` — „host(global): remove ripgrep from systemPackages"
- Autor: pijukka, 2026-09-07 10:20:32 +0200
- Elterncommit: `9329d87d5a55862ef4cda80a9520c77b4f37f400` („board-agent(reviewer): migrate board-triggered review from Codex to Claude")
- Umfang laut `git show --stat bf2a775`: `hosts/globalServices/packages.nix`, 1 Datei, 0 Einfügungen, 1 Löschung
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 entfernt genau den Listeneintrag `ripgrep` (Zeile 7 der Elternfassung, zwischen `tmsu` und `ffmpeg`) aus der `environment.systemPackages`-Liste in `hosts/globalServices/packages.nix`. Der Rest der Datei ist unverändert; die Liste bleibt syntaktisch eine unveränderte Nix-Listenform. Eine Sortierinvariante wird nicht verletzt — die globale Liste war schon vorher nicht alphabetisch sortiert (`git`, `neovim`, `tmsu`, `ffmpeg`, `unzip`, `tree`, `nmap`, …).
Auftragsgrundlage: `docs/intent/blunix-remove-ripgrep-global.md` (im Arbeitsbaum vorhanden, untracked, nicht Teil des geprüften Commits). Sie fordert: Ziel „`ripgrep` soll systemweit auf blunix nicht mehr installiert sein"; Auftrag an den Builder: „Entferne ausschließlich den Eintrag `ripgrep` aus `hosts/globalServices/packages.nix` innerhalb der bestehenden `environment.systemPackages`-Liste. Ändere keine andere Datei." Der Intent nennt als erwartetes Ergebnis ausdrücklich, dass `ripgrep` danach auf keinem der drei Hosts (tnix, pinix, blunix) mehr systemweit installiert ist. Die Karte ist die vom Reviewer in `docs/review/blunix-remove-ripgrep.md` empfohlene Folgekarte zum dort gemeldeten `medium`-Befund.
Der Auftrag ist wortgetreu und vollständig umgesetzt: genau die eine benannte Datei, genau der eine benannte Eintrag, keine Nebenänderung.
## Tatsächlich ausgeführte Prüfmethoden
Alle Prüfungen rein lesend:
1. `git show bf2a775` und `git show --stat bf2a775` — Scope- und Umfangsprüfung des Diffs.
2. `git diff bf2a775~1 bf2a775 --stat` — unabhängige Bestätigung, dass genau eine Datei mit genau einer Löschung betroffen ist.
3. `git show bf2a775:hosts/globalServices/packages.nix` und `git show bf2a775~1:hosts/globalServices/packages.nix` — Datei­zustand vor und nach dem Commit im Volltext.
4. `git show --no-patch --format=… bf2a775~1` — Identifikation des Elterncommits.
5. `git status --porcelain` / `git status -sb` — Bestätigung, dass der Arbeitsbaum bis auf drei untracked Dokumente sauber ist. Damit entspricht der getrackte Arbeitsbaum dem Baum von `bf2a775`, sodass die folgenden Arbeitsbaum-Suchen für den Commit-Baum gültig sind.
6. `grep -rn ripgrep` repositoryweit (ohne `.git`) sowie `grep -rniE 'ripgrep|\brg\b'` außerhalb von `docs/` — Suche nach verbliebenen Referenzen und nach tatsächlichen Konsumenten.
7. `grep -rn globalServices hosts/` und Lektüre von `hosts/globalServices/default.nix` — Verifikation der Modul-Importkette.
8. `grep -rn systemPackages hosts/` sowie Lektüre von `hosts/blunix/localServices/packages.nix` — Prüfung, ob eine andere Paketliste `ripgrep` nachliefert.
9. Inspektion der realisierten Nix-Store-Pfade von `claude-code-2.1.257`, `codex-0.145.0`, `herdr-0.8.2`, `graphifyy-0.9.53` und `agent-codex-scripts` auf `ripgrep`-/`rg`-Abhängigkeiten (Wrapper-Docstrings, Skripte).
10. Lektüre von `agents/reviewer.md` (Rollenvertrag), `AGENTS.md` (Konventionen), `docs/intent/blunix-remove-ripgrep-global.md` und `docs/review/blunix-remove-ripgrep.md` (Vorgeschichte).
**Nicht ausgeführte Prüfungen (offen):**
- **Keine Nix-Evaluation.** `nix flake check`, `nix-instantiate --parse`, `nix build …#nixosConfigurations.<host>…` und `nixos-rebuild dry-activate` liefen **nicht**. `nix`/`nixos-rebuild` stehen nicht in der Berechtigungsliste dieses Laufs, und Build-/Aktivierungsprüfungen sind der Rolle ohnehin untersagt. Die Aussage „evaluiert unverändert" ist eine Ableitung aus der trivialen Diff-Form, keine gemessene Prüfung.
- **Keine Laufzeitprüfung auf einem Host.** `which rg` wurde von der Berechtigungsschicht abgelehnt; ob `rg` aktuell im PATH liegt, ist nicht gemessen. Kein Deploy, kein Dienstkontakt, kein Hostzugriff.
- **Kein `git fetch`.** Der unten genannte Push-Zustand stammt aus der lokalen Remote-Tracking-Referenz, nicht aus einer Live-Abfrage des Remotes.
- **Keine Prüfung anderer Commits der Historie.** Der Board-Auftrag begrenzt den Scope ausdrücklich auf `bf2a775`.
## Befunde (priorisiert)
**Keine Blocker. Keine `high`-Befunde. Am Commit selbst: keine Befunde.**
Die folgenden drei Punkte betreffen nicht die Umsetzung, sondern Kontext und Pipeline. Sie sind ausdrücklich als außerhalb des Commit-Inhalts liegend gekennzeichnet.
### low — Der Commit war bereits gepusht, bevor dieser Review lief (Prozessbeobachtung, außerhalb des Commit-Inhalts)
- **Beleg:** `git diff origin/dev bf2a775 --stat` liefert leere Ausgabe; `git show --no-patch --format=%H origin/dev` ergibt `bf2a775c2dc…`. Die Remote-Tracking-Referenz `origin/dev` 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 bereits erfolgten 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 (siehe positive Beobachtungen); strukturell relevant wäre es bei einer riskanteren Änderung.
- **Empfehlung:** Keine Korrektur an diesem Commit. Auf Board-/Pipeline-Ebene für lukas zu entscheiden, ob der Review vor dem Push liegen soll oder ob die Wartephase bewusst als „Review nach Auto-Deploy, Mensch entscheidet über Merge/Rollback" gemeint ist. Ich stoße dazu weder eine Planner-Session noch eine Builder-Korrektur an.
### 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. Kartenname und Hintergrundabschnitt des Intents nennen nur blunix.
- **Auswirkung:** `rg` verschwindet beim nächsten Rebuild auch auf tnix und pinix aus `environment.systemPackages`. Kein repository-interner Konsument bricht (verifiziert, siehe unten), aber eine interaktive Shell-Gewohnheit auf den Desktop-/Server-Hosts endet. Eine Ersatzinstallation auf Nutzerebene existiert nirgends im Repository: die repositoryweite, case-insensitive Suche nach `ripgrep` und dem Wort `rg` findet außerhalb von `docs/` **keinen einzigen Treffer**, insbesondere keine Home-Manager-Deklaration.
- **Empfehlung:** Keine Änderung. Der Intent benennt dieses Ergebnis ausdrücklich („auf keinem der drei Hosts … mehr systemweit installiert") — die Wirkung ist gewollt, nicht versehentlich. Nur beim nächsten Rebuild von tnix/pinix bewusst mitdenken.
### low — Berechtigungsliste des Reviewers ist präfixgebunden und bricht bei `cd …&&` / `git -C` (Infrastrukturbeobachtung, außerhalb des Commit-Scopes)
- **Pfad/Zeile:** `agents/claude-settings/reviewer.json:7-9` (`"Bash(git diff *)"`, `"Bash(git status *)"`, `"Bash(git show *)"`).
- **Beleg:** In diesem Lauf wurden sechs git-Aufrufe hintereinander von der Berechtigungsschicht abgelehnt, weil sie als `cd /home/drone/nixos-config && git show …` bzw. `git -C /home/drone/nixos-config show …` formuliert waren. Beide Formen beginnen nicht mit dem Präfix `git show `/`git diff ` und matchen die Allow-Regel daher nicht. Erst die nackten Aufrufe aus dem Arbeitsverzeichnis heraus wurden zugelassen; die Commit-Prüfung konnte danach vollständig durchgeführt werden.
- **Auswirkung:** Ein Reviewer-Lauf, der git gewohnheitsmäßig mit `cd` oder `-C` aufruft, verliert stillschweigend den Zugriff auf den Diff — also auf genau die Kernprüfung dieser Rolle — ohne dass die Ablehnung als Konfigurationsproblem erkennbar wäre. Der vorangegangene Review (`docs/review/blunix-remove-ripgrep.md`, Abschnitt „Nicht ausgeführte Prüfungen") meldet eine strukturell ähnliche Ablehnung. Diese Datei wurde zuletzt im Zuge der Codex→Claude-Migration angefasst, die genau der Elterncommit `9329d87` vornimmt.
- **Empfehlung:** Gehört nicht in diesen Commit. Als eigene kleine Karte führen: entweder die Allow-Regeln um die `git -C <repo>`-Form ergänzen, oder in `agents/reviewer.md` bzw. im Board-Prompt festhalten, dass git-Aufrufe nackt aus dem Repo-Arbeitsverzeichnis erfolgen müssen.
### Positive Beobachtungen
- **Das Intent-Ziel ist erreicht — und zwar nachweislich.** Nach `bf2a775` enthält **keine** `.nix`-Datei des Repositorys mehr eine `ripgrep`-Referenz; die repositoryweite Suche findet Treffer ausschließlich in Prosa unter `docs/`. Keine andere Paketliste (`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`) liefert das Paket nach. Der im Vorgänger-Review gemeldete `medium`-Befund ist damit vollständig geschlossen.
- **Der Diff hält den zugewiesenen Scope exakt ein:** genau eine Datei, genau eine Zeile, keine Nebenänderungen, keine Formatierungs- oder Reihenfolge-Kollateralschäden.
- **Kein repository-interner Konsument bricht.** Die case-insensitive Suche nach `ripgrep` und dem Wort `rg` außerhalb von `docs/` ist leer — kein Modul, Skript, systemd-Unit oder Agent-Rollendokument ruft `rg` auf.
- **Die Agent-Pipeline auf blunix ist nachweislich nicht betroffen — der einzige ernsthafte Risikopfad, den ich gezielt geprüft habe.** blunix installiert `claude-code` und `codex`, deren Suchwerkzeuge ripgrep verwenden. Beide bringen es jedoch als eigene Closure-Abhängigkeit mit, unabhängig von `environment.systemPackages`:
- Der `claude-code`-Wrapper setzt `USE_BUILTIN_RIPGREP=0` **und** stellt `…-ripgrep-15.2.0/bin` seinem PATH voran.
- Der `codex`-Wrapper stellt ebenfalls ein eigenes `…-ripgrep-15.2.0/bin` seinem PATH voran.
Beide finden `rg` also über ihren Wrapper, nicht über die Systemumgebung. `herdr-0.8.2` enthält keine ripgrep-Referenz. `graphifyy-0.9.53` nennt `"rg"`/`"ripgrep"` ausschließlich als Literale in der Menge `_SEARCH_COMMANDS` in `graphify/cli.py:742` — das dient der **Klassifikation** fremder Bash-Kommandos, nicht der Ausführung; graphify ruft ripgrep nicht auf. Auch `agent-codex-scripts` (`builder.py`, `common.py`, `db.py`, `worker.py`) enthalten keinen `rg`-Aufruf.
- **Kein Regressionsrisiko für Dienste.** Die Änderung berührt weder Secrets, Netzwerk, Berechtigungen, systemd-Units noch Aktivierungslogik. Kein Sicherheitsbefund.
- **Die Commit-Nachricht** `host(global): remove ripgrep from 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)` weicht von den hostbezogenen Beispielen (`host(tnix)`) ab, ist aber eindeutig und passend, da die Datei unter `hosts/globalServices/` liegt. Kein Änderungsbedarf.
## Unsicherheiten
- **Keine Nix-Evaluation ausgeführt.** Dass `hosts/globalServices/packages.nix` nach dem Commit sauber evaluiert, ist aus der Diff-Form erschlossen (Entfernen eines Listenelements aus einer syntaktisch unveränderten Liste; die Datei wurde im Volltext vor und nach dem Commit gelesen), nicht durch `nix-instantiate`/`nix flake check` belegt. `nix` steht in diesem Lauf nicht zur Verfügung.
- **Die Store-Inspektion belegt die Wrapper dieses Rechners**, also die aktuell hier realisierten Ableitungen von `claude-code-2.1.257` und `codex-0.145.0`. Das ist ein starker Beleg für die in dieser Konfiguration gepinnten Versionen, ersetzt aber keine Evaluation der blunix-Systemclosure. Sollte ein späteres nixpkgs-Update die Wrapper so ändern, dass sie kein eigenes ripgrep mehr mitbringen, entfällt die Absicherung — das ist kein Befund gegen diesen Commit, aber eine Annahme, die nicht dauerhaft garantiert ist.
- **Push-Zustand aus lokaler Referenz abgeleitet.** `origin/dev` == `bf2a775` 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-remove-ripgrep-global.md` ist untracked und daher nicht Teil von `bf2a775`. 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 gelöschte Zeile, genau der im Intent benannte Eintrag. Er schließt den `medium`-Befund des vorangegangenen Reviews (`docs/review/blunix-remove-ripgrep.md`) vollständig — `ripgrep` ist nach diesem Commit in keiner `.nix`-Datei des Repositorys mehr deklariert und damit auf keinem der drei Hosts systemweit installiert.
Das einzige ernsthaft prüfenswerte Risiko war, ob die auf blunix laufende Agent-Pipeline systemweites ripgrep benötigt. Das ist verifiziert nicht der Fall: `claude-code` und `codex` bringen ripgrep über ihre Wrapper als eigene Closure-Abhängigkeit mit, `graphify` nennt es nur als Klassifikationsliteral, `herdr` gar nicht. Es bleibt kein Regressions- oder Sicherheitsrisiko.
Die drei `low`-Punkte betreffen Prozess und Infrastruktur, nicht diesen Commit, und rechtfertigen keine Rückgabe an die Planung. Der prozessual wichtigste davon — Review nach bereits erfolgtem Push — ist ein Hinweis für die Board-Gestaltung, keine Aussage über die Qualität der Änderung.
Entscheidung: bereit für Deployment