mirror of
https://github.com/Jeuners/tgrep-ai-skill.git
synced 2026-09-09 15:02:36 +02:00
Add Astra handoff notes for future project work
This commit is contained in:
parent
a52a72622d
commit
b5031ac2bc
1 changed files with 191 additions and 0 deletions
191
docs/HANDOFF-astra.md
Normal file
191
docs/HANDOFF-astra.md
Normal file
|
|
@ -0,0 +1,191 @@
|
||||||
|
# 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.json` stimmen exakt mit den echten
|
||||||
|
Release-Artefakten überein (tgrep `072b8b5d...`, ripgrep `33e15bcf...`).
|
||||||
|
- tgrep v1.0.5 und ripgrep 15.2.0 sind die jeweils aktuellsten Upstream-Releases.
|
||||||
|
- Die README-Aussage zu `serve --hidden` stimmt. 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.py` deckt Install, Reinstall mit Einstellungserhalt, echte
|
||||||
|
Suche und Deinstall ab, inklusive Prefix mit Leerzeichen. Es ruft die Unit-Tests
|
||||||
|
mit `LOCAL_SEARCH_INTEGRATION=1` mit 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.
|
||||||
|
|
||||||
|
1. Keine Laufzeitabhängigkeiten außer der Standardbibliothek. `dependencies = []`
|
||||||
|
bleibt leer, der venv wird ohne pip gebaut.
|
||||||
|
2. Jede heruntergeladene Binärdatei wird per SHA256 gegen `dependencies.lock.json`
|
||||||
|
geprüft, bevor sie ausgeführt wird. Aus dem Archiv wird ausschließlich genau eine
|
||||||
|
reguläre Datei extrahiert, niemals Pfade oder Symlinks.
|
||||||
|
3. Ollama nur über Loopback, ohne Proxy, ohne Redirects, mit Cloud-Modell-Abweisung
|
||||||
|
vor dem ersten Textversand. Modellausgabe ist Daten, niemals Kommando.
|
||||||
|
4. Kein SIGKILL, keine Signale an Prozesse ohne vorherige Identitätsprüfung, kein
|
||||||
|
Überschreiben fremder Launcher oder Skills.
|
||||||
|
5. Suchergebnisse werden gegen die registrierte Wurzel validiert.
|
||||||
|
6. 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.
|
||||||
|
7. Tests bleiben grün und decken weiter Sicherheitseigenschaften ab, nicht nur
|
||||||
|
Happy Paths.
|
||||||
|
8. 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.0` setzen. 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
|
||||||
|
|
||||||
|
- `localhost` wird 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>/cmdline` robuster als
|
||||||
|
`ps`, mit `ps` als Fallback für macOS. `ps` fehlt in schlanken Containern.
|
||||||
|
- In `engine.search` wird im Malformed-JSON-Zweig `data.splitlines()` innerhalb der
|
||||||
|
Schleife neu berechnet und per Wertvergleich gegen die letzte Zeile geprüft.
|
||||||
|
Praktisch harmlos, weil nur bei `truncated` erreichbar, aber unsauber. Sauberer
|
||||||
|
wäre Iteration mit Index oder Behandlung nach der Schleife.
|
||||||
|
- Ein `SECURITY.md` mit Meldeweg wäre für ein Projekt mit diesem Anspruch
|
||||||
|
naheliegend, sobald es öffentlich beworben wird.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Verifikation vor jedem Commit
|
||||||
|
|
||||||
|
```sh
|
||||||
|
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
|
||||||
|
|
||||||
|
1. 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.
|
||||||
|
2. Soll `--limit` bei mehreren Wurzeln fair verteilt werden (Round Robin pro Wurzel)
|
||||||
|
statt global nach Pfad zu kappen? `match_count` macht die Kappung jetzt sichtbar,
|
||||||
|
löst sie aber nicht.
|
||||||
|
3. Ist ein zweiter unterstützter tgrep-Versionsstand vorgesehen, oder bleibt das
|
||||||
|
Lockfile bewusst bei genau einer gepinnten Version?
|
||||||
Loading…
Add table
Add a link
Reference in a new issue