entities:/concepts: einer Source-Seite sind nach dem Anlegen unerreichbar, und xref add schreibt dort ein undeklariertes related:
#18
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Kurz
Die Lücke, die #14 für
tags:undraw_files:geschlossen hat, besteht für die eine Feldfamilie fort, auf die #14 ausdrücklich verwiesen hat. Die Sperrliste intouch --setlehnt Page-Ref-Felder mit „usewikitool xref add/xref remove" ab — für dieentities:/concepts:einer Source-Seite kannxrefdas aber nicht.Das ist ein Loch in einer Designentscheidung von heute (1.4.0), kein Altlastenfund.
Der Ablauf, der es auslöst
Ein Ingest legt die Source-Seite an, bevor die Concept-Seiten existieren — der Skill schreibt sie später, weil ihre Titel erst beim Extrahieren feststehen. Also bleibt
concepts: []. Danach:xref link-source --source … --entities A,Bsources:+ See Also). Die Arrays der Source-Seite rührt es nie an — es validiert nur, dass sie existiert (xref.py:218).xref add --a "Source - …" --b "A"related:auf die Source-Seite.types/source.mddeklariertpage_ref_fields: [entities, concepts]—relatedist keins davon.xref remove --a "Source - …" --b "A"strip_frontmatter_ref()läuft nur über die vom Typ deklarierten Felder.touch --set concepts=…xref add/xref remove" — verweist auf zwei Befehle, die das Feld nicht bedienen können.Ergebnis: eine Sackgasse, und unterwegs eine Seite, die das Schema verletzt.
Der Schaden liegt live auf main
8524bce,kb/sources/Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31.md:lintmeldet es als einzigen Schema-Fehler im Korpus:concepts:ist leer, obwohl die Seite zwei neue Concepts belegt. Die Zuordnung steht ersatzweise als Prosa im Body.Drei Defekte, eine Ursache
xref addprüft nicht, ob der Typ das Feld kennt. Es sollte ablehnen statt ein undeklariertes Feld zu schreiben — dann wäre der Schema-Fehler nie entstanden. Das ist die eigentliche Ursache.xref removekann undeklarierte Reste nicht räumen. Sein Contract-Eintrag verspricht ausdrücklich, „eine Referenz zu klären, die eine von Hand gelöschte oder umbenannte Seite hinterlassen hat, ohne Frontmatter von Hand zu editieren". Für ein Feld außerhalb der Typdeklaration hält es das nicht.link-sourceist die Gegenrichtung. Es fehlt der Hinweg.Lösungsrichtungen
xref link-sourceschreibt beide Richtungen. Es kennt Quelle und Ziele bereits; der Ingest-Ablauf ruft es ohnehin auf. Naheliegendster Schnitt, und der Name stimmt dann endlich.xref addlehnt undeklarierte Felder ab — mit einer Meldung, die sagt, welche Ref-Felder der Typ kennt. Analog zu der Unterscheidung, dietouch --setseit 1.4.0 macht.xref removeräumt auch Felder außerhalb der Deklaration, damit ein einmal entstandener Rest überhaupt entfernbar bleibt. Ohne das ist jeder künftige Fall wieder eine Sackgasse.touchs Sperrliste anpassen, sobaldxrefden Fall wirklich abdeckt — heute verweist sie ins Leere.Reparatur des Bestandsfalls
Nach dem Fix mit dem Werkzeug selbst. Vorher gibt es keinen Weg, der ohne
rm --yesauskommt, und die Seite wird von fünf anderen referenziert (wikitool,llm-wiki-test1,Write-Once Frontmatter Fields,Denylist over Allowlist,Detect-Repair Asymmetry) — löschen und neu anlegen kostet fünfcite addund einxref link-sourceund ist die schlechtere Wahl, wenn der Fix ohnehin ansteht.Akzeptanzkriterien
concepts:— ohne Frontmatter-Handeditierung. Das ist der Test.xref addauf ein vom Typ nicht deklariertes Ref-Feld wird abgelehnt und nennt die Felder, die der Typ kennt.xref removeräumt ein undeklariertes Ref-Feld, das eine ältere Version hinterlassen hat.mainist repariert:related:weg,concepts:gefüllt,lintohne Schema-Fehler.tools/CONTRACT.mdfür jedes geänderte Kommando und seinen Fehlerkontrakt.Warum prio/1
Ein Schema-Fehler liegt veröffentlicht auf
main, und der Zustand ist mit den vorhandenen Kommandos nicht rückgängig zu machen. Zusätzlich ist es der laufende Gegenbeweis zu der Aussage, die #14 zu schließen behauptet: eine Feldklasse, dieneweinmal schreibt und danach niemand mehr.Behoben in 1.6.0 (
ce03749). Alle drei Defekte, plus die Reparatur des Bestandsfalls mit dem Werkzeug selbst.1.
xref link-sourceschreibt beide RichtungenWelches Feld ein Ziel bekommt, folgt seiner Collection:
kb/entities/→entities:,kb/concepts/→concepts:. Das Verzeichnis ist der Feldname, also braucht eine neue Collection hier keine Code-Änderung — sie braucht einen Typ, der das passende Feld deklariert. Kein Typ-zu-Feld-Mapping, das driften kann.Ein Ziel, dessen Collection zu keinem deklarierten Ref-Feld der Source-Seite passt, wird einseitig verlinkt und in der Ausgabe benannt statt stillschweigend übergangen.
2.
xref addlehnt ein nicht deklariertesrelated:abDie Prüfung läuft für beide Seiten, bevor eine davon geschrieben wird — eine Ablehnung darf keinen halben Link hinterlassen. Dafür gibt es einen eigenen Test.
3.
xref removeräumt undeklarierte ResteGesweept wird jetzt zusätzlich jedes auf der Seite vorhandene Feld, das irgendein Typ als Ref-Feld deklariert — die Namen kommen aus den Type-Specs, nicht aus einer Konstante. Ein undeklariertes Feld, das dabei leer wird, fällt ganz weg statt als
related: []stehenzubleiben: der Schlüssel war für diesen Typ nie gültig, und ein leeres Array hielte die Seite weiter schemawidrig.Weil
renameundrmdenselben Helfer benutzen, gilt es auch dort.Bestandsfall repariert — ohne
rm --yesErgebnis:
lintmeldet keinen Schema-Fehler mehr im Korpus. Die referenzierende Concept-Seite ist byte-identisch durch den Zyklus gekommen —xref removehat ihren Rückverweis korrekt beidseitig geräumt,link-sourceihn identisch wiederhergestellt.Sonst
Die Sperrlisten-Meldungen in
touch --setnennen fürentities:/concepts:/sources:jetzt konkretxref link-source. Der bisherige Verweis aufxref add/xref removewar für genau diese Felder falsch — das war das Loch in der 1.4.0-Entscheidung, das dieses Issue aufgedeckt hat.689 Tests grün in beiden Umgebungen (sechs neue). Contract-Zeilen für alle drei Kommandos und ihre Fehlerkontrakte aktualisiert.
Was das über den Zuschnitt von 1.4.0 sagt
Die Denylist war richtig, ihr Verweisziel nicht. Eine Sperrliste, die auf ein anderes Kommando zeigt, ist eine Behauptung über dessen Fähigkeiten — und die war ungeprüft. Beim nächsten Mal gehört zu einem solchen Verweis ein Test, der zeigt, dass das genannte Kommando den Fall wirklich abdeckt.