source_type: Default streichen, unclassified als sichtbares Fach, layout: fuer source - Paket A
#66
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?
Abgespalten von #59 (
7f74303,4.8.0-beta.6). Dort wurdelayout:fürconcepteingeführt und fürsourcezurückgestellt — mit einer Begründung, die sich beim Nachmessen als falsch herausgestellt hat.Umgesetzt und gepublisht:
b138fd8(Stack4.8.0-beta.7, Code + Korpus-Sweep),4c4dca3(README-Nachzug),f2a093b(Lauf geschlossen). Paket A von vier: A hier, B in #67 (Accept-Pfad), C in #68 (Profile und Setup), D in #69 (Reproduktionslauf).Befund
#59 argumentierte: „25 von 29 Source-Seiten sind
notes, die Aufteilung ergäbe eine Area und vier Splitter." Das maß das Sammelbecken, nicht die Realität. Aufgeschlüsselt nach dem, was die Seiten tatsächlich sind — aus Dateiname,author:und der Raw-Datei, nicht aus dem gesetztensource_type— und am Baum gegengezählt:29 Seiten, 22 umzuhängen.
specundimagestanden im Enum und hatten null Seiten.Die Ursache: der Default
Das Sammelbecken war nicht durch ein zu kleines Enum entstanden, sondern durch
default: notesintypes/source.schema.yaml— die Maschine wählte den unschärfsten Wert, sobald niemand widersprach. Das stand quer zur eigenen Doktrin aus AGENTS.md, dass Grenzen in Code gehören. Dazu kam, dass es unsichtbar war (notessah aus wie die größte und damit normalste Kategorie) und dass Leeren keine benannte Operation war (#68 holt das nach).Ein Sammelbecken an sich ist kein Fehler — das Wikiwiki-Prinzip verlangt eines. Es muss nur ein sichtbares Fach sein und kein Default. Ohne das Streichen des Defaults wäre die Neueinteilung eine Einmalreinigung gewesen, mit ihm ist sie eine Reparatur.
Entscheidungen
Subtype, kein eigener Page-Type. AI-Transkripte bekommen keinen Typ
types/transcript.md: der Stack ankert aufsource(kb_collections.STACK_REQUIRED_TYPES,sources coverage,[^cite-id]-Auflösung,sources rebuild-indexfragen allepage.kind == "source"), es gibt keinen strukturellen Frontmatter-Unterschied, und ein fünfterroot: kb-Type-Spec wäre ein fünftes.template, das jede neue Instanz ausfüllen muss — für eine Unterscheidung, die eine Enum-Zeile leistet.specundimagegestrichen. Beide null Seiten, beide in Erwartung aufgenommen statt aus einem echten Fall — genau der Worked-case-Guard, den #68 als Regel festschreibt.imageüberlappte mitraw/assets/,specwar gegendocumentnicht trennscharf. Am Baum bestätigt, dass die Verengung keine bestehende Instanz erreicht:dist_cmd._plan_types()schlüsselt jeden Type-Spec mitroot: kb— Default, also auchsource— samt.schema.yamlauf.templateum.Abdeckungsverlust: Fixture-Type-Spec (war „zu entscheiden"). Beim Nachmessen betraf er vier Tests, nicht drei. Drei hängen ohne Fixture auf
comparisonum (base_dir, aber wederlayout:nochsubtype_field:). Der vierte nicht:test_lint.pystest_the_area_recommendation_says_the_layout_is_missing_when_it_isbraucht einen Typ mit Subtype-Feld und ohnelayout:;comparisonfällt inunsharded_collections()beiif not counts: continueheraus. Ohne Fixture wäre derlayout_declared is False-Zweig inlint_core.pyunerreichbar geworden — ein toter Zweig im Report-Renderer, kein bloß verlorenes Beispiel. Umgesetzt als tmp-types/-Kopie plusbadtype.md, gefüllt nachcomparisons/stattsources/, damit die echten Source-Seiten des Fixtures sich nicht in die Zählung mischen.trackerbei zwei Seiten wurde als bewusste Ausnahme der ≥3-Regel aus #68 aufgenommen — der Bestand wächst mit jedem Issue-Ingest, und die Alternative wäre, dieselben zwei Seiten später ein zweites Mal zu bewegen.Was umgesetzt wurde
Schema und Type-Spec.
default: notesentfernt; Enum jetzttranscript, analysis, article, document, notes, tracker, unclassified.types/source.mddeklariert einlayout:über alle sieben Werte mit deutschen Anzeigetiteln. Das war nicht kosmetisch: der Pluralisierungs-Fallback insubtype_dirhätte für zwei Werte Müll erzeugt (notes→notess,analysis→analysiss).Die Verweigerung brauchte keinen neuen Code —
_build_frontmatterlässt ein Feld ohnedefault:weg,_validate_or_failläuft vor jedem Schreibzugriff, undnew sourcescheitert an'source_type' is a required property, bevor Datei oder Verzeichnis entstehen.lint. Neuer beratender Befundunclassified_source_pages, nicht inHARD_ERROR_KEYS— dieselbe Klasse wieunsharded_collections. Ein Korpus, dessen einziger Befund dieser ist, bleibt grün.Prosa (von keinem Check erfasst, deshalb hier einzeln benannt):
instructions/wiki-ingest/SKILL.mdübergibt--set source_type=und sagt, wie der Wert gewählt wird — ohne das hätte der wegfallende Default jeden künftigen Ingest gebrochen.types/type-spec.mdnenntsourcenicht mehr als worked example fürs Flachlassen; der Gegensatz ist jetzt „kein Subtype-Feld" (comparison) gegen „schiefes Feld wird repariert, nicht flach gelassen".tools/CONTRACT.mdslint-Zeile nennt den neuen Befund.kb/sources/COLLECTION.mdbeschreibt die Areas und die Autorschafts-Trennung.instructions/dev/corpus-policy.mdträgt die Floor-Ausnahme.README.mdzog nach (4c4dca3) — dort standkb/sources/zweimal als „no areas by choice"; das Beispiel fürs Flachlassen ist jetztkb/comparisons/.Korpus-Lauf in
work/reclassify-source-types/: 22 Seiten pertouch --set source_type=…, dannmove --reconcile(29 Seiten),index rebuild,migrate verify,lint. Lauf mitwork closegeschlossen und Verzeichnis gelöscht (f2a093b);plan.mdundREADME.mdbleiben überb138fd8in der Historie lesbar.Vorgehen: eigener Lauf statt geteiltem mit #67
Enum-Erweiterung und Sweep sind untrennbar:
corpus-policy.mdfordert ≥ 1 Seite pro deklariertem Subtype, also wäre der Floor in dem Moment gebrochen, in demtranscript/analysis/trackerim Enum stehen und keine Seite sie trägt.Eine frühere Fassung dieses Bodys sah den Sweep gemeinsam mit #67 vor und widersprach sich damit selbst. Entschieden 2026-09-08: #66 sweept selbst — #67 ist
size/Lund nicht begonnen, und bis dahin hätte der Subtype-Floor verletzt gelegen. Preis ist ein zweites Mass-Update-Gate, wenn #67 seinenfidelity/authority-Backfill über dieselben Seiten fährt; das ist die billigere Hälfte des Tauschs.Nicht angefasst und bei #67 geblieben:
raw/CONTRACT.mds Routing-Tabelle.Versionsteil
MINOR (
4.8.0-beta.6→4.8.0-beta.7), geprüft gegeninstructions/dev/version-parts.md. Forward: eine Instanz besitzt ihr eigenestypes/source.md(Auslieferung nur als.template), kopierttools//types//instructions/über sich und bleibt funktionsfähig, ohne Handarbeit. Backward: kein maschinengelesenes Format umgeschrieben,.wikitool-kb.jsonunberührt — dies ist keine Korpus-Migration, nur ein Sweep innerhalb der bestehenden Form. Kein--breaking, kein Migrationsdokument. Die Nachzüge4c4dca3(Prosa) undf2a093b(Lauf-Cleanup) bumpen nicht.Der Kandidat bleibt offen:
release.yml(Run 195) lief aufb138fd8durch und hat keinen Release geschnitten — neuester Release ist unverändertv4.7.4. Genau das Verhalten, dasversion-parts.md§ Kandidatenmodell beschreibt.Akzeptanzkriterien
types/source.schema.yamlhat keindefault:aufsource_type;wikitool new sourceverweigert ohne expliziten Wert (test_new_source_rejects_missing_source_type) und legt dabei weder Datei noch Verzeichnis an.transcript, analysis, article, document, notes, tracker, unclassified;specundimagesind entfernt.types/source.mddeklariert einlayout:, das jeden Enum-Wert abdeckt, mit Verzeichnis und deutschem Anzeigetitel;test_source_layout_covers_every_declared_source_typehält Layout und Enum deckungsgleich.lintmeldetsource_type: unclassifiedals beratenden Befund;unclassified_source_pagessteht nicht inHARD_ERROR_KEYS.tools/CONTRACT.mdslint-Zeile nennt den neuen Befund;docs verifygrün.instructions/wiki-ingest/SKILL.mdübergibt--set source_type=und begründet die Wahl;instructions verifygrün,instructions syncgelaufen.types/type-spec.mdnenntsourcenicht mehr als Beispiel für ein bewusst fehlendeslayout:.test_page_subdir_is_none_for_types_without_layout, der beim Lauf auffiel); derlayout_declared is False-Zweig ist über den Fixture-Type-Spec weiterhin abgedeckt.wikitool search --field source_type=<v>bestätigt: transcript 16, analysis 4, article 3, notes 3, tracker 2, document 1, unclassified 0.corpus-policy.mdgehalten: jeder deklarierte Wert ≥ 1 Seite, Ausnahmeunclassified(0, per Konstruktion) ist dort notiert.move --reconcileliegt jede der 29 Source-Seiten in ihrer Area;migrate verify --from HEADbestätigt182 compared, 0 added, 0 removed, 29 moved, 22 findings— die 22 sind exakt die beabsichtigtensource_type-Änderungen, keine Wikilink- oder Zitatzahl betroffen.index rebuilderzeugt sechs Areas, keine über der Shard-Schwelle;lint --fail-on-errorexit 0,misplaced_pages,nested_pagesundunclassified_source_pagesalle leer.kb/sources/COLLECTION.mdbeschreibt die Areas und sagt, dass die Autorschaftanalysisvondocumenttrennt.work/reclassify-source-types/angelegt, getragen, mitwork closegeschlossen, inkb/log.mdprotokolliert.--minor, ohne--breaking, ohne Migrationsdokument.Verifikation
pytest: 1057 Tests grün (lokal,tools/.venv).tools/wikitool docs verify: 52 Kommandos dokumentiert,CHANGES.mddeckt4.8.0-beta.7.tools/wikitool instructions verify: 20 Instructions, 7 Skills, 14 publizierte Kopien deckungsgleich.tools/wikitool migrate verify --from HEAD:182 compared, 0 added, 0 removed, 29 moved.tools/wikitool lint --fail-on-error: exit 0. Verbleibende Befunde sind die vorbestehenden advisory-Klassen (orphan_pages,redundant_see_also), unverändert durch dieses Paket.b138fd8(der substanzielle Commit): Run 194 (ci.yml) success, Run 195 (release.yml) success ohne Release-Schnitt.4c4dca3undf2a093blief beim Schließen dieses Issues noch — beide sind Prosa bzw. Verzeichnis-Cleanup ohne Verhaltensänderung, und der lokale Vollcheck war für beide grün.Modelle je Phase
Design, Versionsteil und Boundary-Beurteilung: Opus. Mechanischer Mittelteil (Schema,
layout:,lint-Befund, Tests, Bump): ebenfalls Opus — der Wechsel auf Sonnet wurde am Ende der Vorbereitung angeboten, aber nicht vollzogen, weil die Umsetzung direkt in derselben Sitzung startete. Abschlussphase: Opus. Alle drei Phasen also auf demselben Modell; die mittlere teurer als nötig, die beiden ungeprüften Phasen auf dem Modell, das sie verlangen.`source_type: notes` ist ein Sammelbecken - Enum um transcript/analysis/tracker erweitern und `layout:` fuer sourceto source_type: Default streichen, `unclassified` als sichtbares Fach, `layout:` fuer source - Paket ABody neu gefasst nach der Architekturdiskussion vom 2026-09-08. Was sich gegen den vorigen Stand geändert hat:
default: notesintypes/source.schema.yaml:10. Das Streichen dieses Defaults ist jetzt Punkt 1 und der eigentliche Hebel — ohne ihn wäre der Sweep eine Einmalreinigung.unclassifiedneu aufgenommen als sichtbares Fach mit eigener Area und beratendemlint-Befund. Damit wirdnoteswieder eine ehrliche Kategorie statt eines Abflusses. Ein Sammelbecken ist kein Fehler, ein unsichtbarer Default ist einer.spec/imagewerden gestrichen (in Erwartung aufgenommen, nie belegt — der Worked-case-Guard). Die Abgrenzunganalysisgegendocumentläuft über die Autorschaft und gehört inkb/sources/COLLECTION.md.trackerbleibt bei zwei Seiten drin, aber als notierte Ausnahme der ≥3-Regel aus #68, nicht durch Umformulieren der Regel.kind/decisionaufkind/build,area/kbergänzt.Abgespalten: #67 (Accept-Pfad: Datums-Shard,
fidelity/authority), #68 (Profilkatalog, Setup-Frage,manual:-Instruction), #69 (Reproduktionslauf).Changelog: Body gegen den Baum geprüft und auf Umsetzungsreife gebracht (Opus, 2026-09-08). Verteilung und
.template-Argument bestätigt, keine Korrektur nötig. Geändert:work/-Lauf (reclassify-source-types) und schließt danach, statt auf #67 zu warten. Die alte Fassung sagte gleichzeitig „untrennbar" und „gemeinsamer Lauf mit #67"; beides zusammen ging nicht, und der Preis für den geteilten Lauf wäre ein über die gesamte Laufzeit von #67 (size/L) verletzter Subtype-Floor gewesen. Zweites Mass-Update-Gate akzeptiert.test_lint.py:296— ohne ihn wird derlayout_declared is False-Zweig inlint_core.py:566unerreichbar. Die anderen drei hängen ohne Fixture aufcomparisonum.instructions/wiki-ingest/SKILL.md:73ruftnew sourceohnesource_typeauf (bricht jeden Ingest);types/type-spec.md:102-110nenntsourceals worked example fürs Flachlassen;tools/CONTRACT.md:54zählt die lint-Befunde auf;test_new_page.py:203prüft den Default;test_lint.py:326s Docstring beschreibt den alten Korpus.new sourcebraucht keinen neuen Code —_validate_or_failläuft vor jedem Schreibzugriff. Nur Schema-Zeile weg plus Test.notessundanalysiss.--breaking, kein Migrationsdokument.raw/CONTRACT.mds Routing-Tabelle bleibt liegen.Changelog: Body auf Endstand gebracht und Paket abgeschlossen. Gegenüber der Vorbereitungsfassung:
test_new_source_rejects_missing_source_type,test_source_layout_covers_every_declared_source_type), diemigrate verify-Zahlen und die tatsächliche Endverteilung auswikitool search --field.docs verify,instructions verify,migrate verify,lint --fail-on-errorexit 0, plus die CI-Runs.test_page_subdir_is_none_for_types_without_layoutbenutztesourceebenfalls als „kein Layout"-Beispiel. Dazu neun Testdateien-Anpassungen, die aus demlayout:folgten — die Fixture-Source-Seite liegt jetzt untersources/notes/, undnew source-Aufrufe in Tests brauchen--set source_type=.4c4dca3):kb/sources/stand dort zweimal als „no areas by choice" bzw. als worked example fürs Flachlassen. Das Beispiel ist jetztkb/comparisons/(kein Subtype-Feld), und der schiefe-Feld-Fall wird als „reparieren statt flach lassen" beschrieben. Kein Bump — prosaonly.docs/geprüft: keine Seite veraltet.ownership-and-templates.mdbeschreibt dieroot: kb-Type-Spec-Ownership, auf die sich das.template-Argument dieses Issues stützt, ohne die Grenze zu verschieben.Modelle je Phase (
instructions/claude-code-model-selection.md): Design, Versionsteil und die Boundary-Beurteilung liefen auf Opus — inklusive der Sweep-Sequenzierung, des Punkt-8-Abdeckungsverlusts und der Drop-in-Prüfung. Der mechanische Mittelteil (Schema,layout:,lint-Befund, Tests, Bump) lief ebenfalls auf Opus: der Wechsel auf Sonnet wurde am Ende der Vorbereitung angeboten, aber nicht vollzogen, weil der Nutzer die Umsetzung direkt in derselben Sitzung startete. Diese Abschlussphase läuft auf Opus. Alle drei Phasen also auf demselben Modell — die mittlere teurer als nötig, die beiden ungeprüften Phasen auf dem Modell, das sie verlangen.Changelog: Geschlossen. Gegenüber dem vorigen Stand: Lauf-Cleanup ergänzt (
work close,f2a093b, inkb/log.mdprotokolliert), CI-Zeile auf das tatsächliche Ergebnis präzisiert (194 und 195 grün aufb138fd8, 195 hat korrekt keinen Release aus dem-beta.7-Kandidaten geschnitten — neuester Release bleibtv4.7.4), und die Modell-Zuordnung aus dem Kommentar in den Body übernommen, damit sie im geschlossenen Stand mitliest.