wikitool new: Schraegstrich in --name erzeugt verschachtelten Pfad statt Ablehnung #114

Closed
opened 2026-09-17 20:53:30 +00:00 by torben · 1 comment
Owner

Befund

wikitool new <type> --name "<Titel>" uebernimmt den rohen --name-Wert ungeprueft in den
Dateipfad. Enthaelt der Titel einen /, interpretiert pathlib.Path.__truediv__ diesen als
Verzeichnistrenner: die Seite landet in einem neu angelegten Unterverzeichnis, und ihr
tatsaechlicher, im Katalog/search/rename gefuehrter Titel ist nur noch der Teilstring nach
dem letzten / - waehrend die H1-Ueberschrift im Seiteninhalt weiterhin den vollen,
beabsichtigten Titel traegt. Titel (H1), Dateiname/Seitenidentitaet und Katalogeintrag laufen
damit sofort auseinander, ohne jede Fehlermeldung.

Betrifft jeden Typ, der ueber den generischen new_page_command laeuft (entity, concept,
source, comparison, ...), da die Titelverarbeitung typunabhaengig ist.

Reproduktion

Getestet in einer privaten Instanz gegen Stack-Version 6.1.0 (source_commit
11c400c670d341988dd0f1a7746f59557d00722b). Titel bewusst generisch gewaehlt, kein
Instanzinhalt:

$ tools/wikitool new concept --name "Foo/Bar Baz Pattern" \
    --set concept_type=pattern --set provenance=general \
    --set summary="throwaway repro page for a wikitool bug report"
OK Created kb/concepts/patterns/Foo/Bar Baz Pattern.md

$ find kb/concepts/patterns -iname "Foo*"
kb/concepts/patterns/Foo
kb/concepts/patterns/Foo/Bar Baz Pattern.md

$ tools/wikitool search "Bar Baz"
6.0 | concept/pattern | Bar Baz Pattern | kb/concepts/patterns/Foo/Bar Baz Pattern.md | throwaway repro page for a wikitool bug report
1 result(s).

$ head -15 "kb/concepts/patterns/Foo/Bar Baz Pattern.md"
---
type: types/concept.md
concept_type: pattern
...
---
# Foo/Bar Baz Pattern

Der Katalog/search fuehrt die Seite unter dem Titel Bar Baz Pattern, die Datei liegt unter
kb/concepts/patterns/Foo/Bar Baz Pattern.md, die H1 in der Datei lautet weiterhin
# Foo/Bar Baz Pattern. Drei verschiedene "Titel" fuer dieselbe Seite.

Der vom Nutzer eigentlich gemeinte Titel ist danach nicht mehr sauber referenzierbar:

$ tools/wikitool rename --from "Foo/Bar Baz Pattern" --to "Foo-Bar Baz Pattern" --dry-run
ERROR Neither 'Foo/Bar Baz Pattern' nor 'Foo-Bar Baz Pattern' is a page under kb/.
Repointing references to 'Foo-Bar Baz Pattern' would just move the dangling reference;
create the page first with `wikitool new ...`, or drop the reference with `wikitool xref remove`.

rename kennt nur den tatsaechlichen (kaputten) Titel Bar Baz Pattern, nicht den vom Nutzer
eingegebenen. Der einzige gangbare Reparaturweg war wikitool rm --page "Bar Baz Pattern" und
Neuanlage mit einem slash-freien Titel.

Ursache

tools/chemenu/commands/new_page.py:293:

page_title = f"{title_prefix}{name}"

tools/chemenu/commands/new_page.py:349:

path = target_dir / f"{page_title}.md"

name (aus --name) wird an keiner Stelle dazwischen auf Pfadtrennzeichen geprueft, bevor er
in eine Path-Verknuepfung eingeht. check_collision(page_title) (Zeile 299) prueft ebenfalls
nur den rohen, slash-haltigen String - das ist kein Titel, den je eine echte Seite tragen wird,
die Pruefung kann die Kollision mit der tatsaechlich entstehenden Seite (Titel ohne den
Prefix-Teil) also gar nicht sehen.

Loesungsvorschlag

  • new_page_command sollte name vor Zeile 293 auf ein Pfadtrennzeichen (/, unter Windows
    zusaetzlich \) pruefen und mit fail(...) ablehnen - konsistent mit dem bestehenden
    No-Guessing-Stil an anderer Stelle in derselben Datei (siehe missing_capture /
    guessed_unknown wenige Zeilen weiter unten: klare Fehlermeldung statt stille
    Fehlinterpretation).
  • Gleiche Pruefung ist vermutlich auch fuer --to bei rename sinnvoll (dort bislang nicht
    getestet) - separat zu betrachten.

Akzeptanzkriterien

  • wikitool new <type> --name "A/B" schlaegt mit klarer Fehlermeldung fehl, statt eine
    Seite unter <base_dir>/A/B.md mit Titel B anzulegen.
  • Test deckt mindestens Vorwaerts-Slash ab.
  • pytest, docs verify clean.

Herkunft

Beobachtet waehrend eines regulaeren wiki-ingest-Laufs in einer privaten Instanz (2026-09-17)
beim Anlegen mehrerer Concept-Seiten mit "CI/CD" im Titel; dort direkt per wikitool rm und
Neuanlage mit bereinigtem Titel behoben. Dieses Issue reproduziert den Fehler eigenstaendig mit
einem generischen Titel, ohne Bezug zu Inhalten der Instanz.

## Befund `wikitool new <type> --name "<Titel>"` uebernimmt den rohen `--name`-Wert ungeprueft in den Dateipfad. Enthaelt der Titel einen `/`, interpretiert `pathlib.Path.__truediv__` diesen als Verzeichnistrenner: die Seite landet in einem neu angelegten Unterverzeichnis, und ihr tatsaechlicher, im Katalog/`search`/`rename` gefuehrter Titel ist nur noch der Teilstring nach dem letzten `/` - waehrend die H1-Ueberschrift im Seiteninhalt weiterhin den vollen, beabsichtigten Titel traegt. Titel (H1), Dateiname/Seitenidentitaet und Katalogeintrag laufen damit sofort auseinander, ohne jede Fehlermeldung. Betrifft jeden Typ, der ueber den generischen `new_page_command` laeuft (`entity`, `concept`, `source`, `comparison`, ...), da die Titelverarbeitung typunabhaengig ist. ## Reproduktion Getestet in einer privaten Instanz gegen Stack-Version 6.1.0 (`source_commit` `11c400c670d341988dd0f1a7746f59557d00722b`). Titel bewusst generisch gewaehlt, kein Instanzinhalt: ``` $ tools/wikitool new concept --name "Foo/Bar Baz Pattern" \ --set concept_type=pattern --set provenance=general \ --set summary="throwaway repro page for a wikitool bug report" OK Created kb/concepts/patterns/Foo/Bar Baz Pattern.md $ find kb/concepts/patterns -iname "Foo*" kb/concepts/patterns/Foo kb/concepts/patterns/Foo/Bar Baz Pattern.md $ tools/wikitool search "Bar Baz" 6.0 | concept/pattern | Bar Baz Pattern | kb/concepts/patterns/Foo/Bar Baz Pattern.md | throwaway repro page for a wikitool bug report 1 result(s). $ head -15 "kb/concepts/patterns/Foo/Bar Baz Pattern.md" --- type: types/concept.md concept_type: pattern ... --- # Foo/Bar Baz Pattern ``` Der Katalog/`search` fuehrt die Seite unter dem Titel `Bar Baz Pattern`, die Datei liegt unter `kb/concepts/patterns/Foo/Bar Baz Pattern.md`, die H1 in der Datei lautet weiterhin `# Foo/Bar Baz Pattern`. Drei verschiedene "Titel" fuer dieselbe Seite. Der vom Nutzer eigentlich gemeinte Titel ist danach nicht mehr sauber referenzierbar: ``` $ tools/wikitool rename --from "Foo/Bar Baz Pattern" --to "Foo-Bar Baz Pattern" --dry-run ERROR Neither 'Foo/Bar Baz Pattern' nor 'Foo-Bar Baz Pattern' is a page under kb/. Repointing references to 'Foo-Bar Baz Pattern' would just move the dangling reference; create the page first with `wikitool new ...`, or drop the reference with `wikitool xref remove`. ``` `rename` kennt nur den tatsaechlichen (kaputten) Titel `Bar Baz Pattern`, nicht den vom Nutzer eingegebenen. Der einzige gangbare Reparaturweg war `wikitool rm --page "Bar Baz Pattern"` und Neuanlage mit einem slash-freien Titel. ## Ursache `tools/chemenu/commands/new_page.py:293`: ```python page_title = f"{title_prefix}{name}" ``` `tools/chemenu/commands/new_page.py:349`: ```python path = target_dir / f"{page_title}.md" ``` `name` (aus `--name`) wird an keiner Stelle dazwischen auf Pfadtrennzeichen geprueft, bevor er in eine `Path`-Verknuepfung eingeht. `check_collision(page_title)` (Zeile 299) prueft ebenfalls nur den rohen, slash-haltigen String - das ist kein Titel, den je eine echte Seite tragen wird, die Pruefung kann die Kollision mit der tatsaechlich entstehenden Seite (Titel ohne den Prefix-Teil) also gar nicht sehen. ## Loesungsvorschlag - `new_page_command` sollte `name` vor Zeile 293 auf ein Pfadtrennzeichen (`/`, unter Windows zusaetzlich `\`) pruefen und mit `fail(...)` ablehnen - konsistent mit dem bestehenden No-Guessing-Stil an anderer Stelle in derselben Datei (siehe `missing_capture` / `guessed_unknown` wenige Zeilen weiter unten: klare Fehlermeldung statt stille Fehlinterpretation). - Gleiche Pruefung ist vermutlich auch fuer `--to` bei `rename` sinnvoll (dort bislang nicht getestet) - separat zu betrachten. ## Akzeptanzkriterien - [ ] `wikitool new <type> --name "A/B"` schlaegt mit klarer Fehlermeldung fehl, statt eine Seite unter `<base_dir>/A/B.md` mit Titel `B` anzulegen. - [ ] Test deckt mindestens Vorwaerts-Slash ab. - [ ] `pytest`, `docs verify` clean. ## Herkunft Beobachtet waehrend eines regulaeren `wiki-ingest`-Laufs in einer privaten Instanz (2026-09-17) beim Anlegen mehrerer Concept-Seiten mit "CI/CD" im Titel; dort direkt per `wikitool rm` und Neuanlage mit bereinigtem Titel behoben. Dieses Issue reproduziert den Fehler eigenstaendig mit einem generischen Titel, ohne Bezug zu Inhalten der Instanz.
torben added the prio/plannedsize/Sarea/kbkind/defectstatus/incoming labels 2026-09-17 20:53:30 +00:00
Author
Owner

Changelog: Das Issue ist in #155 aufgegangen und wird geschlossen (Betreiber-Entscheidung D31, 2026-09-29). Der Befund ist ein Sonderfall der Dateinamensregel für Titel aus D18: / gehört zu den verbotenen Zeichen, und new wie rename verweigern ihn künftig vor jedem Schreibzugriff. Beide Akzeptanzkriterien stehen jetzt in #155: „new --name "A/B" endet mit Exit 1, es entsteht weder A/ noch eine Datei“, und ein Test deckt den Schrägstrich ab. Die Frage aus dem Lösungsvorschlag, ob rename --to dieselbe Prüfung braucht, ist dort mit Ja beantwortet. Der Body bleibt unverändert als Befundbericht stehen.

**Changelog:** Das Issue ist in #155 aufgegangen und wird geschlossen (Betreiber-Entscheidung D31, 2026-09-29). Der Befund ist ein Sonderfall der Dateinamensregel für Titel aus D18: `/` gehört zu den verbotenen Zeichen, und `new` wie `rename` verweigern ihn künftig vor jedem Schreibzugriff. Beide Akzeptanzkriterien stehen jetzt in #155: „`new --name "A/B"` endet mit Exit 1, es entsteht weder `A/` noch eine Datei“, und ein Test deckt den Schrägstrich ab. Die Frage aus dem Lösungsvorschlag, ob `rename --to` dieselbe Prüfung braucht, ist dort mit Ja beantwortet. Der Body bleibt unverändert als Befundbericht stehen.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#114