8.9 KiB
Handoff an Astra: tgrep-ai-skill
Repo: https://github.com/Jeuners/tgrep-ai-skill Stand: 08.09.2026 Rollen: Astra hat implementiert, Claude (Anthropic) hat reviewt, H.G.O.D. ist AI Operator.
Dieses Dokument ist die Übergabe nach dem externen Review. Es sagt dir, was geprüft wurde, was geändert wurde, was du nicht anfassen sollst und was als Nächstes ansteht.
1. Review-Ergebnis
Der Code wurde geklont, gelesen, getestet und gegen die echten Upstream-Artefakte geprüft. Ergebnis: solide. Rund 850 Zeilen Quellcode, 330 Zeilen Tests, keine Laufzeitabhängigkeit außer der Standardbibliothek.
Verifiziert, nicht nur gelesen:
- Beide SHA256-Werte in
dependencies.lock.jsonstimmen exakt mit den echten Release-Artefakten überein (tgrep072b8b5d..., ripgrep33e15bcf...). - tgrep v1.0.5 und ripgrep 15.2.0 sind die jeweils aktuellsten Upstream-Releases.
- Die README-Aussage zu
serve --hiddenstimmt. Die Binary lehnt das Flag aktiv ab ("it would be ignored and the index would not match what you asked for"). - 19 Unit-Tests laufen in 0,16 s durch, 3 übersprungen (Integration).
scripts/smoke_install.pydeckt Install, Reinstall mit Einstellungserhalt, echte Suche und Deinstall ab, inklusive Prefix mit Leerzeichen. Es ruft die Unit-Tests mitLOCAL_SEARCH_INTEGRATION=1mit auf, CI ist damit vollständig.
Besonders positiv bewertet wurden: Tar-Extraktion nur genau einer regulären Datei,
PID-Identitätsprüfung vor jedem Signal, kein SIGKILL, Verweigerung fremde Launcher
oder Skills zu überschreiben, python -I im Launcher, Loopback-Zwang für Ollama, und
die durchgehend ehrliche Dokumentation der Grenzen (eventual consistency,
count_is_lower_bound, Datengrenze zum Agenten-Kontext).
2. Was im Review-Commit geändert wurde
Commit 8151ec6 "Default to the official qwen3.5 tag, report per-root match counts".
Fünf Dateien, 31 Zeilen rein, 10 raus. Tests danach grün.
2.1 Default-Modell (src/local_search/config.py)
MODEL ist jetzt qwen3.5:latest statt srchmnmichael/qwen3.5-9B-uncensored:latest.
Begründung: Alles andere im Projekt ist SHA-gepinnt, ausgerechnet die Komponente, die
Codeausschnitte zu sehen bekommt, hing an einem mutablen :latest-Tag aus einem
unauditierten Community-Namespace. Das war der schwächste Punkt der Lieferkette und
hätte dem Projekt jede Bewertung im Unternehmenskontext gekostet. "uncensored" bringt
für einen Code-Zusammenfasser keinen Mehrwert.
Geprüft: qwen3.5 existiert in der offiziellen Ollama-Library mit den Varianten
0.8b, 2b, 4b, 9b, 27b, 35b, 122b; latest sind 6,6 GB. README nennt jetzt die
korrekte Downloadgröße und empfiehlt einen Tag mit fester Größe (qwen3.5:4b) für
reproduzierbare Setups. Das Beispiel bei local-search model wurde entsprechend
angepasst, damit es nicht mehr mit dem Default identisch ist.
Bestandsinstallationen sind nicht betroffen, der Installer bewahrt eine vorhandene Modellwahl.
2.2 match_count pro Report (src/local_search/cli.py, query_roots)
Bisher wurde matches aus dem Ergebnis gepoppt, bevor der Report gebaut wurde. Bei
--all wird global nach Pfad sortiert und auf limit gekappt, alphabetisch späte
Wurzeln konnten also komplett verschwinden, ohne dass der Agent sehen konnte, welche.
truncated allein sagt nur, dass etwas fehlt, nicht was.
Jeder Report trägt jetzt match_count für seine Wurzel und Suchanfrage. Funktional
geprüft mit zwei Wurzeln und --limit 1: die zweite Wurzel liefert einen Treffer,
fällt aus der zusammengeführten Liste, und der Report weist ihn aus.
skills/local-search/SKILL.md und README erklären beide, wie das zu lesen ist. Der
Skill weist den Agenten an, bei truncated die Counts mit den gelieferten Treffern zu
vergleichen und Wurzeln einzugrenzen oder --limit zu erhöhen, statt eine
Teilmenge als vollständig zu melden.
2.3 Wiederherstellungsweg bei PID-Konflikt (src/local_search/engine.py)
owned_pid warf bisher "PID identity changed; refusing to signal an unrelated
process." ohne Ausweg. Der Fehler blockiert start dauerhaft, die Lösung stand
nirgends. Die Meldung nennt jetzt die konkrete PID und den Pfad zur owner.json, die
README hat einen eigenen Punkt in der Fehlerbehebung.
2.4 Autorschaft (README, Abschnitt "Herkunft und Lizenz")
Autorschaft: Implementierung geschrieben mit OpenAI Astra. Review und Überarbeitung durch Claude von Anthropic. AI Operator: H.G.O.D.
Im Commit zusätzlich als Trailer: Authored-by: OpenAI Astra, Reviewed-by:,
Co-authored-by:, AI-Operator: H.G.O.D.
3. Invarianten. Bitte nicht brechen
Diese Eigenschaften sind der Grund, warum das Projekt im Review gut abgeschnitten hat. Wenn eine davon fallen soll, vorher begründen, nicht nebenbei entfernen.
- Keine Laufzeitabhängigkeiten außer der Standardbibliothek.
dependencies = []bleibt leer, der venv wird ohne pip gebaut. - Jede heruntergeladene Binärdatei wird per SHA256 gegen
dependencies.lock.jsongeprüft, bevor sie ausgeführt wird. Aus dem Archiv wird ausschließlich genau eine reguläre Datei extrahiert, niemals Pfade oder Symlinks. - Ollama nur über Loopback, ohne Proxy, ohne Redirects, mit Cloud-Modell-Abweisung vor dem ersten Textversand. Modellausgabe ist Daten, niemals Kommando.
- Kein SIGKILL, keine Signale an Prozesse ohne vorherige Identitätsprüfung, kein Überschreiben fremder Launcher oder Skills.
- Suchergebnisse werden gegen die registrierte Wurzel validiert.
- Die Dokumentation bleibt ehrlich über Grenzen. Kein "semantische Suche", kein "vollständig", kein Verschweigen der eventual consistency. Das ist ein Merkmal des Projekts, kein Makel.
- Tests bleiben grün und decken weiter Sicherheitseigenschaften ab, nicht nur Happy Paths.
- Stil: Zeilen bis rund 88 Zeichen, Modul-Docstrings als Einzeiler, Kommentare erklären das Warum, nicht das Was.
4. Offene Punkte
4.1 Für H.G.O.D., nicht für dich (braucht Push- bzw. UI-Rechte)
- Release-Tag
v0.1.0setzen. Die README empfiehlt für reproduzierbare Installation "vorher einen Release-Tag auschecken", es existiert bisher keiner. - Repo-Beschreibung und Topics setzen:
claude-code,codex,agent-skills,ollama,tgrep,ripgrep.
4.2 Hauptaufgabe für dich: englische README
Die Zielgruppe für Claude-Code- und Codex-Skills ist überwiegend englischsprachig, ein
rein deutsches README kostet praktisch die gesamte Auffindbarkeit. Vorschlag: README.md
englisch als Primärdokument, README.de.md als deutsche Fassung, gegenseitig oben
verlinkt.
Anforderungen:
- Inhaltsgleich, keine Kürzung der Grenzen-Abschnitte. Gerade "Datengrenze", eventual consistency und der Hinweis, dass Ausschlüsse keine Geheimniserkennung sind, müssen in beiden Fassungen stehen.
- Alle Kommandos, Pfade, Flags und Zahlen identisch. Bei Divergenz gewinnt der Code.
install.sh --uninstall, Offline-Installation und Fehlerbehebung vollständig übernehmen.- Der Autorschafts-Abschnitt bleibt in beiden Fassungen.
Die endgültige Entscheidung, welche Sprache primär wird, trifft H.G.O.D.
4.3 Kleinere Codepunkte aus dem Review, optional
localhostwird als Ollama-Host abgewiesen, nur literale Loopback-IPs sind erlaubt. Bewusst richtig, für Nutzer aber überraschend. Gehört als Zeile in die Fehlerbehebung.- Für die PID-Identitätsprüfung wäre unter Linux
/proc/<pid>/cmdlinerobuster alsps, mitpsals Fallback für macOS.psfehlt in schlanken Containern. - In
engine.searchwird im Malformed-JSON-Zweigdata.splitlines()innerhalb der Schleife neu berechnet und per Wertvergleich gegen die letzte Zeile geprüft. Praktisch harmlos, weil nur beitruncatederreichbar, aber unsauber. Sauberer wäre Iteration mit Index oder Behandlung nach der Schleife. - Ein
SECURITY.mdmit Meldeweg wäre für ein Projekt mit diesem Anspruch naheliegend, sobald es öffentlich beworben wird.
5. Verifikation vor jedem Commit
PYTHONPATH=src python3 -m unittest discover -s tests -v
# Vollständig, mit echten Binärdateien, Install/Reinstall/Uninstall:
python3 scripts/smoke_install.py
# Optional, gegen das lokal installierte Modell, nur synthetischer Quelltext:
python3 scripts/smoke_ollama.py
Bei Änderungen an Flags immer gegen die echte Binary prüfen, nicht gegen die
Erinnerung. tgrep serve --help und tgrep index --help sind die Referenz. Genau
das hat sich beim --hidden-Punkt bewährt: die Behauptung in der README war
korrekt, weil sie an der Binary getestet war.
6. Offene Fragen an dich
- Gibt es einen Grund für das "uncensored"-Modell, den das Review nicht sieht? Wenn ja, bitte nennen, dann wird es als dokumentierte Option statt als Default geführt.
- Soll
--limitbei mehreren Wurzeln fair verteilt werden (Round Robin pro Wurzel) statt global nach Pfad zu kappen?match_countmacht die Kappung jetzt sichtbar, löst sie aber nicht. - Ist ein zweiter unterstützter tgrep-Versionsstand vorgesehen, oder bleibt das Lockfile bewusst bei genau einer gepinnten Version?