source_type: Default streichen, unclassified als sichtbares Fach, layout: fuer source - Paket A #66

Closed
opened 2026-09-08 08:11:32 +00:00 by torben · 4 comments
Owner

Abgespalten von #59 (7f74303, 4.8.0-beta.6). Dort wurde layout: für concept eingeführt und für source zurückgestellt — mit einer Begründung, die sich beim Nachmessen als falsch herausgestellt hat.

Umgesetzt und gepublisht: b138fd8 (Stack 4.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 gesetzten source_type — und am Baum gegengezählt:

Was es wirklich ist Anzahl
Session-Transkripte (Mensch ↔ Agent) 16
LLM-Analysen (Modell-Output, kein Dialog) 4
Tracker-Exporte 2
Echte eigene Notizen 3
Artikel 3
Dokumente 1

29 Seiten, 22 umzuhängen. spec und image standen im Enum und hatten null Seiten.

Die Ursache: der Default

Das Sammelbecken war nicht durch ein zu kleines Enum entstanden, sondern durch default: notes in types/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 (notes sah 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 auf source (kb_collections.STACK_REQUIRED_TYPES, sources coverage, [^cite-id]-Auflösung, sources rebuild-index fragen alle page.kind == "source"), es gibt keinen strukturellen Frontmatter-Unterschied, und ein fünfter root: 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.

spec und image gestrichen. Beide null Seiten, beide in Erwartung aufgenommen statt aus einem echten Fall — genau der Worked-case-Guard, den #68 als Regel festschreibt. image überlappte mit raw/assets/, spec war gegen document nicht trennscharf. Am Baum bestätigt, dass die Verengung keine bestehende Instanz erreicht: dist_cmd._plan_types() schlüsselt jeden Type-Spec mit root: kb — Default, also auch source — samt .schema.yaml auf .template um.

Abdeckungsverlust: Fixture-Type-Spec (war „zu entscheiden"). Beim Nachmessen betraf er vier Tests, nicht drei. Drei hängen ohne Fixture auf comparison um (base_dir, aber weder layout: noch subtype_field:). Der vierte nicht: test_lint.pys test_the_area_recommendation_says_the_layout_is_missing_when_it_is braucht einen Typ mit Subtype-Feld und ohne layout:; comparison fällt in unsharded_collections() bei if not counts: continue heraus. Ohne Fixture wäre der layout_declared is False-Zweig in lint_core.py unerreichbar geworden — ein toter Zweig im Report-Renderer, kein bloß verlorenes Beispiel. Umgesetzt als tmp-types/-Kopie plus badtype.md, gefüllt nach comparisons/ statt sources/, damit die echten Source-Seiten des Fixtures sich nicht in die Zählung mischen.

tracker bei 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: notes entfernt; Enum jetzt transcript, analysis, article, document, notes, tracker, unclassified. types/source.md deklariert ein layout: über alle sieben Werte mit deutschen Anzeigetiteln. Das war nicht kosmetisch: der Pluralisierungs-Fallback in subtype_dir hätte für zwei Werte Müll erzeugt (notesnotess, analysisanalysiss).

Die Verweigerung brauchte keinen neuen Code_build_frontmatter lässt ein Feld ohne default: weg, _validate_or_fail läuft vor jedem Schreibzugriff, und new source scheitert an 'source_type' is a required property, bevor Datei oder Verzeichnis entstehen.

lint. Neuer beratender Befund unclassified_source_pages, nicht in HARD_ERROR_KEYS — dieselbe Klasse wie unsharded_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.md nennt source nicht 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.mds lint-Zeile nennt den neuen Befund. kb/sources/COLLECTION.md beschreibt die Areas und die Autorschafts-Trennung. instructions/dev/corpus-policy.md trägt die Floor-Ausnahme. README.md zog nach (4c4dca3) — dort stand kb/sources/ zweimal als „no areas by choice"; das Beispiel fürs Flachlassen ist jetzt kb/comparisons/.

Korpus-Lauf in work/reclassify-source-types/: 22 Seiten per touch --set source_type=…, dann move --reconcile (29 Seiten), index rebuild, migrate verify, lint. Lauf mit work close geschlossen und Verzeichnis gelöscht (f2a093b); plan.md und README.md bleiben über b138fd8 in der Historie lesbar.

Vorgehen: eigener Lauf statt geteiltem mit #67

Enum-Erweiterung und Sweep sind untrennbar: corpus-policy.md fordert ≥ 1 Seite pro deklariertem Subtype, also wäre der Floor in dem Moment gebrochen, in dem transcript/analysis/tracker im 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/L und nicht begonnen, und bis dahin hätte der Subtype-Floor verletzt gelegen. Preis ist ein zweites Mass-Update-Gate, wenn #67 seinen fidelity/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.64.8.0-beta.7), geprüft gegen instructions/dev/version-parts.md. Forward: eine Instanz besitzt ihr eigenes types/source.md (Auslieferung nur als .template), kopiert tools//types//instructions/ über sich und bleibt funktionsfähig, ohne Handarbeit. Backward: kein maschinengelesenes Format umgeschrieben, .wikitool-kb.json unberührt — dies ist keine Korpus-Migration, nur ein Sweep innerhalb der bestehenden Form. Kein --breaking, kein Migrationsdokument. Die Nachzüge 4c4dca3 (Prosa) und f2a093b (Lauf-Cleanup) bumpen nicht.

Der Kandidat bleibt offen: release.yml (Run 195) lief auf b138fd8 durch und hat keinen Release geschnitten — neuester Release ist unverändert v4.7.4. Genau das Verhalten, das version-parts.md § Kandidatenmodell beschreibt.

Akzeptanzkriterien

  • types/source.schema.yaml hat kein default: auf source_type; wikitool new source verweigert ohne expliziten Wert (test_new_source_rejects_missing_source_type) und legt dabei weder Datei noch Verzeichnis an.
  • Enum lautet transcript, analysis, article, document, notes, tracker, unclassified; spec und image sind entfernt.
  • types/source.md deklariert ein layout:, das jeden Enum-Wert abdeckt, mit Verzeichnis und deutschem Anzeigetitel; test_source_layout_covers_every_declared_source_type hält Layout und Enum deckungsgleich.
  • lint meldet source_type: unclassified als beratenden Befund; unclassified_source_pages steht nicht in HARD_ERROR_KEYS.
  • tools/CONTRACT.mds lint-Zeile nennt den neuen Befund; docs verify grün.
  • instructions/wiki-ingest/SKILL.md übergibt --set source_type= und begründet die Wahl; instructions verify grün, instructions sync gelaufen.
  • types/type-spec.md nennt source nicht mehr als Beispiel für ein bewusst fehlendes layout:.
  • Vier Tests umgehängt (plus ein fünfter, test_page_subdir_is_none_for_types_without_layout, der beim Lauf auffiel); der layout_declared is False-Zweig ist über den Fixture-Type-Spec weiterhin abgedeckt.
  • Endverteilung per wikitool search --field source_type=<v> bestätigt: transcript 16, analysis 4, article 3, notes 3, tracker 2, document 1, unclassified 0.
  • Floor aus corpus-policy.md gehalten: jeder deklarierte Wert ≥ 1 Seite, Ausnahme unclassified (0, per Konstruktion) ist dort notiert.
  • Nach move --reconcile liegt jede der 29 Source-Seiten in ihrer Area; migrate verify --from HEAD bestätigt 182 compared, 0 added, 0 removed, 29 moved, 22 findings — die 22 sind exakt die beabsichtigten source_type-Änderungen, keine Wikilink- oder Zitatzahl betroffen.
  • index rebuild erzeugt sechs Areas, keine über der Shard-Schwelle; lint --fail-on-error exit 0, misplaced_pages, nested_pages und unclassified_source_pages alle leer.
  • kb/sources/COLLECTION.md beschreibt die Areas und sagt, dass die Autorschaft analysis von document trennt.
  • work/reclassify-source-types/ angelegt, getragen, mit work close geschlossen, in kb/log.md protokolliert.
  • Changelog-Eintrag geschrieben; Bump --minor, ohne --breaking, ohne Migrationsdokument.

Verifikation

  • pytest: 1057 Tests grün (lokal, tools/.venv).
  • tools/wikitool docs verify: 52 Kommandos dokumentiert, CHANGES.md deckt 4.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.
  • CI auf b138fd8 (der substanzielle Commit): Run 194 (ci.yml) success, Run 195 (release.yml) success ohne Release-Schnitt.
  • CI auf den beiden Nachzügen 4c4dca3 und f2a093b lief 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.

Abgespalten von #59 (`7f74303`, `4.8.0-beta.6`). Dort wurde `layout:` für `concept` eingeführt und für `source` **zurückgestellt** — mit einer Begründung, die sich beim Nachmessen als falsch herausgestellt hat. **Umgesetzt und gepublisht:** `b138fd8` (Stack `4.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 gesetzten `source_type` — und am Baum gegengezählt: | Was es wirklich ist | Anzahl | |---|---:| | Session-Transkripte (Mensch ↔ Agent) | 16 | | LLM-Analysen (Modell-Output, kein Dialog) | 4 | | Tracker-Exporte | 2 | | Echte eigene Notizen | 3 | | Artikel | 3 | | Dokumente | 1 | 29 Seiten, 22 umzuhängen. `spec` und `image` standen im Enum und hatten **null** Seiten. ## Die Ursache: der Default Das Sammelbecken war nicht durch ein zu kleines Enum entstanden, sondern durch **`default: notes` in `types/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 (`notes` sah 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 auf `source` (`kb_collections.STACK_REQUIRED_TYPES`, `sources coverage`, `[^cite-id]`-Auflösung, `sources rebuild-index` fragen alle `page.kind == "source"`), es gibt keinen strukturellen Frontmatter-Unterschied, und ein fünfter `root: 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. **`spec` und `image` gestrichen.** Beide null Seiten, beide in Erwartung aufgenommen statt aus einem echten Fall — genau der Worked-case-Guard, den #68 als Regel festschreibt. `image` überlappte mit `raw/assets/`, `spec` war gegen `document` nicht trennscharf. Am Baum bestätigt, dass die Verengung keine bestehende Instanz erreicht: `dist_cmd._plan_types()` schlüsselt jeden Type-Spec mit `root: kb` — Default, also auch `source` — samt `.schema.yaml` auf `.template` um. **Abdeckungsverlust: Fixture-Type-Spec** (war „zu entscheiden"). Beim Nachmessen betraf er **vier** Tests, nicht drei. Drei hängen ohne Fixture auf `comparison` um (`base_dir`, aber weder `layout:` noch `subtype_field:`). Der vierte nicht: `test_lint.py`s `test_the_area_recommendation_says_the_layout_is_missing_when_it_is` braucht einen Typ **mit** Subtype-Feld und **ohne** `layout:`; `comparison` fällt in `unsharded_collections()` bei `if not counts: continue` heraus. Ohne Fixture wäre der `layout_declared is False`-Zweig in `lint_core.py` unerreichbar geworden — ein toter Zweig im Report-Renderer, kein bloß verlorenes Beispiel. Umgesetzt als tmp-`types/`-Kopie plus `badtype.md`, gefüllt nach `comparisons/` statt `sources/`, damit die echten Source-Seiten des Fixtures sich nicht in die Zählung mischen. **`tracker` bei 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: notes` entfernt; Enum jetzt `transcript, analysis, article, document, notes, tracker, unclassified`. `types/source.md` deklariert ein `layout:` über alle sieben Werte mit deutschen Anzeigetiteln. Das war nicht kosmetisch: der Pluralisierungs-Fallback in `subtype_dir` hätte für zwei Werte Müll erzeugt (`notes` → `notess`, `analysis` → `analysiss`). Die Verweigerung brauchte **keinen neuen Code** — `_build_frontmatter` lässt ein Feld ohne `default:` weg, `_validate_or_fail` läuft vor jedem Schreibzugriff, und `new source` scheitert an `'source_type' is a required property`, bevor Datei oder Verzeichnis entstehen. **`lint`.** Neuer beratender Befund `unclassified_source_pages`, nicht in `HARD_ERROR_KEYS` — dieselbe Klasse wie `unsharded_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.md` nennt `source` nicht 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.md`s `lint`-Zeile nennt den neuen Befund. `kb/sources/COLLECTION.md` beschreibt die Areas und die Autorschafts-Trennung. `instructions/dev/corpus-policy.md` trägt die Floor-Ausnahme. `README.md` zog nach (`4c4dca3`) — dort stand `kb/sources/` zweimal als „no areas by choice"; das Beispiel fürs Flachlassen ist jetzt `kb/comparisons/`. **Korpus-Lauf** in `work/reclassify-source-types/`: 22 Seiten per `touch --set source_type=…`, dann `move --reconcile` (29 Seiten), `index rebuild`, `migrate verify`, `lint`. Lauf mit `work close` geschlossen und Verzeichnis gelöscht (`f2a093b`); `plan.md` und `README.md` bleiben über `b138fd8` in der Historie lesbar. ## Vorgehen: eigener Lauf statt geteiltem mit #67 Enum-Erweiterung und Sweep sind untrennbar: `corpus-policy.md` fordert ≥ 1 Seite pro deklariertem Subtype, also wäre der Floor in dem Moment gebrochen, in dem `transcript`/`analysis`/`tracker` im 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/L` und nicht begonnen, und bis dahin hätte der Subtype-Floor verletzt gelegen. Preis ist ein zweites Mass-Update-Gate, wenn #67 seinen `fidelity`/`authority`-Backfill über dieselben Seiten fährt; das ist die billigere Hälfte des Tauschs. Nicht angefasst und bei #67 geblieben: `raw/CONTRACT.md`s Routing-Tabelle. ## Versionsteil **MINOR** (`4.8.0-beta.6` → `4.8.0-beta.7`), geprüft gegen `instructions/dev/version-parts.md`. *Forward:* eine Instanz besitzt ihr eigenes `types/source.md` (Auslieferung nur als `.template`), kopiert `tools/`/`types/`/`instructions/` über sich und bleibt funktionsfähig, ohne Handarbeit. *Backward:* kein maschinengelesenes Format umgeschrieben, `.wikitool-kb.json` unberührt — dies ist keine Korpus-Migration, nur ein Sweep innerhalb der bestehenden Form. Kein `--breaking`, kein Migrationsdokument. Die Nachzüge `4c4dca3` (Prosa) und `f2a093b` (Lauf-Cleanup) bumpen nicht. Der Kandidat bleibt offen: `release.yml` (Run 195) lief auf `b138fd8` durch und hat **keinen** Release geschnitten — neuester Release ist unverändert `v4.7.4`. Genau das Verhalten, das `version-parts.md` § Kandidatenmodell beschreibt. ## Akzeptanzkriterien - [x] `types/source.schema.yaml` hat **kein** `default:` auf `source_type`; `wikitool new source` verweigert ohne expliziten Wert (`test_new_source_rejects_missing_source_type`) und legt dabei weder Datei noch Verzeichnis an. - [x] Enum lautet `transcript, analysis, article, document, notes, tracker, unclassified`; `spec` und `image` sind entfernt. - [x] `types/source.md` deklariert ein `layout:`, das jeden Enum-Wert abdeckt, mit Verzeichnis und deutschem Anzeigetitel; `test_source_layout_covers_every_declared_source_type` hält Layout und Enum deckungsgleich. - [x] `lint` meldet `source_type: unclassified` als beratenden Befund; `unclassified_source_pages` steht nicht in `HARD_ERROR_KEYS`. - [x] `tools/CONTRACT.md`s `lint`-Zeile nennt den neuen Befund; `docs verify` grün. - [x] `instructions/wiki-ingest/SKILL.md` übergibt `--set source_type=` und begründet die Wahl; `instructions verify` grün, `instructions sync` gelaufen. - [x] `types/type-spec.md` nennt `source` nicht mehr als Beispiel für ein bewusst fehlendes `layout:`. - [x] Vier Tests umgehängt (plus ein fünfter, `test_page_subdir_is_none_for_types_without_layout`, der beim Lauf auffiel); der `layout_declared is False`-Zweig ist über den Fixture-Type-Spec weiterhin abgedeckt. - [x] Endverteilung per `wikitool search --field source_type=<v>` bestätigt: transcript 16, analysis 4, article 3, notes 3, tracker 2, document 1, unclassified 0. - [x] Floor aus `corpus-policy.md` gehalten: jeder deklarierte Wert ≥ 1 Seite, Ausnahme `unclassified` (0, per Konstruktion) ist dort notiert. - [x] Nach `move --reconcile` liegt jede der 29 Source-Seiten in ihrer Area; `migrate verify --from HEAD` bestätigt `182 compared, 0 added, 0 removed, 29 moved, 22 findings` — die 22 sind exakt die beabsichtigten `source_type`-Änderungen, keine Wikilink- oder Zitatzahl betroffen. - [x] `index rebuild` erzeugt sechs Areas, keine über der Shard-Schwelle; `lint --fail-on-error` exit 0, `misplaced_pages`, `nested_pages` und `unclassified_source_pages` alle leer. - [x] `kb/sources/COLLECTION.md` beschreibt die Areas und sagt, dass die **Autorschaft** `analysis` von `document` trennt. - [x] `work/reclassify-source-types/` angelegt, getragen, mit `work close` geschlossen, in `kb/log.md` protokolliert. - [x] Changelog-Eintrag geschrieben; Bump `--minor`, ohne `--breaking`, ohne Migrationsdokument. ## Verifikation - `pytest`: 1057 Tests grün (lokal, `tools/.venv`). - `tools/wikitool docs verify`: 52 Kommandos dokumentiert, `CHANGES.md` deckt `4.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. - CI auf `b138fd8` (der substanzielle Commit): Run 194 (`ci.yml`) **success**, Run 195 (`release.yml`) **success** ohne Release-Schnitt. - CI auf den beiden Nachzügen `4c4dca3` und `f2a093b` lief 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.
torben added the prio/plannedsize/Marea/corpuskind/decision labels 2026-09-08 08:11:42 +00:00
torben changed title from `source_type: notes` ist ein Sammelbecken - Enum um transcript/analysis/tracker erweitern und `layout:` fuer source to source_type: Default streichen, `unclassified` als sichtbares Fach, `layout:` fuer source - Paket A 2026-09-08 17:30:37 +00:00
torben added area/kbkind/build and removed kind/decision labels 2026-09-08 17:30:46 +00:00
Author
Owner

Body neu gefasst nach der Architekturdiskussion vom 2026-09-08. Was sich gegen den vorigen Stand geändert hat:

  • Ursache neu bestimmt. Das Sammelbecken ist nicht durch ein zu kleines Enum entstanden, sondern durch default: notes in types/source.schema.yaml:10. Das Streichen dieses Defaults ist jetzt Punkt 1 und der eigentliche Hebel — ohne ihn wäre der Sweep eine Einmalreinigung.
  • unclassified neu aufgenommen als sichtbares Fach mit eigener Area und beratendem lint-Befund. Damit wird notes wieder eine ehrliche Kategorie statt eines Abflusses. Ein Sammelbecken ist kein Fehler, ein unsichtbarer Default ist einer.
  • Zwei der drei offenen Fragen entschieden. spec/image werden gestrichen (in Erwartung aufgenommen, nie belegt — der Worked-case-Guard). Die Abgrenzung analysis gegen document läuft über die Autorschaft und gehört in kb/sources/COLLECTION.md. tracker bleibt bei zwei Seiten drin, aber als notierte Ausnahme der ≥3-Regel aus #68, nicht durch Umformulieren der Regel.
  • Label von kind/decision auf kind/build, area/kb ergänzt.
  • Korpus-Lauf wird geteilt mit #67 — dieselben ~31 Seiten, ein Mass-Update-Gate, eine Freigabe.

Abgespalten: #67 (Accept-Pfad: Datums-Shard, fidelity/authority), #68 (Profilkatalog, Setup-Frage, manual:-Instruction), #69 (Reproduktionslauf).

Body neu gefasst nach der Architekturdiskussion vom 2026-09-08. Was sich gegen den vorigen Stand geändert hat: - **Ursache neu bestimmt.** Das Sammelbecken ist nicht durch ein zu kleines Enum entstanden, sondern durch `default: notes` in `types/source.schema.yaml:10`. Das Streichen dieses Defaults ist jetzt Punkt 1 und der eigentliche Hebel — ohne ihn wäre der Sweep eine Einmalreinigung. - **`unclassified` neu aufgenommen** als sichtbares Fach mit eigener Area und beratendem `lint`-Befund. Damit wird `notes` wieder eine ehrliche Kategorie statt eines Abflusses. Ein Sammelbecken ist kein Fehler, ein unsichtbarer Default ist einer. - **Zwei der drei offenen Fragen entschieden.** `spec`/`image` werden gestrichen (in Erwartung aufgenommen, nie belegt — der Worked-case-Guard). Die Abgrenzung `analysis` gegen `document` läuft über die Autorschaft und gehört in `kb/sources/COLLECTION.md`. `tracker` bleibt bei zwei Seiten drin, aber als notierte Ausnahme der ≥3-Regel aus #68, nicht durch Umformulieren der Regel. - **Label** von `kind/decision` auf `kind/build`, `area/kb` ergänzt. - **Korpus-Lauf wird geteilt** mit #67 — dieselben ~31 Seiten, ein Mass-Update-Gate, eine Freigabe. Abgespalten: #67 (Accept-Pfad: Datums-Shard, `fidelity`/`authority`), #68 (Profilkatalog, Setup-Frage, `manual:`-Instruction), #69 (Reproduktionslauf).
Author
Owner

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:

  • Sweep-Sequenzierung entschieden#66 fährt seinen eigenen 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.
  • Punkt 8 entschieden (war „zu entscheiden"): Fixture-Type-Spec. Grund ist ein beim Nachmessen gefundener vierter betroffener Test, test_lint.py:296 — ohne ihn wird der layout_declared is False-Zweig in lint_core.py:566 unerreichbar. Die anderen drei hängen ohne Fixture auf comparison um.
  • Fünf Fundstellen ergänzt, die die alte Fassung nicht nannte: instructions/wiki-ingest/SKILL.md:73 ruft new source ohne source_type auf (bricht jeden Ingest); types/type-spec.md:102-110 nennt source als worked example fürs Flachlassen; tools/CONTRACT.md:54 zählt die lint-Befunde auf; test_new_page.py:203 prüft den Default; test_lint.py:326s Docstring beschreibt den alten Korpus.
  • Punkt 1 präzisiert: die Verweigerung von new source braucht keinen neuen Code — _validate_or_fail läuft vor jedem Schreibzugriff. Nur Schema-Zeile weg plus Test.
  • Layout-Tabelle vorgeschlagen mit deutschen Titeln, plus der harte Grund für den Deckungstest: der Pluralisierungs-Fallback erzeugt notess und analysiss.
  • Versionsteil belegt statt vermutet: MINOR, Drop-in-Test in beide Richtungen durchgerechnet, kein --breaking, kein Migrationsdokument.
  • Abgrenzung zu #67 notiert: raw/CONTRACT.mds Routing-Tabelle bleibt liegen.
**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: - **Sweep-Sequenzierung entschieden** — #66 fährt seinen eigenen `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. - **Punkt 8 entschieden** (war „zu entscheiden"): Fixture-Type-Spec. Grund ist ein beim Nachmessen gefundener **vierter** betroffener Test, `test_lint.py:296` — ohne ihn wird der `layout_declared is False`-Zweig in `lint_core.py:566` unerreichbar. Die anderen drei hängen ohne Fixture auf `comparison` um. - **Fünf Fundstellen ergänzt**, die die alte Fassung nicht nannte: `instructions/wiki-ingest/SKILL.md:73` ruft `new source` ohne `source_type` auf (bricht jeden Ingest); `types/type-spec.md:102-110` nennt `source` als worked example fürs Flachlassen; `tools/CONTRACT.md:54` zählt die lint-Befunde auf; `test_new_page.py:203` prüft den Default; `test_lint.py:326`s Docstring beschreibt den alten Korpus. - **Punkt 1 präzisiert:** die Verweigerung von `new source` braucht keinen neuen Code — `_validate_or_fail` läuft vor jedem Schreibzugriff. Nur Schema-Zeile weg plus Test. - **Layout-Tabelle vorgeschlagen** mit deutschen Titeln, plus der harte Grund für den Deckungstest: der Pluralisierungs-Fallback erzeugt `notess` und `analysiss`. - **Versionsteil belegt** statt vermutet: MINOR, Drop-in-Test in beide Richtungen durchgerechnet, kein `--breaking`, kein Migrationsdokument. - Abgrenzung zu #67 notiert: `raw/CONTRACT.md`s Routing-Tabelle bleibt liegen.
Author
Owner

Changelog: Body auf Endstand gebracht und Paket abgeschlossen. Gegenüber der Vorbereitungsfassung:

  • Alle 15 Akzeptanzkriterien abgehakt, mit dem jeweiligen Beleg statt einer Zusage: Testnamen (test_new_source_rejects_missing_source_type, test_source_layout_covers_every_declared_source_type), die migrate verify-Zahlen und die tatsächliche Endverteilung aus wikitool search --field.
  • „Umzusetzen" (14 nummerierte Schritte) durch „Was umgesetzt wurde" ersetzt — die Schritte waren eine Bauanleitung und lesen sich nach dem Publish als offene Arbeit.
  • Neuer Abschnitt Verifikation: pytest 1057, docs verify, instructions verify, migrate verify, lint --fail-on-error exit 0, plus die CI-Runs.
  • Ein fünfter Test kam beim Lauf dazu, den die Vorbereitung nicht vorhergesehen hatte: test_page_subdir_is_none_for_types_without_layout benutzte source ebenfalls als „kein Layout"-Beispiel. Dazu neun Testdateien-Anpassungen, die aus dem layout: folgten — die Fixture-Source-Seite liegt jetzt unter sources/notes/, und new source-Aufrufe in Tests brauchen --set source_type=.
  • README-Veralterung gefunden und behoben (4c4dca3): kb/sources/ stand dort zweimal als „no areas by choice" bzw. als worked example fürs Flachlassen. Das Beispiel ist jetzt kb/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.md beschreibt die root: 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:** Body auf Endstand gebracht und Paket abgeschlossen. Gegenüber der Vorbereitungsfassung: - Alle 15 Akzeptanzkriterien abgehakt, mit dem jeweiligen Beleg statt einer Zusage: Testnamen (`test_new_source_rejects_missing_source_type`, `test_source_layout_covers_every_declared_source_type`), die `migrate verify`-Zahlen und die tatsächliche Endverteilung aus `wikitool search --field`. - „Umzusetzen" (14 nummerierte Schritte) durch „Was umgesetzt wurde" ersetzt — die Schritte waren eine Bauanleitung und lesen sich nach dem Publish als offene Arbeit. - Neuer Abschnitt **Verifikation**: pytest 1057, `docs verify`, `instructions verify`, `migrate verify`, `lint --fail-on-error` exit 0, plus die CI-Runs. - **Ein fünfter Test** kam beim Lauf dazu, den die Vorbereitung nicht vorhergesehen hatte: `test_page_subdir_is_none_for_types_without_layout` benutzte `source` ebenfalls als „kein Layout"-Beispiel. Dazu neun Testdateien-Anpassungen, die aus dem `layout:` folgten — die Fixture-Source-Seite liegt jetzt unter `sources/notes/`, und `new source`-Aufrufe in Tests brauchen `--set source_type=`. - README-Veralterung gefunden und behoben (`4c4dca3`): `kb/sources/` stand dort zweimal als „no areas by choice" bzw. als worked example fürs Flachlassen. Das Beispiel ist jetzt `kb/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.md` beschreibt die `root: 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.
Author
Owner

Changelog: Geschlossen. Gegenüber dem vorigen Stand: Lauf-Cleanup ergänzt (work close, f2a093b, in kb/log.md protokolliert), CI-Zeile auf das tatsächliche Ergebnis präzisiert (194 und 195 grün auf b138fd8, 195 hat korrekt keinen Release aus dem -beta.7-Kandidaten geschnitten — neuester Release bleibt v4.7.4), und die Modell-Zuordnung aus dem Kommentar in den Body übernommen, damit sie im geschlossenen Stand mitliest.

**Changelog:** Geschlossen. Gegenüber dem vorigen Stand: Lauf-Cleanup ergänzt (`work close`, `f2a093b`, in `kb/log.md` protokolliert), CI-Zeile auf das tatsächliche Ergebnis präzisiert (194 und 195 grün auf `b138fd8`, 195 hat korrekt **keinen** Release aus dem `-beta.7`-Kandidaten geschnitten — neuester Release bleibt `v4.7.4`), und die Modell-Zuordnung aus dem Kommentar in den Body übernommen, damit sie im geschlossenen Stand mitliest.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#66