Typ project und Collection kb/gtd/: das Vorhaben als eigene Seitenart #123

Closed
opened 2026-09-19 14:56:08 +00:00 by torben · 1 comment
Owner

Erledigt (ee24b6e, Stack 7.0.0-beta.1). Paket 1 aus #119 (D16, D17, D22, D24, D27, D28,
D29). Legt die kb/-Haelfte der Projektwelt an.

Was gebaut wurde

Ein neuer Seitentyp fuer das Vorhaben — Ziel, Beteiligte, Endzustand, offene Schleifen —
abgegrenzt gegen das Artefakt, das weiter entity ist (#122).

Type-Spec

types/project.md + types/project.schema.yaml, beide root: kb und damit instanzeigen, also
als .template ausgeliefert (generisch ueber dist_cmd.pys bestehenden Mechanismus fuer jeden
root: kb-Typ mit base_dir: — kein Code dafuer noetig).

Pflichtfelder wie geplant: type, state (active/dormant/completed/abandoned,
default: active), responsibility (subtype_field, haus/finanzen/technik, kein
Default), created/modified, summary, provenance (default: general). related/sources
optional. base_dir: gtd, also kb/gtd/<bereich>/<Titel>.md.

Vorlage

## Ziel, ## Kontext, ## Beteiligte, ## Status, ## Entscheidungen, ## Gelerntes — wie
in der Ausschreibung. Die beiden Regeln aus #119 (## Status ist dauerhafte Charakterisierung,
nicht Momentzustand; ## Beteiligte traegt Erwaehnungen ohne Wikilink/eigene Seite) stehen
sowohl im Type-Spec (types/project.md § Authoring guidance) als auch in
kb/gtd/COLLECTION.md (§ Two rules unique to this collection).

Collection

kb/gtd/COLLECTION.md mit required_by_stack: true. outbound:-Bloecke fuer
entities/concepts/sources/gtd, vorerst nur see-also — die Beteiligungs-Label-Frage
bleibt #118. Umgekehrt traegt kb/entities/COLLECTION.md jetzt einen gtd: [see-also]-Block;
ohne ihn lehnt xref add jede Kante von einer Entity auf ein Vorhaben ab — verifiziert
end-to-end (Ablehnung vor dem Block, Erfolg danach, Testkante wieder entfernt).

Stack-Forderung

project/state: steht jetzt neben source/raw_files: in
kb_collections.STACK_REQUIRED_TYPES/STACK_REQUIRED_TYPE_FIELDS — eine Codezeile, die
docs_verify.check_stack_required_types() und stack_required_collections() (beide bereits
generisch) automatisch auf project/gtd mit ausdehnt.

Akzeptanzkriterien

  • tools/wikitool types describe project beschreibt den Typ vollstaendig; types list
    fuehrt ihn mit base_dir: kb/gtd.
  • tools/wikitool new project --name X --set responsibility=haus (nicht --responsibility —
    das war Kurzschrift in der Ausschreibung, das reale CLI-Muster ist --set feld=wert wie
    bei entity_type) erzeugt kb/gtd/haus/X.md mit allen sechs Abschnitten und
    state: active.
  • Ein Wert ausserhalb des state-Enums wird abgelehnt, nicht stillschweigend geschrieben —
    manuell verifiziert (--set state=erledigt → Fehler, keine Datei).
  • Ein responsibility-Wert ohne layout:-Eintrag fuehrt zu einem Befund, nicht zu einer
    Seite an unerwarteter Stelle — kein neuer Lint-Check noetig: new_page_command
    validiert bereits vor dem Schreiben (_validate_or_fail laeuft vor write_page), also
    verhindert die reine Enum-Deklaration von responsibility (kein freier String) jeden
    Schreibvorgang mit einem nicht gelisteten Wert von vornherein. Manuell verifiziert.
  • kb/gtd/ wird von wikitool als Collection erkannt, und index rebuild erzeugt je
    Verantwortungsbereich eine Katalogsektion — verifiziert (kb/gtd/INDEX.md mit
    ## Haus-Sektion, kb/index.md fuehrt gtd/).
  • Eine Kante von einer Personenseite auf eine Vorhabenseite ist autorisierbar, sobald das
    Label aus #118 existiert; ohne den gtd:-Block in kb/entities/COLLECTION.md lehnt
    xref add sie ab — beide Richtungen end-to-end verifiziert.
  • docs verify FAILt auf einem Baum ohne Type-Spec name: project mit state:, und
    passiert einen Baum mit zusaetzlichen instanzeigenen Feldern — neu mit dedizierten
    Tests abgedeckt (test_docs_verify.py, test_kb_collections.py); vorher gab es dafuer gar
    keine direkte Testabdeckung, nur den indirekten Weg ueber einen vollen verify()-Lauf
    gegen den echten Baum.
  • dist export liefert types/project.md.template und .schema.yaml.template aus, nicht
    die adoptierten Dateien — generisch bereits durch _plan_types()/
    instance_owned_type_stems() abgedeckt, mitgeprueft von der bestehenden
    test_page_type_specs_ship_as_templates_and_stack_types_do_not, die jetzt automatisch auch
    project gegen den echten Baum durchlaeuft.
  • kb/gtd/COLLECTION.md wird als .template ausgeliefert — gleicher generischer Mechanismus
    (iter_kb_collections()-Schleife in dist_cmd.py).
  • docs verify, instructions verify, pytest gruen — 1321 Tests, beide verify-Kommandos
    grün.
  • Versionsteil gegen instructions/dev/version-parts.md: die Ausschreibung nahm --minor
    an, das war falsch.
    Der Rueckweg-Test ergab: eine aeltere Instanz, die die neue tools/
    uebernimmt ohne types/project.md.template zu adoptieren, faellt bei docs verify durch,
    wo sie vorher bestand — das verletzt die Forward-Haelfte des Drop-in-Tests, also
    Grenzuebertritt. Mit dem Betreiber abgestimmt (Alternativen erwogen: kb_version-Gating wie
    bei labelled edges, oder die Stack-Forderung auf einen spaeteren Bump verschieben) und
    --major gewaehlt, exakt nach sources eigenem (aelterem, ungegatetem) Vorbild.
    Geshippt als 7.0.0-beta.1 mit --breaking/--no-migration (kein Content-Migrationsbedarf
    — der Fix ist die gewoehnliche .template-Adoption).

Nebenbei mitkorrigiert

  • README.mds Verzeichnisbaum nannte unter kb/entities/ noch projects/ statt codebases/ —
    Ueberbleibsel aus #122, beim Beruehren desselben Baums mitgezogen.
  • kb_collections.declaration_issues()s Meldung fuer eine fehlende Pflicht-Collection nannte
    immer source, unabhaengig davon, welcher Typ tatsaechlich fehlte — ein latenter Fehler, der
    erst mit einem zweiten Eintrag in STACK_REQUIRED_TYPES sichtbar wurde (drei betroffene Tests
    in test_conventions.py liefen vorher gegen eine Welt mit nur einer Pflicht-Collection).
    Behoben mit der neuen stack_required_collection_owners(), die den Typ pro Collection
    generisch ableitet statt ihn hart zu kodieren.

Abhaengigkeiten

Lief nach #122, wie geplant. Entblockt jetzt #118 (der gtd:-Block, auf den es wartete,
existiert). #124/#125/#126 koennen wie in #119s Umsetzungstabelle vorgesehen anlaufen.

**Erledigt** (`ee24b6e`, Stack 7.0.0-beta.1). Paket 1 aus #119 (D16, D17, D22, D24, D27, D28, D29). Legt die `kb/`-Haelfte der Projektwelt an. ## Was gebaut wurde Ein neuer Seitentyp fuer das **Vorhaben** — Ziel, Beteiligte, Endzustand, offene Schleifen — abgegrenzt gegen das **Artefakt**, das weiter `entity` ist (#122). ### Type-Spec `types/project.md` + `types/project.schema.yaml`, beide `root: kb` und damit instanzeigen, also als `.template` ausgeliefert (generisch ueber `dist_cmd.py`s bestehenden Mechanismus fuer jeden `root: kb`-Typ mit `base_dir:` — kein Code dafuer noetig). Pflichtfelder wie geplant: `type`, `state` (`active`/`dormant`/`completed`/`abandoned`, `default: active`), `responsibility` (`subtype_field`, `haus`/`finanzen`/`technik`, kein Default), `created`/`modified`, `summary`, `provenance` (`default: general`). `related`/`sources` optional. `base_dir: gtd`, also `kb/gtd/<bereich>/<Titel>.md`. ### Vorlage `## Ziel`, `## Kontext`, `## Beteiligte`, `## Status`, `## Entscheidungen`, `## Gelerntes` — wie in der Ausschreibung. Die beiden Regeln aus #119 (`## Status` ist dauerhafte Charakterisierung, nicht Momentzustand; `## Beteiligte` traegt Erwaehnungen ohne Wikilink/eigene Seite) stehen sowohl im Type-Spec (`types/project.md` § Authoring guidance) als auch in `kb/gtd/COLLECTION.md` (§ Two rules unique to this collection). ### Collection `kb/gtd/COLLECTION.md` mit `required_by_stack: true`. `outbound:`-Bloecke fuer `entities`/`concepts`/`sources`/`gtd`, vorerst nur `see-also` — die Beteiligungs-Label-Frage bleibt #118. Umgekehrt traegt `kb/entities/COLLECTION.md` jetzt einen `gtd: [see-also]`-Block; ohne ihn lehnt `xref add` jede Kante von einer Entity auf ein Vorhaben ab — verifiziert end-to-end (Ablehnung vor dem Block, Erfolg danach, Testkante wieder entfernt). ### Stack-Forderung `project`/`state:` steht jetzt neben `source`/`raw_files:` in `kb_collections.STACK_REQUIRED_TYPES`/`STACK_REQUIRED_TYPE_FIELDS` — eine Codezeile, die `docs_verify.check_stack_required_types()` und `stack_required_collections()` (beide bereits generisch) automatisch auf `project`/`gtd` mit ausdehnt. ## Akzeptanzkriterien - [x] `tools/wikitool types describe project` beschreibt den Typ vollstaendig; `types list` fuehrt ihn mit `base_dir: kb/gtd`. - [x] `tools/wikitool new project --name X --set responsibility=haus` (nicht `--responsibility` — das war Kurzschrift in der Ausschreibung, das reale CLI-Muster ist `--set feld=wert` wie bei `entity_type`) erzeugt `kb/gtd/haus/X.md` mit allen sechs Abschnitten und `state: active`. - [x] Ein Wert ausserhalb des `state`-Enums wird abgelehnt, nicht stillschweigend geschrieben — manuell verifiziert (`--set state=erledigt` → Fehler, keine Datei). - [x] Ein `responsibility`-Wert ohne `layout:`-Eintrag fuehrt zu einem Befund, nicht zu einer Seite an unerwarteter Stelle — **kein neuer Lint-Check noetig**: `new_page_command` validiert bereits vor dem Schreiben (`_validate_or_fail` laeuft vor `write_page`), also verhindert die reine Enum-Deklaration von `responsibility` (kein freier String) jeden Schreibvorgang mit einem nicht gelisteten Wert von vornherein. Manuell verifiziert. - [x] `kb/gtd/` wird von `wikitool` als Collection erkannt, und `index rebuild` erzeugt je Verantwortungsbereich eine Katalogsektion — verifiziert (`kb/gtd/INDEX.md` mit `## Haus`-Sektion, `kb/index.md` fuehrt `gtd/`). - [x] Eine Kante von einer Personenseite auf eine Vorhabenseite ist autorisierbar, sobald das Label aus #118 existiert; ohne den `gtd:`-Block in `kb/entities/COLLECTION.md` lehnt `xref add` sie ab — beide Richtungen end-to-end verifiziert. - [x] `docs verify` **FAILt** auf einem Baum ohne Type-Spec `name: project` mit `state:`, und **passiert** einen Baum mit zusaetzlichen instanzeigenen Feldern — neu mit dedizierten Tests abgedeckt (`test_docs_verify.py`, `test_kb_collections.py`); vorher gab es dafuer gar keine direkte Testabdeckung, nur den indirekten Weg ueber einen vollen `verify()`-Lauf gegen den echten Baum. - [x] `dist export` liefert `types/project.md.template` und `.schema.yaml.template` aus, nicht die adoptierten Dateien — generisch bereits durch `_plan_types()`/ `instance_owned_type_stems()` abgedeckt, mitgeprueft von der bestehenden `test_page_type_specs_ship_as_templates_and_stack_types_do_not`, die jetzt automatisch auch `project` gegen den echten Baum durchlaeuft. - [x] `kb/gtd/COLLECTION.md` wird als `.template` ausgeliefert — gleicher generischer Mechanismus (`iter_kb_collections()`-Schleife in `dist_cmd.py`). - [x] `docs verify`, `instructions verify`, `pytest` gruen — 1321 Tests, beide `verify`-Kommandos grün. - [x] Versionsteil gegen `instructions/dev/version-parts.md`: **die Ausschreibung nahm `--minor` an, das war falsch.** Der Rueckweg-Test ergab: eine aeltere Instanz, die die neue `tools/` uebernimmt ohne `types/project.md.template` zu adoptieren, faellt bei `docs verify` durch, wo sie vorher bestand — das verletzt die Forward-Haelfte des Drop-in-Tests, also Grenzuebertritt. Mit dem Betreiber abgestimmt (Alternativen erwogen: kb_version-Gating wie bei labelled edges, oder die Stack-Forderung auf einen spaeteren Bump verschieben) und **`--major` gewaehlt**, exakt nach `source`s eigenem (aelterem, ungegatetem) Vorbild. Geshippt als `7.0.0-beta.1` mit `--breaking`/`--no-migration` (kein Content-Migrationsbedarf — der Fix ist die gewoehnliche `.template`-Adoption). ## Nebenbei mitkorrigiert - `README.md`s Verzeichnisbaum nannte unter `kb/entities/` noch `projects/` statt `codebases/` — Ueberbleibsel aus #122, beim Beruehren desselben Baums mitgezogen. - `kb_collections.declaration_issues()`s Meldung fuer eine fehlende Pflicht-Collection nannte immer `source`, unabhaengig davon, welcher Typ tatsaechlich fehlte — ein latenter Fehler, der erst mit einem zweiten Eintrag in `STACK_REQUIRED_TYPES` sichtbar wurde (drei betroffene Tests in `test_conventions.py` liefen vorher gegen eine Welt mit nur einer Pflicht-Collection). Behoben mit der neuen `stack_required_collection_owners()`, die den Typ pro Collection generisch ableitet statt ihn hart zu kodieren. ## Abhaengigkeiten Lief nach #122, wie geplant. **Entblockt jetzt #118** (der `gtd:`-Block, auf den es wartete, existiert). #124/#125/#126 koennen wie in #119s Umsetzungstabelle vorgesehen anlaufen.
torben added the prio/plannedsize/Marea/kbkind/build labels 2026-09-19 14:56:08 +00:00
Author
Owner

Changelog: Umgesetzt und geschlossen (ee24b6e). Alle Akzeptanzkriterien abgehakt. Versionsteil-Frage aufgeloest: --major, nicht die angenommenen --minor — Details und Begruendung jetzt im Akzeptanzkriterium selbst. Zwei nebenbei gefundene Fehler mitkorrigiert (README-Verzeichnisbaum, declaration_issues()s hartkodierte source-Meldung) — siehe neuer Abschnitt „Nebenbei mitkorrigiert".

**Changelog:** Umgesetzt und geschlossen (`ee24b6e`). Alle Akzeptanzkriterien abgehakt. Versionsteil-Frage aufgeloest: **`--major`**, nicht die angenommenen `--minor` — Details und Begruendung jetzt im Akzeptanzkriterium selbst. Zwei nebenbei gefundene Fehler mitkorrigiert (README-Verzeichnisbaum, `declaration_issues()`s hartkodierte `source`-Meldung) — siehe neuer Abschnitt „Nebenbei mitkorrigiert".
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#123