Konfidenz-Bewertung: Studienlage, Lösungskonflikt und Bedingungen für eine Wiederaufnahme #85

Open
opened 2026-09-10 15:11:20 +00:00 by torben · 0 comments
Owner

Status: zurückgestellt, nicht verworfen. Der Konfidenz-Mechanismus wird mit #60 ersatzlos entfernt. Dieses Issue hält fest, warum, was dabei geprüft und verworfen wurde, und unter welchen Bedingungen das Thema wieder aufzumachen ist. Es ist eine Entscheidung auf Abruf, kein Arbeitspaket: es wird nicht implementiert, sondern gelesen, wenn einer der Trigger unten eintritt.

Der Grund für dieses Issue: die Analyse hat sechs Gesprächsrunden und drei Agentenläufe gekostet und mehrere Entwürfe erzeugt, die jeweils an einem konkreten Messwert gescheitert sind. Diese Messwerte sind mit der Entfernung des Mechanismus nicht mehr aus dem Korpus reproduzierbar — die Felder sind dann weg. Ohne diese Notiz müsste eine spätere Session bei null anfangen und würde mit hoher Wahrscheinlichkeit dieselben drei Entwürfe erneut bauen.

Inhalt

Was entschieden wurde

Am 2026-09-10, aus der Ausarbeitung von #60: confidence, confidence_base, der Zeit-Decay und die Konfidenz-Rubrik werden ersatzlos entfernt (Variante A der drei unten). Bewusst hingenommener Verlust dabei: der Lint-Befund confidence_exceeds_source_standing, der einzige automatische Abgleich zwischen dem, was eine Seite beansprucht, und dem, was ihre Quellen tragen.

fidelity und authority auf den Source-Seiten bleiben. Sie sind aufgezeichnete Tatsachen über die Quelle und hängen nicht am gelöschten Wert — jede Wiederaufnahme kann auf ihnen aufsetzen.

Die Messlage

Erhoben am 2026-09-09/10 gegen 182 kb-Seiten, davon 152 mit confidence_base. Nach der Migration sind diese Zahlen nicht mehr reproduzierbar.

Verteilung der Basiswerte: 0.95×23, 0.90×24, 0.88×2, 0.85×14, 0.80×30, 0.75×1, 0.70×14, 0.60×1, 0.50×43. Neun benutzte Stufen auf einer Skala mit hundert, gelesen gegen genau zwei Konstanten (0.6 und 0.4).

Der Vorgabewert dominiert. Die 43 Seiten auf exakt 0.50 tragen den Schema-default:, den new_page.py beim Anlegen durchreicht — kein Urteil. Die Arbeitsliste --field 'confidence<0.6' findet damit überwiegend „nie bewertet", nicht „unsicher", und die beiden Zustände sind im Feld nicht unterscheidbar. Unter 0.4 liegt keine einzige Seite; die härtere Hedging-Schwelle aus der Rubrik war nie erreichbar.

Der Wert wird angelegt und nie wieder angefasst. In der gesamten Historie seit dem Squash vom 2026-09-01 (82 Commits, 31 an kb/-Seiten) wurde confidence_base auf zwei Seiten nachträglich geändert, beide als Nebeneffekt einer inhaltlichen Überarbeitung. Einschränkung: die Historie ist nur neun Tage tief.

Der Decay hat nie gewirkt. Alle 152 Seiten trugen ein modified: von höchstens 12 Tagen (Korpusreduktion 2026-09-01), Faktor ~0.996. Genau eine Seite hatte confidence ≠ confidence_base — „Issue Label Scheme", 0.70 gegen 0.85. Das war kein Decay-Ergebnis, sondern ein stiller Fehler: confidence_decay.py überspringt concept_type: decision, und touch --confidence-base zieht das abgeleitete Feld nicht mit. Nichts prüfte diese Divergenz. Rechnerisch brauchte eine unberührte Seite im Median 25 Monate bis unter 0.6 und 50 bis unter 0.4 — bei einem modified:, das jede Bearbeitung zurücksetzte, also nie.

Kohortenbefund — der wichtigste Einzelbefund. Die Ausreißer sind fast vollständig Altlast, nicht Rubrikversagen:

Kohorte (created) Seiten über Rubrik-Maximum über Quellenstands-Obergrenze Ø Basis
≤ 2026-08-13 (PoC + init-base-Backfill) 131 47 66 0.77
2026-08-14 … 08-31 17 0 1 0.62
≥ 2026-09-01 4 0 0 0.65

Die 21 Seiten der neueren Kohorte haben 1–4 Quellen, sind also vergleichbar, und liegen systematisch tiefer.

Die Werte korrelieren nicht mit Quellenmetadaten. Alle 21 Seiten der neueren Kohorte liegen in derselben Zelle der Autoritätstabelle (authority: reporting × fidelity: verbatim), weil 16 der 29 Quellen wortgetreue Design-Transkripte sind. Die Streuung 0.5 / 0.7 / 0.85 passiert vollständig innerhalb einer Zelle. Bei einer Quelle: 0.5 achtmal, 0.7 viermal — gleiche Zelle, anderes Urteil.

Was der Wert stattdessen zu kodieren scheint: Reifegrad des Gegenstands. Gerade entschieden, noch nicht ausgeübt → 0.5 („Personalization Plane", „ENVIRONMENT.md", „Structural Enforcement over Documented Rule"). Implementiert und ausgeliefert → 0.7 („Publish-Remote Gate", „KB Stack Versioning"). Kodifiziert und mehrfach belegt → 0.85 („Issue Label Scheme"). Das ist eine Rekonstruktion aus 21 Seiten, keine Aussage des Operators — sie war nie bestätigt und ist der erste Punkt, den eine Wiederaufnahme klären müsste.

Informationsgehalt des Feldes: 14 von 152 Seiten. Nur dort sagte der handgesetzte Wert etwas, das keine Ableitung aus vorhandenen Daten rekonstruiert hätte: 9 Seiten provenance: sourced mit einer Quelle, die trotzdem auf 0.5 standen (belegt, aber als dünn beurteilt), und 5 Seiten provenance: general ganz ohne Quelle auf 0.7–0.95 (unbelegt, aber als sicher beurteilt).

Der Wert korrelierte mit Vorhandenem — Confounder: die hohen Werte sind überwiegend die PoC-Kohorte, die schlicht mehr Bearbeitung gesehen hat.

Band n Ø Zeichen Ø Inbound-Links Ø Quellen
0.5–0.6 44 1.819 1,6 0,34
0.7–0.8 45 3.115 2,4 1,49
0.85–0.95 63 5.228 5,0 1,94

Kein Konsument hing vom Wert ab. Nur Leser: Trefferanzeige, --sort -confidence, ein generisches Frontmatter-Prädikat, ein beratender Lint-Check. Das Ranking benutzte ihn nicht (Score = Treffergewicht plus Titel-/Summary-Boost), index rebuild schrieb ihn nicht in den Katalog, doctor, eval und provenance kannten ihn nicht, kein Gate und kein Test hing daran. Der einzige strukturelle Bezug war corpus_diff.STRUCTURAL_FIELDS — eine Abhängigkeit auf die Existenz des Feldes, nicht auf seinen Wert.

Herkunft. Der Mechanismus ist importiert, nicht aus einem Bedarf dieser Instanz abgeleitet: raw/articles/llm-wiki-v2.md beschreibt ihn als Idee — Score aus Quellenzahl, Aktualität und Widerspruch, „decays with time and strengthens with reinforcement". Gebaut wurde die Hälfte: der Zerfall, nie die Verstärkung.

Der Lösungskonflikt: vier geprüfte und verworfene Entwürfe

Jeder scheiterte an einem konkreten Befund, nicht an Geschmack. Wer das Thema wieder aufmacht, sollte hier anfangen.

1. Rubrik nachjustieren (Defaults senken, Decay erhöhen). Der naheliegende Reflex aus dem ursprünglichen Stub. Verworfen am Kohortenbefund: die aktuelle Autorenpraxis respektiert Rubrik und Obergrenze bereits; die Ausreißer sind Altbestand. An der Rubrik zu drehen hätte nichts an der Ursache geändert — sie wird ohnehin nicht angewendet, in keine Richtung.

2. Autorität der Design-Transkripte anheben (reportingnormative, weil eine Sitzung, in der etwas entschieden wird, für diesen Gegenstand konstitutiv ist, nicht berichtend). Kontrafaktisch durchgerechnet: alle 18 transcript/tracker-Quellen auf normative löst 7 von 67 Befunden. Der Rest kommt aus PoC-Quellen anderer Art (Cheat-Sheets, Artikel, opinion-Analysen). Als Haupterklärung untauglich.

3. standing — den Wert aus authority × fidelity der Quellen berechnen statt ihn zu schätzen, mit handgesetztem Override für unabhängige Verifikation. Getestet gegen die gut kalibrierte Kohorte, die die Formel reproduzieren müsste: Ø Delta −0,21, null von 21 Seiten innerhalb ±0,05. Die Formel zog jede neue Seite nach oben (0.5 → 0.8). Grund: sie misst die Form des Mitschnitts, nicht den Gegenstand. Ein perfektes Transkript einer Sitzung, in der etwas gerade erst erfunden wurde, ist reporting × verbatim — und die Sache selbst ist trotzdem ungesichert.

4. Zwei Schubladen — maturity (Reifegrad, Ankerwerte 0.5/0.7/0.85) und volatility (Halbwertszeit des Gegenstands: volatile 6 / evolving 24 / stable 60 Monate / fixed kein Decay), beide vom LLM beim Ingest vorgeschlagen und vom Operator korrigierbar, Zuordnungen als maschinenlesbarer Block im Frontmatter von kb/CONVENTIONS.md. Der weitest ausgearbeitete Entwurf; er beantwortete den berechtigten Einwand, dass Veralterung eine Eigenschaft des Gegenstands ist (Python-Best-Practices altern, E3DC-Designprinzipien nicht, Blogs schnell, OOP und Scrum kaum) und keine globale Konstante. Zwei Gründe für das Aus:

  • Single Point of Truth verletzt: die Schubladennamen hätten in drei Dateien gestanden (beide *.schema.yaml plus der Konfigblock) — genau die zweite Kopie, die Invariante 8 verbietet.
  • maturity war zirkulär: wenn provisional den Ankerwert 0.5 bedeutet und der Autor 0.5 schreibt, steht derselbe Sachverhalt zweimal da, und der Prüf-Check verglich eine Zahl mit einem Etikett, das aus der Zahl folgt. Die diskrete Rubrik confidence_base ∈ {0.5, 0.7, 0.85} hätte dasselbe ohne Feld geleistet — womit der ganze Aufbau auf ein Feld zusammenfiel und die Frage, ob das eine Feld noch trägt, wieder offen war.

Der Volatilitäts-Teil dieses Entwurfs ist der einzige, der eine Wiederaufnahme wert bleibt — siehe Trigger 3.

Commonplace: der dokumentierte Präzedenzfall

Die eingebundene Wissensbasis unter commonplace/kb/ (Projekt zby/commonplace, schreibgeschützt, von dist export ausgeschlossen) hat dasselbe Problem gelöst und das Feld gelöscht.

reference/adr/044-user-verification-replaces-global-note-status.md (2026-07-11) entfernt das status-Feld ersatzlos. Begründung: es fusionierte Reife (seedling), Akzeptanz (current), Behauptungsstärke (speculative) und Aktualität (outdated) in eine Achse, die „weder eine Achse noch in irgendeiner Kombination maschinell prüfbar" war. Die dort verworfenen Alternativen decken sich mit unseren Entwürfen:

  • „Ein kleineres Lifecycle-Enum behalten" — verworfen: erhält eine globale Achse ohne kohärente Bedeutung (entspricht unserem maturity)
  • „Das Feld in Lifecycle plus vertraglich deklarierte Behauptungsstärke aufspalten" — verworfen; die Selbstkritik dort nennt das alte Feld „eine Diagonale durch Reife, Aktualität und Endorsement" (entspricht maturity + volatility)
  • „Verifikation aus Review-Akzeptanz oder Freshness berechnen" — verworfen: kollabiert kriteriumsspezifische Evidenz zu einem universellen Urteil (entspricht standing)
  • Kernsatz: „deleting the field achieves the same outcome without designing a mechanism ahead of a worked case, and a collection that later needs an explicit axis can define a type-local field."

An seine Stelle traten dort drei getrennte Dinge: user-verified: true als menschliche Bezeugung (nur dieser eine Wert; Abwesenheit sagt ausdrücklich nichts über Wahrheit, Reife oder Review-Historie), kriteriumsspezifische Freshness-Baselines im Store, und Prosa-Kriterien als eigene Review-Gates.

Die Mark-Doktrinnotes/a-derived-copy-of-recomputable-truth-must-be-checked-or-absent.md: eine fehlende abgeleitete Kopie kostet den Konsumenten eine begrenzte Neuberechnung, eine falsche kostet stille, unbegrenzte Fehlerhaftigkeit, weil sie genau den Fallback unterdrückt, der die Wahrheit gerettet hätte. Handgepflegt-und-geglaubt ist die „forbidden middle". notes/notes-need-quality-scores-to-scale-curation.md sagt dazu direkt: „No global scalar supplies quality."

Der prinzipielle Einwand gegen jeden Seitenskalarnotes/mixed-epistemic-status-must-be-preserved-below-the-document-level.md: ein Dokument enthält Beobachtung, Ableitung und bloß kompatible Erklärung nebeneinander; ein Urteil auf Dokumentebene kollabiert sie. Gilt unabhängig davon, wer den Skalar setzt.

Warum LLM-gesetzte Konfidenz grundsätzlich schwach istnotes/llm-generation-confidence-tracks-typicality-not-soundness.md: Konfidenz misst Typikalität, nicht Belegtheit.

Was dort die Funktion übernimmt und hier übertragbar wäre:

  • Prosa-Kriterien statt Schwellen (instructions/review-gates/prose/confidence-miscalibration.md und frontmatter/claim-strength.md): prüfen, ob ein Text stärker auftritt, als das trägt, was er zitiert — gegen die zitierten Quellen, nicht gegen eine Zahl. Beantwortet zusätzlich, welche Stelle zu stark hedgt. Kosten: zwei Markdown-Dateien, kein Code, kein Store; aber ein LLM-Urteil pro geprüfter Seite, also nur stichprobenweise im Semantic-Review-Abschnitt von wiki-lint finanzierbar. Das ist der naheliegendste Ersatz für den verlorenen confidence_exceeds_source_standing-Check.
  • Kriterium-Hash statt Zeit-Decay (reference/freshness-architecture.md, reference/adr/043-*.md): hier feuert das Input-Change-Signal von der Quellenseite nie, weil raw/ per Contract unveränderlich ist. Die Kriteriumsseite ändert sich aber sehr wohl — types/*.md und kb/CONVENTIONS.md. Ein Feld mit dem Hash des Type-Specs, gegen den die Seite zuletzt geprüft wurde, wäre mechanisch reproduzierbar und erfüllt die Mark-Doktrin, anders als confidence_base.
  • Arbeitsliste aus Strukturzählungen (notes/quality-signals-for-kb-evaluation.md): Orphan-Rate, Index-Deckung, Beschreibungs-Uniqueness, gewichtete Inbound-Links. Wichtig von dort: eine Explorationsquote reservieren, sonst verhungern genau die Orphans, die die Liste finden soll.
  • Make-artige Staleness über den Link-Graph (notes/link-graph-plus-timestamps-enables-make-like-staleness-detection.md): eine Seite, deren related:-Ziel nach ihrer letzten Bestätigung umgeschrieben wurde, ist Review-Kandidat. Umsonst aus vorhandenen Daten, präziser als jede Uhr für die selbstdokumentierende Hälfte des Korpus.

Nicht übertragbar: der SQLite-Store mit Snapshots und Baselines, 26 Kommandos, ~13.000 Zeilen Python — bei 60 wikitool-Aufrufen pro Sitzung nicht finanzierbar. Ebenso Modellpartitionen (setzen einen persistierten Evidenzraum voraus). user-verified: true wäre übertragbar, löst das Problem aber nicht: laut ADR 044 sagt seine Abwesenheit ausdrücklich nichts, es ist eine Bezeugung, kein Qualitätsmaß.

Die drei Endansätze

A — Streichen (gewählt) B — Ein Urteil, drei Stufen, kein Decay C — Bezeugung + Kriterien
Bleibt nichts; Hedging nach Quellenlage ein handgesetztes Feld mit drei zulässigen Werten, standardmäßig abwesend (Abwesenheit = nie bewertet); Ceiling-Check darauf umgehängt verified: true; ein Prosa-Kriterium prüft Auftritt gegen Quellenstand
Zeit gar nicht Lint-Befund „seit N Monaten unbestätigt", nie gespeichert dito, plus Link-Graph-Staleness
Pro maximale Ehrlichkeit, ~300 Zeilen weg, keine Kalibrierungsdebatte, dokumentierter Präzedenzfall behält die 14 informationstragenden Seiten, keine abgeleitete Kopie mehr (Mark-Doktrin erfüllt), Wert gegen eine Dreiermenge prüfbar, keine Konfiguration jedes Element ist aufgezeichnete Tatsache oder Urteil im Moment der Prüfbarkeit; findet die Stelle, nicht nur die Seite
Contra verliert die 14 Seiten und den einzigen Quellenstand-Abgleich bleibt ein globaler, unauditierbarer Achsenrest — genau das, was ADR 044 an einem „kleineren Enum" verwirft LLM-Urteil pro Seite nur als Stichprobe finanzierbar; keine persistierte Abstufung zur Query-Zeit; verified: droht dasselbe ungepflegte Feld zu werden

Wiederaufnahme-Trigger

Das Issue steht auf prio/waiting; dies sind die Auslöser. Tritt einer ein, ist es zu lesen und die Entscheidung neu zu treffen — nicht der alte Entwurf zu bauen.

  1. Beobachtete Fehlkalibrierung. Eine Query zitiert eine dünn belegte Seite im selben Ton wie eine gut belegte, und es fällt auf. Das ist der Fehlertyp, gegen den der Mechanismus verteidigt wurde; tritt er real auf, ist der Verlust bezahlt und die Frage neu zu stellen. Erster Kandidat als Antwort: das Prosa-Kriterium aus dem Commonplace-Abschnitt, nicht ein Zahlenfeld.
  2. Die Arbeitsliste reicht nicht mehr. --field '!sources', --field provenance=general und --sort modified finden die schwachen Seiten heute schärfer als es confidence<0.6 je tat. Wenn der Korpus so wächst, dass diese Prädikate zu grob werden — Richtwert: dauerhaft mehr als ~50 Seiten ohne sources: —, braucht die Kuratierung wieder ein Signal.
  3. Eine Instanz mit volatilen Themen. Dieser Korpus ist überwiegend selbstdokumentierend und altert kaum; die private Arbeitsinstanz oder eine Instanz mit LLM-, Blog- oder Ökosystem-Themen altert anders. Wird dort Veralterung als Problem sichtbar, ist Entwurf 4 (Volatilitäts-Schubladen) der Ansatzpunkt — dann aber mit einem Feld statt zweier und ohne den Konfigblock, der ihn hier zu Fall gebracht hat.
  4. Eine Kriteriumsseite wird zur prüfbaren Abhängigkeit. Sobald types/*.md oder kb/CONVENTIONS.md als Kriterium versioniert werden, gegen das eine Seite zuletzt geprüft wurde, trägt das Commonplace-Freshness-Modell plötzlich — und zwar ohne Store, als Hash im Frontmatter. Das ist der einzige Weg, auf dem Veralterung hier ein Zustand statt einer Meinung würde.
  5. raw/ verliert seine Unveränderlichkeit. Unwahrscheinlich und vertraglich ausgeschlossen, aber es ist die Bedingung, unter der das Input-Snapshot-Modell vollständig übertragbar würde.

Woran eine Wiederaufnahme anzusetzen hätte

Zuerst die offene Frage klären, die nie beantwortet wurde: Was hat der Operator gemeint, wenn er 0.5 hinschrieb? Die Reifegrad-Lesart ist eine Rekonstruktion aus 21 Seiten. Ohne diese Antwort baut jeder Entwurf auf einer Vermutung — genau der Fehler, der die Entwürfe 3 und 4 gekostet hat.

Dann die Reihenfolge einhalten, die hier gelernt wurde: erst messen, ob das Problem im aktuellen Verhalten überhaupt auftritt, dann den Mechanismus entwerfen. Entwurf 1 und 2 wären nie gebaut worden, wenn die Kohortenanalyse vorher vorgelegen hätte, und Entwurf 3 fiel in dem Moment, in dem er gegen echte Daten getestet wurde statt gegen Plausibilität.

Und die Mark-Doktrin als Filter anlegen: Jeder Kandidat, der einen handgepflegten Wert einführt, den kein Konsument gegen etwas prüfen kann, ist derselbe Mechanismus in neuer Schreibweise.


Kontext: entstanden aus der Ausarbeitung von #60. Umsetzung dort, Korpusmigration im zugehörigen Migrations-Issue.

**Status: zurückgestellt, nicht verworfen.** Der Konfidenz-Mechanismus wird mit #60 ersatzlos entfernt. Dieses Issue hält fest, *warum*, was dabei geprüft und verworfen wurde, und unter welchen Bedingungen das Thema wieder aufzumachen ist. Es ist eine Entscheidung auf Abruf, kein Arbeitspaket: es wird nicht implementiert, sondern gelesen, wenn einer der Trigger unten eintritt. Der Grund für dieses Issue: die Analyse hat sechs Gesprächsrunden und drei Agentenläufe gekostet und mehrere Entwürfe erzeugt, die jeweils an einem konkreten Messwert gescheitert sind. Diese Messwerte sind mit der Entfernung des Mechanismus nicht mehr aus dem Korpus reproduzierbar — die Felder sind dann weg. Ohne diese Notiz müsste eine spätere Session bei null anfangen und würde mit hoher Wahrscheinlichkeit dieselben drei Entwürfe erneut bauen. ## Inhalt - [Was entschieden wurde](#was-entschieden-wurde) - [Die Messlage](#die-messlage) - [Der Lösungskonflikt: vier geprüfte und verworfene Entwürfe](#der-lösungskonflikt-vier-geprüfte-und-verworfene-entwürfe) - [Commonplace: der dokumentierte Präzedenzfall](#commonplace-der-dokumentierte-präzedenzfall) - [Die drei Endansätze](#die-drei-endansätze) - [Wiederaufnahme-Trigger](#wiederaufnahme-trigger) - [Woran eine Wiederaufnahme anzusetzen hätte](#woran-eine-wiederaufnahme-anzusetzen-hätte) ## Was entschieden wurde Am 2026-09-10, aus der Ausarbeitung von #60: `confidence`, `confidence_base`, der Zeit-Decay und die Konfidenz-Rubrik werden ersatzlos entfernt (Variante A der drei unten). Bewusst hingenommener Verlust dabei: der Lint-Befund `confidence_exceeds_source_standing`, der einzige automatische Abgleich zwischen dem, was eine Seite beansprucht, und dem, was ihre Quellen tragen. `fidelity` und `authority` auf den Source-Seiten bleiben. Sie sind aufgezeichnete Tatsachen über die Quelle und hängen nicht am gelöschten Wert — jede Wiederaufnahme kann auf ihnen aufsetzen. ## Die Messlage Erhoben am 2026-09-09/10 gegen 182 kb-Seiten, davon 152 mit `confidence_base`. **Nach der Migration sind diese Zahlen nicht mehr reproduzierbar.** **Verteilung der Basiswerte:** 0.95×23, 0.90×24, 0.88×2, 0.85×14, 0.80×30, 0.75×1, 0.70×14, 0.60×1, 0.50×43. Neun benutzte Stufen auf einer Skala mit hundert, gelesen gegen genau zwei Konstanten (0.6 und 0.4). **Der Vorgabewert dominiert.** Die 43 Seiten auf exakt 0.50 tragen den Schema-`default:`, den `new_page.py` beim Anlegen durchreicht — kein Urteil. Die Arbeitsliste `--field 'confidence<0.6'` findet damit überwiegend „nie bewertet", nicht „unsicher", und die beiden Zustände sind im Feld nicht unterscheidbar. Unter 0.4 liegt keine einzige Seite; die härtere Hedging-Schwelle aus der Rubrik war nie erreichbar. **Der Wert wird angelegt und nie wieder angefasst.** In der gesamten Historie seit dem Squash vom 2026-09-01 (82 Commits, 31 an `kb/`-Seiten) wurde `confidence_base` auf zwei Seiten nachträglich geändert, beide als Nebeneffekt einer inhaltlichen Überarbeitung. Einschränkung: die Historie ist nur neun Tage tief. **Der Decay hat nie gewirkt.** Alle 152 Seiten trugen ein `modified:` von höchstens 12 Tagen (Korpusreduktion 2026-09-01), Faktor ~0.996. Genau eine Seite hatte `confidence ≠ confidence_base` — „Issue Label Scheme", 0.70 gegen 0.85. Das war kein Decay-Ergebnis, sondern ein stiller Fehler: `confidence_decay.py` überspringt `concept_type: decision`, und `touch --confidence-base` zieht das abgeleitete Feld nicht mit. Nichts prüfte diese Divergenz. Rechnerisch brauchte eine unberührte Seite im Median 25 Monate bis unter 0.6 und 50 bis unter 0.4 — bei einem `modified:`, das jede Bearbeitung zurücksetzte, also nie. **Kohortenbefund — der wichtigste Einzelbefund.** Die Ausreißer sind fast vollständig Altlast, nicht Rubrikversagen: | Kohorte (`created`) | Seiten | über Rubrik-Maximum | über Quellenstands-Obergrenze | Ø Basis | |---|---|---|---|---| | ≤ 2026-08-13 (PoC + `init-base`-Backfill) | 131 | 47 | 66 | 0.77 | | 2026-08-14 … 08-31 | 17 | 0 | 1 | 0.62 | | ≥ 2026-09-01 | 4 | 0 | 0 | 0.65 | Die 21 Seiten der neueren Kohorte haben 1–4 Quellen, sind also vergleichbar, und liegen systematisch tiefer. **Die Werte korrelieren nicht mit Quellenmetadaten.** Alle 21 Seiten der neueren Kohorte liegen in **derselben Zelle** der Autoritätstabelle (`authority: reporting` × `fidelity: verbatim`), weil 16 der 29 Quellen wortgetreue Design-Transkripte sind. Die Streuung 0.5 / 0.7 / 0.85 passiert vollständig *innerhalb* einer Zelle. Bei einer Quelle: 0.5 achtmal, 0.7 viermal — gleiche Zelle, anderes Urteil. **Was der Wert stattdessen zu kodieren scheint:** Reifegrad des Gegenstands. Gerade entschieden, noch nicht ausgeübt → 0.5 („Personalization Plane", „ENVIRONMENT.md", „Structural Enforcement over Documented Rule"). Implementiert und ausgeliefert → 0.7 („Publish-Remote Gate", „KB Stack Versioning"). Kodifiziert und mehrfach belegt → 0.85 („Issue Label Scheme"). **Das ist eine Rekonstruktion aus 21 Seiten, keine Aussage des Operators** — sie war nie bestätigt und ist der erste Punkt, den eine Wiederaufnahme klären müsste. **Informationsgehalt des Feldes: 14 von 152 Seiten.** Nur dort sagte der handgesetzte Wert etwas, das keine Ableitung aus vorhandenen Daten rekonstruiert hätte: 9 Seiten `provenance: sourced` mit einer Quelle, die trotzdem auf 0.5 standen (belegt, aber als dünn beurteilt), und 5 Seiten `provenance: general` ganz ohne Quelle auf 0.7–0.95 (unbelegt, aber als sicher beurteilt). **Der Wert korrelierte mit Vorhandenem** — Confounder: die hohen Werte sind überwiegend die PoC-Kohorte, die schlicht mehr Bearbeitung gesehen hat. | Band | n | Ø Zeichen | Ø Inbound-Links | Ø Quellen | |---|---|---|---|---| | 0.5–0.6 | 44 | 1.819 | 1,6 | 0,34 | | 0.7–0.8 | 45 | 3.115 | 2,4 | 1,49 | | 0.85–0.95 | 63 | 5.228 | 5,0 | 1,94 | **Kein Konsument hing vom Wert ab.** Nur Leser: Trefferanzeige, `--sort -confidence`, ein generisches Frontmatter-Prädikat, ein beratender Lint-Check. Das Ranking benutzte ihn nicht (Score = Treffergewicht plus Titel-/Summary-Boost), `index rebuild` schrieb ihn nicht in den Katalog, `doctor`, `eval` und `provenance` kannten ihn nicht, kein Gate und kein Test hing daran. Der einzige strukturelle Bezug war `corpus_diff.STRUCTURAL_FIELDS` — eine Abhängigkeit auf die *Existenz* des Feldes, nicht auf seinen Wert. **Herkunft.** Der Mechanismus ist importiert, nicht aus einem Bedarf dieser Instanz abgeleitet: `raw/articles/llm-wiki-v2.md` beschreibt ihn als Idee — Score aus Quellenzahl, Aktualität und Widerspruch, „decays with time and strengthens with reinforcement". Gebaut wurde die Hälfte: der Zerfall, nie die Verstärkung. ## Der Lösungskonflikt: vier geprüfte und verworfene Entwürfe Jeder scheiterte an einem konkreten Befund, nicht an Geschmack. Wer das Thema wieder aufmacht, sollte hier anfangen. **1. Rubrik nachjustieren (Defaults senken, Decay erhöhen).** Der naheliegende Reflex aus dem ursprünglichen Stub. Verworfen am Kohortenbefund: die aktuelle Autorenpraxis respektiert Rubrik *und* Obergrenze bereits; die Ausreißer sind Altbestand. An der Rubrik zu drehen hätte nichts an der Ursache geändert — sie wird ohnehin nicht angewendet, in keine Richtung. **2. Autorität der Design-Transkripte anheben** (`reporting` → `normative`, weil eine Sitzung, in der etwas entschieden wird, für diesen Gegenstand konstitutiv ist, nicht berichtend). Kontrafaktisch durchgerechnet: alle 18 `transcript`/`tracker`-Quellen auf `normative` löst **7 von 67** Befunden. Der Rest kommt aus PoC-Quellen anderer Art (Cheat-Sheets, Artikel, `opinion`-Analysen). Als Haupterklärung untauglich. **3. `standing` — den Wert aus `authority` × `fidelity` der Quellen berechnen** statt ihn zu schätzen, mit handgesetztem Override für unabhängige Verifikation. Getestet gegen die gut kalibrierte Kohorte, die die Formel reproduzieren müsste: **Ø Delta −0,21, null von 21 Seiten innerhalb ±0,05.** Die Formel zog jede neue Seite nach oben (0.5 → 0.8). Grund: sie misst die Form des Mitschnitts, nicht den Gegenstand. Ein perfektes Transkript einer Sitzung, in der etwas gerade erst erfunden wurde, ist `reporting × verbatim` — und die Sache selbst ist trotzdem ungesichert. **4. Zwei Schubladen — `maturity` (Reifegrad, Ankerwerte 0.5/0.7/0.85) und `volatility` (Halbwertszeit des Gegenstands: `volatile` 6 / `evolving` 24 / `stable` 60 Monate / `fixed` kein Decay)**, beide vom LLM beim Ingest vorgeschlagen und vom Operator korrigierbar, Zuordnungen als maschinenlesbarer Block im Frontmatter von `kb/CONVENTIONS.md`. Der weitest ausgearbeitete Entwurf; er beantwortete den berechtigten Einwand, dass Veralterung eine Eigenschaft des Gegenstands ist (Python-Best-Practices altern, E3DC-Designprinzipien nicht, Blogs schnell, OOP und Scrum kaum) und keine globale Konstante. Zwei Gründe für das Aus: - **Single Point of Truth verletzt:** die Schubladennamen hätten in drei Dateien gestanden (beide `*.schema.yaml` plus der Konfigblock) — genau die zweite Kopie, die Invariante 8 verbietet. - **`maturity` war zirkulär:** wenn `provisional` den Ankerwert 0.5 bedeutet und der Autor 0.5 schreibt, steht derselbe Sachverhalt zweimal da, und der Prüf-Check verglich eine Zahl mit einem Etikett, das aus der Zahl folgt. Die diskrete Rubrik `confidence_base ∈ {0.5, 0.7, 0.85}` hätte dasselbe ohne Feld geleistet — womit der ganze Aufbau auf ein Feld zusammenfiel und die Frage, ob das eine Feld noch trägt, wieder offen war. Der Volatilitäts-Teil dieses Entwurfs ist der einzige, der eine Wiederaufnahme wert bleibt — siehe Trigger 3. ## Commonplace: der dokumentierte Präzedenzfall Die eingebundene Wissensbasis unter `commonplace/kb/` (Projekt zby/commonplace, schreibgeschützt, von `dist export` ausgeschlossen) hat dasselbe Problem gelöst und **das Feld gelöscht**. **`reference/adr/044-user-verification-replaces-global-note-status.md`** (2026-07-11) entfernt das `status`-Feld ersatzlos. Begründung: es fusionierte Reife (`seedling`), Akzeptanz (`current`), Behauptungsstärke (`speculative`) und Aktualität (`outdated`) in eine Achse, die „weder eine Achse noch in irgendeiner Kombination maschinell prüfbar" war. Die dort **verworfenen Alternativen decken sich mit unseren Entwürfen**: - „Ein kleineres Lifecycle-Enum behalten" — verworfen: erhält eine globale Achse ohne kohärente Bedeutung *(entspricht unserem `maturity`)* - „Das Feld in Lifecycle plus vertraglich deklarierte Behauptungsstärke aufspalten" — verworfen; die Selbstkritik dort nennt das alte Feld „eine Diagonale durch Reife, Aktualität und Endorsement" *(entspricht `maturity` + `volatility`)* - „Verifikation aus Review-Akzeptanz oder Freshness berechnen" — verworfen: kollabiert kriteriumsspezifische Evidenz zu einem universellen Urteil *(entspricht `standing`)* - Kernsatz: *„deleting the field achieves the same outcome without designing a mechanism ahead of a worked case, and a collection that later needs an explicit axis can define a type-local field."* An seine Stelle traten dort drei getrennte Dinge: `user-verified: true` als menschliche Bezeugung (nur dieser eine Wert; Abwesenheit sagt ausdrücklich nichts über Wahrheit, Reife oder Review-Historie), kriteriumsspezifische Freshness-Baselines im Store, und Prosa-Kriterien als eigene Review-Gates. **Die Mark-Doktrin** — `notes/a-derived-copy-of-recomputable-truth-must-be-checked-or-absent.md`: eine fehlende abgeleitete Kopie kostet den Konsumenten eine begrenzte Neuberechnung, eine *falsche* kostet stille, unbegrenzte Fehlerhaftigkeit, weil sie genau den Fallback unterdrückt, der die Wahrheit gerettet hätte. Handgepflegt-und-geglaubt ist die „forbidden middle". `notes/notes-need-quality-scores-to-scale-curation.md` sagt dazu direkt: „No global scalar supplies quality." **Der prinzipielle Einwand gegen jeden Seitenskalar** — `notes/mixed-epistemic-status-must-be-preserved-below-the-document-level.md`: ein Dokument enthält Beobachtung, Ableitung und bloß kompatible Erklärung nebeneinander; ein Urteil auf Dokumentebene kollabiert sie. Gilt unabhängig davon, wer den Skalar setzt. **Warum LLM-gesetzte Konfidenz grundsätzlich schwach ist** — `notes/llm-generation-confidence-tracks-typicality-not-soundness.md`: Konfidenz misst Typikalität, nicht Belegtheit. **Was dort die Funktion übernimmt und hier übertragbar wäre:** - **Prosa-Kriterien statt Schwellen** (`instructions/review-gates/prose/confidence-miscalibration.md` und `frontmatter/claim-strength.md`): prüfen, ob ein Text stärker auftritt, als das trägt, was er zitiert — gegen die zitierten Quellen, nicht gegen eine Zahl. Beantwortet zusätzlich, *welche Stelle* zu stark hedgt. Kosten: zwei Markdown-Dateien, kein Code, kein Store; aber ein LLM-Urteil pro geprüfter Seite, also nur stichprobenweise im Semantic-Review-Abschnitt von `wiki-lint` finanzierbar. **Das ist der naheliegendste Ersatz für den verlorenen `confidence_exceeds_source_standing`-Check.** - **Kriterium-Hash statt Zeit-Decay** (`reference/freshness-architecture.md`, `reference/adr/043-*.md`): hier feuert das Input-Change-Signal von der Quellenseite nie, weil `raw/` per Contract unveränderlich ist. Die *Kriteriumsseite* ändert sich aber sehr wohl — `types/*.md` und `kb/CONVENTIONS.md`. Ein Feld mit dem Hash des Type-Specs, gegen den die Seite zuletzt geprüft wurde, wäre mechanisch reproduzierbar und erfüllt die Mark-Doktrin, anders als `confidence_base`. - **Arbeitsliste aus Strukturzählungen** (`notes/quality-signals-for-kb-evaluation.md`): Orphan-Rate, Index-Deckung, Beschreibungs-Uniqueness, gewichtete Inbound-Links. Wichtig von dort: eine Explorationsquote reservieren, sonst verhungern genau die Orphans, die die Liste finden soll. - **Make-artige Staleness über den Link-Graph** (`notes/link-graph-plus-timestamps-enables-make-like-staleness-detection.md`): eine Seite, deren `related:`-Ziel nach ihrer letzten Bestätigung umgeschrieben wurde, ist Review-Kandidat. Umsonst aus vorhandenen Daten, präziser als jede Uhr für die selbstdokumentierende Hälfte des Korpus. **Nicht übertragbar:** der SQLite-Store mit Snapshots und Baselines, 26 Kommandos, ~13.000 Zeilen Python — bei 60 `wikitool`-Aufrufen pro Sitzung nicht finanzierbar. Ebenso Modellpartitionen (setzen einen persistierten Evidenzraum voraus). `user-verified: true` wäre übertragbar, löst das Problem aber nicht: laut ADR 044 sagt seine Abwesenheit ausdrücklich nichts, es ist eine Bezeugung, kein Qualitätsmaß. ## Die drei Endansätze | | **A — Streichen** *(gewählt)* | **B — Ein Urteil, drei Stufen, kein Decay** | **C — Bezeugung + Kriterien** | |---|---|---|---| | Bleibt | nichts; Hedging nach Quellenlage | ein handgesetztes Feld mit drei zulässigen Werten, standardmäßig **abwesend** (Abwesenheit = nie bewertet); Ceiling-Check darauf umgehängt | `verified: true`; ein Prosa-Kriterium prüft Auftritt gegen Quellenstand | | Zeit | gar nicht | Lint-Befund „seit N Monaten unbestätigt", nie gespeichert | dito, plus Link-Graph-Staleness | | Pro | maximale Ehrlichkeit, ~300 Zeilen weg, keine Kalibrierungsdebatte, dokumentierter Präzedenzfall | behält die 14 informationstragenden Seiten, keine abgeleitete Kopie mehr (Mark-Doktrin erfüllt), Wert gegen eine Dreiermenge prüfbar, keine Konfiguration | jedes Element ist aufgezeichnete Tatsache oder Urteil im Moment der Prüfbarkeit; findet die Stelle, nicht nur die Seite | | Contra | verliert die 14 Seiten und den einzigen Quellenstand-Abgleich | bleibt ein globaler, unauditierbarer Achsenrest — genau das, was ADR 044 an einem „kleineren Enum" verwirft | LLM-Urteil pro Seite nur als Stichprobe finanzierbar; keine persistierte Abstufung zur Query-Zeit; `verified:` droht dasselbe ungepflegte Feld zu werden | ## Wiederaufnahme-Trigger Das Issue steht auf `prio/waiting`; dies sind die Auslöser. Tritt einer ein, ist es zu lesen und die Entscheidung neu zu treffen — nicht der alte Entwurf zu bauen. 1. **Beobachtete Fehlkalibrierung.** Eine Query zitiert eine dünn belegte Seite im selben Ton wie eine gut belegte, und es fällt auf. Das ist der Fehlertyp, gegen den der Mechanismus verteidigt wurde; tritt er real auf, ist der Verlust bezahlt und die Frage neu zu stellen. Erster Kandidat als Antwort: das Prosa-Kriterium aus dem Commonplace-Abschnitt, nicht ein Zahlenfeld. 2. **Die Arbeitsliste reicht nicht mehr.** `--field '!sources'`, `--field provenance=general` und `--sort modified` finden die schwachen Seiten heute schärfer als es `confidence<0.6` je tat. Wenn der Korpus so wächst, dass diese Prädikate zu grob werden — Richtwert: dauerhaft mehr als ~50 Seiten ohne `sources:` —, braucht die Kuratierung wieder ein Signal. 3. **Eine Instanz mit volatilen Themen.** Dieser Korpus ist überwiegend selbstdokumentierend und altert kaum; die private Arbeitsinstanz oder eine Instanz mit LLM-, Blog- oder Ökosystem-Themen altert anders. Wird dort Veralterung als Problem sichtbar, ist Entwurf 4 (Volatilitäts-Schubladen) der Ansatzpunkt — dann aber **mit einem Feld statt zweier und ohne den Konfigblock**, der ihn hier zu Fall gebracht hat. 4. **Eine Kriteriumsseite wird zur prüfbaren Abhängigkeit.** Sobald `types/*.md` oder `kb/CONVENTIONS.md` als Kriterium versioniert werden, gegen das eine Seite zuletzt geprüft wurde, trägt das Commonplace-Freshness-Modell plötzlich — und zwar ohne Store, als Hash im Frontmatter. Das ist der einzige Weg, auf dem Veralterung hier ein *Zustand* statt einer Meinung würde. 5. **`raw/` verliert seine Unveränderlichkeit.** Unwahrscheinlich und vertraglich ausgeschlossen, aber es ist die Bedingung, unter der das Input-Snapshot-Modell vollständig übertragbar würde. ## Woran eine Wiederaufnahme anzusetzen hätte **Zuerst die offene Frage klären, die nie beantwortet wurde:** Was hat der Operator gemeint, wenn er 0.5 hinschrieb? Die Reifegrad-Lesart ist eine Rekonstruktion aus 21 Seiten. Ohne diese Antwort baut jeder Entwurf auf einer Vermutung — genau der Fehler, der die Entwürfe 3 und 4 gekostet hat. **Dann die Reihenfolge einhalten, die hier gelernt wurde:** erst messen, ob das Problem im aktuellen Verhalten überhaupt auftritt, dann den Mechanismus entwerfen. Entwurf 1 und 2 wären nie gebaut worden, wenn die Kohortenanalyse vorher vorgelegen hätte, und Entwurf 3 fiel in dem Moment, in dem er gegen echte Daten getestet wurde statt gegen Plausibilität. **Und die Mark-Doktrin als Filter anlegen:** Jeder Kandidat, der einen handgepflegten Wert einführt, den kein Konsument gegen etwas prüfen kann, ist derselbe Mechanismus in neuer Schreibweise. --- Kontext: entstanden aus der Ausarbeitung von #60. Umsetzung dort, Korpusmigration im zugehörigen Migrations-Issue.
torben added the prio/waitingsize/Marea/kbkind/decision labels 2026-09-10 15:11:20 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#85