Datenverlust: cite add löscht jeden Inhalt hinter dem Fußnoten-Block
#17
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?
Der Defekt
provenance.split_cite_block()nimmt alles ab der Überschrift## Fußnotenbis zum Dateiende als Block, extrahiert daraus nur die[^id]:-Zeilen, undrender_page_body()setzt anschließendKopf + neu gerenderter Blockzusammen. Steht hinter dem Zitatblock noch etwas anderes, ist es nach dem nächstencite addweg.Alles in
block, wasCITE_DEF_REnicht matcht, existiert danach nicht mehr. Es gibt keine Warnung und keinen Fehler — der Aufruf meldet Erfolg.Warum das systematisch auftritt, nicht zufällig
Zwei Kommandos widersprechen sich in ihrer Annahme darüber, was am Dateiende steht:
xref addhängt## Beziehungenund## Siehe auchans Dateiende an.cite addnimmt an, der Fußnoten-Block sei das Dateiende.Wer
cite addvorxref addlaufen lässt, ist sicher. Wer die Reihenfolge umdreht, verliert beim nächsten Zitat alle Beziehungen. Beide Reihenfolgen sind in den Skills nicht vorgeschrieben, also ist es Zufall.Beobachtet
Beim Ingest am 2026-08-31 (
8524bce) verlorkb/concepts/Detect-Repair Asymmetry.mddurch eincite addvier## Beziehungen- und fünf## Siehe auch-Einträge. Der ausführende Agent hat es bemerkt und überxref add(4 Paare) plusxref link-sourcewiederhergestellt — der Inhalt ist vollständig, nur die Bullet-Reihenfolge ist eine andere.Dass es auffiel, war Glück. Ein Agent, der nach
cite addnicht zurückliest, veröffentlicht den Verlust.Aktueller Schadensstand im Korpus
Unabhängig nachgemessen: 8 Seiten mit zusammen 74 Zeilen stehen jetzt hinter ihrem Fußnoten-Block und gehen beim nächsten
cite add/cite syncauf diesen Seiten verloren.kb/concepts/Detect-Repair Asymmetry.mdkb/concepts/Issue Label Scheme.mdkb/concepts/Write-Once Frontmatter Fields.mdkb/concepts/Denylist over Allowlist.mdkb/concepts/Diff-Reviewable Agent Edits.mdkb/concepts/Claude Code Auto Mode.mdkb/concepts/KB Stack Versioning.mdkb/concepts/Personalization Plane.mdNachzustellen mit:
Lösungsrichtungen
split_cite_blockschneidet bei der nächsten##-Zeile ab statt am Dateiende; der Schwanz wandert unverändert hinter den neu gerenderten Block. Kleinster Eingriff, behebt den Fall vollständig.blockZeilen enthält, die weder leer noch Zitatdefinition sind, und (1) sie nicht rettet — abbrechen statt schreiben. Ein Kommando, das Inhalt verwirft, den es nicht versteht, ist genau das, was hier passiert ist.xref addeinordnen: seine Abschnitte gehören vor den Fußnoten-Block, nicht ans Dateiende. Ergänzend zu (1), nicht statt.Akzeptanzkriterien
cite addauf einer Seite mit## Beziehungenhinter dem Fußnoten-Block lässt diesen Abschnitt unverändert. Das ist der Test, und er muss zuerst rot sein.xref addnachcite add), damit beide Reihenfolgen belegt sind.cite syncfällt unter dieselbe Prüfung; es benutzt denselben Pfad.Warum prio/1
Es ist der einzige bekannte Weg, auf dem dieser Stack Inhalt verliert statt ihn falsch zu schreiben.
lintfindet es nicht: eine Seite ohne Beziehungsabschnitt ist strukturell einwandfrei. Und der Verlust trifft genau die Arbeit, die am teuersten war — von Hand gesetzte Querverweise.Behoben in 1.5.1 (
bb4123b).Der Fix
Der Block endet jetzt an der nächsten Überschrift statt am Dateiende. Alles dahinter — und alles im Block, was keine Zitatdefinition ist — wird auf den Kopf zurückgefaltet statt verworfen. Der Rückgabetyp von
split_cite_block()bleibt gleich, alle sechs Aufrufer profitieren ohne Änderung.Beim Lesen des Codes kam ein dritter betroffener Befehl dazu, den das Issue nicht nannte:
renamebenutzt denselben Pfad und hätte denselben Inhalt gelöscht.Zwei Eigenschaften, die mehr wert sind als die reine Reparatur:
xref adddarf weiterhin ans Dateiende anhängen, ohne Schaden anzurichten — der Widerspruch zwischen den beiden Kommandos ist entschärft, nicht nur umgangen.lintundcorpus_diff, wo eine Exception das Lesen einer Seite verweigern würde, statt sie zu melden. Retten ist strikt besser als Abbrechen und erfüllt den Zweck — nichts wird still verworfen.Nebenbei behoben: ein
[^id], das nur in einem Abschnitt hinter dem Block referenziert wurde, galt fürextract_inline_citesals nicht referenziert —cite synchätte seine Definition als verwaist entfernt. Zweiter Datenverlustpfad, gleiche Ursache.Korpus repariert und nachgemessen
cite sync --allhat elf Seiten normalisiert (die acht gefährdeten plus drei, die nur eine Neusortierung brauchten). Danach:summary:auf eine Zeile.Tests
Fünf neue in
test_provenance.py: Abschnitt hinter dem Block überlebt den Rundlauf, der Block wird zuletzt ausgegeben (Selbstheilung), wiederholte Rundläufe sind stabil, loser Text bleibt erhalten, und ein Zitat im geretteten Abschnitt löst weiterhin auf.Der erste musste zuerst rot sein, und das habe ich gegen die alte Implementierung nachgestellt statt es zu behaupten:
Bemerkenswert: vor diesen Tests liefen alle 678 grün. Das zerstörende Verhalten war von keinem Test festgehalten — so hat es überlebt. Derselbe Befund wie bei der Gate-Zählung in 1.5.0, und er sollte bei #8 mitgelesen werden.