raw accept: Datums-Shard statt Typverzeichnis, plus fidelity/authority am Drop-Punkt - Paket B #67
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Aus der Architekturdiskussion vom 2026-09-08. Paket B von vier: A ist #66, C ist #68, D ist #69.
Erledigt und geschlossen am 2026-09-09. Drei Publishes, ein Kandidat (
4.8.0-beta.8):f4353cc(+ Doku-Nachzugd9af88f)00220f846dfee0Der Befund, aus dem das Paket entstand
raw/s Unterverzeichnisse trugen keinen Vertrag.raw/CONTRACT.mdenthielt keine einzige Klausel, die pro Unterverzeichnis unterschiedlich galt — Unveränderlichkeit, Untrusted-Content-Regel, Ganz-oder-gar-nicht-Ersetzung, Coverage-Erwartung waren universell. Die vier Ordner (articles/,documents/,notes/,assets/) trugen einen Namen, keine Regel, und keine der drei Gegenleistungen, die einen Verzeichnis-Split rechtfertigen, war eingelöst:raw/wird nie durchgeblättert (Zugriff läuft überraw_files:,sources trace,sources coverage; die browsbare Fläche ist das generiertekb/sources/INDEX.md), es gab null verzeichnis-lokale Konventionen, und alle vier verrotteten gleich schnell (nämlich gar nicht).Dem stand eine reale Kosten gegenüber: der Mensch traf beim Ablegen in
incoming/<typ>/eine Routing-Entscheidung, deren einzige Wirkung war, danach von Hand nachsource_typeabgeschrieben zu werden. Genau darüber entstand der in #66 korrigierte Bias —raw/notes/hielt laut altem Contract-Text „Gesprächsprotokolle", und von den 25 Dateien dort waren 16 Transkripte, 4 LLM-Analysen, 2 Tracker-Exporte und 3 tatsächliche Notizen. Das Sammelbecken entstand im Raw-Layer und wurde nachkb/durchgereicht.Der Drop-Punkt erhob das Einzige, was später fehlt. Zwei unabhängige Achsen, die gegenläufig laufen:
fidelity(wie treu ist die Erfassung) undauthority(was darf das Material über seinen Gegenstand behaupten). Ein Chat-Transkript istverbatim+reporting, eine LLM-Analyse über denselben Gegenstandsecondhand+opinion; Systemdoku und Webartikel sind beidepublished, abernormativegegenreporting. Beide Achsen bestehen den Worked-case-Test über vier heterogene Domänen,source_typebesteht ihn nicht — deshalb sind diese zwei Stack-Vokabular undsource_typebleibt Instanzsache (#68):Die vier Entscheidungen (Operator, 2026-09-08)
Alle vier wurden vor der Umsetzung getroffen, alle vier wie empfohlen — die Vorbereitungssitzung hatte sie als offen markiert, weil der ursprüngliche Body sie stillschweigend übersprungen hatte.
3a — Wer trägt die zwei Werte von
raw acceptbisnew source? Übergabe per Meldung. Der Body hatte vorausgesetzt, dassraw acceptdie Felder schreibt; das kann es ohne--pagenicht, weil die Source-Seite erst inwiki-ingestSchritt 6 entsteht. Umgesetzt: mit--pageschreibt es direkt auf die Zielseite (fill-once-geprüft), ohne--pagedruckt es die fertigenew source --set fidelity=… --set authority=…-Folgezeile, undnew sourceverweigert seinerseits ohne beide Werte. Verworfen: ein Handoff-Datensatz (neue maschinengelesene Datei mit Form, Lebensdauer und Aufräumregel für zwei Strings) und „Pflicht nur beinew source" (verfehlt den Drop-Punkt, weil dann erst gefragt würde, nachdem der Agent die Quelle gelesen hat und plausibel raten kann).3b —
UNSETTABLEgegen den Backfill. Fill-once statt Denylist. Der Body verlangte beide auftouch.pys Denylist und einen Backfill über den Bestand; das schließt sich aus, weilmigrate-corpus.mdFrontmatter ausdrücklich übertouchschreibt und Invariante 1 die Handkorrektur verbietet — mit Denylist gäbe es keinen erlaubten Schreibweg. Umgesetzt:touch --setschreibt ein Capture-Feld nur, solange es fehlt, und verweigert, sobald ein abweichender Wert steht. Verworfen: ein Sonderpfad nur für diese Migration, der genau einmal benutzt und danach dauerhaft mitgeschleppt worden wäre.3c — Wo steht die Feldliste? Im Type-Spec.
types/source.mddeklariertcapture_fields: [fidelity, authority],TypeResolver.get_capture_fieldsliest sie, drei Kommandos nutzen sie — statt dreifacher Hardcodierung (Invariante 8).5a — Die Schwellentabelle und wem sie gehört. Stackseitig, in
kb/CONTRACT.md. „Keine Formel" heißt nicht „keine Schwelle" — ohne eine feuert der Befund nie. Die Felder sind Stack-Vokabular, die Schwelle ist beratend, und eine Instanz, die sie anders will, ignoriert einen Hinweis statt eine Regel zu brechen. Verworfen: die Werte auskb/CONVENTIONS.mdlesen (hätte ein neues maschinengelesenes Format plusdocs verify-Check gekostet, und die Felder gehören nicht der Instanz).Versionsteil — MINOR. Drei Bedingungen, alle geprüft und im Changelog benannt:
raw accepttoleriert weiterhin einincoming/<irgendwas>/;fidelity/authoritygehen nicht inrequired:(sonst grenzüberschreitend nachversion-parts.md§ Katalog, „A type-spec's required fields"); die zwei neuen Pflichtflags sind dieselbe Einstufung, die #66snew source-Verweigerung im selben Kandidaten bekam.Was gebaut wurde
Datums-Shard.
raw acceptschreibt nachraw/YYYY/MM/<stem>bzw.raw/YYYY/MM/<stem>/für Bündel, berechnet aus dem Annahmedatum.raw_files:ist ein Identifier (Invariante 2), ein Shard darf also nie rebalancieren — damit fällt „nach Anzahl" aus, und zulässig bleibt nur eine reine Funktion von etwas Unveränderlichem. Das Accept-Datum ist zusätzlich append-only und hält als einziges fest, wann der Korpus etwas gelernt hat.incoming/ist flach; ein Unterverzeichnis wird toleriert und ignoriert statt inspiziert.Bündelort beim Hineinwachsen einer Bestandsdatei: am Elternverzeichnis der bestehenden Datei, nicht im heutigen Shard — ein Bündel aus altem und neuem Erfassungsdatum hätte keine eindeutig richtige Adresse.
Altbestand unbewegt.
raw/s Layout war nirgends versioniert (.wikitool-kb.jsonbeschreibt diekb/-Form,corpus_diff.pyvergleichtraw_filesals Wert), also gab es keine „zwei Korpusformen" zu versöhnen. Die vier alten Verzeichnisse bleiben gültige Pfade und--replaces-Ziele. Die Stem-Eindeutigkeit aus #64 gilt jetzt global überraw/, strukturell unterschieden (4-stelliges Jahr) statt über eine hartkodierte Liste alter Typnamen.Capture-Felder. Im Schema ohne
default:und nicht inrequired:; Pflicht im Werkzeug.unknownist backfill-only — wederraw acceptnochnew sourcedürfen es schreiben, nurtouch.raw accept --replacesist der einzige Weg, einen bereits gesetzten Wert zu überschreiben, weil eine korrigierte Erfassung eine neue Edition der Quelle ist und keine Bearbeitung der Seite.Beratender
lint-Befundconfidence_exceeds_source_standing, nicht inHARD_ERROR_KEYS, mit stackseitiger Obergrenzentabelle (Minimum aus beiden Spalten:reporting0.8,opinion0.6,secondhand/nontextual0.7;normative/verbatim/published/unknownohne Obergrenze). Keine Formel, weilconfidencebereits ausconfidence_baseabgeleitet wird und eine zweite Ableitung zwei widersprechende Antworten auf dieselbe Frage ergäbe — und weil Autorität eine Obergrenze ist, unter der eine Seite durch unabhängige Prüfung liegen darf, kein Determinant.Aufgeräumt.
dist_cmd.RAW_SUBDIRS,docs_verify.check_raw_subdirs/documented_raw_subdirs/RAW_DIR_CELL_RE, die Routing-Tabelle inraw/CONTRACT.md, die Ignore-Kanarie (incoming/documents/probe.pdf→incoming/probe.pdf), diedocs verify-Zeile intools/CONTRACT.md, der.gitignore-Kommentarblock,instructions/bootstrap.md.dist exportseedet jetztraw/.gitkeep+incoming/.gitkeepstatt acht Typ-Verzeichnisse. Menschendoku nachgezogen:README.md(Verzeichnisbaum, Ingest-Ablauf, Beispiel).Der Backfill (Publish 2/3)
29 Seiten, nicht 31. Die 31 waren eine Fehlzählung in der Vorbereitungssitzung —
find kb/sources -name '*.md'zähltINDEX.mdundCOLLECTION.mdmit. 29 deckt sich mit #66s Changelog und den 29 Raw-Dateien.Der Lauf hielt eine engere Regel als der laufende Betrieb, weil ein nachgetragener Wert erschlossen ist und nicht erhoben: ein echter Wert nur dort, wo die Art des Artefakts ihn aus dem Material selbst festlegt, sonst
unknown.verbatim+reportingsecondhand+opinionpublished+reportingpublished+normativeverbatim+normativeunknown+normativeunknown+reportingfidelity: unknownauf 4 von 29,authority: unknownauf 0. Die Asymmetrie ist das Ergebnis, nicht ein Mangel: die Zuständigkeitsfrage war überall aus dem Material beantwortbar, die Erfassungstreue nicht — der Enum hat keinen Wert für ein originär geschriebenes Artefakt. Genau die Grenze, dieunknownmarkieren soll.Der Fund, den der neue Befund produziert hat
Nach dem Backfill melden 67 von 152 Seiten mit
confidence_basemehr Konfidenz, als ihre Quellenlage trägt — 47 gegen die 0.8-Grenze (reporting), 20 gegen die 0.6-Grenze (opinion); betroffene Werte 21× 0.95, 19× 0.90, 9× 0.85, 15× 0.80.Das ist kein Fehlalarm und war auch nicht in diesem Paket zu beheben. Der Korpus ist zu gut der Hälfte aus Gesprächstranskripten kompiliert, und die Rubrik in
kb/CONVENTIONS.mdlässt Quellenzahl (+0.2 je Quelle, max +0.6) und Aktualität (+0.2) allein bis 0.95 laufen, während der Autoritätsterm (+0.1) der kleinste Summand ist. Ob daraus folgt, dass 67 Seiten überbewertet sind oder dass die 0.8-Grenze für einen selbstdokumentierenden Korpus zu eng ist, ist eine Entscheidung — sie liegt als Messung am Stub #60, der genau diesen Verdacht ohne Zahlen aufgeschrieben hatte. #60 bleibtstatus/incomingund wurde nicht ausgearbeitet.Die Transkripte wurden ausdrücklich nicht auf
normativehochgestuft, nur damit der Report leiser wird — das wäre Tuning der Daten auf den Check.Verifiziert
docs verify,instructions verifygrün.migrate verify --from HEAD --path kb/sources: 29 verglichen, 0 added/removed/moved, 0 findings — keine Wikilink-, Zitat-, Fußnoten- oder H1-Zahl angefasst.lint --fail-on-errorExit 0, keine harten Fehler;sources coverage0 unbeanspruchte Dateien, 0 gebrochene Referenzen, 0 Legacy-Seiten.setup-instance-Replay gegen einen frischendist export(„The distribution works as a fresh instance") und der nächtliche Drift-Check. Run 156 (46dfee0, reine Prosa) lief beim Schließen noch.CHEMENU_ROOT: Promotion nachraw/2026/09/, gedruckte Folgezeile,new source,touch-Verweigerung.Akzeptanzkriterien
raw acceptschreibt nachraw/YYYY/MM/<stem>;incoming/flach gelesen, Unterverzeichnis ignoriert statt verweigert.raw/; Test mit gleichem Stem in zwei Shards.raw/notes/.raw/bewegt;sources coverageweiterhin null unbeanspruchte Dateien.fidelity/authorityim Schema, ohnedefault:, nicht inrequired:;raw acceptundnew sourceverweigern ohne beide, mit Test.raw accept --fidelity unknownundnew source --set fidelity=unknownverweigert; nurtouchschreibtunknown, mit Test.touch --setschreibbar solange es fehlt, verweigert sobald es steht — Test für beide Richtungen.raw acceptohne--pagedruckt die fertigenew source-Folgezeile mit beiden Werten.types/source.mddeklariertcapture_fields:;raw_cmd.py/new_page.py/touch.pylesen sie vom Type-Resolver.fidelity: unknown, und das steht im Changelog.lintmeldet den Befund beratend, Schwellentabelle inkb/CONTRACT.md; 67 Fälle im Korpus belegen ihn.dist_cmd.RAW_SUBDIRS,check_raw_subdirs, Routing-Tabelle und Ignore-Kanarie entfernt bzw. nachgezogen;docs verifygrün.raw/CONTRACT.mdbeschreibt Shard, Capture-Felder und Verweigerungsregel;tools/CONTRACT.mdnennt den entfallenen Check nicht mehr.Was daraus offen weiterläuft
status/incoming) trägt jetzt die Messung zur Konfidenz-Kalibrierung als Notiz. Nicht ausgearbeitet, nicht triagiert — bewusst.docs/wurde auf Veralterung geprüft und ist aktuell:pipeline-rationale.mdsincoming/-Absatz beschreibt die Vertrauensgrenze (Promotion nachraw/), die unverändert gilt;ownership-and-templates.mds Eigentümerlinie ist genau die, nach der die Schwellentabelle stackseitig und die Rubrik instanzseitig liegt.work/backfill-capture-fields/ist geschlossen und gelöscht; seine dauerhaften Schlüsse stehen in den 29 Seiten selbst und im Changelog-Eintrag.Changelog: Body gegen den Baum gelesen (Vorbereitungssitzung 2026-09-08), Analyse unverändert, Umsetzungsteil nachgezogen. Neu bzw. korrigiert:
work/-Lauf ist überholt — #66 ist geschlossen,reclassify-source-typesabgeschlossen,work/leer. Der Backfill bekommt einen eigenen Lauf; dafür eine dreiteilige Abfolge mit getrennten Publishes ergänzt.fidelity/authoritygehen nicht inrequired:— sonst ist die Änderung nachversion-parts.md§ Katalog grenzüberschreitend. Als zweite MINOR-Bedingung in den Versionsteil aufgenommen; dritte Bedingung (neue Pflichtflags anraw accept) neu benannt.raw acceptkann die Felder ohne--pagegar nicht schreiben — die Source-Seite entsteht erst inwiki-ingestSchritt 6. Drei Trägeroptionen, Empfehlung (a).UNSETTABLEund der Backfill schließen sich aus (migrate-corpus.mdschreibt Frontmatter pertouch). Vorschlag: Fill-once statt Denylist.kb/CONVENTIONS.mdbenannt.dist_cmd.py:419(.gitkeep-Seeding), die Ignore-Kanarieincoming/documents/probe.pdf,tools/CONTRACT.md:74, drei Testdateien.unknown-Verweigerung,required:-Ausschluss).Re-Label:
kind/build→kind/decision. Vier Entscheidungen (3a, 3b, 5a, Versionsteil-Bedingung 3) liegen beim Operator und blockieren den ersten Commit; danach zurück aufkind/build.Entscheidungen gefallen (Operator, 2026-09-08): alle vier wie empfohlen.
raw acceptverlangt beide Flags, schreibt bei--pagedirekt, druckt sonst die fertigenew source-Zeile;new sourceverweigert ohne sie)touch --setschreibt ein Capture-Feld nur, solange es fehlt)kb/CONTRACT.md4.8.0-beta.8Body wird jetzt auf den entschiedenen Stand gebracht, Label zurück auf
kind/build. Umsetzung beginnt in dieser Sitzung.Changelog: Publish 1/3 gelaufen (Code + Verträge + Instruction),
4.8.0-beta.8. Body auf den erreichten Stand umgeschrieben: alle Akzeptanzkriterien außer dem Backfill (Publish 2/3) und der Belegzeile dazu (Publish 3/3) sind erledigt und mit den jeweiligen Testnamen belegt. Noch nicht committed/gepusht — Freigabe zum Publish steht noch aus.Changelog: Verifikation in den Body nachgetragen — Commits
f4353cc(Stack) undd9af88f(README-Nachzug), CI-Run 152 grün inkl.dist export-Replay als frische Instanz.docs/-Veralterungsprüfung ergänzt (keine Seite veraltet, mit Begründung je Seite). Sonst unverändert; die zwei offenen Kriterien bleiben Publish 2/3 und 3/3.Changelog: Body auf Endstand geschrieben und geschlossen. Neu gegenüber dem letzten Stand: Publish 2/3 (
00220f8, Backfill) und 3/3 (46dfee0, Belegzeile + Workshop geschlossen) sind gelandet; die vier Entscheidungen stehen jetzt mit ihren verworfenen Alternativen im Body statt nur als Verweis; Backfill-Verteilung und Begründung je Kombination ergänzt. Korrigiert: 29 Source-Seiten, nicht 31 — die höhere Zahl war eine Fehlzählung (INDEX.md/COLLECTION.mdmitgezählt). Ergebnis des Befunds nachgetragen: 67 von 152 Seiten über der Obergrenze, als Messung an #60 gehängt, dasstatus/incomingbleibt.