stack: TOC-Scope auf types/ und docs/, Sprachregeln nach AGENTS.md zentralisiert, alle Templates auf Control-Plane-Sprache, --breaking akkumuliert (schliesst #99)
CI / verify (push) Successful in 45s
Release / release (push) Successful in 36s

Files changed:
- AGENTS.md
- CHANGES.md
- ENVIRONMENT.md.template
- SOUL.md
- SOUL.md.template
- USER.md.template
- VERSION
- docs/ownership-and-templates.md
- docs/version-model.md
- instructions/CONTRACT.md
- instructions/dev/doc-pull-through.md
- instructions/dev/stack-close/SKILL.md
- instructions/dev/stack-dev/SKILL.md
- instructions/dev/version-parts.md
- instructions/setup-instance.md
- kb/CONVENTIONS.md
- kb/CONVENTIONS.md.template
- kb/concepts/COLLECTION.md
- kb/sources/COLLECTION.md
- tools/CONTRACT.md
- tools/chemenu/commands/types_cmd.py
- tools/chemenu/commands/version_cmd.py
- tools/chemenu/tests/test_toc.py
- tools/chemenu/tests/test_version_cmd.py
- tools/chemenu/toc.py
- tools/chemenu/version.py
- types/comparison.md
- types/concept.md
- types/entity.md
- types/lint-report.md
- types/source.md
This commit is contained in:
2026-09-15 16:21:02 +02:00
parent c0dc2129bb
commit c64479fe02
31 changed files with 1093 additions and 603 deletions
+12 -5
View File
@@ -40,11 +40,18 @@ those regions and nothing else. Nothing matches on this text.
## Language
Pages are written in **German**. This binds `kb/` and the authoring surface that shapes it -
the page type-specs `types/entity.md`, `types/concept.md`, `types/source.md` and
`types/comparison.md`. `raw/` is untouched ([raw/CONTRACT.md](../raw/CONTRACT.md)), and the
control plane stays English: `AGENTS.md`, the stage contracts, this file, `instructions/`, and
the type-specs for non-page artifacts.
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
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.
`raw/` is untouched ([raw/CONTRACT.md](../raw/CONTRACT.md)).
Two things follow from that value rather than being decided here, both stated once in
[AGENTS.md § File naming](../AGENTS.md#file-naming): the control plane stays English whatever an
instance writes its pages in, and an agent *speaks* the language named above.
Which line is prose and which is an identifier - and therefore what is translated at all - is
the contract's rule, not this file's: see
+14 -6
View File
@@ -27,12 +27,20 @@ marker pair, so a rename re-renders words and nothing else.
## Language
Pages are written in **{language}**. This binds `kb/` and the authoring surface that shapes it -
the page type-specs `types/entity.md`, `types/concept.md`, `types/source.md` and
`types/comparison.md`, whose `## Template` blocks are the body skeleton every new page starts
from. `raw/` is untouched ([raw/CONTRACT.md](../raw/CONTRACT.md)), and the control plane stays
English: `AGENTS.md`, the stage contracts, this file, `instructions/`, and the type-specs for
non-page artifacts.
Pages are written in **{language}** - 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 - the body skeleton every new page
starts from - 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. Adopting this template into a non-English instance therefore means
translating those blocks, not the whole file. `raw/` is untouched
([raw/CONTRACT.md](../raw/CONTRACT.md)).
Two things follow from that value rather than being decided here, both stated once in
[AGENTS.md § File naming](../AGENTS.md#file-naming): the control plane stays English whatever an
instance writes its pages in, and an agent *speaks* the language named above.
Which line is prose and which is an identifier - and therefore what is translated at all - is
the contract's rule, not this file's: see
+21 -22
View File
@@ -35,32 +35,31 @@ tone, relationship labels, the confidence rubric. Neither is restated here.
## Types offered
`concept` (`tools/wikitool types describe concept`). Das Feld `concept_type:`
wählt die Area:
`concept` (`tools/wikitool types describe concept`). The `concept_type:` field
picks the area:
| Area | Hält |
|------|------|
| `architectures/` | Aufbau und Struktur: wie ein System geschnitten ist und warum die Schnitte dort liegen |
| `patterns/` | Wiederverwendbare Lösungsformen, die über mehr als einen Gegenstand hinweg gelten |
| `protocols/` | Kommunikationsprotokolle und Standards, in ihrer üblichen Schreibweise benannt |
| `workflows/` | Abläufe und Prozesse, die projektübergreifend wiederkehren |
| `decisions/` | Architektur- und Entwurfsentscheidungen (siehe unten) |
| `problems/` | Wiederkehrende Problemstellungen und ihre Lösungsansätze |
| Area | Holds |
|------|-------|
| `architectures/` | Shape and structure: how a system is cut up, and why the cuts fall where they do |
| `patterns/` | Reusable solution shapes that hold across more than one subject |
| `protocols/` | Communication protocols and standards, named in their usual spelling |
| `workflows/` | Procedures and processes that recur across projects |
| `decisions/` | Architectural and design decisions (see below) |
| `problems/` | Recurring problems and the approaches taken to them |
Das sind Areas, keine Collections: sie erben diesen Contract und tragen keine
eigene `COLLECTION.md`.
These are areas, not collections: they inherit this contract and carry no
`COLLECTION.md` of their own.
Die Zuordnung trifft niemand von Hand — sie steht als `layout:` in
`types/concept.md`, und `wikitool new` legt eine neue Seite direkt dort ab.
Eine Seite, die anderswo liegt, meldet `wikitool lint` als *misplaced*;
`wikitool move --page "<Titel>"` bringt sie an ihren berechneten Ort.
Nobody assigns them by hand — the mapping is the `layout:` in
`types/concept.md`, and `wikitool new` puts a new page straight there. A page
sitting anywhere else is reported by `wikitool lint` as *misplaced*;
`wikitool move --page "<title>"` moves it to its computed location.
Die Aufteilung ist keine Geschmacksfrage, sondern das, was die Shard-Schwelle
des Katalogs überhaupt wirksam macht: `index rebuild` teilt **pro Area**, und
eine Collection ohne Areas teilt sich niemit 80 Seiten in einer einzigen
Tabelle war die Schwelle hier ein toter Wert. Keine der sechs
Areas liegt derzeit über der Schwelle, also bekommt auch keine einen eigenen
Shard; wächst eine hinein, passiert das ohne Zutun.
The split is not a matter of taste but what makes the catalog's shard threshold
effective at all: `index rebuild` splits **per area**, and a collection without
areas never splitswith 80 pages in a single table the threshold was a dead
value here. None of the six areas is currently above it, so none gets a shard of
its own; when one grows into it, that happens without anyone acting.
## Decisions
+26 -28
View File
@@ -26,38 +26,36 @@ renamed or dropped - its authoring rules below are the instance's, its existence
## Types offered
`source` (`tools/wikitool types describe source`). Page titles carry the `Source - ` prefix,
applied automatically by `wikitool new source`. Das Feld `source_type:` wählt die Area - **ohne
Default**: `wikitool new source` verweigert ohne einen expliziten Wert.
applied automatically by `wikitool new source`. The `source_type:` field picks the area - **with
no default**: `wikitool new source` refuses without an explicit value.
| Area | Hält |
|------|------|
| `transcripts/` | Session-Transkripte: mitgeschriebener Dialog zwischen Mensch und Agent, oder zwischen Menschen |
| `analyses/` | Analyse-Output eines Modells über einen Gegenstand - kein Dialog, kein Protokoll, sondern eine eigenständige Einschätzung |
| `articles/` | Externe Artikel und Blogposts, mit `source_url:` |
| `documents/` | Eingelesene Dokumente, Handbücher, Spezifikationen |
| `notes/` | Echte eigene Notizen ohne Dialogform - Cheat Sheets, Merkzettel |
| `trackers/` | Exporte aus einem Issue-Tracker oder vergleichbaren System |
| `unclassified/` | Sichtbares Fach für eine Quelle, deren Kategorie noch nicht feststeht - beratender `lint`-Befund, kein Sammelbecken. Es wieder zu leeren, oder das Enum um einen neuen Wert zu erweitern: [instructions/evolve-subtypes.md](../../instructions/evolve-subtypes.md) |
| Area | Holds |
|------|-------|
| `transcripts/` | Session transcripts: recorded dialogue between a human and an agent, or between humans |
| `analyses/` | A model's analytical output about a subject - not dialogue, not a record, but an assessment in its own right |
| `articles/` | External articles and blog posts, with `source_url:` |
| `documents/` | Ingested documents, manuals, specifications |
| `notes/` | Genuinely own notes in no dialogue form - cheat sheets, reminders |
| `trackers/` | Exports from an issue tracker or comparable system |
| `unclassified/` | The visible slot for a source whose category is not settled yet - an advisory `lint` finding, not a dumping ground. Emptying it again, or extending the enum by a new value: [instructions/evolve-subtypes.md](../../instructions/evolve-subtypes.md) |
Das sind Areas, keine Collections: sie erben diesen Contract und tragen keine eigene
`COLLECTION.md`. Die Zuordnung trifft niemand von Hand - sie steht als `layout:` in
`types/source.md`, und `wikitool new` legt eine neue Seite direkt dort ab. Eine Seite, die
anderswo liegt, meldet `wikitool lint` als *misplaced*; `wikitool move --page "<Titel>"` bringt
sie an ihren berechneten Ort.
These are areas, not collections: they inherit this contract and carry no `COLLECTION.md` of
their own. Nobody assigns them by hand - the mapping is the `layout:` in `types/source.md`, and
`wikitool new` puts a new page straight there. A page sitting anywhere else is reported by
`wikitool lint` as *misplaced*; `wikitool move --page "<title>"` moves it to its computed
location.
**`analysis` gegen `document`:** die Unterscheidung läuft über die Autorschaft, nicht über den
Inhalt. Ein Modell, das über einen Gegenstand urteilt oder ihn zusammenfasst, ohne dass ein
Mensch oder eine Organisation dafür geradesteht, ist `analysis` - unabhängig davon, wie
artikelförmig der Text wirkt. Ein Handbuch, eine Spezifikation, eine Herstellerdoku ist
`document`, auch wenn ein Werkzeug sie generiert hat, solange eine Organisation die Aussage
verantwortet. Die Frage ist also "wer haftet für die Behauptung", nicht "wie liest sich der
Text".
**`analysis` versus `document`:** the distinction runs on authorship, not on content. A model
judging or summarizing a subject with no human or organization answering for it is `analysis` -
however article-shaped the text looks. A manual, a specification, a vendor document is
`document`, even where a tool generated it, as long as an organization is accountable for what
it says. The question is "who is liable for the claim", not "how does the text read".
Solange es diesen Default noch gab, fiel fast alles hierher in `notes/`, weil
`types/source.schema.yaml` `notes` als `default:` gesetzt hatte - der Compiler wählte das
Sammelbecken, sobald niemand widersprach.
22 der 29 damaligen Seiten waren tatsächlich Transkripte, Analysen oder Tracker-Exporte und
wurden per `wikitool touch --set source_type=…` umklassifiziert, bevor die Areas entstanden.
While that default still existed, nearly everything landed here in `notes/`, because
`types/source.schema.yaml` had `notes` as its `default:` - the compiler picked the dumping
ground whenever nobody objected. 22 of the 29 pages there at the time were in fact transcripts,
analyses or tracker exports, and were reclassified with `wikitool touch --set source_type=…`
before the areas existed.
## Provenance rules