f7597b209c
Files changed: - kb/concepts/INDEX.md - kb/concepts/Iteration and Cost Limits.md - kb/concepts/MCP-Leseserver.md - kb/concepts/Mass-Update Gate.md - kb/concepts/Publish-Remote Gate.md - kb/entities/INDEX.md - kb/entities/projects/Chemenu.md - kb/entities/tools/wikitool.md - kb/index.md - kb/log.md - kb/provenance.md - kb/sources/INDEX.md - kb/sources/Source - MCP Read Server Implementation Session 2026-09-02.md - raw/notes/Conversation Transcript - MCP Read Server Implementation Session 2026-09-02.md
306 lines
30 KiB
Markdown
306 lines
30 KiB
Markdown
---
|
|
type: types/entity.md
|
|
entity_type: tool
|
|
tags: [cli, automation, deterministic, wiki-management]
|
|
created: 2026-08-03
|
|
modified: 2026-09-02
|
|
related: [Semantic Lint Automation, Session Orientation, Iteration and Cost Limits, KB Stack Versioning, KB Migration, Personalization Plane, Detect-Repair Asymmetry, Write-Once Frontmatter Fields, Denylist over Allowlist, Command Round-Trip Integrity, Green Suite Blind Spot, Ambient Environment Dependency, Structural Enforcement over Documented Rule, Optional Instance Context File, MCP-Leseserver]
|
|
sources: [Source - LLM Improvements Codex Analysis, Source - LLM Improvements Sonnet Analysis, Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04, Source - LLM Improvements Production Agent Gaps 2026, Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31, Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31, Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31, 'Source - Public Release, Corpus Purge and History Squash Session 2026-09-01', Source - Publish-Remote Gate and Issue Triage Session 2026-09-01, Source - Private-Instance Merge Correction and Issue 30 Session 2026-09-01, Source - MCP Read Server Implementation Session 2026-09-02]
|
|
confidence: 0.90
|
|
confidence_base: 0.90
|
|
provenance: sourced
|
|
summary: Deterministisches CLI fuer alle mechanischen Wiki-Operationen; seit 2.0.0 im Paket chemenu, seit 2.4.0 zusaetzlich als MCP-Leseserver erreichbar
|
|
---
|
|
# wikitool
|
|
|
|
**Typ:** tool
|
|
|
|
## Beschreibung
|
|
|
|
wikitool ist ein deterministisches CLI-Tool, das alle mechanischen Operationen für Chemenu verwaltet. Es erzwingt Konsistenz über Gerüstbau, Cross-References, Index-Neuerstellung, Log-Einträge, Confidence-Decay-Berechnungen und Git-Publishing. Das Tool ist so ausgelegt, dass es manuelle Fehler verhindert und strukturelle Aspekte des Wikis (Frontmatter, Linking, Indizierung) immer korrekt sind, sodass sich das LLM auf semantische Inhalte konzentrieren kann.
|
|
|
|
Wie in der Codex-Analyse vermerkt, bietet wikitool die deterministische Grundlage, die vielen öffentlichen LLM-Wiki-Skills fehlt. Es implementiert die Trennung von "mechanisch vs. semantisch", die in AGENTS.md definiert ist, wobei wikitool alles handhabt, das präzise automatisiert werden kann, während das LLM Urteile und Prosa handhabt.
|
|
|
|
## Kerndaten
|
|
|
|
- **Zweck:** Deterministische mechanische Wiki-Operationen
|
|
- **Status:** Aktiv, in aktiver Entwicklung
|
|
- **Version:** Teil des tools/chemenu-Pakets
|
|
- **Sprache/Technik:** Python 3, Typer CLI Framework
|
|
- **Repository:** Lokal unter `tools/chemenu/`
|
|
- **Einstiegspunkt:** `tools/wikitool` (Bash-Wrapper)
|
|
|
|
## Beziehungen
|
|
|
|
- **Teil von:** [[AGENTS.md]]-Workflow-Implementierung
|
|
- **Verwendet:** [[Python]]
|
|
- **Verwandt mit:** [[LLM Wiki Pattern]], [[Three-Layer Architecture]]
|
|
, [[Mass-Update Gate]]
|
|
- **implementiert:** [[Semantic Lint Automation]]
|
|
- **würde implementieren:** [[Session Orientation]]
|
|
- **Analyse:** [[Source - LLM Improvements Codex Analysis]], [[Source - LLM Improvements Sonnet Analysis]]
|
|
- **implementiert:** [[Iteration and Cost Limits]]
|
|
- **implementiert:** [[KB Stack Versioning]]
|
|
- **implementiert:** [[KB Migration]]
|
|
- **implementiert:** [[Personalization Plane]]
|
|
- **zeigt:** [[Detect-Repair Asymmetry]]
|
|
- **behebt:** [[Write-Once Frontmatter Fields]]
|
|
- **implementiert:** [[Denylist over Allowlist]]
|
|
- **zeigt:** [[Command Round-Trip Integrity]]
|
|
- **zeigt:** [[Green Suite Blind Spot]]
|
|
- **zeigte:** [[Ambient Environment Dependency]]
|
|
- **setzt um:** [[Structural Enforcement over Documented Rule]]
|
|
- **setzt um:** [[Optional Instance Context File]]
|
|
- **implementiert:** [[MCP-Leseserver]]
|
|
|
|
## Befehle
|
|
|
|
wikitool bietet die folgenden Befehlskategorien:
|
|
|
|
- **Gerüstbau:** `new entity`, `new concept`, `new source`, `new comparison`, `new instruction`. Ein `--set`-Wert für ein Array-Feld wird auf Kommas gesplittet; seit `1.2.0` ist ein literales Komma als `\,` ausdrückbar (Lookbehind `(?<!\\),` plus Unescape je Element), und ein für dasselbe Array-Feld wiederholtes `--set` hängt an statt zu ersetzen. Skalare behalten „last one wins". Derselbe Helper bedient auch `xref add --entities`[^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31]
|
|
- **Seiten-Mutation:** `touch` (eines Seiten-`modified`/`summary`/`provenance`/`confidence_base`, seit `1.4.0` zusätzlich `--set`/`--add`/`--remove` für jedes Feld, das das Schema des Seitentyps deklariert, abzüglich der Sperrliste `type`, `confidence` und der Referenz-Arrays; `--add`/`--remove` arbeiten auf einzelnen Elementen eines Listenfelds, `--remove` gelingt und meldet es, wenn das Element nicht vorhanden ist, und ein per `touch` geschriebenes `raw_files:` wird gegen das Dateisystem geprüft wie beim Anlegen[^s-conversation-write-once-frontmatter-fields-and-touch-set-session-2026-08-31]. Siehe [[Write-Once Frontmatter Fields]] und [[Denylist over Allowlist]]), `rename` (Seite umtiteln und jeden Verweis neu ausrichten, oder Verweise auf eine bestehende Seite neu ausrichten), `rm` (Löschen und Entfernen von Verknüpfungen)
|
|
- **Cross-References:** `xref add`, `xref remove`, `xref link-source` - seit `1.6.0` schreibt
|
|
`link-source` **beide Richtungen**: das Ziel bekommt `sources:` und einen Siehe-auch-Eintrag,
|
|
die Source-Seite trägt das Ziel in ihr eigenes `entities:` oder `concepts:` ein. Welches der
|
|
beiden Felder es wird, folgt der Collection des Ziels (`kb/entities/` → `entities:`), sodass
|
|
eine neue Collection hier keine Codeänderung braucht. `xref add` lehnt eine Seite ab, deren
|
|
Typ `related:` nicht deklariert, und prüft beide Seiten, bevor es eine schreibt; `xref remove`
|
|
fegt auch ein undeklariertes Feld weg und löscht den Schlüssel, sobald er leer ist[^s-conversation-two-round-trip-defects-found-by-an-ingest-session-2026-08-31].
|
|
Siehe [[Command Round-Trip Integrity]]
|
|
- **Zitate:** `cite id`, `cite add`, `cite sync` - der Fußnotenblock endet seit `1.5.1` an der
|
|
**nächsten Überschrift** statt am Dateiende. Zuvor löschte `cite add` jeden Inhalt dahinter,
|
|
weil `split_cite_block()` alles bis Dateiende als Block nahm und nur die
|
|
Zitatdefinitionszeilen behielt; `cite sync` und `rename` benutzten denselben Pfad. Loser Text im Block wird auf den
|
|
Seitenkopf zurückgefaltet statt abgelehnt, und weil der Block immer zuletzt gerendert wird,
|
|
richtet die erste Zitatoperation eine verrutschte Seite von selbst wieder ein[^s-conversation-two-round-trip-defects-found-by-an-ingest-session-2026-08-31]
|
|
- **Abfrage:** `search` - Textsuche über `kb/` durch ein austauschbares Backend (`rg` heute), plus `--field`-Prädikate, die auf Frontmatter evaluiert werden (`entity_type=system`, `confidence>=0.8`, `tags=k8s`, `!source_url`). Ohne Text ist es eine reine strukturierte Abfrage. Schreibgeschützt und ausgenommen von der Iteration-Budget-Gate, da Abfrage das Lesen statt das Iterieren ist
|
|
- **MCP-Server:** `python -m chemenu.mcp` (`--transport stdio|streamable-http`) - kein
|
|
`wikitool`-Unterbefehl, sondern ein zweiter Einstiegspunkt über `chemenu.api.Corpus`, derselbe
|
|
Kern wie `search`/`types`/`lint`. Siehe [[MCP-Leseserver]]
|
|
- **Indizierung:** `index rebuild` - regeneriert die `kb/index.md`-Map plus eine pro-Sammlung `INDEX.md`, wobei ein Bereich bei 50 Zeilen in seine eigene Shard aufgeteilt wird
|
|
- **Herkunft:** `sources coverage`, `sources trace`, `sources rebuild-index`
|
|
- **Protokollierung:** `log append`, `log status`
|
|
- **Linting:** `lint` - schreibt den vollen Report seit `1.2.0` immer, standardmäßig nach `reports/Lint Report <datum>.md`, und gibt den Pfad aus; gedruckt werden nur Abschnitte mit Befunden, `--full` druckt alles, `--json` schreibt nichts[^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31]
|
|
- **Typen:** `types list`, `types describe`
|
|
- **Konfidenz:** `confidence decay`, `confidence init-base`
|
|
- **Veröffentlichung:** `publish` - zählt seit `1.5.0` nur noch Dateien, die eine Entscheidung tragen: Pfade unter `work/` und generierte Dateien (`kb/index.md`, `kb/log.md`, `kb/provenance.md`, jede `INDEX.md`) werden committet und gepusht, aber nicht gegen die Schwelle gezählt; die Weigerungszeile weist beide Gründe getrennt aus[^s-conversation-gate-counting-and-measured-calibration-session-2026-08-31]. Siehe [[Mass-Update Gate]]
|
|
- **Budget:** `budget status`, `budget reset` - Obergrenze seit `1.2.0` 60 Aufrufe je Sitzung; ein Aufruf, der über `_util.fail()` abgelehnt wurde, bekommt seinen Slot zurück und bleibt trotzdem in `recent`, damit der Loop-Breaker ihn sieht[^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31]. Siehe [[Iteration and Cost Limits]]
|
|
- **Versionierung:** `version bump`, `version check` - `bump` schreibt die Stack-Version in die
|
|
Wurzeldatei `VERSION` und verweigert einen `MAJOR`-Sprung ohne Migrationsdokument, sofern er
|
|
nicht ausdrücklich mit `--no-migration "<Begründung>"` gesetzt wird; `check` ist der einzige
|
|
Befehl, der einen Netzaufruf machen darf - ohne Schlüssel, mit Timeout und injizierbarem
|
|
Fetch, damit Tests nie ein Netz
|
|
berühren[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]
|
|
- **Migration:** `migrate list`, `migrate status`, `migrate verify`, `migrate done`,
|
|
`migrate baseline` - `status` bildet das Intervall `(kb_version, VERSION]` aufsteigend,
|
|
`done` verweigert jede Version, die nicht das nächste Glied ist, `verify` vergleicht zwei
|
|
Revisionen des Korpus über `corpus_diff` mit Zählungen statt Mengen, `baseline` setzt einer
|
|
Instanz ohne `.wikitool-kb.json` ihren
|
|
Startwert[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]. Siehe
|
|
[[KB Migration]]
|
|
- **Distribution:** `dist export` - erzeugt das Release-Artefakt und legt den Stempel
|
|
`.wikitool-release.json` hinein[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]
|
|
- **Diagnose:** `doctor` - enthält einen `kb-version`-Check[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]
|
|
sowie seit `1.1.0` einen `personalization`-Check: `FAIL`, wenn `USER.md` oder `SOUL.md`
|
|
fehlen, und ebenso, wenn eine der beiden noch die Sentinel-Zeile des Templates trägt - ein
|
|
umbenanntes Template ist kein ausgefülltes. Siehe [[Personalization Plane]]
|
|
sowie seit `1.8.0` einen `environment`-Check für [[ENVIRONMENT.md]]: `OK` bei fehlender wie
|
|
bei ausgefüllter Datei, `WARN` allein bei einem umbenannten, nie ausgefüllten Template. Nie
|
|
`FAIL` - die Datei ist optional, und ein `FAIL` machte sie durch die Hintertür verpflichtend[^s-conversation-environment-md-as-an-optional-third-session-level-file-session-2026-08-31].
|
|
Siehe [[Optional Instance Context File]]
|
|
- **Coverage:** CI führt die Tests seit `1.8.1` mit `pytest --cov` aus (Konfiguration
|
|
`tools/.coveragerc`, nicht `pytest.ini` - coverage.py liest Letzteres nicht) und lädt den
|
|
Bericht als Artefakt hoch, ohne Abbruchschwelle - siehe Messen vor Schwelle
|
|
- **Dokumentation:** `docs verify` - überprüft, dass jeder CLI-Befehl in `tools/CONTRACT.md` dokumentiert ist und umgekehrt, dass jedes Verzeichnis unter `kb/` eine `COLLECTION.md` hat und kein Verzeichnis außerhalb hat, dass jeder Stage-Contract existiert, und dass keine Ignorierungsregel Inhalte unter `raw/` oder `kb/` stille ausschließen würde (oder stille generierte Ausgabe unter `reports/` committen würde)
|
|
- **Anweisungen:** `instructions sync`, `instructions verify`, `instructions list` - publiziert jede `instructions/<name>/SKILL.md` als **Kopie** in `.agents/skills/` (nativ gelesen von GitHub Copilot, Codex CLI und Mistral Vibe) und `.claude/skills/` (erforderlich für Claude Code, das nichts anderes liest), und überprüft die Schicht: Anweisungen gegen ihre Schema, Skill-Frontmatter gegen das, das der Harness liest, jede veröffentlichte Kopie Byte-für-Byte gegen ihre Quelle, und alle Anweisungen, auf die nichts verweist
|
|
|
|
## Details
|
|
|
|
Das Tool verwendet eine Python-Paketstruktur mit einer Typer-basierten CLI. Wichtige Module sind:
|
|
- `cli.py` - Haupteinstiegspunkt des Befehls
|
|
- `commands/new_page.py` - Seiten-Gerüstbau
|
|
- `commands/xref.py` - Cross-Reference-Verwaltung
|
|
- `commands/search.py` + `search/` - Abfrage, aufgeteilt in einen Backend-agnostischen Kern (`SearchBackend`-Protokoll, Frontmatter-Prädikate, Reciprocal Rank Fusion) und ein Backend (`ripgrep.py`), sodass ein Vektor-Backend ein neues Modul statt einer Umschrift ist
|
|
- `commands/index_build.py` - Katalog-Map und Shard-Neuerstellung
|
|
- `commands/instructions_cmd.py` - Anweisungs-Schicht: publish, verify, list
|
|
- `commands/provenance_cmd.py` - Herkunfts-Verfolgung
|
|
- `commands/log_append.py` - Log-Eintrag-Formatierung
|
|
- `commands/lint.py` - Strukturvalidierung
|
|
- `commands/git_publish.py` - Git-Operationen
|
|
- `commands/skills_sync.py` - `.agents/skills/` <-> `.claude/skills/`-Spiegelung und Verifikation[^s-conversation-agents-md-skill-restructuring-session-2026-08-04]
|
|
|
|
Die Provenance-Remediation-Session fügte drei wichtige operative Verbesserungen hinzu:
|
|
|
|
- Neue Provenance-Befehlsgruppe (`sources coverage`, `sources trace`, `sources rebuild-index`) für Raw-zu-Source- und Source-zu-Page-Nachverfolgbarkeit.
|
|
- Erweiterte Lint-Überprüfungen für nicht abgedeckte Raw-Dateien, beschädigte Raw-Verweise, fehlende Provenance-Marker und Citation/Frontmatter-Drift.
|
|
- Wrapper-Verhaltensbehebung, sodass relative Pfadargumente vom Arbeitsverzeichnis des Aufrufers (Repository-Root-Verwendung) statt von `tools/` aufgelöst werden.
|
|
|
|
Der Bash-Wrapper unter `tools/wikitool` aktiviert die Python venv und exportiert `PYTHONPATH`, um `chemenu` importierbar zu halten, ohne cwd zu ändern.
|
|
|
|
Für die Migrationsprüfung kamen zwei Module dazu: `corpus_diff.py` vergleicht zwei Revisionen
|
|
des Korpus und `kb_state.py` liest und schreibt `.wikitool-kb.json`. Beide Seiten des Vergleichs
|
|
müssen dieselbe Vorstellung von „Seite" haben: Ein erster Lauf meldete 13 entfernte Seiten, die
|
|
keine waren, weil die historische Seite jede `.md` unter `kb/` zählte und die
|
|
Arbeitsbaum-Seite `iter_kb_pages` benutzte. Ein gemeinsames `kb_scan.is_page_path` löst das
|
|
auf[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30].
|
|
|
|
`kb_scan.extract_wikilinks()` liefert bewusst ein Set. Das ist die richtige Form für `lint`, das
|
|
fragt, ob ein Verweis auflöst - und die falsche für eine Migrationsprüfung, die fragt, ob einer
|
|
verschwunden
|
|
ist[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30].
|
|
|
|
## Historie
|
|
|
|
- 2026-09-02 - `2.2.3`-`2.4.1`: die vierstufige Sequenz aus Issue #36 (Publish-Remote-Gate
|
|
scharf, Lesepfad gehärtet, Root-Auflösung und Bibliotheksgrenze, [[MCP-Leseserver]]) plus
|
|
Menschendoku. `.wikitool-remotes.json` war trotz gegenteiliger Dokumentation nicht gesetzt -
|
|
angelegt und gegen ein erfundenes Ziel gegengeprüft (Exit 42). Sechs Lesepfad-Härtungen:
|
|
gelöschter ReDoS-Zweig in der Ranking-Funktion, ein 30-Sekunden-`rg`-Timeout, ein
|
|
YAML-Alias-Refusal (267 B → 672.603 Knoten reproduziert), `CSafeLoader` (265 ms → 54 ms),
|
|
gemeldetes statt geschlucktes kaputtes Frontmatter, ein Korpus-Cache, der nie einen
|
|
schmutzigen Arbeitsbaum cacht. `config.ROOT` und alle abgeleiteten Pfade waren zur Importzeit
|
|
gebunden - jetzt lazy aufgelöst (`$CHEMENU_ROOT` → Walk-up), mit einem eigenen
|
|
`config.reset()` gegen eine Falle, in die `monkeypatch`s eigener Teardown sonst zurückläuft.
|
|
Neuer typerloser Lesekern (`search/service.py`, `lint_core.py`, `types_core.py`) hinter
|
|
`chemenu.api.Corpus`, darüber der MCP-Server: `search`/`types`/`describe_type`/`lint`/`status`,
|
|
strukturell ohne Schreibpfad, jede Antwort mit Commit-Stempel. `wikitool search` end-to-end
|
|
593 ms → 347 ms. Menschendoku `INSTALL-MCP.md`, ausgeliefert über `dist_cmd.ROOT_FILES`.
|
|
Siehe [[Publish-Remote Gate]], [[Mass-Update Gate]],
|
|
[[MCP-Leseserver]][^s-mcp-read-server-implementation-session-2026-09-02]
|
|
- 2026-09-01 - `2.1.0`-`2.2.2`: Vorbereitung und Durchführung der Veröffentlichung. `dist export`
|
|
bekommt `REQUIRED_ROOT_FILES` (fehlende Lizenzdateien lassen den Export scheitern statt still
|
|
weiterzulaufen) und `find_leaks()` (strukturelle Prüfung des fertigen Export-Plans gegen
|
|
Personalisierungsdateien, `instructions/dev/`, `kb/`- und `raw/`-Inhalte - bewusst kein
|
|
Text-Muster-Scan, weil der eigene Hostname legitim in `INSTALL.md`/`version.py` steht). `publish`
|
|
bekommt ein drittes Gate: das **Publish-Remote-Gate** prüft die aufgelöste Push-URL (nicht den
|
|
Remote-Namen) gegen eine optionale, gitignorete `.wikitool-remotes.json` und hat als einziges
|
|
der drei Gates keinen `--confirm`-Token - der Weg daran vorbei ist ein bewusster Edit der
|
|
Datei durch den Nutzer, nie durch einen Agenten. `doctor` bekommt den `publish-remotes`-Check.
|
|
Ein `raw_dir`-Testfixture löste `config.ROOT` gegen das echte Repo-Root statt die Fixture auf
|
|
und bestand nur, weil zufällig ein Verzeichnis existierte, das der Korpus-Schnitt entfernte -
|
|
in der Fixture geschlossen, nicht im einzelnen Test, aus demselben Grund wie Gitea #8.
|
|
Siehe [[Chemenu]], [[Mass-Update Gate]], [[Publish-Remote Gate]],
|
|
[[Delete Rather Than Anonymize]],
|
|
[[Dual Licensing by File Plan]][^s-public-release-corpus-purge-and-history-squash-session-2026-09-01][^s-publish-remote-gate-and-issue-triage-session-2026-09-01]
|
|
- 2026-09-01 - `2.0.0` (Commit `9a7abe6`, 730 Tests grün): das Python-Paket heißt `chemenu`
|
|
statt `wiki_tools`, **das Kommando bleibt `wikitool`**. Der Import-Name eines Pakets ist ein
|
|
flacher globaler Namensraum ohne Kollisionsschutz, `wiki_tools` war dafür zu generisch;
|
|
Distributionsname, Import-Name und Kommandoname sind drei unabhängige Dinge, und ein
|
|
abweichender Kommandoname ist verbreitete Praxis. Unverändert bleiben damit auch
|
|
`.wikitool-release.json`, `.wikitool-kb.json` und die `WIKITOOL_*`-Variablen - sie gehören
|
|
zum Kommando, nicht zum Paket. Verzeichnet in `CHANGES.md` (`2.0.0`), Kontext in [[Chemenu]].
|
|
- 2026-08-31 - `1.8.0` (Commit `a243a4a`): `doctor` bekommt den `environment`-Check,
|
|
`dist export` liefert `ENVIRONMENT.md.template` über die Root-Allowlist aus, und `docs verify`
|
|
prüft das zugehörige Ignore-Muster in beide Richtungen - die Datei muss ignoriert sein, ihr
|
|
Template darf es nicht[^s-conversation-environment-md-as-an-optional-third-session-level-file-session-2026-08-31]
|
|
- 2026-08-31 - `1.7.1` (Commit `31c9b81`, Tag `v1.7.1`, 702 Tests grün, 7 neue): die Testsuite
|
|
läuft seither gegen eine absichtlich leere Maschine, Gitea-Issue #8 (`prio/1`). Eine
|
|
autouse-Fixture in `conftest.py` setzt `HOME` je Test in dessen `tmp_path`, git-Konfiguration
|
|
auf `/dev/null` und löscht die Tool- sowie die git-Identitätsvariablen; `WIKI_TRACE_DIR` bleibt
|
|
als einziges gesetzt, weil zwei Telemetrie-Tests einen geschriebenen Trace behaupten. Anlass
|
|
war `default_author()`, das per `git config user.name` die globale Konfiguration des Aufrufers
|
|
las - vier Tests hingen nacheinander daran, zwei davon geschrieben, nachdem das Issue offen
|
|
war. Die Wirkung ist nicht am grünen Lauf belegt (die Suite war unter der gehärteten Umgebung
|
|
schon vorher grün), sondern an der Gegenprobe: dieselbe Funktion antwortet ohne Isolierung mit
|
|
dem globalen git-Namen, mit Isolierung `None`. 702 Tests in vier Umgebungen -
|
|
Entwickler-Shell, vergiftet, `env -i`, CI[^s-conversation-hardening-the-test-suite-against-silent-environment-dependencies-session-2026-08-31].
|
|
Siehe [[Ambient Environment Dependency]] und [[Structural Enforcement over Documented Rule]]
|
|
- 2026-08-31 - `1.6.0` (Commit `ce03749`, 689 Tests grün, 11 neue): drei Symptome mit einer
|
|
Ursache, Gitea-Issue #18 (`prio/1`). `xref_link_source` schrieb nur die Zielseiten, nie die
|
|
eigenen Arrays der Source-Seite - die waren nach `new source` unerreichbar. Das von
|
|
`xref add` dort geschriebene `related:` deklariert `types/source.md` nicht, und
|
|
`strip_frontmatter_ref()` räumte nur deklarierte Felder, also konnte `xref remove` es nicht
|
|
entfernen. Seither schreibt `link-source` beide Richtungen, `xref add` prüft beide Seiten
|
|
vorab und lehnt ein undeklariertes Feld ab, `xref remove` fegt Reste. Der Beleg für die
|
|
Inversenbeziehung war eine Concept-Seite, die byteidentisch aus `xref remove` plus
|
|
`xref link-source` zurückkam[^s-conversation-two-round-trip-defects-found-by-an-ingest-session-2026-08-31]. Siehe [[Command Round-Trip Integrity]]
|
|
- 2026-08-31 - `1.5.1` (Commit `bb4123b`): `cite add` löschte jeden Inhalt hinter dem
|
|
Fußnotenblock, weil `split_cite_block()` alles von der Überschrift bis Dateiende als Block
|
|
nahm und daraus nur die Zitatdefinitionen behielt; `cite sync` und `rename` teilten den Pfad,
|
|
und eine nur hinter dem Block referenzierte Fußnote wäre von `cite sync` als verwaist
|
|
gelöscht worden. Da `xref add` am Dateiende anhängt, entschied allein die Reihenfolge beider
|
|
Kommandos über den Bestand der Querverweise. 8 Seiten mit 74 Zeilen standen in dieser
|
|
Position; `cite sync --all` normalisierte elf Seiten auf 0 (Gitea-Issue #17, `prio/1`)[^s-conversation-two-round-trip-defects-found-by-an-ingest-session-2026-08-31].
|
|
Siehe [[Command Round-Trip Integrity]] und [[Green Suite Blind Spot]]
|
|
- 2026-08-31 - `1.5.0` (Commit `3166c31`, 9 Dateien, 678 Tests grün): zwei Kalibrierungen aus
|
|
einer Beobachtung, nicht aus einem Issue. `publish` nimmt generierte Dateien aus der
|
|
Gate-Zählung heraus - `is_generated()` kannte die Liste und `GATE_EXEMPT_PREFIXES`/
|
|
`counted_files()` boten den Mechanismus, verbunden waren beide nie -, und das
|
|
Kalibrierungsband für einen komplexen Multi-Tool-Workflow steigt in `run_budget.py` von
|
|
15-25 auf 20-35 Aufrufe. Beides ist an realen Läufen gemessen: drei Ingest-Changesets
|
|
(14 → 9, 16 → 9, 11 → 5 gezählte Dateien) und vier Sitzungszähler aus
|
|
`tools/.wikitool_session/budget.json` (30, 29, 26, 24 Aufrufe). Schwelle 10 und
|
|
Budget-Obergrenze 60 blieben unverändert[^s-conversation-gate-counting-and-measured-calibration-session-2026-08-31]
|
|
- 2026-08-31 - Gitea-Issues #12 und #13 behoben (`1.2.0`, Commit `40adbb7`): Komma-Escape und Append-Semantik in `parse_list()`, Budget-Erstattung für abgelehnte Aufrufe, Obergrenze 60 und der immer geschriebene Lint-Report. Der End-to-End-Test deckte einen zweiten Defekt auf: `dump_frontmatter` schreibt Listen im Flow-Stil, `_format_scalar` entschied das Quoting aber über eine Round-Trip-Probe auf Dokumentebene, wo ein Komma gewöhnlich ist - innerhalb von `[...]` ist es ein Indikator. Behoben in `frontmatter_io.py` über `_round_trips_as_string(text, flow=True)` und einen `_quote()`-Helper, der sich vom Dumper eine einelementige Flow-Sequenz geben lässt und die Klammern abstreift, weil ein blanker Plain-Scalar aus `safe_dump` einen `...`-Dokumentende-Marker mitbringt. Bestehende Ausgabe blieb unverändert. 658 Tests grün, auch in der gehärteten Umgebung, nachdem zwei neue Tests `WIKI_AUTHOR` selbst setzen[^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31]
|
|
- 2026-08-31 - Gitea-Issue #14 geschlossen (`1.4.0`, Commit `dbe2f73`, 9 Dateien, 674 Tests
|
|
grün): `touch` bekommt `--set`/`--add`/`--remove`. Der Schnitt blieb bewusst eng - die
|
|
Dateiverschiebung bleibt zweistufig (`git mv`, dann `touch --set raw_files=…`), `raw rename`
|
|
wurde als Issue #16 (`prio/2`, `size/S`) abgespalten. `_coerce_set_value`, `_parse_set_fields`
|
|
und `_check_raw_files_exist` wanderten aus `new_page.py` nach `commands/_util.py`, damit
|
|
`touch --set` den Komma-Defekt aus Issue #12 nicht am ersten Tag erbt. Als Nebenbefund fiel
|
|
eine Testfalle: ein direkt aufgerufener Typer-Callback bekommt für jedes ausgelassene Argument
|
|
ein `OptionInfo`-Objekt, worauf drei neue Optionen sieben Aufrufstellen in `test_touch.py`
|
|
brachen; die Tests laufen jetzt über einen `_touch(**overrides)`-Helper[^s-conversation-write-once-frontmatter-fields-and-touch-set-session-2026-08-31]
|
|
- 2026-08-31 - Zuvor offene Lücke (Gitea-Issue #14): kein Befehl schreibt `raw_files:` auf einer bestehenden Seite. `touch` deckt die Felder ab, die die Seite beschreiben, `xref` die Seiten-Referenz-Arrays; `raw_files:` zeigt auf einen Pfad und ist keines von beidem. Vorgeschlagen sind `sources relink` oder ein `raw rename`, das `git mv` und jede referenzierende Source-Seite in einem Schritt erledigt. Siehe [[Detect-Repair Asymmetry]][^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31]
|
|
- 2026-08-30 - Befehlsgruppen `version` und `migrate` sowie `dist export` ergänzt; Stack- und
|
|
KB-Version werden seither in getrennten Dateien geführt. Zwei Tests, die die Autor-Ermittlung
|
|
über `git config user.name` prüfen sollten, hingen unbemerkt an der globalen git-Konfiguration
|
|
der ausführenden Maschine und fielen im ersten CI-Lauf; behoben in den Tests, nicht durch eine
|
|
git-Identität für CI[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]
|
|
- 2026-08-05 - Wechsel von `skills sync`/`verify` vom Kopieren von Skill-Verzeichnissen zu relativen Symlinks (Claude Codes eigene Dokumentation bestätigt, dass es symlinked Skill-Ordner folgt) - ein Symlink kann niemals veralten, im Gegensatz zu einer Kopie.
|
|
- 2026-08-04 - Befehle `skills sync`/`skills verify` hinzugefügt, um `.agents/skills/` in `.claude/skills/` für Claude-Code-Kompatibilität zu spiegeln, als Teil des Aufteilens von AGENTS.md-Workflows in diskrete Skills[^s-conversation-agents-md-skill-restructuring-session-2026-08-04].
|
|
- 2026-08-03 - Deterministische Provenance-Befehlsgruppe hinzugefügt und Wrapper-Pfadverhalten während der Conversation-Ingest/Provenance-Remediation-Arbeit gehärtet.
|
|
- 2026-08-03 - Seite während der Einspeisung der Codex-Analyse erstellt
|
|
- 2026-08-02 - Tool referenziert in wikitool-Lint-Verbesserungen (Log-Eintrag)
|
|
- 2026-07-26 - Anfängliche Implementierung als Teil der Wiki-Infrastruktur
|
|
|
|
## Siehe auch
|
|
|
|
- [[AGENTS.md]]
|
|
- [[LLM Wiki Pattern]]
|
|
- [[Source - LLM Improvements Codex Analysis]][^s-llm-improvements-codex-analysis]
|
|
- [[Semantic Lint Automation]]
|
|
- [[Session Orientation]]
|
|
- [[Source - LLM Improvements Sonnet Analysis]]
|
|
- [[Source - Copilot Skill Restructure Instructions]]
|
|
- [[Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04]]
|
|
- [[Iteration and Cost Limits]]
|
|
- [[Source - LLM Improvements Production Agent Gaps 2026]]
|
|
- [[KB Stack Versioning]]
|
|
- [[KB Migration]]
|
|
- [[Personalization Plane]]
|
|
- [[Detect-Repair Asymmetry]]
|
|
- [[Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31]]
|
|
- [[Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31]]
|
|
- [[Write-Once Frontmatter Fields]]
|
|
- [[Denylist over Allowlist]]
|
|
- [[Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31]]
|
|
- [[Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31]]
|
|
- [[Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31]]
|
|
- [[Command Round-Trip Integrity]]
|
|
- [[Green Suite Blind Spot]]
|
|
- [[Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31]]
|
|
- [[Ambient Environment Dependency]]
|
|
- [[Structural Enforcement over Documented Rule]]
|
|
- [[Optional Instance Context File]]
|
|
- [[Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31]]
|
|
- [[Source - Public Release, Corpus Purge and History Squash Session 2026-09-01]]
|
|
- [[Source - Publish-Remote Gate and Issue Triage Session 2026-09-01]]
|
|
- [[Source - Private-Instance Merge Correction and Issue 30 Session 2026-09-01]]
|
|
- [[MCP-Leseserver]]
|
|
|
|
## Fußnoten
|
|
|
|
[^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31]: [[Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31]]
|
|
[^s-conversation-write-once-frontmatter-fields-and-touch-set-session-2026-08-31]: [[Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31]]
|
|
[^s-conversation-two-round-trip-defects-found-by-an-ingest-session-2026-08-31]: [[Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31]]
|
|
[^s-conversation-gate-counting-and-measured-calibration-session-2026-08-31]: [[Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31]]
|
|
[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]: [[Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30]]
|
|
[^s-conversation-environment-md-as-an-optional-third-session-level-file-session-2026-08-31]: [[Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31]]
|
|
[^s-conversation-agents-md-skill-restructuring-session-2026-08-04]: [[Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04]]
|
|
[^s-conversation-hardening-the-test-suite-against-silent-environment-dependencies-session-2026-08-31]: [[Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31]]
|
|
[^s-llm-improvements-codex-analysis]: [[Source - LLM Improvements Codex Analysis]]
|
|
[^s-public-release-corpus-purge-and-history-squash-session-2026-09-01]: [[Source - Public Release, Corpus Purge and History Squash Session 2026-09-01]]
|
|
[^s-publish-remote-gate-and-issue-triage-session-2026-09-01]: [[Source - Publish-Remote Gate and Issue Triage Session 2026-09-01]]
|
|
[^s-mcp-read-server-implementation-session-2026-09-02]: [[Source - MCP Read Server Implementation Session 2026-09-02]]
|