Verdichtung als Zustandsübergang · gemessen am Quelltext
Eine Verdichtung ist ein Zustandsübergang: jeder Eintrag geht in den nächsten Lauf und kommt entweder unverändert, zusammengezogen oder gar nicht wieder heraus. Das ist eine Markov-Kette — und als solche lässt sich fragen, wo sie auf lange Sicht landet.
Ich habe die Übergänge nicht aus SKILL.md abgelesen, sondern
compactor.js mit erfundenen Einträgen gefüttert und beobachtet,
was zurückkommt. Das Ergebnis unten ist gemessen, nicht vermutet.
Je ein Eintrag pro Typ, einmal ohne ref und einmal mit — sonst
identisch. Überlebt oder nicht:
| Typ | ohne ref |
mit ref |
|---|---|---|
| MOTIV | überlebt | überlebt |
| FUND | entfernt | überlebt |
| WEG | entfernt | überlebt |
| WAND | entfernt | überlebt |
| SETZUNG | entfernt | überlebt |
| ZWEIFEL | entfernt | überlebt |
ref gesetzt ist.
Die effektive Regel von compactor.js lautet:
Ein Eintrag überlebt genau dann, wenn er MOTIV ist oder ein
ref trägt.
Das ist keine Zusammenfassung der sieben Regeln, das ist alles, was von ihnen übrig ist. Regel 2 und 3 laufen nie (Abweichung A), Regel 5 und 6 haben keine Wirkung, weil kein Typ geprüft wird (Abweichung C), und Regel 7 übernimmt den gesamten Rest. Sechs Typen und ein Regelwerk, das faktisch eine einzige Ja/Nein-Frage stellt.
Damit lässt sich die Kette simulieren. Der Regler stellt ein, wie viele
Einträge im Korpus ein ref tragen — der einzige Wert, auf den
compactor.js reagiert.
ref-Dichte
60 %
Verschieb den Regler über den ganzen Bereich. Bei 0 % bleibt nur das MOTIV übrig, bei 100 % bleibt alles stehen. Dazwischen verschiebt sich nur das Verhältnis — aber die Zahl der zusammengezogenen Einträge bleibt an jeder Stelle null.
Es gibt keine Einstellung, bei der compactor.js verdichtet.
Er löscht viel oder wenig. Genau das ist der Unterschied zwischen dem Skill
und einer gewöhnlichen Zusammenfassung — und er hängt an einer Kante, die
in der Kette fehlt.
Naheliegender Schluss aus alldem: Abweichung A beheben, also die Strang-Suche
auf eingehende Verweise umstellen — dann greift Regel 2. Ich habe das
durchgespielt, indem ich die ref-Richtung in den Testdaten
umgedreht habe, sodass die Suche die Wand findet. Das kommt dabei heraus:
refe01 MOTIV
e03 WEG ref→e04 "Weg, weil X"
e04 WAND "Die Wand"
Regel 2 greift: e03 wird in e04 hineingezogen
e04 heisst jetzt "Die Wand (Weg, weil X)" ✓ richtig
Regel 7 greift: e04 hat jetzt keinen eingehenden Verweis mehr
und selbst keinen ausgehenden → folgenlos ✗ geloescht
Ergebnis: 3 → 1 Wand und Weil sind beide weg
refe01 MOTIV
e03 WEG ref→e04 "Weg, weil X"
e04 WAND ref→e01 "Die Wand"
Regel 2 greift: wie oben
Regel 7 greift nicht: e04 hat einen ausgehenden Verweis
Ergebnis: 3 → 2 e04 "Die Wand (Weg, weil X)" — so soll es sein
compactor.js.
Abweichung A lässt sich nicht allein beheben. Sobald Regel 2
greift, verliert die WAND ihren einzigen eingehenden Verweis — den vom WEG,
den sie gerade geschluckt hat. Damit ist sie für isFolgenlos()
folgenlos und fällt im selben Lauf weg. Die Regel zerstört genau das, was
sie eben erzeugt hat.
Ob die zusammengezogene Wand überlebt, hängt an etwas völlig Unbeteiligtem:
ob sie zufällig selbst einen ref trägt. A und C müssen
zusammen behoben werden, sonst macht der Fix die Sache schlimmer —
aus 4 → 4 wird 4 → 2, und was verlorengeht, sind die Wände.
Die Liste der vier Abweichungen legt nahe, man könne sie einzeln abarbeiten. Die Messung sagt: nein. A ohne C angewandt verschlechtert das Ergebnis. Das gehört auf die Tagesordnung, bevor jemand anfängt.
Und die Reihenfolge ergibt sich daraus von selbst: erst C
(isFolgenlos() auch WAND und offene ZWEIFEL ausnehmen), dann A
(Strang-Suche umdrehen), dann D (Verweise nachziehen), dann B (Altersstufen).
C zuerst, weil es das Sicherheitsnetz ist, in das A hineinfällt.