-
v4.0.0 Stable
released this
2026-09-02 16:42:22 +00:00 | 90 commits to main since this release4.0.0 - 2026-09-02 - Prosa ist kein Identifier: Link-Taxonomie als Enum, generierte Regionen mit Markern
Author: Torben Nehmer
Breaking Change: Beziehungslabel sind Enum-Werte in related: statt Freitext im Body-Bullet, toolgefuehrte Abschnitte liegen zwischen Marker-Paaren statt hinter ihrer Ueberschrift, und xref add schreibt nur noch eine Kante statt beider Richtungen. tools/chemenu/sections.py ist geloescht. Eine bestehende Instanz muss sections: in kb/CONVENTIONS.md auf links/footnotes umstellen, outbound: in jede COLLECTION.md eintragen, die {section.*}-Variablen aus ihren Page-Type-Templates entfernen und den Korpus umstellen - sonst scaffoldet new die Variablen woertlich in neue Seiten. Ablauf: instructions/migrations/4.0.0-link-taxonomy.md
Der Stack benutzte an drei Stellen Prosa als Identifier, und jede hat messbar etwas
gekostet. Die Überschrift eines Abschnitts war seine Adresse (^## Beziehungen$), was die
KB-Sprache zu einer Compiler-Konstante machte und das Ende der Region zur Schätzung - sie lief
bis zur nächsten Überschrift, davor bis zum Dateiende, und hat auf acht Seiten still Inhalt
gelöscht. Das Beziehungslabel stand nur im Body-Bullet, also konnte nichts das Vokabular prüfen:
gemessen am Korpus 152 distinkte Label in 337 Bullets gegen dreizehn dokumentierte, 102 davon
genau einmal vorkommend. Undxref addspiegelte jede Kante, was## Siehe auchmit 555
Bullets ohne Label füllte - 353 davon beweisbar redundant.Was jetzt Identifier ist. Eine Region liegt zwischen
<!-- wikitool:links -->bzw.
<!-- wikitool:footnotes -->und wird vollständig aus dem Frontmatter gerendert, Überschrift
eingeschlossen. Ein Label ist ein Maschinenwert inrelated:(- depends-on: Hermes), gezogen
ausinstructions/link-taxonomy.mdund pro Ziel autorisiert von der Quell-Collection
(outbound:imCOLLECTION.md, Commonplaces ADR-019). Der Body-Bullet ist eine Darstellung
dieser Daten, nicht ihr zweiter Aufbewahrungsort.Gelöscht, ersatzlos:
tools/chemenu/sections.pykomplett,heading_re, der
Alias-Mechanismus,PRE_CONVENTIONS_NAMES,cite_block_heading,provenance.__getattr__, die
{section.*}-Template-Variablen,xrefs Abschnittssuche. Kein Überschriftentext liegt mehr in
Python - bis auf zwei kosmetische Fallbacks, und die sind harmlos geworden: der Marker trägt die
Identität, also rendert ein falscher Default falsche Wörter statt Struktur zu zerlegen, und der
nächste Write repariert es.Kanten sind direktional, und das war keine Geschmacksfrage. Die per-Collection-Autorisierung
ist mit einer automatisch gespiegelten Gegenkante logisch unverträglich: die Spiegelhälfte
entsteht in einer Collection, deren Regeln der Autor nie gelesen hat. Entweder schriebe das
Werkzeug unautorisierte Kanten, oder die Regel "die Quellcollection entscheidet" löst sich auf.
Der Navigationseinwand wird dabei besser beantwortet als vorher:wikitool links show --page
berechnet die Eingangssicht über den Korpus, vollständig und ohne Pflege, und das gerenderte
Bullet ist ein gewöhnlicher[[wikilink]]- ein Backlink-Panel zeigt es ohnehin. Die erzwungene
Gegenkante garantierte nie Vollständigkeit, nur dass jemand daran gedacht hat.Der Orphan-Check meldet dadurch mehr, und das ist die Prüfung bei der Arbeit: sie misst jetzt
Erreichbarkeit statt "istxrefgelaufen".obligation:trennt zwei Achsen, die vorher eine waren.migration_kind:sagt wie
gearbeitet wird, neuobligation: required|offeredob überhaupt. Eineoffered-Migration ist
ein Angebot für eine Datei, die der Instanz gehört - sie blockiert nie, steht nicht in der Kette,
undmigrate doneverbucht sie im Ledger, ohnekb_versionzu bewegen. Genau daran hing ein
Entwurfsfehler, den erst der Test gezeigt hat: Offers gegenkb_versionzu filtern hätte jede
Offer verschwinden lassen, sobald irgendein unbeteiligter Pflichtschritt lief. Dazu ist die
Erkennungshälfte aktiviert, die seit ihrer Einführung ungelesen dalag - die sha256 pro Datei in
.wikitool-release.jsonbeantwortet jetzt "editiert oder nur empfangen", also ob eine Offer
kopiert werden darf oder von Hand abgeglichen werden muss.types/teilt sich entlangroot:.root: kbheißt Wissensseite heißt Instanz: die vier
Page-Type-Specs samt Schemas gehen als.template,instruction/lint-report/type-spec
verbatim. Damit ist die deutsche Prosa in jenen vier Dateien korrekt statt Migrationsschuld -
es war die richtige Sprache an einem Ort mit falsch deklariertem Eigentümer. Was der Stack von
der Type-Schicht noch verlangt, ist eine Zeile: ein Type-Specname: source, dessen Schema
raw_filesfordert.STACK_REQUIRED_COLLECTIONSentfällt als separate Liste - die pflichtige
Collection wird aus dembase_dirdieses Typs abgeleitet.Warum das MAJOR ist. Vorwärts:
sections:hat eine andere Form,outbound:fehlt, und die
in 3.0.0 übernommenen Page-Type-Templates enthalten{section.*}-Variablen, die es nicht mehr
gibt -newschriebe sie wörtlich in neue Seiten. Rückwärts: 4.0.0 schreibt gelabelte Kanten,
die 3.0.0s Schema alstype: stringablehnt. Beide Hälften des Drop-in-Tests fallen.Der Korpus dieser Instanz ist noch nicht umgestellt. Diese Version liefert die Maschinerie;
lintmeldet die 480 noch ungelabelten Kanten als Findings, nicht als Fehler, weil das genau das
Fenster ist, für das.wikitool-kb.jsonexistiert.malformed_edgesundunbalanced_markers
sind dagegen sofort hart - keines beschreibt eine unkonvertierte Seite, nur eine kaputte. Die
Beförderung der beiden anderen kommt, wenn der Korpus sie bestehen kann.Downloads