Katalog-Erweiterung vor der ersten produktiven Instanz: alternative-to, addresses, entity→entity-Lineage, Lint-Befund gegen redundante see-also #49

Closed
opened 2026-09-04 16:33:25 +00:00 by torben · 1 comment
Owner

Erledigt in 4.7.0 (Commit 3916cb9, CI-Runs 161/162 grün) und 4.7.1 (Commit 24593c5, die Doku-Hälfte).

Warum das jetzt lief

Eine erste produktive Instanz steht an. Katalog und COLLECTION.md gehen über dist export in jede neue Instanz — der Katalog verbatim, die Contracts als .template. Was hier fehlt, fehlt dort ab Tag eins, und nachträglich ist eine Katalogerweiterung eine Korpus-Migration statt einer Datenzeile.

Die Messung, die den Zuschnitt bestimmt hat

180 see-also-Kanten, exakt partitioniert (57 + 70 + 53 = 180):

Klasse Kanten Ergebnis
Spiegel einer bereits typisierten Gegenkante 57 (32 %) kein Label nötig — der Katalog war ausreichend, es hat sie nur nichts gemeldet
Wechselseitige see-also-Paare 70 (39 %) Label + „einmal pro Paar schreiben"
Einseitig, ohne Gegenkante 53 (29 %) teils Label, teils zu Recht see-also

Die erste Klasse hat den Zuschnitt umgedreht: Wine see-also Wine GE steht neben Wine GE depends-on Wine, RAG see-also NotebookLM neben NotebookLM implements RAG. Ein Drittel des Befunds war Redundanz, kein Vokabularloch — deshalb ist der Lint-Check unten nicht Beiwerk, sondern der Teil mit der größten Wirkung.

Was gebaut wurde

alternative-to (operationales Register, selbst-dual). „serves the same purpose as the target, so a reader choosing between them wants both." Belegt durch ~30 Paare; die sieben Agent-CLIs tragen untereinander ausschließlich see-also, keine einzige typisierte Kante. Abgegrenzt gegen contrasts (lesenswerter Unterschied) und compares-with (benannte Dimensionen, führt auf eine kb/comparisons/-Seite).

Dazu ein eigener Absatz im Katalog: ein selbst-duales Label wird einmal pro Paar geschrieben. Ohne ihn wäre aus einer 22-Kanten-see-also-Clique eine 22-Kanten-alternative-to-Clique geworden. Sieben austauschbare Werkzeuge sind 21 Paare; beidseitig deklariert 42 Kanten, von denen die zweiten 21 nichts sagen.

addresses (konzeptionelles Register). „is a response to the problem the target describes." types/concept.md deklariert problem und decision als Subtypen, und der Katalog hatte kein Label dazwischen — eine Collection konnte ein Problem benennen und nie sagen, was dagegen unternommen wurde. Abgegrenzt gegen rests-on (nimmt das Ziel als Prämisse). Nur vier belegte Paare im Korpus, also dünn nach worked-case-first; die Ausnahme ist bewusst und gilt dem Auslieferungszeitpunkt.

authored kam aus #43 im selben Bump.

Autorisierungen entity→entity: derived-from und adapted-from (Fork, Neuimplementierung, Nachbau waren zwischen zwei Entities nicht ausdrückbar), dazu implements (eine Entity, die eine als Entity geführte Konvention umsetzt). Beide COLLECTION.md haben einen Absatz bekommen, der die Fallstricke der neuen Label benennt statt sie nur zu listen.

Lint-Befund redundant_see_also. Meldet eine see-also-Kante, deren Gegenrichtung bereits ein typisiertes Label trägt. Advisory, nicht hart, und ausdrücklich nicht migrations-gegatet: es gibt keine Version, ab der die Redundanz zum Fehler wird. links.SEE_ALSO ist damit das einzige Katalog-Label, das das Werkzeug beim Namen kennt — begründet im Code, weil see-also der erklärte letzte Ausweg ist und nur deshalb als schwächer als eine andere Kante beurteilbar.

Was beim Abschluss noch gefunden wurde (4.7.1)

Zwei Prosa-Stellen, die kein Check fängt:

  • tools/CONTRACT.md zählt in der lint-Zeile die Befunde auf und kannte den neuen nicht. Eine Instanz hätte eine Report-Sektion gefunden, die ihr Contract nicht erklärt. docs verify prüft, dass die Kommandotabelle existiert, nie was in einer Zeile steht.
  • instructions/wiki-lint/SKILL.md — die wichtigere der beiden. Der neue Befund liest sich wie etwas, das Schritt 7 („repariere, was mechanisch ist") abräumt, und der naheliegende Griff wäre xref remove, das die Referenz beidseitig löscht. Auf Wine see-also Wine GE neben Wine GE depends-on Wine angewandt hätte das die schwache und die spezifische Kante entfernt. Ein Befund, dessen offensichtliche Reparatur Daten zerstört, ist schlechter als kein Befund; die Falle steht jetzt in Schritt 1, mit xref add (nur Quellseite) als Ausweg. Dieselbe Asymmetrie hat in #30 schon einmal Daten gekostet.

Akzeptanzkriterien

  • link-taxonomy.md führt alternative-to und addresses mit ihrem Satz und den Abgrenzungen
  • Der Katalog sagt ausdrücklich, dass ein selbst-duales Label einmal pro Paar geschrieben wird
  • kb/entities/COLLECTION.md: alternative-to, authored, implements, derived-from, adapted-from für entities:; alternative-to, authored für concepts:
  • kb/concepts/COLLECTION.md: addresses, alternative-to für concepts:; alternative-to für entities:
  • lint --json trägt redundant_see_also; sechs Tests decken Melden, Nicht-Melden, den wechselseitigen Fall, dass nie die spezifische Seite gemeldet wird, die Advisory-Einstufung über drei kb_version-Stände und das Durchreichen in Report und Summary ab
  • redundant_see_also nicht in hard_error_keys(), dafür in scorecard.ADVISORY_KEYS
  • Gegen den echten Korpus genau 57 Kanten — deckt sich mit der unabhängigen Vormessung
  • pytest 975 grün, docs verify und instructions verify exit 0, CI 161/162 success
  • version bump --minor → 4.7.0; Doku-Nachzug als --patch → 4.7.1

Abgrenzung, wie geplant eingehalten

Außer den vier Urheberschaftskanten aus #43 wurde keine Korpus-Kante angefasst. Der Sweep der verbleibenden 177 see-also-Kanten ist #48 und bleibt offen.

Verworfen und nicht gebaut: variant-of (die Wine-Forks tragen bereits depends-on Wine), implemented-by (Spiegel von implements, den die Inbound-View rendert), sibling-of für die Concept-Cliquen (Über-Verlinkung nach link-taxonomy.md Schritt 1, kein fehlendes Wort), builds-on (Vokabularkollision, siehe #43).

**Erledigt in 4.7.0** (Commit `3916cb9`, CI-Runs 161/162 grün) **und 4.7.1** (Commit `24593c5`, die Doku-Hälfte). ## Warum das jetzt lief Eine erste produktive Instanz steht an. Katalog und `COLLECTION.md` gehen über `dist export` in jede neue Instanz — der Katalog verbatim, die Contracts als `.template`. Was hier fehlt, fehlt dort ab Tag eins, und nachträglich ist eine Katalogerweiterung eine Korpus-Migration statt einer Datenzeile. ## Die Messung, die den Zuschnitt bestimmt hat 180 `see-also`-Kanten, exakt partitioniert (57 + 70 + 53 = 180): | Klasse | Kanten | Ergebnis | |---|---:|---| | Spiegel einer bereits typisierten Gegenkante | 57 (32 %) | **kein Label nötig** — der Katalog war ausreichend, es hat sie nur nichts gemeldet | | Wechselseitige `see-also`-Paare | 70 (39 %) | Label + „einmal pro Paar schreiben" | | Einseitig, ohne Gegenkante | 53 (29 %) | teils Label, teils zu Recht `see-also` | Die erste Klasse hat den Zuschnitt umgedreht: `Wine see-also Wine GE` steht neben `Wine GE depends-on Wine`, `RAG see-also NotebookLM` neben `NotebookLM implements RAG`. Ein Drittel des Befunds war Redundanz, kein Vokabularloch — deshalb ist der Lint-Check unten nicht Beiwerk, sondern der Teil mit der größten Wirkung. ## Was gebaut wurde **`alternative-to`** (operationales Register, selbst-dual). „serves the same purpose as the target, so a reader choosing between them wants both." Belegt durch ~30 Paare; die sieben Agent-CLIs tragen untereinander ausschließlich `see-also`, keine einzige typisierte Kante. Abgegrenzt gegen `contrasts` (lesenswerter Unterschied) und `compares-with` (benannte Dimensionen, führt auf eine `kb/comparisons/`-Seite). Dazu ein eigener Absatz im Katalog: **ein selbst-duales Label wird einmal pro Paar geschrieben.** Ohne ihn wäre aus einer 22-Kanten-`see-also`-Clique eine 22-Kanten-`alternative-to`-Clique geworden. Sieben austauschbare Werkzeuge sind 21 Paare; beidseitig deklariert 42 Kanten, von denen die zweiten 21 nichts sagen. **`addresses`** (konzeptionelles Register). „is a response to the problem the target describes." `types/concept.md` deklariert `problem` und `decision` als Subtypen, und der Katalog hatte kein Label dazwischen — eine Collection konnte ein Problem benennen und nie sagen, was dagegen unternommen wurde. Abgegrenzt gegen `rests-on` (nimmt das Ziel als *Prämisse*). Nur vier belegte Paare im Korpus, also dünn nach worked-case-first; die Ausnahme ist bewusst und gilt dem Auslieferungszeitpunkt. **`authored`** kam aus #43 im selben Bump. **Autorisierungen entity→entity:** `derived-from` und `adapted-from` (Fork, Neuimplementierung, Nachbau waren zwischen zwei Entities nicht ausdrückbar), dazu `implements` (eine Entity, die eine als Entity geführte Konvention umsetzt). Beide `COLLECTION.md` haben einen Absatz bekommen, der die Fallstricke der neuen Label benennt statt sie nur zu listen. **Lint-Befund `redundant_see_also`.** Meldet eine `see-also`-Kante, deren Gegenrichtung bereits ein typisiertes Label trägt. Advisory, nicht hart, und ausdrücklich nicht migrations-gegatet: es gibt keine Version, ab der die Redundanz zum Fehler wird. `links.SEE_ALSO` ist damit das einzige Katalog-Label, das das Werkzeug beim Namen kennt — begründet im Code, weil `see-also` der erklärte letzte Ausweg ist und nur deshalb als *schwächer als* eine andere Kante beurteilbar. ## Was beim Abschluss noch gefunden wurde (4.7.1) Zwei Prosa-Stellen, die kein Check fängt: - **`tools/CONTRACT.md`** zählt in der `lint`-Zeile die Befunde auf und kannte den neuen nicht. Eine Instanz hätte eine Report-Sektion gefunden, die ihr Contract nicht erklärt. `docs verify` prüft, dass die Kommandotabelle existiert, nie was in einer Zeile steht. - **`instructions/wiki-lint/SKILL.md`** — die wichtigere der beiden. Der neue Befund liest sich wie etwas, das Schritt 7 („repariere, was mechanisch ist") abräumt, und der naheliegende Griff wäre `xref remove`, das die Referenz **beidseitig** löscht. Auf `Wine see-also Wine GE` neben `Wine GE depends-on Wine` angewandt hätte das die schwache *und* die spezifische Kante entfernt. Ein Befund, dessen offensichtliche Reparatur Daten zerstört, ist schlechter als kein Befund; die Falle steht jetzt in Schritt 1, mit `xref add` (nur Quellseite) als Ausweg. Dieselbe Asymmetrie hat in #30 schon einmal Daten gekostet. ## Akzeptanzkriterien - [x] `link-taxonomy.md` führt `alternative-to` und `addresses` mit ihrem Satz und den Abgrenzungen - [x] Der Katalog sagt ausdrücklich, dass ein selbst-duales Label einmal pro Paar geschrieben wird - [x] `kb/entities/COLLECTION.md`: `alternative-to`, `authored`, `implements`, `derived-from`, `adapted-from` für `entities:`; `alternative-to`, `authored` für `concepts:` - [x] `kb/concepts/COLLECTION.md`: `addresses`, `alternative-to` für `concepts:`; `alternative-to` für `entities:` - [x] `lint --json` trägt `redundant_see_also`; sechs Tests decken Melden, Nicht-Melden, den wechselseitigen Fall, dass nie die *spezifische* Seite gemeldet wird, die Advisory-Einstufung über drei `kb_version`-Stände und das Durchreichen in Report und Summary ab - [x] `redundant_see_also` nicht in `hard_error_keys()`, dafür in `scorecard.ADVISORY_KEYS` - [x] Gegen den echten Korpus genau 57 Kanten — deckt sich mit der unabhängigen Vormessung - [x] `pytest` 975 grün, `docs verify` und `instructions verify` exit 0, CI 161/162 success - [x] `version bump --minor` → 4.7.0; Doku-Nachzug als `--patch` → 4.7.1 ## Abgrenzung, wie geplant eingehalten Außer den vier Urheberschaftskanten aus #43 wurde **keine** Korpus-Kante angefasst. Der Sweep der verbleibenden 177 `see-also`-Kanten ist **#48** und bleibt offen. Verworfen und nicht gebaut: `variant-of` (die Wine-Forks tragen bereits `depends-on Wine`), `implemented-by` (Spiegel von `implements`, den die Inbound-View rendert), `sibling-of` für die Concept-Cliquen (Über-Verlinkung nach `link-taxonomy.md` Schritt 1, kein fehlendes Wort), `builds-on` (Vokabularkollision, siehe #43).
torben added the prio/blockingsize/Marea/kbkind/build labels 2026-09-04 16:33:25 +00:00
Author
Owner

Changelog: Body auf Abschlussstand. Spezifikation durch Ergebnis ersetzt, alle neun Akzeptanzkriterien abgehakt und mit dem belegt, was sie prüft (57 gemeldete Kanten gegen den Korpus, deckungsgleich mit der unabhängigen Vormessung; sechs neue Lint-Tests; CI 161/162).

Neu gegenüber der Spezifikation: der Abschnitt „Was beim Abschluss noch gefunden wurde (4.7.1)". Zwei Prosa-Lücken, die kein Check fängt — die lint-Zeile in tools/CONTRACT.md, und wichtiger die xref remove-Falle in wiki-lint: der neue Befund liest sich mechanisch, aber die naheliegende Reparatur hätte die spezifische Kante mitgelöscht. Als eigener --patch auf 4.7.1 nachgezogen.

Geschlossen. #48 bleibt offen und ist jetzt allein der Korpus-Sweep.

**Changelog:** Body auf Abschlussstand. Spezifikation durch Ergebnis ersetzt, alle neun Akzeptanzkriterien abgehakt und mit dem belegt, was sie prüft (57 gemeldete Kanten gegen den Korpus, deckungsgleich mit der unabhängigen Vormessung; sechs neue Lint-Tests; CI 161/162). Neu gegenüber der Spezifikation: der Abschnitt „Was beim Abschluss noch gefunden wurde (4.7.1)". Zwei Prosa-Lücken, die kein Check fängt — die `lint`-Zeile in `tools/CONTRACT.md`, und wichtiger die `xref remove`-Falle in `wiki-lint`: der neue Befund liest sich mechanisch, aber die naheliegende Reparatur hätte die *spezifische* Kante mitgelöscht. Als eigener `--patch` auf 4.7.1 nachgezogen. Geschlossen. #48 bleibt offen und ist jetzt allein der Korpus-Sweep.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#49