compactor.js gegen SKILL.md · Abweichung A

Die Wand liegt rechts

Regel 2 verlangt: ein geschlossener Strang WEG → WAND wird auf die WAND zusammengezogen, die WAND erbt das Weil des WEG. Damit das greifen kann, muss der Code von einem WEG aus seine Wand finden.

In den Daten zeigt ref vom neueren auf den älteren Eintrag. findClosedStrand() startet beim WEG und folgt den ausgehenden Verweisen — sucht die Wand also in der Vergangenheit, wo sie nie liegen kann. Sie liegt immer in der Zukunft des WEG.

Der Strang aus Gemini/TestProjekt

Suche ab e03 WEG
älter neuer e04 WAND — gefunden, Strang geschlossen ref ref ref Ende — keine WAND e01 MOTIV e02 FUND e03 WEG e04 WAND Start der Suche das Ziel von Regel 2
Ausgehend (was der Code tut): e03 → e02 → e01 → Ende. Der Weg führt in die eigene Vorgeschichte, an FUND und MOTIV vorbei. e04 WAND steht die ganze Zeit direkt daneben — in der anderen Richtung, die nie betreten wird. Regel 2 findet keinen Strang und feuert nicht.
Die dünnen Pfeile unten sind die tatsächlichen ref-Verweise: jeder Eintrag zeigt auf den älteren, auf den er antwortet — e04 WAND zeigt auf e03 WEG, den Weg, der gegen sie lief. Der Umschalter spielt die beiden Suchrichtungen ab dem WEG ab.

Was der Trockenlauf misst

Variante Einträge nachher Regel 2 gegriffen?
Vorher 4 —
compactor.js (heute) 4 nein, kein einziges Mal
nach SKILL.md, Regel 2 3 ja — e03 zieht auf e04 zusammen

TestProjekt enthält den lehrbuchhaften Strang e03 WEG → e04 WAND. Nach Regel 2 müssten daraus drei Einträge werden. Gemessen: 4 → 4. Das ist der Beleg, nicht die Vermutung.

Warum A schwerer wiegt als B, C und D

Regel 2 und 3 sind die einzigen, die zusammenziehen. Fallen sie aus, bleiben nur 6 und 7 — und die löschen. Genau das erklärt Gemini/Blödeleini: 4 → 0, kein einziger Zusammenzug, nur Wegnahme.

Der Unterschied zwischen dem Skill und einer gewöhnlichen Zusammenfassung hängt an den beiden Regeln, die nicht laufen. Ohne sie verdichtet der Compactor nicht, er kürzt.

Die eine Frage an Richard

SKILL.md legt die Richtung von ref nirgends ausdrücklich fest. Deshalb ist A die einzige der vier Abweichungen, die wirklich eine Entscheidung ist:

Ist ref so gemeint, wie die Daten es zeigen — neu zeigt auf alt?

Falls ja: ein Zeilen-Fix — die Strang-Suche auf eingehende Verweise umstellen.
Falls nein: die Erzeuger (journal-store.js, auto-tagger.js) schreiben verkehrt herum, und der Fix gehört dorthin.

B, C und D dagegen widersprechen dem, was in SKILL.md bereits ausdrücklich steht — die vier Altersstufen, das „außer WAND" in Regel 7, das Nachziehen der Verweise. Das sind keine Entscheidungen, sondern Abweichungen von einer vorhandenen Spezifikation: sie brauchen Richards Durchsicht, nicht seine Erlaubnis.

Das Journal macht es bereits richtig. In index.html sind B, C und D umgesetzt und gegen diese Daten getestet (compactByAge(), KEEP_ALWAYS, relinkRefs()); der Code ließe sich übernehmen. A ist dort gar nicht betroffen, weil das Journal seine Stränge über die eingehenden Verweise bildet — genau den Weg, den der grüne Bogen oben zeigt.
Unabhängig vom Ausgang des Gesprächs: runCompaction() setzt data.okf.json und VERLAUF.md auf 0666, überschreibt sie an Ort und Stelle und setzt sie zurück auf 0444 — keine Sicherung, keine Historie. Was ein Lauf wegnimmt, ist weg, und es fällt erst Monate später auf, wenn die Wand fehlt, die einen zweiten Anlauf verhindert hätte. Eine Kopie vor dem Schreiben wäre billig.