sources: auf comparison- und source-Seiten: Schema verbietet, was cite add schreibt; Quellen dürfen Quellen zitieren #173

Closed
opened 2026-10-04 09:00:07 +00:00 by torben · 5 comments
Owner

Stand

Erledigt. Version 8.0.0-beta.40 (Bump --minor, Impact medium), Commit 862bc04.
Entscheidungen 1–4 sind so umgesetzt, wie sie unten stehen, ohne Abweichung.

Verifiziert durch:

  • lokal: pytest hermetisch (2218 passed, 3 skipped), docs verify, instructions verify
  • CI auf 862bc04: Run 539 (Jobs verify und pwsh) und Run 540, beide grün

Im Abschluss (stack-close) wurden geprüft: docs/, README.md § Provenance, die Typ-Guidance,
kb/CONTRACT.md, wiki-ingest und die Befehls-Records. Veraltet war nur ein Satz im
CHANGES.md-Eintrag. Er behauptete, bis zu den Handgriffen melde lint jede zitierende
source-Seite als Schema-Fehler. Seit Entscheidung 3 gilt das für das Selbstzitat nicht mehr, denn
das kommt allein mit dem Code-Upgrade. Korrigiert in 8ff22ad, nur CHANGES.md, daher kein
Bump. CI-Run 541 grün.

Befund

wikitool cite add legte auf jeder Seite per setdefault das Frontmatter-Feld sources: an und
trug die zitierte Quelle ein (tools/chemenu/commands/cite_cmd.py, upsert_citation).
Zwei der fünf root: kb-Seitentypen deklarierten sources weder im Schema noch in
page_ref_fields:. Ihr Schema steht zudem auf additionalProperties: false, sodass
wikitool lint die Seite danach als Schema-Fehler meldete:

Seitentyp sources im Schema / in page_ref_fields (vorher) Betroffen
entity, concept, project ja / ja nein
comparison nein / nein ([entities, related]) ja: jede Zitation
source nein / nein ([entities, concepts]) ja: jede Zitation, auch das Selbstzitat mit --file

Am 2026-10-04 gegen main (662a844) reproduziert, mit einem Wegwerf-Test auf den
kb_dir/raw_dir-Fixtures und run_lint():

  • comparison: Additional properties are not allowed ('sources' was unexpected)
  • source, Selbstzitat mit --file notes.md: ('source', 'sources' were unexpected). Das
    source ist ein Fixture-Artefakt, sources kam neu durch cite add dazu.

Andere Typen (instruction, type-spec, …) sind keine kb/-Seiten, cite add erreicht sie
nicht.

Derselbe Defekt steckte in xref link-source, wenn ein Ziel in --entities selbst eine
source-Seite war. Der Befehl schrieb dann sources: auf das Ziel, was wieder gegen das
source-Schema verstieß. Den Rückverweis ließ er als „unrouted“ liegen.

Der Widerspruch: kb/comparisons/COLLECTION.md:38 (wird als .template ausgeliefert) verlangt
„Cite hard facts the same way any other page does.“ Und lint selbst behandelt das Selbstzitat
einer source-Seite als legitim (tools/chemenu/lint_core.py, citation_frontmatter_drift). Eine
regelkonform belegte Seite konnte lint nicht bestehen.

page_ref_fields: gehört zum Fix, nicht nur das Schema. Was dort nicht deklariert ist,
zieht rename/rm nicht mit (page_ops.retarget_frontmatter), prüft lint nicht auf
Auflösbarkeit (dangling_frontmatter_refs) und leert xref remove nicht. Ein Schema-Fix allein,
wie ihn die private Instanz lokal gemacht hat, lässt nach dem Umbenennen einer Quelle tote
sources:-Einträge auf comparison-Seiten zurück, und niemand meldet sie.

Entscheidungen

  1. comparison: sources wird optionales, deklariertes Referenzfeld. Das Schema bekommt
    sources (array of string, wie types/concept.schema.yaml), nicht required, damit
    Bestandsseiten weiter validieren. page_ref_fields: [entities, related, sources].
    Verworfen: cite add auf comparison ohne sources: schreiben lassen, denn dann zeigt eine
    Fußnote auf eine Quelle, die kb/provenance.md und sources coverage nicht kennen, und
    lint meldet citation_frontmatter_drift.
  2. source-Seiten dürfen andere source-Seiten zitieren (Entscheidung des Betreibers,
    2026-10-04: „nicht ungewöhnlich“). Gleiche Form wie bei comparison: Das Schema bekommt
    sources (optional) und page_ref_fields: [entities, concepts, sources].
    cite add --page "Source - A" --source "Source - B" schreibt sources: [Source - B] auf A.
    B bleibt unverändert, und citing_pages(B) führt A dann als Zitierer.
  3. Selbstzitat: cite add schreibt den eigenen Titel nie in sources:. Wenn
    source_title == page.title, rührt upsert_citation das Frontmatter nicht an: kein
    Eintrag, auch kein durch setdefault angelegtes leeres sources: []. Die
    Fußnotendefinition wird wie bisher geschrieben. Mit Entscheidung 2 wäre der Eintrag kein
    Schema-Fehler mehr, aber eine Kante auf sich selbst ohne Information. lint und
    provenance.citing_pages() ignorieren sie ohnehin. Das zieht cite add auf deren Linie.
  4. xref link-source lehnt ein Ziel ab, das selbst eine source-Seite ist
    (page.kind == "source"). Grund: link-source heißt „Quelle A erwähnt X“ und schreibt
    X.sources += A. Bei X = Quelle B behauptet das „B zitiert A“, also die falsche Richtung.
    Mit Entscheidung 2 käme über _back_reference_field noch A.sources += B dazu, die
    Zitation stünde dann symmetrisch auf beiden Seiten. Eine Zitation zwischen Quellen hat eine
    Richtung, und die drückt nur cite add aus. Verhalten: Das Ziel wird nicht geschrieben und
    in einer eigenen Ausgabezeile Refused (a source page - …) benannt, mit dem Hinweis auf
    wikitool cite add --page "<A>" --source "<B>" (oder umgekehrt, denn welche Richtung gilt,
    weiß das Werkzeug nicht). Die übrigen Ziele werden verlinkt, der Lauf endet wie bei „page not
    found“ mit exit 1. Verworfen: still überspringen mit exit 0, denn dann bemerkt
    wiki-ingest nicht, dass eine gewollte Verbindung fehlt.

Nicht Teil dieses Pakets

  • Ob comparison zusätzlich provenance:/modified: bekommen sollte (entity/concept haben
    beides), ist nicht gefragt und nicht nötig, um diesen Defekt zu beheben.
  • sources trace --page "Source - A" listet nach Entscheidung 2 die zitierten Quellen und deren
    Rohdateien, nicht A's eigene raw_files:. Das stimmt mit der Bedeutung „was belegt diese
    Seite per Zitat“ überein und braucht keine Änderung.
  • kb/sources/COLLECTION.md § Outbound linking bleibt unverändert: Die Aussage dort („Pages
    elsewhere cite this one …“) ist weiter wahr, und die neue Regel steht einmal, in
    kb/CONTRACT.md (Invariante 8).

Betroffene Dateien (so geändert in 862bc04, CHANGES.md nachgebessert in 8ff22ad)

  • types/comparison.schema.yaml: Property sources

  • types/comparison.md: page_ref_fields: [entities, related, sources], Zeile sources in der
    Frontmatter-Tabelle

  • types/source.schema.yaml: Property sources

  • types/source.md: page_ref_fields: [entities, concepts, sources], Zeile sources in der
    Frontmatter-Tabelle

    Alle vier Dateien werden als .template ausgeliefert (dist_cmd._owned_type_stem).

  • tools/chemenu/commands/cite_cmd.py: upsert_citation (Entscheidung 3). Notes von
    cite add nennen die Selbstzitat-Ausnahme und dass cite add die Zitation zwischen Quellen
    festhält.

  • tools/chemenu/commands/xref.py: xref_link_source (Entscheidung 4), dazu im
    CommandRecord eine Note und eine Failure für das abgelehnte source-Ziel

  • tools/CONTRACT.md: per docs contract --apply neu erzeugt

  • kb/CONTRACT.md § Provenance and citation: Selbstzitat-Ausnahme bei cite add und bei
    „A source cited inline must also appear …“, neuer Punkt „A source page may cite another
    source page“, link-source-Punkt nennt: nie eine andere source-Seite als Ziel.

  • instructions/wiki-ingest/SKILL.md Schritt 9: Absatz für eine ältere Quelle, die die neue
    zitiert, mit cite add, verlinkt die Regel in kb/CONTRACT.md.

  • CHANGES.md: Eintrag mit den Handgriffen für bestehende Instanzen

  • Tests: test_cite_cmd.py (comparison, source zitiert source, Selbstzitat drei Fälle),
    test_xref.py (test_xref_link_source_refuses_a_target_that_is_itself_a_source),
    test_page_ops.py (test_rename_carries_sources_on_comparison_and_source_pages),
    test_type_resolver.py (die dort festgeschriebenen page_ref_fields nachgezogen). Jeder neue
    Test scheitert gegen den Stand vor dem Fix.

Akzeptanzkriterien

  • Nach cite add --page "<comparison>" --source "Source - X" auf einer sonst
    schema-gültigen comparison-Seite steht die Seite nicht in
    run_lint(kb_dir)["schema_validation_errors"], und ihr sources: enthält Source - X.
  • Nach cite add --page "Source - A" --source "Source - B" auf einer sonst schema-gültigen
    source-Seite A steht A nicht in schema_validation_errors, A.sources == ["Source - B"],
    B's Datei ist byte-gleich, und citing_pages(pages, "Source - B") enthält
    Source - A.
  • Nach cite add --page "Source - A" --source "Source - A" --file <f> hat A keinen
    Schlüssel sources (wenn es vorher keinen hatte) bzw. ein unverändertes sources:, und
    die Definition [[Source - A|<f>]] steht im Footnotes-Bereich. Die Wiederholung liefert
    changed is False.
  • Ein Rename von Source - X schreibt den neuen Titel in das sources: einer
    comparison-Seite und einer source-Seite, die X zitieren. Danach meldet lint keinen
    dangling_frontmatter_refs-Eintrag für diese Seiten.
  • xref link-source --source "Source - A" --entities "<entity>,Source - B": Die Entity ist
    verlinkt. Das Frontmatter von A und B enthält danach keinen Eintrag, der die jeweils
    andere Quelle nennt. Die Ausgabe nennt Source - B mit dem cite add-Hinweis. Der exit
    code ist 1.
  • Zitationen auf entity/concept/project verhalten sich unverändert (bestehende Tests grün).
  • kb/CONTRACT.md, wiki-ingest Schritt 9 sowie die Notes von cite add und
    xref link-source beschreiben das neue Verhalten. tools/CONTRACT.md ist neu erzeugt.
  • Der CHANGES.md-Eintrag sagt Betreibern einer bestehenden Instanz, was sie tun müssen,
    und welcher Fall auch ohne die Handgriffe funktioniert (siehe unten).
  • pytest (hermetisch: 2218 passed, 3 skipped), docs verify, instructions verify
    sauber.
  • CI grün auf 862bc04: Runs 539 und 540. Auf 8ff22ad Run 541.

Bestehende Instanzen

Schema und Type-Spec von comparison und source gehören nach der Adoption der Instanz.
dist upgrade erneuert nur die .template-Dateien daneben und meldet nicht, dass sich das
Template unter einer adoptierten Datei geändert hat (instructions/upgrade-instance.md Schritt
6/9). Der Typ-Teil (Entscheidungen 1 und 2) erreicht eine bestehende Instanz also nur von
Hand
. Der CHANGES.md-Eintrag sagt das explizit, je Typ (comparison, source) drei Handgriffe:

  • Property sources aus types/<typ>.schema.yaml.template in das eigene Schema übernehmen
  • sources in page_ref_fields: der eigenen types/<typ>.md ergänzen (ohne das zieht ein
    Rename die Einträge nicht mit)
  • Tabellenzeile sources in derselben Datei übernehmen

Eine Instanz, die nur das Schema angepasst hat (wie die meldende), braucht noch den zweiten
Punkt. Die Code-Teile (Entscheidungen 3 und 4) liegen unter tools/ und kommen mit dem
normalen Upgrade. Das Selbstzitat einer source-Seite validiert damit auch ohne die Handgriffe.

Versionsteil

--minor, gebumpt auf 8.0.0-beta.40. Drop-in-Test (instructions/dev/version-parts.md):

  • Vorwärts: Nichts, was vorher funktionierte, bricht. Schemas werden nur gelockert, und
    cite add schreibt in einem Fall weniger. link-source mit source-Ziel endet jetzt mit
    exit 1. Vorher endete es mit exit 0, aber mit einer Seite, die lint als Schema-Fehler
    meldet: Das funktionierte also schon vorher nicht. Die Handarbeit oben ist nötig, um die
    neue Fähigkeit zu bekommen, nicht, um weiterzuarbeiten.
  • Rückwärts: Ein Downgrade ersetzt nur die .template-Dateien. Die adoptierten
    Schemas/Type-Specs der Instanz bleiben, also validiert eine source-Seite mit sources:
    weiter.

Neue Fähigkeit (Quellen zitieren Quellen), drop-in in beide Richtungen, daher --minor, nicht
--patch. Der laufende Kandidat stand bei 8.0.0-beta.39 (schon MAJOR-Stufe). Der Bump hat
dort nur die Bump-Zählung erhöht. Kein Boundary-Crossing, also kein --breaking und kein
--no-migration. Impact: medium.

Herkunft

Aufgefallen beim Anlegen der ersten comparison-Seite einer privaten Instanz (v7.0.0). Die
Instanz hat das Schema lokal schon angepasst. Ursprünglicher Stub wörtlich im ersten Kommentar.

## Stand **Erledigt.** Version `8.0.0-beta.40` (Bump `--minor`, Impact `medium`), Commit `862bc04`. Entscheidungen 1–4 sind so umgesetzt, wie sie unten stehen, ohne Abweichung. Verifiziert durch: - lokal: `pytest` hermetisch (2218 passed, 3 skipped), `docs verify`, `instructions verify` - CI auf `862bc04`: Run 539 (Jobs `verify` und `pwsh`) und Run 540, beide grün Im Abschluss (`stack-close`) wurden geprüft: `docs/`, `README.md` § Provenance, die Typ-Guidance, `kb/CONTRACT.md`, `wiki-ingest` und die Befehls-Records. Veraltet war nur ein Satz im `CHANGES.md`-Eintrag. Er behauptete, bis zu den Handgriffen melde `lint` *jede* zitierende source-Seite als Schema-Fehler. Seit Entscheidung 3 gilt das für das Selbstzitat nicht mehr, denn das kommt allein mit dem Code-Upgrade. Korrigiert in `8ff22ad`, nur `CHANGES.md`, daher kein Bump. CI-Run 541 grün. ## Befund `wikitool cite add` legte auf jeder Seite per `setdefault` das Frontmatter-Feld `sources:` an und trug die zitierte Quelle ein (`tools/chemenu/commands/cite_cmd.py`, `upsert_citation`). Zwei der fünf `root: kb`-Seitentypen deklarierten `sources` weder im Schema noch in `page_ref_fields:`. Ihr Schema steht zudem auf `additionalProperties: false`, sodass `wikitool lint` die Seite danach als Schema-Fehler meldete: | Seitentyp | `sources` im Schema / in `page_ref_fields` (vorher) | Betroffen | |---|---|---| | entity, concept, project | ja / ja | nein | | **comparison** | nein / nein (`[entities, related]`) | **ja**: jede Zitation | | **source** | nein / nein (`[entities, concepts]`) | **ja**: jede Zitation, auch das Selbstzitat mit `--file` | Am 2026-10-04 gegen `main` (662a844) reproduziert, mit einem Wegwerf-Test auf den `kb_dir`/`raw_dir`-Fixtures und `run_lint()`: - comparison: `Additional properties are not allowed ('sources' was unexpected)` - source, Selbstzitat mit `--file notes.md`: `('source', 'sources' were unexpected)`. Das `source` ist ein Fixture-Artefakt, `sources` kam neu durch `cite add` dazu. Andere Typen (`instruction`, `type-spec`, …) sind keine `kb/`-Seiten, `cite add` erreicht sie nicht. Derselbe Defekt steckte in `xref link-source`, wenn ein Ziel in `--entities` selbst eine source-Seite war. Der Befehl schrieb dann `sources:` auf das Ziel, was wieder gegen das source-Schema verstieß. Den Rückverweis ließ er als „unrouted“ liegen. Der Widerspruch: `kb/comparisons/COLLECTION.md:38` (wird als `.template` ausgeliefert) verlangt „Cite hard facts the same way any other page does.“ Und `lint` selbst behandelt das Selbstzitat einer source-Seite als legitim (`tools/chemenu/lint_core.py`, `citation_frontmatter_drift`). Eine regelkonform belegte Seite konnte `lint` nicht bestehen. **`page_ref_fields:` gehört zum Fix, nicht nur das Schema.** Was dort nicht deklariert ist, zieht `rename`/`rm` nicht mit (`page_ops.retarget_frontmatter`), prüft `lint` nicht auf Auflösbarkeit (`dangling_frontmatter_refs`) und leert `xref remove` nicht. Ein Schema-Fix allein, wie ihn die private Instanz lokal gemacht hat, lässt nach dem Umbenennen einer Quelle tote `sources:`-Einträge auf comparison-Seiten zurück, und niemand meldet sie. ## Entscheidungen 1. **comparison: `sources` wird optionales, deklariertes Referenzfeld.** Das Schema bekommt `sources` (array of string, wie `types/concept.schema.yaml`), nicht required, damit Bestandsseiten weiter validieren. `page_ref_fields: [entities, related, sources]`. *Verworfen:* `cite add` auf comparison ohne `sources:` schreiben lassen, denn dann zeigt eine Fußnote auf eine Quelle, die `kb/provenance.md` und `sources coverage` nicht kennen, und `lint` meldet `citation_frontmatter_drift`. 2. **source-Seiten dürfen andere source-Seiten zitieren** (Entscheidung des Betreibers, 2026-10-04: „nicht ungewöhnlich“). Gleiche Form wie bei comparison: Das Schema bekommt `sources` (optional) und `page_ref_fields: [entities, concepts, sources]`. `cite add --page "Source - A" --source "Source - B"` schreibt `sources: [Source - B]` auf A. B bleibt unverändert, und `citing_pages(B)` führt A dann als Zitierer. 3. **Selbstzitat: `cite add` schreibt den eigenen Titel nie in `sources:`.** Wenn `source_title == page.title`, rührt `upsert_citation` das Frontmatter nicht an: kein Eintrag, auch kein durch `setdefault` angelegtes leeres `sources: []`. Die Fußnotendefinition wird wie bisher geschrieben. Mit Entscheidung 2 wäre der Eintrag kein Schema-Fehler mehr, aber eine Kante auf sich selbst ohne Information. `lint` und `provenance.citing_pages()` ignorieren sie ohnehin. Das zieht `cite add` auf deren Linie. 4. **`xref link-source` lehnt ein Ziel ab, das selbst eine source-Seite ist** (`page.kind == "source"`). Grund: `link-source` heißt „Quelle A erwähnt X“ und schreibt `X.sources += A`. Bei X = Quelle B behauptet das „B zitiert A“, also die falsche Richtung. Mit Entscheidung 2 käme über `_back_reference_field` noch `A.sources += B` dazu, die Zitation stünde dann symmetrisch auf beiden Seiten. Eine Zitation zwischen Quellen hat eine Richtung, und die drückt nur `cite add` aus. Verhalten: Das Ziel wird nicht geschrieben und in einer eigenen Ausgabezeile `Refused (a source page - …)` benannt, mit dem Hinweis auf `wikitool cite add --page "<A>" --source "<B>"` (oder umgekehrt, denn welche Richtung gilt, weiß das Werkzeug nicht). Die übrigen Ziele werden verlinkt, der Lauf endet wie bei „page not found“ mit exit 1. *Verworfen:* still überspringen mit exit 0, denn dann bemerkt `wiki-ingest` nicht, dass eine gewollte Verbindung fehlt. ## Nicht Teil dieses Pakets - Ob comparison zusätzlich `provenance:`/`modified:` bekommen sollte (entity/concept haben beides), ist nicht gefragt und nicht nötig, um diesen Defekt zu beheben. - `sources trace --page "Source - A"` listet nach Entscheidung 2 die zitierten Quellen und deren Rohdateien, nicht A's eigene `raw_files:`. Das stimmt mit der Bedeutung „was belegt diese Seite per Zitat“ überein und braucht keine Änderung. - `kb/sources/COLLECTION.md` § Outbound linking bleibt unverändert: Die Aussage dort („Pages elsewhere cite this one …“) ist weiter wahr, und die neue Regel steht einmal, in `kb/CONTRACT.md` (Invariante 8). ## Betroffene Dateien (so geändert in `862bc04`, `CHANGES.md` nachgebessert in `8ff22ad`) - `types/comparison.schema.yaml`: Property `sources` - `types/comparison.md`: `page_ref_fields: [entities, related, sources]`, Zeile `sources` in der Frontmatter-Tabelle - `types/source.schema.yaml`: Property `sources` - `types/source.md`: `page_ref_fields: [entities, concepts, sources]`, Zeile `sources` in der Frontmatter-Tabelle Alle vier Dateien werden als `.template` ausgeliefert (`dist_cmd._owned_type_stem`). - `tools/chemenu/commands/cite_cmd.py`: `upsert_citation` (Entscheidung 3). Notes von `cite add` nennen die Selbstzitat-Ausnahme und dass `cite add` die Zitation zwischen Quellen festhält. - `tools/chemenu/commands/xref.py`: `xref_link_source` (Entscheidung 4), dazu im `CommandRecord` eine Note und eine `Failure` für das abgelehnte source-Ziel - `tools/CONTRACT.md`: per `docs contract --apply` neu erzeugt - `kb/CONTRACT.md` § Provenance and citation: Selbstzitat-Ausnahme bei `cite add` und bei „A source cited inline must also appear …“, neuer Punkt „A source page may cite another source page“, `link-source`-Punkt nennt: nie eine andere source-Seite als Ziel. - `instructions/wiki-ingest/SKILL.md` Schritt 9: Absatz für eine ältere Quelle, die die neue zitiert, mit `cite add`, verlinkt die Regel in `kb/CONTRACT.md`. - `CHANGES.md`: Eintrag mit den Handgriffen für bestehende Instanzen - Tests: `test_cite_cmd.py` (comparison, source zitiert source, Selbstzitat drei Fälle), `test_xref.py` (`test_xref_link_source_refuses_a_target_that_is_itself_a_source`), `test_page_ops.py` (`test_rename_carries_sources_on_comparison_and_source_pages`), `test_type_resolver.py` (die dort festgeschriebenen `page_ref_fields` nachgezogen). Jeder neue Test scheitert gegen den Stand vor dem Fix. ## Akzeptanzkriterien - [x] Nach `cite add --page "<comparison>" --source "Source - X"` auf einer sonst schema-gültigen comparison-Seite steht die Seite nicht in `run_lint(kb_dir)["schema_validation_errors"]`, und ihr `sources:` enthält `Source - X`. - [x] Nach `cite add --page "Source - A" --source "Source - B"` auf einer sonst schema-gültigen source-Seite A steht A nicht in `schema_validation_errors`, `A.sources == ["Source - B"]`, B's Datei ist byte-gleich, und `citing_pages(pages, "Source - B")` enthält `Source - A`. - [x] Nach `cite add --page "Source - A" --source "Source - A" --file <f>` hat A keinen Schlüssel `sources` (wenn es vorher keinen hatte) bzw. ein unverändertes `sources:`, und die Definition `[[Source - A|<f>]]` steht im Footnotes-Bereich. Die Wiederholung liefert `changed is False`. - [x] Ein Rename von `Source - X` schreibt den neuen Titel in das `sources:` einer comparison-Seite und einer source-Seite, die X zitieren. Danach meldet `lint` keinen `dangling_frontmatter_refs`-Eintrag für diese Seiten. - [x] `xref link-source --source "Source - A" --entities "<entity>,Source - B"`: Die Entity ist verlinkt. Das Frontmatter von A und B enthält danach keinen Eintrag, der die jeweils andere Quelle nennt. Die Ausgabe nennt `Source - B` mit dem `cite add`-Hinweis. Der exit code ist 1. - [x] Zitationen auf entity/concept/project verhalten sich unverändert (bestehende Tests grün). - [x] `kb/CONTRACT.md`, `wiki-ingest` Schritt 9 sowie die Notes von `cite add` und `xref link-source` beschreiben das neue Verhalten. `tools/CONTRACT.md` ist neu erzeugt. - [x] Der `CHANGES.md`-Eintrag sagt Betreibern einer bestehenden Instanz, was sie tun müssen, und welcher Fall auch ohne die Handgriffe funktioniert (siehe unten). - [x] `pytest` (hermetisch: 2218 passed, 3 skipped), `docs verify`, `instructions verify` sauber. - [x] CI grün auf `862bc04`: Runs 539 und 540. Auf `8ff22ad` Run 541. ## Bestehende Instanzen Schema und Type-Spec von comparison und source gehören nach der Adoption der Instanz. `dist upgrade` erneuert nur die `.template`-Dateien daneben und meldet nicht, dass sich das Template unter einer adoptierten Datei geändert hat (`instructions/upgrade-instance.md` Schritt 6/9). Der Typ-Teil (Entscheidungen 1 und 2) erreicht eine bestehende Instanz also **nur von Hand**. Der `CHANGES.md`-Eintrag sagt das explizit, je Typ (comparison, source) drei Handgriffe: - Property `sources` aus `types/<typ>.schema.yaml.template` in das eigene Schema übernehmen - `sources` in `page_ref_fields:` der eigenen `types/<typ>.md` ergänzen (ohne das zieht ein Rename die Einträge nicht mit) - Tabellenzeile `sources` in derselben Datei übernehmen Eine Instanz, die nur das Schema angepasst hat (wie die meldende), braucht noch den zweiten Punkt. Die Code-Teile (Entscheidungen 3 und 4) liegen unter `tools/` und kommen mit dem normalen Upgrade. Das Selbstzitat einer source-Seite validiert damit auch ohne die Handgriffe. ## Versionsteil **`--minor`**, gebumpt auf `8.0.0-beta.40`. Drop-in-Test (`instructions/dev/version-parts.md`): - *Vorwärts:* Nichts, was vorher funktionierte, bricht. Schemas werden nur gelockert, und `cite add` schreibt in einem Fall weniger. `link-source` mit source-Ziel endet jetzt mit exit 1. Vorher endete es mit exit 0, aber mit einer Seite, die `lint` als Schema-Fehler meldet: Das funktionierte also schon vorher nicht. Die Handarbeit oben ist nötig, um die neue Fähigkeit zu *bekommen*, nicht, um weiterzuarbeiten. - *Rückwärts:* Ein Downgrade ersetzt nur die `.template`-Dateien. Die adoptierten Schemas/Type-Specs der Instanz bleiben, also validiert eine source-Seite mit `sources:` weiter. Neue Fähigkeit (Quellen zitieren Quellen), drop-in in beide Richtungen, daher `--minor`, nicht `--patch`. Der laufende Kandidat stand bei `8.0.0-beta.39` (schon MAJOR-Stufe). Der Bump hat dort nur die Bump-Zählung erhöht. Kein Boundary-Crossing, also kein `--breaking` und kein `--no-migration`. Impact: `medium`. ## Herkunft Aufgefallen beim Anlegen der ersten comparison-Seite einer privaten Instanz (v7.0.0). Die Instanz hat das Schema lokal schon angepasst. Ursprünglicher Stub wörtlich im ersten Kommentar.
torben added the size/Sarea/kbkind/defectstatus/incoming labels 2026-10-04 09:00:07 +00:00
Author
Owner

Ausarbeitung des Stubs (status/incoming). Der ursprüngliche Body, wörtlich, vor der Neufassung:

Befund

Auf einer comparison-Seite schreibt wikitool cite add wie auf jeder anderen Seite die Quelle in
das Frontmatter-Feld sources:. Das ausgelieferte Schema types/comparison.schema.yaml
(identisch mit dem Template einer Instanz) kennt dieses Feld nicht und steht auf
additionalProperties: false (Zeile 50). wikitool lint meldet die Seite danach als
Schema-Fehler:

## Schema Validation Errors
- [[A vs B]] type: `types/comparison.md` - Frontmatter validation failed for type
  types/comparison.md: Additional properties are not allowed ('sources' was unexpected)

(Ausgabe aus einer privaten Instanz, Seitentitel durch A vs B ersetzt.)

Gleichzeitig verlangt kb/comparisons/COLLECTION.md.template:38: "Cite hard facts the same way
any other page does." Werkzeug, Collection-Vertrag und Schema widersprechen sich; eine
regelkonform belegte comparison-Seite kann lint nicht bestehen.

Ursache

tools/chemenu/commands/cite_cmd.py:78-81 legt sources unabhaengig vom Seitentyp per
setdefault an. types/comparison.schema.yaml deklariert sources nicht (entity und concept
tun es, z. B. types/concept.schema.yaml:45-49). Gemessen: v7.0.0 und aktueller main
(Datei unveraendert). Angenommen, nicht geprueft: weitere Seitentypen ohne sources-Feld
waeren gleich betroffen.

Reproduktion

  1. Zwei beliebige Seiten anlegen, z. B. zwei Entities A und B.
  2. tools/wikitool new comparison --name "A vs B" --set entities=A,B
  3. tools/wikitool cite add --page "A vs B" --source "Source - <beliebige Quelle>"
  4. tools/wikitool lint -> Schema Validation Error wie oben.

Loesungsvorschlag

sources als optionales Feld (array of string) in types/comparison.schema.yaml aufnehmen und
im Feld-Table von types/comparison.md dokumentieren - wie bei concept. Eine Instanz hat das
lokal so geloest.

Verworfen: cite add auf comparison-Seiten ohne sources: schreiben lassen - dann zeigt eine
Fussnote auf eine Quelle, die kb/provenance.md und sources coverage nicht kennen.

Akzeptanzkriterien

  • types/comparison.schema.yaml (und das ausgelieferte Template) erlaubt sources
  • types/comparison.md fuehrt das Feld in der Frontmatter-Tabelle
  • Test: cite add auf einer comparison-Seite, danach lint ohne Schema-Fehler
  • Hinweis fuer bestehende Instanzen (Template-Datei gehoert der Instanz): CHANGES.md bzw.
    Upgrade-Hinweis
  • pytest, docs verify, instructions verify sauber

Herkunft

Aufgefallen beim Anlegen der ersten comparison-Seite einer privaten Instanz (v7.0.0).

**Ausarbeitung des Stubs (status/incoming).** Der ursprüngliche Body, wörtlich, vor der Neufassung: > ## Befund > > Auf einer comparison-Seite schreibt `wikitool cite add` wie auf jeder anderen Seite die Quelle in > das Frontmatter-Feld `sources:`. Das ausgelieferte Schema `types/comparison.schema.yaml` > (identisch mit dem Template einer Instanz) kennt dieses Feld nicht und steht auf > `additionalProperties: false` (Zeile 50). `wikitool lint` meldet die Seite danach als > Schema-Fehler: > > ## Schema Validation Errors > - [[A vs B]] type: `types/comparison.md` - Frontmatter validation failed for type > types/comparison.md: Additional properties are not allowed ('sources' was unexpected) > > (Ausgabe aus einer privaten Instanz, Seitentitel durch `A vs B` ersetzt.) > > Gleichzeitig verlangt `kb/comparisons/COLLECTION.md.template:38`: "Cite hard facts the same way > any other page does." Werkzeug, Collection-Vertrag und Schema widersprechen sich; eine > regelkonform belegte comparison-Seite kann `lint` nicht bestehen. > > ## Ursache > > `tools/chemenu/commands/cite_cmd.py:78-81` legt `sources` unabhaengig vom Seitentyp per > `setdefault` an. `types/comparison.schema.yaml` deklariert `sources` nicht (entity und concept > tun es, z. B. `types/concept.schema.yaml:45-49`). Gemessen: v7.0.0 und aktueller `main` > (Datei unveraendert). Angenommen, nicht geprueft: weitere Seitentypen ohne `sources`-Feld > waeren gleich betroffen. > > ## Reproduktion > > 1. Zwei beliebige Seiten anlegen, z. B. zwei Entities `A` und `B`. > 2. `tools/wikitool new comparison --name "A vs B" --set entities=A,B` > 3. `tools/wikitool cite add --page "A vs B" --source "Source - <beliebige Quelle>"` > 4. `tools/wikitool lint` -> Schema Validation Error wie oben. > > ## Loesungsvorschlag > > `sources` als optionales Feld (array of string) in `types/comparison.schema.yaml` aufnehmen und > im Feld-Table von `types/comparison.md` dokumentieren - wie bei concept. Eine Instanz hat das > lokal so geloest. > > Verworfen: `cite add` auf comparison-Seiten ohne `sources:` schreiben lassen - dann zeigt eine > Fussnote auf eine Quelle, die `kb/provenance.md` und `sources coverage` nicht kennen. > > ## Akzeptanzkriterien > > - [ ] `types/comparison.schema.yaml` (und das ausgelieferte Template) erlaubt `sources` > - [ ] `types/comparison.md` fuehrt das Feld in der Frontmatter-Tabelle > - [ ] Test: `cite add` auf einer comparison-Seite, danach `lint` ohne Schema-Fehler > - [ ] Hinweis fuer bestehende Instanzen (Template-Datei gehoert der Instanz): CHANGES.md bzw. > Upgrade-Hinweis > - [ ] `pytest`, `docs verify`, `instructions verify` sauber > > ## Herkunft > > Aufgefallen beim Anlegen der ersten comparison-Seite einer privaten Instanz (v7.0.0).
torben changed title from cite add schreibt sources: auf comparison-Seiten, deren Schema das Feld verbietet to cite add schreibt sources: in Seiten, deren Schema das Feld verbietet (comparison; source-Selbstzitat) 2026-10-04 18:48:19 +00:00
torben added prio/plannedkind/build and removed kind/defectstatus/incoming labels 2026-10-04 18:48:26 +00:00
Author
Owner

Changelog: Stub ausgearbeitet und gegen main (662a844) reproduziert. Die Annahme „weitere Typen betroffen“ ist geprüft: Zusätzlich betroffen ist nur das Selbstzitat einer source-Seite. Das bekommt einen eigenen Fix in cite add (Entscheidung 2), weil lint und provenance es schon ausnehmen. Dateipfad korrigiert: im Origin-Repo kb/comparisons/COLLECTION.md, nicht .template. Neu: Abschnitt „Bestehende Instanzen“, weil dist upgrade geänderte Templates unter adoptierten Dateien nicht meldet. Ausgegrenzt: Zitat einer anderen Quelle auf einer source-Seite, nicht blockierend. Versionsteil --patch. Labels: kind/defect → kind/build, prio/planned gesetzt, status/incoming entfernt.

**Changelog:** Stub ausgearbeitet und gegen `main` (662a844) reproduziert. Die Annahme „weitere Typen betroffen“ ist geprüft: Zusätzlich betroffen ist nur das Selbstzitat einer source-Seite. Das bekommt einen eigenen Fix in `cite add` (Entscheidung 2), weil `lint` und `provenance` es schon ausnehmen. Dateipfad korrigiert: im Origin-Repo `kb/comparisons/COLLECTION.md`, nicht `.template`. Neu: Abschnitt „Bestehende Instanzen“, weil `dist upgrade` geänderte Templates unter adoptierten Dateien nicht meldet. Ausgegrenzt: Zitat einer *anderen* Quelle auf einer source-Seite, nicht blockierend. Versionsteil `--patch`. Labels: `kind/defect` → `kind/build`, `prio/planned` gesetzt, `status/incoming` entfernt.
torben changed title from cite add schreibt sources: in Seiten, deren Schema das Feld verbietet (comparison; source-Selbstzitat) to sources: auf comparison- und source-Seiten: Schema verbietet, was cite add schreibt; Quellen dürfen Quellen zitieren 2026-10-04 18:58:40 +00:00
torben added size/M and removed size/S labels 2026-10-04 18:59:36 +00:00
Author
Owner

Changelog: Betreiber-Entscheidung eingearbeitet: source-Seiten dürfen andere Quellen zitieren, im selben Paket (neue Entscheidung 2). Neu gefunden: sources muss auch in page_ref_fields: stehen, nicht nur im Schema, sonst ziehen rename/rm, lint und xref remove die Einträge nicht mit. Gilt für comparison und source, der Abschnitt „Bestehende Instanzen“ ist entsprechend erweitert. Neue Entscheidung 4: xref link-source lehnt source-Ziele mit exit 1 ab (schrieb vorher in die falsche Richtung, mit Schema-Fehler). wiki-ingest Schritt 9 bekommt den cite add-Hinweis. Der Punkt „Quelle zitiert andere Quelle“ unter „Nicht Teil dieses Pakets“ ist gestrichen. Versionsteil --patch → --minor (neue Fähigkeit), Impact low → medium. size/S → size/M (Contract-, Instruction- und Type-Spec-Änderungen, eigener Testaufwand).

**Changelog:** Betreiber-Entscheidung eingearbeitet: source-Seiten dürfen andere Quellen zitieren, im selben Paket (neue Entscheidung 2). Neu gefunden: `sources` muss auch in `page_ref_fields:` stehen, nicht nur im Schema, sonst ziehen `rename`/`rm`, `lint` und `xref remove` die Einträge nicht mit. Gilt für comparison und source, der Abschnitt „Bestehende Instanzen“ ist entsprechend erweitert. Neue Entscheidung 4: `xref link-source` lehnt source-Ziele mit exit 1 ab (schrieb vorher in die falsche Richtung, mit Schema-Fehler). `wiki-ingest` Schritt 9 bekommt den `cite add`-Hinweis. Der Punkt „Quelle zitiert andere Quelle“ unter „Nicht Teil dieses Pakets“ ist gestrichen. Versionsteil `--patch` → `--minor` (neue Fähigkeit), Impact `low` → `medium`. `size/S` → `size/M` (Contract-, Instruction- und Type-Spec-Änderungen, eigener Testaufwand).
Author
Owner

Changelog: Gebaut und veröffentlicht als 8.0.0-beta.40, Commit 862bc04. CI ist grün (Runs 539, 540). Neu im Body: der Abschnitt „Stand“, alle Akzeptanzkriterien abgehakt, „Betroffene Dateien“ auf den tatsächlichen Änderungsstand gebracht (dazu der Test in test_type_resolver.py, der die alten page_ref_fields festschrieb). Unter „Nicht Teil dieses Pakets“ steht jetzt, warum kb/sources/COLLECTION.md unverändert bleibt. Der Befund ist in der Vergangenheitsform. An den Entscheidungen hat sich nichts geändert.

**Changelog:** Gebaut und veröffentlicht als `8.0.0-beta.40`, Commit `862bc04`. CI ist grün (Runs 539, 540). Neu im Body: der Abschnitt „Stand“, alle Akzeptanzkriterien abgehakt, „Betroffene Dateien“ auf den tatsächlichen Änderungsstand gebracht (dazu der Test in `test_type_resolver.py`, der die alten `page_ref_fields` festschrieb). Unter „Nicht Teil dieses Pakets“ steht jetzt, warum `kb/sources/COLLECTION.md` unverändert bleibt. Der Befund ist in der Vergangenheitsform. An den Entscheidungen hat sich nichts geändert.
Author
Owner

Changelog: Abschluss. Ein Satz im CHANGES.md-Eintrag war zu weit gefasst und ist in 8ff22ad korrigiert (CI-Run 541 grün): Das Selbstzitat einer source-Seite validiert auch ohne die Handgriffe am Typ. „Stand“ nennt jetzt alles, was verifiziert ist, und dass im Abschluss außer diesem Satz nichts veraltet war (docs/, README.md, die Typ-Guidance, kb/CONTRACT.md, wiki-ingest, die Befehls-Records). Geschlossen.

**Changelog:** Abschluss. Ein Satz im `CHANGES.md`-Eintrag war zu weit gefasst und ist in `8ff22ad` korrigiert (CI-Run 541 grün): Das Selbstzitat einer source-Seite validiert auch ohne die Handgriffe am Typ. „Stand“ nennt jetzt alles, was verifiziert ist, und dass im Abschluss außer diesem Satz nichts veraltet war (`docs/`, `README.md`, die Typ-Guidance, `kb/CONTRACT.md`, `wiki-ingest`, die Befehls-Records). Geschlossen.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#173