search: Pfad und Titel vollstaendig in der Trefferzeile, Trunkierung wird benannt (schliesst #100)
CI / verify (push) Failing after 40s
Release / release (push) Successful in 36s

Files changed:
- AGENTS.md
- CHANGES.md
- VERSION
- instructions/wiki-query/SKILL.md
- tools/CONTRACT.md
- tools/chemenu/api.py
- tools/chemenu/commands/search.py
- tools/chemenu/mcp/server.py
- tools/chemenu/search/service.py
- tools/chemenu/search/types.py
- tools/chemenu/tests/test_api.py
- tools/chemenu/tests/test_mcp_server.py
- tools/chemenu/tests/test_search.py
This commit is contained in:
2026-09-15 21:26:39 +02:00
parent 55f65c1ab1
commit bb097f614b
13 changed files with 352 additions and 41 deletions
+56 -1
View File
@@ -59,7 +59,7 @@ concern - readable here, never shipped as something to parse.
---
## 6.0.0-beta.7 - 2026-09-15 - types/type-spec.schema.yaml enforced against real type-spec frontmatter
## 6.0.0-beta.8 - 2026-09-15 - search: Pfad und Titel vollstaendig, Trunkierung sichtbar
**Author:** Torben Nehmer
@@ -80,6 +80,7 @@ concern - readable here, never shipped as something to parse.
- docs verify: ein nur als .template ausgeliefertes Linkziel gilt als aufgeloest
- Control-Plane-Sprache universell: Achse ist das Publikum, kein Instanz-Schalter
- types/type-spec.schema.yaml enforced against real type-spec frontmatter
- search: Pfad und Titel vollstaendig, Trunkierung sichtbar
**Low impact**
- gates.md/session-setup.md: die Budget-Ausnahme von version regrade haengt an der Aufrufform
@@ -342,6 +343,60 @@ Verifiziert: `tools/wikitool docs verify`/`instructions verify` gruen, 1263 Test
alle Type-Specs dieses Repos validieren gegen ihr eigenes Schema; ein Type-Spec mit einem dem
Schema unbekannten Feld wird gemeldet, mit Dateiname und Feldname in der Meldung).
### search: Pfad und Titel vollstaendig, Trunkierung sichtbar
Gemeldet wurde eine Sitzung, die nach `wikitool search` zusaetzlich `grep -rl` ueber `kb/`
laufen liess. Der Grep war redundant - `search` *ist* ein `rg`-Lauf ueber `kb/` und kann keine
Seite verfehlen, die ein Grep findet -, aber die Ausgabe gab ihr drei Gruende dafuer, und die
sind der eigentliche Befund.
Die Tabelle nannte **keinen Pfad**, obwohl `wiki-query` verlangt, nur die Seiten zu lesen, auf
die die Suche zeigt. Sie kappte ausserdem den **Titel** auf 34 Zeichen - im gemeldeten
Transkript vier von fuenf Treffern -, und der Titel ist nach Invariante 2 der einzige
Identifier einer Seite und das Argument, das `touch`, `xref add` und `cite add` nehmen. Die
Sitzung hatte also weder etwas zum Oeffnen noch etwas zum Weiterreichen; `grep -rl` lieferte
genau beides.
Drittens war `N result(s).` die *gekappte* Zahl: `run_search` gab nur die beschnittene Liste
zurueck, also konnte kein Adapter die Gesamtzahl melden, und `20 result(s).` auf einer Anfrage
mit 182 Treffern war von einem vollstaendigen Ergebnis nicht zu unterscheiden. Eine
Vollstaendigkeitsaussage, zu der die Ausgabe nicht berechtigt war - der staerkste denkbare
Anlass, ihr zu misstrauen.
Die Zeile hat jetzt die Form `score | kind/subtype | titel | pfad | summary`, ohne
Spaltenauffuellung. Titel und Pfad werden nie gekappt; die Summary ist das einzige verlustige
Feld und steht deshalb am Ende, wo ein `|` in Prosa beim Trennen mit `maxsplit=4` folgenlos
bleibt (ein `|` im Titel schliesst die Wikilink-Syntax ohnehin aus). JSON als Default-Ausgabe
wurde erwogen und verworfen: ein Treffer ist flach, JSON kostet dafuer ein Vielfaches an Tokens,
und `search` existiert dafuer, Retrieval billig zu machen - der Fehler war ein fehlendes Feld,
kein Parse-Problem. Wer Struktur braucht, hat `--json`, `api.search` und MCP.
`run_search` gibt jetzt ein `SearchResult` mit Treffern, Gesamtzahl und Limit zurueck. Die
Tabelle schreibt `50 of 182 result(s) - raise --limit (0 for all) or narrow the query.`, das
JSON traegt `total`/`truncated`/`limit` neben `count`, dessen Bedeutung unveraendert bleibt
(`len(results)`), und `api.search` sowie der MCP-`search`-Tool tragen dieselben Felder. Das
Default-Limit steigt von 20 auf 50 und liegt als eine Konstante `DEFAULT_LIMIT` statt als drei
Literale in drei Adaptern: gekappt wurden bisher vor allem die *strukturellen* Sweeps
(`--field '!sources'`), die alphabetisch und nicht nach Relevanz sortiert sind, wo die Kappung
also eine beliebige Scheibe der Antwort wegwirft statt ihres schwaechsten Endes. Sichtbar zu
sein ist es, was ein endliches Default ueberhaupt erst unbedenklich macht.
`AGENTS.md` § Routing traegt die Regel an genau einer Stelle - `search` ist erschoepfend, ein
eigener Grep ueber `kb/` fuegt nur die generierten Dateien hinzu, die Invariante 1 ohnehin
verbietet; `tools/CONTRACT.md` traegt daneben nur den Mechanismus.
Grenzuebertritt-Frage geprueft und verneint: kein Flag entfernt oder umbenannt, keine
Umgebungsvariable, keine maschinengelesene Datei in ihrer Form veraendert, JSON rein additiv.
Die Tabelle liest ein Agent, kein Skript, und ihre Aenderung verlangt keiner Instanz Handarbeit
ab.
Verifiziert: `docs verify`/`instructions verify` gruen, 1272 Tests gruen (9 neu: Pfad vorhanden;
Titel und Pfad ungekappt bei langem Titel; eine Trefferzeile zerfaellt trotz `|` in der Prosa in
ihre fuenf Felder; ein gekapptes Ergebnis nennt die Gesamtzahl, ein ungekapptes behauptet
nichts; `--limit 0` gilt nie als gekappt; die Gesamtzahl ueberlebt das Limit in `run_search`;
`api.search` meldet dasselbe; alle drei Adapter teilen ein Default-Limit - der MCP-Golden-Test
haelt die neuen Felder zwischen CLI und Server zusammen).
## 5.1.0 - 2026-09-12 - changelog: Kandidaten-Eintrag nach Impact gruppiert, version regrade zur Nachkorrektur, version release verlangt eine Zusammenfassung
**Author:** Torben Nehmer