Abgeschlossen. Gebaut und ausgeliefert in 4ec22d3, Stack 8.0.0-beta.35 (--minor; der
Publish lief durch das Mass-Update-Gate, vom Betreiber freigegeben). Verifiziert durch CI-Run 529 und 530 auf 4ec22d3, beide success; lokal docs verify, instructions verify und pytest (2182 passed, 3 skipped).
Nachzug aus der Abschlussprüfung (stack-close, 2026-10-04): kb/CONTRACT.md § Titles are
identifiers regelte, wie ein Wikilink geschrieben wird, kannte aber [[Titel#Abschnitt]] nicht —
obwohl dieses Paket genau diese Form zur geprüften gemacht hat. Jetzt steht dort: der Titelteil
ist die Referenz (der Graph zählt ihn, rename trägt den Anker mit), ein veralteter Anker ist Broken Anchors (advisory), und ein Abschnitt ist nie Ziel einer Kante. Ausgeliefert in af8bcb5, Stack 8.0.0-beta.36 (--patch), CI-Run 531 und 532 success. Sonst fand die
Prüfung nichts Veraltetes: docs/ trägt weder D28 noch Label- oder Lint-Begründungen, die cli_contract-Datensätze nennen keine entity_type-Liste, README.md ist nachgezogen.
Abweichungen vom Entwurf, keine davon eine neue Entscheidung:
types/entity.guidance.md blieb unverändert (AK 3). Die Datei ist stack-eigen und sagt
ausdrücklich nichts darüber, welche entity_type-Werte eine Instanz wählt; ihre Zeile 18
(„a person, a team or an organization") ist generisch und stimmt weiter.
Aufstieg, Schritt 2 präzisiert (D5): der Abschnitt schrumpft zu einem Spiegelstrich - [[<Name>]] - <Rolle> unter ## Personen, ohne eigene Überschrift. Bliebe die
Überschrift stehen, lösten liegengebliebene Ankerlinks weiter auf und broken_anchors
könnte sie nicht melden.
Vergleich der Überschriften (D4) zusätzlich ohne Inline-Code-Backticks und ohne
schließende #; die H1 einer Seite zählt als Überschrift.
Mehr Pull-Through als geplant:wiki-ingest Schritt 7 sagt, wohin eine Person ohne
Material für eine Seite geht; page-lifecycle.md § Afterwards nennt --op create für einen
Aufstieg und die description: der Datei den neuen Abschnitt.
Drei bestehende Tests pinnten den entity_type-Wortschatz dieses Repos
(test_type_resolver.py zweimal, test_types_cmd.py) und sind um organization erweitert.
AK 11: einziger Treffer außerhalb tests/ ist Docstring-Prosa in lint_core.py
(„organization's page"), kein Wortschatz-Literal.
Problem
In der beruflichen Instanz (entsteht auf Basis von 8.0.0 final) gibt es für viele Personen nur
Stubs: Titel, Tätigkeitsbereich, sonst nichts — meist nach Kunde gruppiert. Zwei Dinge passten
daran nicht:
Die Seiten waren zu klein. Das Wiki führt zwei Schwellen, beide belegt (Farza, über Source - LLM Improvements Sonnet Analysis): Stub Threshold — unter 3 Sätzen oder 15
Zeilen ist eine Seite ein Stub — und Split Threshold — ab etwa 120–150 Zeilen wird geteilt.
Ein Personen-Stub liegt deutlich unter der unteren Schwelle. wiki-ingest Schritt 7 sagt
dasselbe als Regel: „A subject earns a page when the source carries material for one".
Die Gruppierung nach Kunde war nicht ausdrückbar.entity_type: wählt genau eine Area
(people/); eine Ebene people/<kunde>/ gibt es nicht.
prio/blocking, weil die berufliche Instanz das beim Anlegen vorfinden soll: gebaut vor version release von 8.0.0, nach #118.
Stand im Baum (geprüft 2026-10-03, vor dem Bau)
Organisationen waren entity_type: person.types/entity.schema.yaml: enum: [codebase, system, tool, technology, person]; types/entity.mdlayout: bildete person auf people/ ab; kb/entities/COLLECTION.md beschrieb people/ als „People and
organizations"; types/entity.person.md sprach von „Person oder Organisation". Im Korpus genau
eine Organisation: E3DC GmbH.
Kanten zielen auf Seiten, nie auf Abschnitte.xref add verlangt, dass das Ziel als Seite
existiert (commands/xref.py, „Page A or B not found").
Wikilinks im Text dürfen einen Abschnitt nennen, der Graph sieht ihn nicht. kb_scan.WIKILINK_RE (\[\[([^\]|#]+)) schneidet den Anker ab: [[Kunde X#Anna Müller]]
zählt als Link auf Kunde X. Ob der Abschnitt existiert, prüfte nichts.
rename erhält Anker.commands/page_ops.pyLINK_RE behält ein |alias/#anchor-Suffix.
Im Korpus gab es keinen einzigen Wikilink mit #.
Entscheidungen (Betreiber, 2026-10-03)
D1 — Personen stehen als Abschnitt auf der Organisationsseite, bis sie eine Seite verdienen
Optionen waren: A jede Person eine Seite, B Personen nur als Abschnitt, C Abschnitt mit
Aufstieg. Gewählt C — dieselbe Regel wie D28 aus #119, eine Ebene tiefer:
Eine Person steht als ###-Abschnitt unter ## Personen der Organisationsseite: Rolle,
Tätigkeitsbereich, ein bis drei Zeilen. Keine eigene Seite.
Hat sie Material für eine eigene Seite (wiki-ingest Schritt 7), steigt sie auf: eigene
Seite, der Abschnitt wird ein Spiegelstrich mit [[wikilink]], und die Personenseite trägt member-of auf die Organisation.
Projektseiten (#118): solange die Person keine Seite hat, zeigt die Kante auf die Organisation
(consults: Kunde X), und ## Beteiligte nennt die Person als [[Kunde X#Anna Müller]].
Nach dem Aufstieg zeigt beides auf die Person.
Bewusst getragene Kosten: RACI steht für nicht aufgestiegene Personen auf
Organisationsebene. Eine sehr große Organisation überschreitet Split Threshold — Ausweg ist
eine Teilorganisation (Abteilung, Standort) als eigene Seite mit part-of; Schreibdisziplin,
kein Prüfer. Wechselt jemand den Arbeitgeber, wandert der Abschnitt; Historie gibt es erst ab
einer eigenen Seite.
D2 — organization ist ein eigener entity_type und wird im Template ausgeliefert
Area organizations/, Titel „Organisationen", eigene Subtyp-Vorlage types/entity.organization.md mit ## Personen. Die Trennung Person/Organisation ist kein
beruflicher Sonderfall. person meint nur noch Menschen.
D3 — Label member-of für Person → Organisation
„belongs to the organization the target is" — operationales Register, kein Inverses. part-of
bleibt der Teilorganisation → Organisation vorbehalten. Autorisiert unter entities: im outbound: von kb/entities/COLLECTION.md.
D4 — Lint-Befund broken_anchors, nicht hart
Gemeldet wird ein [[Ziel#Anker]] bzw. [[Ziel#Anker|Alias]] im Seitentext, dessen Ziel
existiert, auf dessen Seite aber keine Überschrift dem Anker entspricht. Fehlt schon das Ziel,
ist das broken_links und nicht zusätzlich broken_anchors.
Vergleich: Überschriften aller Ebenen (# bis ######), code-bewusst (Code-Fences und
Inline-Code maskiert); Anker und Überschrift ohne Backticks, schließende #, mehrfachen
Whitespace und Groß-/Kleinschreibung (kb_scan.normalize_anchor). Ein verschachtelter Anker [[Ziel#A#B]] gilt, wenn jedes Segment als Überschrift auf der Zielseite vorkommt.
Nicht im Umfang: reine Selbstverweise [[#Anker]] und Anker in related:/sources:.
Nicht hart: der Link führt weiterhin auf die richtige Seite; und ein neuer harter Befund
würde den Lint einer bestehenden Instanz nach dem Upgrade rot machen (D6).
D5 — Der Aufstieg ist eine dokumentierte Prozedur
instructions/page-lifecycle.md § „Promote a section to its own page", fünf Schritte: Seite mit wikitool new entity --set entity_type=person anlegen; Abschnitt zu einem Spiegelstrich ohne
eigene Überschrift kürzen; xref add --rel member-of; Ankerlinks mit wikitool search "[[<Organisation>#<Name>" finden und umbiegen, Kanten von Projektseiten
umhängen; lint bestätigt null broken_anchors. Kein Kommando: selten und urteilsbehaftet.
D6 — Versionsteil: --minor
Vorwärts: Schema, Type-Spec und Subtyp-Vorlagen gehören der Instanz und kommen nur als .template. member-of ist reine Daten. broken_anchors ist nicht hart.
Rückwärts: eine ältere tools/-Fassung kennt den Befund nicht; eine Seite mit entity_type: organization validiert gegen das Schema der Instanz.
Akzeptanzkriterien
types/entity.schema.yaml führt organization im Enum; types/entity.md in der
Frontmatter-Tabelle und im layout: als organization: {dir: organizations, title: Organisationen}.
types/entity.organization.md existiert; new entity --set entity_type=organization legt
die Seite unter kb/entities/organizations/ an, mit ## Personen und der Aufstiegsregel als
TODO-Zeile (test_new_organization_scaffolds_the_organization_template).
types/entity.person.md und kb/entities/COLLECTION.md (Areas, Per-area emphasis, neuer
Abschnitt „People live on their organization's page until they earn their own") trennen Person
und Organisation und verweisen auf page-lifecycle.md. types/entity.guidance.md bewusst
unverändert (siehe oben).
instructions/link-taxonomy.md § Operational führt member-of und grenzt es gegen part-of ab; kb/entities/COLLECTION.md autorisiert es unter outbound: entities:.
instructions/kb-profiles.md § entities, instructions/wiki-ingest/SKILL.md Schritt 7
und README.md nennen organization/organizations/.
kb_scan.anchored_wikilinks/heading_anchors/normalize_anchor; lint_core.broken_anchors im Bericht („Broken Anchors - advisory, not an error") und in --json; nicht in HARD_ERROR_KEYS.
Tests in test_lint.py: vorhandener Abschnitt mit anderer Schreibung, ###/####, Alias,
Backticks, schließenden #, H1, verschachtelt (kein Befund); fehlender Abschnitt, auch
verschachtelt (Befund, Anker wie geschrieben); Überschrift nur im Fence (Befund); fehlende
Zielseite (nur broken_links); Anker in Fence/Inline-Code und [[#X]] (kein Befund); has_hard_errors bleibt falsch.
lints cli_contract-Datensatz nennt den Befund (docs contract --apply, tools/CONTRACT.md); wiki-lint Schritt 3 nennt ihn; seit af8bcb5 auch kb/CONTRACT.md.
page-lifecycle.md hat den Abschnitt; Inhaltsverzeichnis per docs toc --apply.
E3DC GmbH: touch --set entity_type=organization, move nach kb/entities/organizations/, **Typ:**-Zeile angepasst, index rebuild, log append --op move. lint --json gegen HEAD verglichen: identisch bis auf den neuen, leeren broken_anchors.
Kein Wortschatz-Literal member-of/organization in tools/chemenu/ außerhalb tests/
(ein Docstring-Wort, siehe oben).
version bump --minor → 8.0.0-beta.35, Changeset geschrieben (4ec22d3); CI-Runs 529 und
530 auf 4ec22d3 grün.
Abgrenzung
Beteiligungs- und RACI-Label der Projektseite: #118 (geschlossen).
Die COLLECTION.md und Vorlagen der beruflichen Instanz selbst (sie adoptiert die .template).
Ein Kommando für den Aufstieg — bewusst nicht (D5).
Azure-DevOps-Adapter für die berufliche Instanz: #128.
## Ergebnis
**Abgeschlossen.** Gebaut und ausgeliefert in `4ec22d3`, Stack **8.0.0-beta.35** (`--minor`; der
Publish lief durch das Mass-Update-Gate, vom Betreiber freigegeben). Verifiziert durch CI-Run
**529** und **530** auf `4ec22d3`, beide success; lokal `docs verify`, `instructions verify` und
`pytest` (2182 passed, 3 skipped).
**Nachzug aus der Abschlussprüfung** (`stack-close`, 2026-10-04): `kb/CONTRACT.md` § Titles are
identifiers regelte, wie ein Wikilink geschrieben wird, kannte aber `[[Titel#Abschnitt]]` nicht —
obwohl dieses Paket genau diese Form zur geprüften gemacht hat. Jetzt steht dort: der Titelteil
ist die Referenz (der Graph zählt ihn, `rename` trägt den Anker mit), ein veralteter Anker ist
*Broken Anchors* (advisory), und ein Abschnitt ist nie Ziel einer Kante. Ausgeliefert in
`af8bcb5`, Stack **8.0.0-beta.36** (`--patch`), CI-Run **531** und **532** success. Sonst fand die
Prüfung nichts Veraltetes: `docs/` trägt weder D28 noch Label- oder Lint-Begründungen, die
`cli_contract`-Datensätze nennen keine `entity_type`-Liste, `README.md` ist nachgezogen.
Abweichungen vom Entwurf, keine davon eine neue Entscheidung:
- **`types/entity.guidance.md` blieb unverändert** (AK 3). Die Datei ist stack-eigen und sagt
ausdrücklich nichts darüber, welche `entity_type`-Werte eine Instanz wählt; ihre Zeile 18
(„a person, a team or an organization") ist generisch und stimmt weiter.
- **Aufstieg, Schritt 2 präzisiert** (D5): der Abschnitt schrumpft zu einem Spiegelstrich
`- [[<Name>]] - <Rolle>` unter `## Personen`, **ohne eigene Überschrift**. Bliebe die
Überschrift stehen, lösten liegengebliebene Ankerlinks weiter auf und `broken_anchors`
könnte sie nicht melden.
- **Vergleich der Überschriften** (D4) zusätzlich ohne Inline-Code-Backticks und ohne
schließende `#`; die H1 einer Seite zählt als Überschrift.
- **Mehr Pull-Through als geplant:** `wiki-ingest` Schritt 7 sagt, wohin eine Person ohne
Material für eine Seite geht; `page-lifecycle.md` § Afterwards nennt `--op create` für einen
Aufstieg und die `description:` der Datei den neuen Abschnitt.
- **Drei bestehende Tests** pinnten den `entity_type`-Wortschatz dieses Repos
(`test_type_resolver.py` zweimal, `test_types_cmd.py`) und sind um `organization` erweitert.
- **AK 11:** einziger Treffer außerhalb `tests/` ist Docstring-Prosa in `lint_core.py`
(„organization's page"), kein Wortschatz-Literal.
## Problem
In der beruflichen Instanz (entsteht auf Basis von **8.0.0 final**) gibt es für viele Personen nur
Stubs: Titel, Tätigkeitsbereich, sonst nichts — meist nach Kunde gruppiert. Zwei Dinge passten
daran nicht:
1. **Die Seiten waren zu klein.** Das Wiki führt zwei Schwellen, beide belegt (Farza, über
`Source - LLM Improvements Sonnet Analysis`): `Stub Threshold` — unter 3 Sätzen oder 15
Zeilen ist eine Seite ein Stub — und `Split Threshold` — ab etwa 120–150 Zeilen wird geteilt.
Ein Personen-Stub liegt deutlich unter der unteren Schwelle. `wiki-ingest` Schritt 7 sagt
dasselbe als Regel: „A subject earns a page when the source carries material for one".
2. **Die Gruppierung nach Kunde war nicht ausdrückbar.** `entity_type:` wählt genau eine Area
(`people/`); eine Ebene `people/<kunde>/` gibt es nicht.
`prio/blocking`, weil die berufliche Instanz das beim Anlegen vorfinden soll: gebaut vor
`version release` von 8.0.0, nach #118.
## Stand im Baum (geprüft 2026-10-03, vor dem Bau)
- **Organisationen waren `entity_type: person`.** `types/entity.schema.yaml`:
`enum: [codebase, system, tool, technology, person]`; `types/entity.md` `layout:` bildete
`person` auf `people/` ab; `kb/entities/COLLECTION.md` beschrieb `people/` als „People and
organizations"; `types/entity.person.md` sprach von „Person oder Organisation". Im Korpus genau
eine Organisation: `E3DC GmbH`.
- **Kanten zielen auf Seiten, nie auf Abschnitte.** `xref add` verlangt, dass das Ziel als Seite
existiert (`commands/xref.py`, „Page A or B not found").
- **Wikilinks im Text dürfen einen Abschnitt nennen, der Graph sieht ihn nicht.**
`kb_scan.WIKILINK_RE` (`\[\[([^\]|#]+)`) schneidet den Anker ab: `[[Kunde X#Anna Müller]]`
zählt als Link auf `Kunde X`. Ob der Abschnitt existiert, prüfte nichts.
- **`rename` erhält Anker.** `commands/page_ops.py` `LINK_RE` behält ein `|alias`/`#anchor`-Suffix.
- **Im Korpus gab es keinen einzigen Wikilink mit `#`.**
## Entscheidungen (Betreiber, 2026-10-03)
### D1 — Personen stehen als Abschnitt auf der Organisationsseite, bis sie eine Seite verdienen
Optionen waren: A jede Person eine Seite, B Personen nur als Abschnitt, **C Abschnitt mit
Aufstieg**. Gewählt C — dieselbe Regel wie D28 aus #119, eine Ebene tiefer:
- Eine Person steht als `###`-Abschnitt unter `## Personen` der Organisationsseite: Rolle,
Tätigkeitsbereich, ein bis drei Zeilen. Keine eigene Seite.
- Hat sie Material für eine eigene Seite (`wiki-ingest` Schritt 7), steigt sie auf: eigene
Seite, der Abschnitt wird ein Spiegelstrich mit `[[wikilink]]`, und die Personenseite trägt
`member-of` auf die Organisation.
- Projektseiten (#118): solange die Person keine Seite hat, zeigt die Kante auf die Organisation
(`consults: Kunde X`), und `## Beteiligte` nennt die Person als `[[Kunde X#Anna Müller]]`.
Nach dem Aufstieg zeigt beides auf die Person.
**Bewusst getragene Kosten:** RACI steht für nicht aufgestiegene Personen auf
Organisationsebene. Eine sehr große Organisation überschreitet `Split Threshold` — Ausweg ist
eine Teilorganisation (Abteilung, Standort) als eigene Seite mit `part-of`; Schreibdisziplin,
kein Prüfer. Wechselt jemand den Arbeitgeber, wandert der Abschnitt; Historie gibt es erst ab
einer eigenen Seite.
### D2 — `organization` ist ein eigener `entity_type` und wird im Template ausgeliefert
Area `organizations/`, Titel „Organisationen", eigene Subtyp-Vorlage
`types/entity.organization.md` mit `## Personen`. Die Trennung Person/Organisation ist kein
beruflicher Sonderfall. `person` meint nur noch Menschen.
### D3 — Label `member-of` für Person → Organisation
„belongs to the organization the target is" — operationales Register, kein Inverses. `part-of`
bleibt der Teilorganisation → Organisation vorbehalten. Autorisiert unter `entities:` im
`outbound:` von `kb/entities/COLLECTION.md`.
### D4 — Lint-Befund `broken_anchors`, nicht hart
- **Gemeldet wird** ein `[[Ziel#Anker]]` bzw. `[[Ziel#Anker|Alias]]` im Seitentext, dessen Ziel
existiert, auf dessen Seite aber keine Überschrift dem Anker entspricht. Fehlt schon das Ziel,
ist das `broken_links` und nicht zusätzlich `broken_anchors`.
- **Vergleich:** Überschriften aller Ebenen (`#` bis `######`), code-bewusst (Code-Fences und
Inline-Code maskiert); Anker und Überschrift ohne Backticks, schließende `#`, mehrfachen
Whitespace und Groß-/Kleinschreibung (`kb_scan.normalize_anchor`). Ein verschachtelter Anker
`[[Ziel#A#B]]` gilt, wenn jedes Segment als Überschrift auf der Zielseite vorkommt.
- **Nicht im Umfang:** reine Selbstverweise `[[#Anker]]` und Anker in `related:`/`sources:`.
- **Nicht hart:** der Link führt weiterhin auf die richtige Seite; und ein neuer harter Befund
würde den Lint einer bestehenden Instanz nach dem Upgrade rot machen (D6).
### D5 — Der Aufstieg ist eine dokumentierte Prozedur
`instructions/page-lifecycle.md` § „Promote a section to its own page", fünf Schritte: Seite mit
`wikitool new entity --set entity_type=person` anlegen; Abschnitt zu einem Spiegelstrich ohne
eigene Überschrift kürzen; `xref add --rel member-of`; Ankerlinks mit
`wikitool search "[[<Organisation>#<Name>"` finden und umbiegen, Kanten von Projektseiten
umhängen; `lint` bestätigt null `broken_anchors`. Kein Kommando: selten und urteilsbehaftet.
### D6 — Versionsteil: `--minor`
- **Vorwärts:** Schema, Type-Spec und Subtyp-Vorlagen gehören der Instanz und kommen nur als
`.template`. `member-of` ist reine Daten. `broken_anchors` ist nicht hart.
- **Rückwärts:** eine ältere `tools/`-Fassung kennt den Befund nicht; eine Seite mit
`entity_type: organization` validiert gegen das Schema der *Instanz*.
## Akzeptanzkriterien
1. [x] `types/entity.schema.yaml` führt `organization` im Enum; `types/entity.md` in der
Frontmatter-Tabelle und im `layout:` als `organization: {dir: organizations, title: Organisationen}`.
2. [x] `types/entity.organization.md` existiert; `new entity --set entity_type=organization` legt
die Seite unter `kb/entities/organizations/` an, mit `## Personen` und der Aufstiegsregel als
TODO-Zeile (`test_new_organization_scaffolds_the_organization_template`).
3. [x] `types/entity.person.md` und `kb/entities/COLLECTION.md` (Areas, Per-area emphasis, neuer
Abschnitt „People live on their organization's page until they earn their own") trennen Person
und Organisation und verweisen auf `page-lifecycle.md`. `types/entity.guidance.md` bewusst
unverändert (siehe oben).
4. [x] `instructions/link-taxonomy.md` § Operational führt `member-of` und grenzt es gegen
`part-of` ab; `kb/entities/COLLECTION.md` autorisiert es unter `outbound: entities:`.
5. [x] `instructions/kb-profiles.md` § `entities`, `instructions/wiki-ingest/SKILL.md` Schritt 7
und `README.md` nennen `organization`/`organizations/`.
6. [x] `kb_scan.anchored_wikilinks`/`heading_anchors`/`normalize_anchor`;
`lint_core.broken_anchors` im Bericht („Broken Anchors - advisory, not an error") und in
`--json`; nicht in `HARD_ERROR_KEYS`.
7. [x] Tests in `test_lint.py`: vorhandener Abschnitt mit anderer Schreibung, `###`/`####`, Alias,
Backticks, schließenden `#`, H1, verschachtelt (kein Befund); fehlender Abschnitt, auch
verschachtelt (Befund, Anker wie geschrieben); Überschrift nur im Fence (Befund); fehlende
Zielseite (nur `broken_links`); Anker in Fence/Inline-Code und `[[#X]]` (kein Befund);
`has_hard_errors` bleibt falsch.
8. [x] `lint`s `cli_contract`-Datensatz nennt den Befund (`docs contract --apply`,
`tools/CONTRACT.md`); `wiki-lint` Schritt 3 nennt ihn; seit `af8bcb5` auch `kb/CONTRACT.md`.
9. [x] `page-lifecycle.md` hat den Abschnitt; Inhaltsverzeichnis per `docs toc --apply`.
10. [x] `E3DC GmbH`: `touch --set entity_type=organization`, `move` nach
`kb/entities/organizations/`, `**Typ:**`-Zeile angepasst, `index rebuild`, `log append --op
move`. `lint --json` gegen `HEAD` verglichen: identisch bis auf den neuen, leeren
`broken_anchors`.
11. [x] Kein Wortschatz-Literal `member-of`/`organization` in `tools/chemenu/` außerhalb `tests/`
(ein Docstring-Wort, siehe oben).
12. [x] `docs verify` und `instructions verify` grün; `pytest`: 2182 passed, 3 skipped.
13. [x] `version bump --minor` → 8.0.0-beta.35, Changeset geschrieben (`4ec22d3`); CI-Runs 529 und
530 auf `4ec22d3` grün.
## Abgrenzung
- Beteiligungs- und RACI-Label der Projektseite: #118 (geschlossen).
- Die `COLLECTION.md` und Vorlagen der beruflichen Instanz selbst (sie adoptiert die `.template`).
- Ein Kommando für den Aufstieg — bewusst nicht (D5).
- Azure-DevOps-Adapter für die berufliche Instanz: #128.
torben
changed title from Organisationsseiten sammeln Personen-Stubs: Personen eines Kunden als Abschnitt statt eigener Seite to Organisationsseiten: Personen als Abschnitt mit Aufstieg zur eigenen Seite, `organization`-Subtyp, `member-of`, Lint fuer Abschnittsanker2026-10-03 20:39:25 +00:00
Changelog: Q1–Q5 entschieden (Betreiber, 2026-10-03) und als D1–D6 in den Body uebernommen: Variante C (Abschnitt mit Aufstieg), organization als ausgelieferter entity_type mit eigener Subtyp-Vorlage, Label member-of, Lint-Befund broken_anchors (nicht hart, hier mitgebaut), Aufstieg als Prozedur in page-lifecycle.md statt als Kommando, Versionsteil --minor. Akzeptanzkriterien konkret (13 Punkte, inkl. Testfaelle fuer den Befund und E3DC GmbH → organizations/). kind/decision → kind/build, prio/planned → prio/blocking (vor 8.0.0 final), Reihenfolge nach #118.
**Changelog:** Q1–Q5 entschieden (Betreiber, 2026-10-03) und als D1–D6 in den Body uebernommen: Variante C (Abschnitt mit Aufstieg), `organization` als ausgelieferter `entity_type` mit eigener Subtyp-Vorlage, Label `member-of`, Lint-Befund `broken_anchors` (nicht hart, hier mitgebaut), Aufstieg als Prozedur in `page-lifecycle.md` statt als Kommando, Versionsteil `--minor`. Akzeptanzkriterien konkret (13 Punkte, inkl. Testfaelle fuer den Befund und `E3DC GmbH` → `organizations/`). `kind/decision` → `kind/build`, `prio/planned` → `prio/blocking` (vor 8.0.0 final), Reihenfolge nach #118.
Changelog: Gebaut und gepublisht (4ec22d3, Stack 8.0.0-beta.35; Mass-Update-Gate vom Betreiber freigegeben), CI-Runs 529/530 gruen. AK 1–13 abgehakt mit Beleg. Neu im Body: „Stand der Umsetzung" mit den Abweichungen — types/entity.guidance.md bleibt unveraendert (stack-eigen, instanzneutral); Aufstieg Schritt 2 praezisiert (Abschnitt wird Spiegelstrich ohne eigene Ueberschrift, damit broken_anchors liegengebliebene Links meldet); Ueberschriftenvergleich zusaetzlich ohne Backticks/schliessende #, H1 zaehlt; zusaetzlicher Pull-Through in wiki-ingest Schritt 7 und page-lifecycle.md § Afterwards; drei bestehende Tests mit gepinntem entity_type-Wortschatz erweitert. „Stand im Baum" und Problem ins Praeteritum gesetzt.
**Changelog:** Gebaut und gepublisht (`4ec22d3`, Stack 8.0.0-beta.35; Mass-Update-Gate vom Betreiber freigegeben), CI-Runs 529/530 gruen. AK 1–13 abgehakt mit Beleg. Neu im Body: „Stand der Umsetzung" mit den Abweichungen — `types/entity.guidance.md` bleibt unveraendert (stack-eigen, instanzneutral); Aufstieg Schritt 2 praezisiert (Abschnitt wird Spiegelstrich **ohne** eigene Ueberschrift, damit `broken_anchors` liegengebliebene Links meldet); Ueberschriftenvergleich zusaetzlich ohne Backticks/schliessende `#`, H1 zaehlt; zusaetzlicher Pull-Through in `wiki-ingest` Schritt 7 und `page-lifecycle.md` § Afterwards; drei bestehende Tests mit gepinntem `entity_type`-Wortschatz erweitert. „Stand im Baum" und Problem ins Praeteritum gesetzt.
Changelog: Geschlossen. Abschlussprüfung fand eine Lücke: kb/CONTRACT.md § Titles are identifiers kannte [[Titel#Abschnitt]] und Broken Anchors nicht — nachgezogen in af8bcb5 (Stack 8.0.0-beta.36, --patch), CI-Runs 531/532 grün. Sonst nichts veraltet (docs/, Command-Records, README geprüft). Body auf Endstand: Kopf „Ergebnis" mit allen gelaufenen Prüfungen und dem Nachzug, AK 8 um kb/CONTRACT.md ergänzt, Verweis auf #118 als geschlossen.
**Changelog:** Geschlossen. Abschlussprüfung fand eine Lücke: `kb/CONTRACT.md` § Titles are identifiers kannte `[[Titel#Abschnitt]]` und *Broken Anchors* nicht — nachgezogen in `af8bcb5` (Stack 8.0.0-beta.36, `--patch`), CI-Runs 531/532 grün. Sonst nichts veraltet (`docs/`, Command-Records, README geprüft). Body auf Endstand: Kopf „Ergebnis" mit allen gelaufenen Prüfungen und dem Nachzug, AK 8 um `kb/CONTRACT.md` ergänzt, Verweis auf #118 als geschlossen.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ergebnis
Abgeschlossen. Gebaut und ausgeliefert in
4ec22d3, Stack 8.0.0-beta.35 (--minor; derPublish lief durch das Mass-Update-Gate, vom Betreiber freigegeben). Verifiziert durch CI-Run
529 und 530 auf
4ec22d3, beide success; lokaldocs verify,instructions verifyundpytest(2182 passed, 3 skipped).Nachzug aus der Abschlussprüfung (
stack-close, 2026-10-04):kb/CONTRACT.md§ Titles areidentifiers regelte, wie ein Wikilink geschrieben wird, kannte aber
[[Titel#Abschnitt]]nicht —obwohl dieses Paket genau diese Form zur geprüften gemacht hat. Jetzt steht dort: der Titelteil
ist die Referenz (der Graph zählt ihn,
renameträgt den Anker mit), ein veralteter Anker istBroken Anchors (advisory), und ein Abschnitt ist nie Ziel einer Kante. Ausgeliefert in
af8bcb5, Stack 8.0.0-beta.36 (--patch), CI-Run 531 und 532 success. Sonst fand diePrüfung nichts Veraltetes:
docs/trägt weder D28 noch Label- oder Lint-Begründungen, diecli_contract-Datensätze nennen keineentity_type-Liste,README.mdist nachgezogen.Abweichungen vom Entwurf, keine davon eine neue Entscheidung:
types/entity.guidance.mdblieb unverändert (AK 3). Die Datei ist stack-eigen und sagtausdrücklich nichts darüber, welche
entity_type-Werte eine Instanz wählt; ihre Zeile 18(„a person, a team or an organization") ist generisch und stimmt weiter.
- [[<Name>]] - <Rolle>unter## Personen, ohne eigene Überschrift. Bliebe dieÜberschrift stehen, lösten liegengebliebene Ankerlinks weiter auf und
broken_anchorskönnte sie nicht melden.
schließende
#; die H1 einer Seite zählt als Überschrift.wiki-ingestSchritt 7 sagt, wohin eine Person ohneMaterial für eine Seite geht;
page-lifecycle.md§ Afterwards nennt--op createfür einenAufstieg und die
description:der Datei den neuen Abschnitt.entity_type-Wortschatz dieses Repos(
test_type_resolver.pyzweimal,test_types_cmd.py) und sind umorganizationerweitert.tests/ist Docstring-Prosa inlint_core.py(„organization's page"), kein Wortschatz-Literal.
Problem
In der beruflichen Instanz (entsteht auf Basis von 8.0.0 final) gibt es für viele Personen nur
Stubs: Titel, Tätigkeitsbereich, sonst nichts — meist nach Kunde gruppiert. Zwei Dinge passten
daran nicht:
Source - LLM Improvements Sonnet Analysis):Stub Threshold— unter 3 Sätzen oder 15Zeilen ist eine Seite ein Stub — und
Split Threshold— ab etwa 120–150 Zeilen wird geteilt.Ein Personen-Stub liegt deutlich unter der unteren Schwelle.
wiki-ingestSchritt 7 sagtdasselbe als Regel: „A subject earns a page when the source carries material for one".
entity_type:wählt genau eine Area(
people/); eine Ebenepeople/<kunde>/gibt es nicht.prio/blocking, weil die berufliche Instanz das beim Anlegen vorfinden soll: gebaut vorversion releasevon 8.0.0, nach #118.Stand im Baum (geprüft 2026-10-03, vor dem Bau)
entity_type: person.types/entity.schema.yaml:enum: [codebase, system, tool, technology, person];types/entity.mdlayout:bildetepersonaufpeople/ab;kb/entities/COLLECTION.mdbeschriebpeople/als „People andorganizations";
types/entity.person.mdsprach von „Person oder Organisation". Im Korpus genaueine Organisation:
E3DC GmbH.xref addverlangt, dass das Ziel als Seiteexistiert (
commands/xref.py, „Page A or B not found").kb_scan.WIKILINK_RE(\[\[([^\]|#]+)) schneidet den Anker ab:[[Kunde X#Anna Müller]]zählt als Link auf
Kunde X. Ob der Abschnitt existiert, prüfte nichts.renameerhält Anker.commands/page_ops.pyLINK_REbehält ein|alias/#anchor-Suffix.#.Entscheidungen (Betreiber, 2026-10-03)
D1 — Personen stehen als Abschnitt auf der Organisationsseite, bis sie eine Seite verdienen
Optionen waren: A jede Person eine Seite, B Personen nur als Abschnitt, C Abschnitt mit
Aufstieg. Gewählt C — dieselbe Regel wie D28 aus #119, eine Ebene tiefer:
###-Abschnitt unter## Personender Organisationsseite: Rolle,Tätigkeitsbereich, ein bis drei Zeilen. Keine eigene Seite.
wiki-ingestSchritt 7), steigt sie auf: eigeneSeite, der Abschnitt wird ein Spiegelstrich mit
[[wikilink]], und die Personenseite trägtmember-ofauf die Organisation.(
consults: Kunde X), und## Beteiligtenennt die Person als[[Kunde X#Anna Müller]].Nach dem Aufstieg zeigt beides auf die Person.
Bewusst getragene Kosten: RACI steht für nicht aufgestiegene Personen auf
Organisationsebene. Eine sehr große Organisation überschreitet
Split Threshold— Ausweg isteine Teilorganisation (Abteilung, Standort) als eigene Seite mit
part-of; Schreibdisziplin,kein Prüfer. Wechselt jemand den Arbeitgeber, wandert der Abschnitt; Historie gibt es erst ab
einer eigenen Seite.
D2 —
organizationist ein eigenerentity_typeund wird im Template ausgeliefertArea
organizations/, Titel „Organisationen", eigene Subtyp-Vorlagetypes/entity.organization.mdmit## Personen. Die Trennung Person/Organisation ist keinberuflicher Sonderfall.
personmeint nur noch Menschen.D3 — Label
member-offür Person → Organisation„belongs to the organization the target is" — operationales Register, kein Inverses.
part-ofbleibt der Teilorganisation → Organisation vorbehalten. Autorisiert unter
entities:imoutbound:vonkb/entities/COLLECTION.md.D4 — Lint-Befund
broken_anchors, nicht hart[[Ziel#Anker]]bzw.[[Ziel#Anker|Alias]]im Seitentext, dessen Zielexistiert, auf dessen Seite aber keine Überschrift dem Anker entspricht. Fehlt schon das Ziel,
ist das
broken_linksund nicht zusätzlichbroken_anchors.#bis######), code-bewusst (Code-Fences undInline-Code maskiert); Anker und Überschrift ohne Backticks, schließende
#, mehrfachenWhitespace und Groß-/Kleinschreibung (
kb_scan.normalize_anchor). Ein verschachtelter Anker[[Ziel#A#B]]gilt, wenn jedes Segment als Überschrift auf der Zielseite vorkommt.[[#Anker]]und Anker inrelated:/sources:.würde den Lint einer bestehenden Instanz nach dem Upgrade rot machen (D6).
D5 — Der Aufstieg ist eine dokumentierte Prozedur
instructions/page-lifecycle.md§ „Promote a section to its own page", fünf Schritte: Seite mitwikitool new entity --set entity_type=personanlegen; Abschnitt zu einem Spiegelstrich ohneeigene Überschrift kürzen;
xref add --rel member-of; Ankerlinks mitwikitool search "[[<Organisation>#<Name>"finden und umbiegen, Kanten von Projektseitenumhängen;
lintbestätigt nullbroken_anchors. Kein Kommando: selten und urteilsbehaftet.D6 — Versionsteil:
--minor.template.member-ofist reine Daten.broken_anchorsist nicht hart.tools/-Fassung kennt den Befund nicht; eine Seite mitentity_type: organizationvalidiert gegen das Schema der Instanz.Akzeptanzkriterien
types/entity.schema.yamlführtorganizationim Enum;types/entity.mdin derFrontmatter-Tabelle und im
layout:alsorganization: {dir: organizations, title: Organisationen}.types/entity.organization.mdexistiert;new entity --set entity_type=organizationlegtdie Seite unter
kb/entities/organizations/an, mit## Personenund der Aufstiegsregel alsTODO-Zeile (
test_new_organization_scaffolds_the_organization_template).types/entity.person.mdundkb/entities/COLLECTION.md(Areas, Per-area emphasis, neuerAbschnitt „People live on their organization's page until they earn their own") trennen Person
und Organisation und verweisen auf
page-lifecycle.md.types/entity.guidance.mdbewusstunverändert (siehe oben).
instructions/link-taxonomy.md§ Operational führtmember-ofund grenzt es gegenpart-ofab;kb/entities/COLLECTION.mdautorisiert es unteroutbound: entities:.instructions/kb-profiles.md§entities,instructions/wiki-ingest/SKILL.mdSchritt 7und
README.mdnennenorganization/organizations/.kb_scan.anchored_wikilinks/heading_anchors/normalize_anchor;lint_core.broken_anchorsim Bericht („Broken Anchors - advisory, not an error") und in--json; nicht inHARD_ERROR_KEYS.test_lint.py: vorhandener Abschnitt mit anderer Schreibung,###/####, Alias,Backticks, schließenden
#, H1, verschachtelt (kein Befund); fehlender Abschnitt, auchverschachtelt (Befund, Anker wie geschrieben); Überschrift nur im Fence (Befund); fehlende
Zielseite (nur
broken_links); Anker in Fence/Inline-Code und[[#X]](kein Befund);has_hard_errorsbleibt falsch.lintscli_contract-Datensatz nennt den Befund (docs contract --apply,tools/CONTRACT.md);wiki-lintSchritt 3 nennt ihn; seitaf8bcb5auchkb/CONTRACT.md.page-lifecycle.mdhat den Abschnitt; Inhaltsverzeichnis perdocs toc --apply.E3DC GmbH:touch --set entity_type=organization,movenachkb/entities/organizations/,**Typ:**-Zeile angepasst,index rebuild,log append --op move.lint --jsongegenHEADverglichen: identisch bis auf den neuen, leerenbroken_anchors.member-of/organizationintools/chemenu/außerhalbtests/(ein Docstring-Wort, siehe oben).
docs verifyundinstructions verifygrün;pytest: 2182 passed, 3 skipped.version bump --minor→ 8.0.0-beta.35, Changeset geschrieben (4ec22d3); CI-Runs 529 und530 auf
4ec22d3grün.Abgrenzung
COLLECTION.mdund Vorlagen der beruflichen Instanz selbst (sie adoptiert die.template).Organisationsseiten sammeln Personen-Stubs: Personen eines Kunden als Abschnitt statt eigener Seiteto Organisationsseiten: Personen als Abschnitt mit Aufstieg zur eigenen Seite, `organization`-Subtyp, `member-of`, Lint fuer AbschnittsankerChangelog: Q1–Q5 entschieden (Betreiber, 2026-10-03) und als D1–D6 in den Body uebernommen: Variante C (Abschnitt mit Aufstieg),
organizationals ausgelieferterentity_typemit eigener Subtyp-Vorlage, Labelmember-of, Lint-Befundbroken_anchors(nicht hart, hier mitgebaut), Aufstieg als Prozedur inpage-lifecycle.mdstatt als Kommando, Versionsteil--minor. Akzeptanzkriterien konkret (13 Punkte, inkl. Testfaelle fuer den Befund undE3DC GmbH→organizations/).kind/decision→kind/build,prio/planned→prio/blocking(vor 8.0.0 final), Reihenfolge nach #118.Changelog: Gebaut und gepublisht (
4ec22d3, Stack 8.0.0-beta.35; Mass-Update-Gate vom Betreiber freigegeben), CI-Runs 529/530 gruen. AK 1–13 abgehakt mit Beleg. Neu im Body: „Stand der Umsetzung" mit den Abweichungen —types/entity.guidance.mdbleibt unveraendert (stack-eigen, instanzneutral); Aufstieg Schritt 2 praezisiert (Abschnitt wird Spiegelstrich ohne eigene Ueberschrift, damitbroken_anchorsliegengebliebene Links meldet); Ueberschriftenvergleich zusaetzlich ohne Backticks/schliessende#, H1 zaehlt; zusaetzlicher Pull-Through inwiki-ingestSchritt 7 undpage-lifecycle.md§ Afterwards; drei bestehende Tests mit gepinntementity_type-Wortschatz erweitert. „Stand im Baum" und Problem ins Praeteritum gesetzt.Changelog: Geschlossen. Abschlussprüfung fand eine Lücke:
kb/CONTRACT.md§ Titles are identifiers kannte[[Titel#Abschnitt]]und Broken Anchors nicht — nachgezogen inaf8bcb5(Stack 8.0.0-beta.36,--patch), CI-Runs 531/532 grün. Sonst nichts veraltet (docs/, Command-Records, README geprüft). Body auf Endstand: Kopf „Ergebnis" mit allen gelaufenen Prüfungen und dem Nachzug, AK 8 umkb/CONTRACT.mdergänzt, Verweis auf #118 als geschlossen.