stack: Typ project und Collection kb/gtd/ (#123)
CI / verify (push) Successful in 45s
Release / release (push) Successful in 36s

Files changed:
- CHANGES.md
- README.md
- VERSION
- kb/CONTRACT.md
- kb/CONVENTIONS.md
- kb/entities/COLLECTION.md
- kb/gtd/COLLECTION.md
- kb/gtd/INDEX.md
- kb/index.md
- tools/CONTRACT.md
- tools/chemenu/kb_collections.py
- tools/chemenu/tests/test_conventions.py
- tools/chemenu/tests/test_docs_verify.py
- tools/chemenu/tests/test_kb_collections.py
- tools/chemenu/tests/test_new_page.py
- tools/chemenu/tests/test_type_resolver.py
- tools/chemenu/tests/test_types_cmd.py
- types/project.md
- types/project.schema.yaml
- types/type-spec.md
This commit is contained in:
torben committed 2026-09-19 21:13:24 +02:00
1 parent 3c9d669729
commit ee24b6e5b8
20 files changed
+507 -38

No files matched your search

+3 -2
View File
@@ -80,12 +80,13 @@ resolves against it by name.
| Collection | Holds | Contract |
|------------|-------|----------|
| `kb/entities/` | Concrete things: projects, deployed systems, tools, technologies, people | [entities/COLLECTION.md](entities/COLLECTION.md) |
| `kb/entities/` | Concrete things: codebases, deployed systems, tools, technologies, people | [entities/COLLECTION.md](entities/COLLECTION.md) |
| `kb/concepts/` | Architectures, patterns, protocols, workflows, decisions, recurring problems | [concepts/COLLECTION.md](concepts/COLLECTION.md) |
| `kb/sources/` | One summary page per ingested source, carrying its `raw_files:` provenance | [sources/COLLECTION.md](sources/COLLECTION.md) |
| `kb/comparisons/` | Structured comparisons of two or more existing pages | [comparisons/COLLECTION.md](comparisons/COLLECTION.md) |
| `kb/gtd/` | One page per committed initiative (a GTD project): goal, participants, durable status, open loops | [gtd/COLLECTION.md](gtd/COLLECTION.md) |
The four rows above are this instance's collections, not a fixed set. **Adding one:**
The five rows above are this instance's collections, not a fixed set. **Adding one:**
`mkdir kb/<name>` and write a `kb/<name>/COLLECTION.md` with the two fields above. Collections
are discovered by contract presence, so no code change is needed. A collection only becomes
*writable* once some type-spec declares a matching `base_dir:`. Renaming or dropping one is the
+3 -2
View File
@@ -42,8 +42,9 @@ those regions and nothing else. Nothing matches on this text.
Pages are written in **German** - the `language:` in this file's own frontmatter, and the one
place that value is written down. This binds `kb/`, and inside the page type-specs
(`types/entity.md`, `types/concept.md`, `types/source.md`, `types/comparison.md`) exactly the
parts that become page text: each one's `## Template` block, and the `layout:` titles that head a
(`types/entity.md`, `types/concept.md`, `types/source.md`, `types/comparison.md`,
`types/project.md`) exactly the parts that become page text: each one's `## Template` block, and
the `layout:` titles that head a
catalog section. Their authoring guidance around those is instruction to an agent, so it follows
the control plane and stays English - the same prose/identifier cut
[kb/CONTRACT.md](CONTRACT.md#language-and-identifiers) makes inside a page, applied one level up.
+1
View File
@@ -5,6 +5,7 @@ outbound:
concepts: [implements, exemplifies, rests-on, applies-when, operates-on, invokes, authored, alternative-to, see-also]
sources: [evidenced-by, defined-in, see-also]
comparisons: [compares-with, see-also]
gtd: [see-also]
required_by_stack: false
---
+78
View File
@@ -0,0 +1,78 @@
---
profile: none
outbound:
entities: [see-also]
concepts: [see-also]
sources: [see-also]
gtd: [see-also]
required_by_stack: true
---
# kb/gtd/ - Collection Contract
One page per committed initiative (a project in the GTD sense): the goal, the participants, the
durable status, the open loops. This is the half of Muster 4 that `kb/` owns - the other half,
the moment-to-moment task list, lives in the task tracker and is joined to a page here only by
name (`AGENTS.md` invariant 8, § "Two truths about status are forbidden").
**Quality goal:** a page here should still make sense once the initiative is over. A reader
should come away knowing what was attempted, who was in it, what was decided, and what was
learned - not a snapshot of what was still open at some point in time.
Inherits [kb/CONTRACT.md](../CONTRACT.md) for the rules the stack enforces - linking mechanics,
provenance, citation, the confidence machinery - and
[kb/CONVENTIONS.md](../CONVENTIONS.md) for what this instance decided: language, naming forms,
tone, relationship labels, the hedging rule. Neither is restated here.
**This collection is `required_by_stack`.** A type-spec declaring `name: project` whose schema
requires `state:` must exist (`types/type-spec.md` § "What the stack still requires of the type
layer"), and `kb/gtd/` is whichever collection that type writes into - derived, not hardcoded, so
renaming it stays consistent instead of tripping a stale name.
## Types offered
`project` (`tools/wikitool types describe project`). The `responsibility:` field selects the
area:
| Area | Holds |
|------|-------|
| `haus/` | Household initiatives |
| `finanzen/` | Financial initiatives |
| `technik/` | Technical initiatives outside any tracked codebase's own scope |
These are areas, not collections: they inherit this contract and carry no `COLLECTION.md` of
their own. The initial three values are this instance's own starting vocabulary
(`types/project.md` § Frontmatter) - not a stack requirement, and free to extend.
## Two rules unique to this collection
- **`## Status` is durable, never a momentary state (D7).** The page never summarizes the task
list. "Pilotbetrieb seit 2026-03, zwei Abteilungen angebunden" is a status; "warte auf
Freigabe" is a tracker state and does not belong here. The join between a page and its tracker
project happens at read time, over the normalized title, and is never stored.
- **`## Beteiligte` carries mentions, not links (D28).** One to two lines per person, in prose,
with no `[[wikilink]]` and no page of their own. This is a deliberate, named exception to
`kb/CONTRACT.md` § "Every page should" - a project page with unlinked people in its
`## Beteiligte` section is conforming, not incomplete. A person earns their own page, and the
mention becomes an edge, only once they matter for the knowledge independent of this one
initiative.
## Authorised labels
Only `see-also` is authorised in every direction for now. The vocabulary a participation edge
(person -> project) would use is a deliberate later addition, not an oversight - adding it is a
collection-contract change made when that label exists, not a way around a refusal.
## Outbound linking
A project page links to the entities and concepts its initiative actually touches - the codebase
it ships, the system it changes, the concept it applies - and to other project pages it depends
on or was split from.
## What does not belong here
- A summary of the tracker's current task list. The tracker owns tasks; this page owns the
initiative's durable memory.
- A person's own page reached from `## Beteiligte` - see above.
- An initiative's *artifact* - the codebase, system or tool it is about. That is `entity`
(`kb/entities/COLLECTION.md`), a different page under a different type.
+6
View File
@@ -0,0 +1,6 @@
<!-- Generated by `wikitool index rebuild`. Do not hand-edit. -->
# kb/gtd/ - Index
0 page(s). Regenerated by `wikitool index rebuild`.
+2
View File
@@ -17,6 +17,7 @@ The page tables live in a generated `INDEX.md` inside each collection, linked be
- **Comparisons:** 1
- **Concepts:** 80
- **Entities:** 72
- **Gtd:** 0
- **Sources:** 29
- **Last Updated:** 2026-09-19
@@ -29,6 +30,7 @@ The page tables live in a generated `INDEX.md` inside each collection, linked be
| `comparisons/` | 1 | [comparisons/INDEX.md](comparisons/INDEX.md) |
| `concepts/` | 80 | [concepts/INDEX.md](concepts/INDEX.md) |
| `entities/` | 72 | [entities/INDEX.md](entities/INDEX.md) |
| `gtd/` | 0 | [gtd/INDEX.md](gtd/INDEX.md) |
| `sources/` | 29 | [sources/INDEX.md](sources/INDEX.md) |
### concepts/