wikitool new instruction schreibt das Migrationsfeld obligation: required in jede neue Instruktion #109

Closed
opened 2026-09-16 12:16:00 +00:00 by torben · 2 comments
Owner

Befund

tools/wikitool new instruction --name "<name>" schrieb obligation: required in jede neue
Instruktion. obligation: ist ein Migrationsfeld (instructions/CONTRACT.md
§ instructions/migrations/, types/instruction.schema.yaml) - eine gewoehnliche Instruktion
ist keine Migration und hat nichts, was laufen muesste.

Ursache: tools/chemenu/commands/new_page.py, _build_frontmatter() materialisierte jedes
Schema-default: unbesehen. Ueber alle acht types/*.schema.yaml gibt es genau zwei:
provenance (entity/concept, in required:) und obligation (instruction, nicht in
required:).

Entscheidung

Der Scaffold materialisiert ein Schema-default: nur fuer ein Feld, das das Schema auch in
required: fuehrt.
Ein default: auf einem optionalen Feld ist eine Lese-Annahme (was ein
fehlendes Feld bedeutet), keine Schreib-Vorgabe - sie hinzuschreiben macht aus der stillen
Annahme eine ausgesprochene Behauptung. Die Lese-Annahme selbst steht unveraendert und
unabhaengig in tools/chemenu/kb_state.py:164
(str(frontmatter.get("obligation") or REQUIRED)), abgedeckt von
test_obligation_defaults_to_required_when_undeclared.

Der array-Zweig direkt daneben (leere Liste [] fuer ein unbesetztes optionales Array wie
tags:) ist davon ausdruecklich ausgenommen und blieb unveraendert: ein fehlender
Schluessel wuerde sonst den Template-Filter-Suffix woertlich in den Body schreiben
({related|bullets} -> das Wort "bullets" in der Seite).

Umsetzung

  • tools/chemenu/commands/new_page.py: _build_frontmatter() prueft jetzt
    field_name in required neben "default" in field_schema; Modul- und Funktions-Docstring
    aktualisiert.
  • Tests in tools/chemenu/tests/test_new_page.py:
    • test_new_instruction_omits_migration_only_default - kein obligation: im Scaffold
    • test_new_instruction_explicit_obligation_is_still_written - --set obligation=offered
      schreibt das Feld weiterhin (expliziter Pfad unberuehrt)
    • test_new_entity_still_materializes_empty_arrays_for_unset_optional_fields -
      tags/related/sources bleiben [], kein woertliches "bullets" im Body
    • test_new_entity_applies_schema_declared_defaults (bestehend) - provenance: general
      bleibt unveraendert
  • Doc-Pull-Through: types/type-spec.md § Anatomy of a type, tools/CONTRACT.mds new-Zeile,
    instructions/CONTRACT.md § instructions/migrations/ (haelt fest, dass der Scaffold keines
    der drei Migrationsfelder liefert - sie werden von Hand ergaenzt).
  • Version --patch (6.1.0-beta.5 -> 6.1.0-beta.6): kein Bestandsdokument aendert sich, keine
    Migration, ein zurueckgerolltes Werkzeug schriebe das Feld nur wieder mit.

Verifiziert: pytest (1312 passed), tools/wikitool docs verify (OK, keine neuen Befunde),
tools/wikitool instructions verify (OK, 23 Instruktionen/7 Skills gueltig). Reproduziert vor
der Aenderung (Scaffold schrieb obligation: required), gegengeprueft nach der Aenderung
(Feld fehlt; --set obligation=offered schreibt es weiterhin).

Kein docs/-Dokument traegt Reasoning ueber Scaffold-Defaults - keines wurde stale.

Publiziert: aa31d43 auf main.

Akzeptanzkriterien

  • tools/wikitool new instruction --name "x" erzeugt eine Frontmatter ohne obligation:.
  • Kein Migrationsdokument wird vom Scaffold vollstaendig erzeugt (weder vorher noch nachher -
    migrates_to:/migration_kind: haben kein default:); die drei Migrationsfelder werden
    von Hand ergaenzt, jetzt in instructions/CONTRACT.md dokumentiert.
  • Frontmatter-Tests decken den instruction-Scaffold ab (s.o.).
  • docs verify, instructions verify, pytest ohne neue Befunde.

Modelle

Triage/Design (Entscheidung als Regel, verworfene Alternativen): Opus 5. Mechanische Mitte
(Code, Tests, Doc-Pull-Through, Version-Bump): Opus 5. Closing-Phase (dieser Body,
docs/-Staleness-Check): Opus 5 - Wechsel zu Sonnet wurde angeboten, Nutzer hat weitergearbeitet.

Gefunden beim Anlegen der Instruktion aus #108.

## Befund `tools/wikitool new instruction --name "<name>"` schrieb `obligation: required` in jede neue Instruktion. `obligation:` ist ein Migrationsfeld (`instructions/CONTRACT.md` § `instructions/migrations/`, `types/instruction.schema.yaml`) - eine gewoehnliche Instruktion ist keine Migration und hat nichts, was laufen muesste. **Ursache:** `tools/chemenu/commands/new_page.py`, `_build_frontmatter()` materialisierte jedes Schema-`default:` unbesehen. Ueber alle acht `types/*.schema.yaml` gibt es genau zwei: `provenance` (`entity`/`concept`, in `required:`) und `obligation` (`instruction`, nicht in `required:`). ## Entscheidung **Der Scaffold materialisiert ein Schema-`default:` nur fuer ein Feld, das das Schema auch in `required:` fuehrt.** Ein `default:` auf einem optionalen Feld ist eine Lese-Annahme (was ein fehlendes Feld bedeutet), keine Schreib-Vorgabe - sie hinzuschreiben macht aus der stillen Annahme eine ausgesprochene Behauptung. Die Lese-Annahme selbst steht unveraendert und unabhaengig in `tools/chemenu/kb_state.py:164` (`str(frontmatter.get("obligation") or REQUIRED)`), abgedeckt von `test_obligation_defaults_to_required_when_undeclared`. Der `array`-Zweig direkt daneben (leere Liste `[]` fuer ein unbesetztes optionales Array wie `tags:`) ist davon **ausdruecklich ausgenommen** und blieb unveraendert: ein fehlender Schluessel wuerde sonst den Template-Filter-Suffix woertlich in den Body schreiben (`{related|bullets}` -> das Wort "bullets" in der Seite). ## Umsetzung - `tools/chemenu/commands/new_page.py`: `_build_frontmatter()` prueft jetzt `field_name in required` neben `"default" in field_schema`; Modul- und Funktions-Docstring aktualisiert. - Tests in `tools/chemenu/tests/test_new_page.py`: - `test_new_instruction_omits_migration_only_default` - kein `obligation:` im Scaffold - `test_new_instruction_explicit_obligation_is_still_written` - `--set obligation=offered` schreibt das Feld weiterhin (expliziter Pfad unberuehrt) - `test_new_entity_still_materializes_empty_arrays_for_unset_optional_fields` - `tags`/`related`/`sources` bleiben `[]`, kein woertliches "bullets" im Body - `test_new_entity_applies_schema_declared_defaults` (bestehend) - `provenance: general` bleibt unveraendert - Doc-Pull-Through: `types/type-spec.md` § Anatomy of a type, `tools/CONTRACT.md`s `new`-Zeile, `instructions/CONTRACT.md` § `instructions/migrations/` (haelt fest, dass der Scaffold keines der drei Migrationsfelder liefert - sie werden von Hand ergaenzt). - Version `--patch` (6.1.0-beta.5 -> 6.1.0-beta.6): kein Bestandsdokument aendert sich, keine Migration, ein zurueckgerolltes Werkzeug schriebe das Feld nur wieder mit. **Verifiziert:** `pytest` (1312 passed), `tools/wikitool docs verify` (OK, keine neuen Befunde), `tools/wikitool instructions verify` (OK, 23 Instruktionen/7 Skills gueltig). Reproduziert vor der Aenderung (Scaffold schrieb `obligation: required`), gegengeprueft nach der Aenderung (Feld fehlt; `--set obligation=offered` schreibt es weiterhin). Kein `docs/`-Dokument traegt Reasoning ueber Scaffold-Defaults - keines wurde stale. Publiziert: `aa31d43` auf `main`. ## Akzeptanzkriterien - [x] `tools/wikitool new instruction --name "x"` erzeugt eine Frontmatter ohne `obligation:`. - [x] Kein Migrationsdokument wird vom Scaffold vollstaendig erzeugt (weder vorher noch nachher - `migrates_to:`/`migration_kind:` haben kein `default:`); die drei Migrationsfelder werden von Hand ergaenzt, jetzt in `instructions/CONTRACT.md` dokumentiert. - [x] Frontmatter-Tests decken den `instruction`-Scaffold ab (s.o.). - [x] `docs verify`, `instructions verify`, `pytest` ohne neue Befunde. ## Modelle Triage/Design (Entscheidung als Regel, verworfene Alternativen): Opus 5. Mechanische Mitte (Code, Tests, Doc-Pull-Through, Version-Bump): Opus 5. Closing-Phase (dieser Body, `docs/`-Staleness-Check): Opus 5 - Wechsel zu Sonnet wurde angeboten, Nutzer hat weitergearbeitet. Gefunden beim Anlegen der Instruktion aus #108.
torben added the prio/plannedsize/Sarea/processkind/defect labels 2026-09-16 12:16:00 +00:00
Author
Owner

Changelog: Body auf Umsetzungsstand umgeschrieben. Ursache gegen den Baum verifiziert (new_page.py:108-109 materialisiert jedes Schema-default:; ueber alle acht Schemas gibt es genau zwei, provenance in required:, obligation nicht) und der Defekt reproduziert. Neu: die Entscheidung als Regel (default: nur fuer ein Pflichtfeld materialisieren) mit Begruendung und zwei verworfenen Alternativen; ein Abschnitt, der den array-Zweig ausdruecklich ausnimmt (sonst rendert {related|bullets} den Literaltext bullets); Umsetzungshinweise zum Test-Harness (root: repo liest config.ROOT, Fixture use_shipped_type_specs), zur Doc-Pull-Through-Liste und zur Versionsstelle (--patch). Altes Akzeptanzkriterium 2 aufgeloest: der Scaffold erzeugt heute kein vollstaendiges Migrationsdokument (migrates_to:/migration_kind: haben kein default:), damit faellt seine Bedingung weg und nur die Dokumentationspflicht bleibt. Drei neue Regressionskriterien (provenance, leere Arrays, --set obligation=offered).

**Changelog:** Body auf Umsetzungsstand umgeschrieben. Ursache gegen den Baum verifiziert (`new_page.py:108-109` materialisiert jedes Schema-`default:`; ueber alle acht Schemas gibt es genau zwei, `provenance` in `required:`, `obligation` nicht) und der Defekt reproduziert. Neu: die Entscheidung als Regel (`default:` nur fuer ein Pflichtfeld materialisieren) mit Begruendung und zwei verworfenen Alternativen; ein Abschnitt, der den `array`-Zweig ausdruecklich ausnimmt (sonst rendert `{related|bullets}` den Literaltext `bullets`); Umsetzungshinweise zum Test-Harness (`root: repo` liest `config.ROOT`, Fixture `use_shipped_type_specs`), zur Doc-Pull-Through-Liste und zur Versionsstelle (`--patch`). Altes Akzeptanzkriterium 2 aufgeloest: der Scaffold erzeugt heute **kein** vollstaendiges Migrationsdokument (`migrates_to:`/`migration_kind:` haben kein `default:`), damit faellt seine Bedingung weg und nur die Dokumentationspflicht bleibt. Drei neue Regressionskriterien (`provenance`, leere Arrays, `--set obligation=offered`).
Author
Owner

Changelog: Body auf Endzustand umgeschrieben. Umgesetzt und publiziert (aa31d43): _build_frontmatter() materialisiert ein Schema-default: jetzt nur fuer ein Feld in required:; drei neue Tests plus Doc-Pull-Through in types/type-spec.md, tools/CONTRACT.md, instructions/CONTRACT.md. Alle vier Akzeptanzkriterien erfuellt (Kriterium 2 im Sinne der finalen Fassung: der Scaffold liefert nie eines der drei Migrationsfelder, jetzt dokumentiert statt als offene Bedingung). Version 6.1.0-beta.6, pytest/docs verify/instructions verify gruen.

**Changelog:** Body auf Endzustand umgeschrieben. Umgesetzt und publiziert (`aa31d43`): `_build_frontmatter()` materialisiert ein Schema-`default:` jetzt nur fuer ein Feld in `required:`; drei neue Tests plus Doc-Pull-Through in `types/type-spec.md`, `tools/CONTRACT.md`, `instructions/CONTRACT.md`. Alle vier Akzeptanzkriterien erfuellt (Kriterium 2 im Sinne der finalen Fassung: der Scaffold liefert nie eines der drei Migrationsfelder, jetzt dokumentiert statt als offene Bedingung). Version 6.1.0-beta.6, `pytest`/`docs verify`/`instructions verify` gruen.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#109