20 KiB
Wiki of Wikis — Compiler-Schema-Vertrag (OKF 0.2)
Status: autorisiert (Story 1.3) — verbindlicher, normativer OKF-0.2-Schema-Vertrag für das Knowledge Bundle.
Vertrags-Metadaten:
- Autorisierende Story: Story 1.3 «OKF-Schema-Vertrag
schema/wiki-compiler.mdautorisieren» — Spezifikation:_bmad-output/implementation-artifacts/spec-1-3-okf-schema-vertrag-schema-wiki-compiler-md-autorisieren.md- Autorisierungsdatum: 2026-08-15
- Revision: 1 (Re-Derivation nach Loop-1-Review; Spec Change Log, Loop 1)
Dieser Vertrag ist die einzige normative Quelle für das erlaubte OKF-0.2-Feldsubset, die exakte sources-Form, die Zulässigkeit von generated/verified, das status-Policing, stale_after, die okf_version-Regel, die log.md-Typdefinition, die Index-Regel sowie die Validitätsprädikate für Concepts und Bundle-Root (AD-1a, A0-1, D-10). Er bindet alle Producer (Compiler und Adapter) gleichermaßen und ist die Prüfgrundlage der Schema-Validierung (Story 1.4, AD-1b/F-2/A0-2). Jede inhaltliche Abweichung von diesem Vertrag erfordert eine neue Autorisierung; einzelne Producer dürfen sie nicht vornehmen. Das Schema liegt außerhalb des Bundles (wiki/) und ist keine Concept-Datei; es ist ein reiner Textvertrag (Markdown) und kein ausführbarer Code (Structural Seed, AD-1).
Fachliche Verbindlichkeit: Begriffe wie „MUSS" und „DARF NICHT" sind verbindliche Regeln; Verstöße gelten, sofern hier nicht anders geregelt, als strukturelle Invalidität (§7). „SOLL" ist eine normative Empfehlung, deren Abweichung begründet werden muss. „KANN"/„darf" bezeichnet eine zulässige, aber nicht geforderte Möglichkeit.
1. Geltungsbereich
- Dieser Vertrag gilt für alle Markdown-Dateien innerhalb der Bundleroot
wiki/sowie für die Pfade, auf diesources-Einträge von Concepts verweisen. - Er gilt nicht für
raw/,schema/undadapters/: Diese liegen außerhalb des Bundles und sind keine Concept-Dateien (Structural Seed, AD-1). - Verteilte Regelwerke in
adapters/MÜSSEN mit diesem Vertrag konform sein und DÜRFEN keine abweichende Knowledge-Semantik definieren (AD-10). - Der Vertrag bleibt rein textuell; er wird von den konsumierenden Producern als Instruktion und von der Validierung (Story 1.4) als Prüfregelwerk gelesen (AD-1).
2. Bundle-Struktur und Bundleroot (okf_version-Regel)
-
Die Bundleroot ist
wiki/(AD-1, AD-9). Sie ist das einzige Verzeichnis, das als OKF Knowledge Bundle behandelt wird;raw/,schema/undadapters/sind keine Bestandteile des Bundles. -
Die Bundleroot enthält zwingend eine Datei
wiki/index.mdund — nach Anlage — eine Dateiwiki/log.md(reservierte Namen;index.md-Regeln: §2/§6,log.md-Typdefinition: §5). Weitere.md-Dateien auf Root-Ebene sind Concepts und unterliegen dem Concept-Prädikat (§6.1). -
wiki/index.mdMUSS als Bundleroot deklariert sein; ihr Frontmatter ist ausschließlich die Bundledeklarationtype: bundleundokf_version: "0.2":--- type: bundle okf_version: "0.2" ---Zusätzliche oder abweichende Frontmatter-Felder sind in der Bundleroot nicht zulässig.
-
okf_version-Regel:okf_version: "0.2"MUSS ausschließlich in der Bundlerootwiki/index.mdstehen. Es DARF NICHT in Area-index.md, in Concepts, inlog.mdoder in irgendeiner anderen Bundle-Datei vorkommen. -
type: bundle-Regel:type: bundleMUSS ausschließlich in der Bundlerootwiki/index.mdvorkommen. Es DARF NICHT in irgendeiner anderen Datei des Bundles auftauchen. -
Frontmatter-Exklusivität: Area-
index.md-Dateien (§6) undlog.md-Dateien (§5) tragen kein Frontmatter. Genauer: Frontmatter ist inindex.mdausschließlich in der Bundleroot erlaubt; jede andereindex.mdim Bundle MUSS frontmatterlos sein.
3. Concept-Feldsubset
Ein Concept ist eine Markdown-Datei mit YAML-Frontmatter innerhalb von wiki/, die weder index.md noch log.md ist. Für das Frontmatter eines Concepts gilt das folgende Feldsubset. Es ist vollständig: Kein anderes Frontmatter-Feld ist erlaubt.
3.1 type — einziges Pflichtfeld
typeMUSS gesetzt und darf nicht leer sein. Es ist das einzige Pflichtfeld eines Concepts.typeMUSS ein nicht-leerer String sein; nicht-String-Werte (z. B.null, Zahlen, Datumsobjekte) sind nicht gesetzt im Sinne dieses Vertrags und damit strukturell invalide.- Nicht gesperrte
.md-Dateien im Bundle (also alle Concepts) MÜSSEN einentypetragen; eine.md-Datei im Bundle ohne Frontmatter bzw. ohnetypeist strukturell invalide (§7) — sie ist nicht „kein Concept", sondern ein invalides Bundle-Element. «Reserviert» im Sinne dieses Vertrags sind ausschließlichindex.md(Bundleroot und Area-index.md) undlog.md(§2, §5, §6); alle übrigen.md-Dateien gelten als nicht-reserviert. - Der Wert von
typeist eine fachliche Klassifikation des Concepts und wird in der Regelconceptoder eine spezifischere, im jeweiligen Fall bestimmte Klasse sein; die Zulässigkeit konkreter Werte legt dieser Vertrag nicht über die Nicht-Leerheit hinaus fest.
3.2 Optionale Felder
Optionale Felder eines Concepts sind ausschließlich: sources, generated, verified, status, stale_after. Alle fünf sind einzeln weglassbar. Das Fehlen eines optionalen Feldes ist niemals ein Validierungsfehler (A0-2/AD-1b, §7). Leere Werte zählen dabei wie folgt: sources: [] und verified: [] sind zulässig und semantisch gleichbedeutend mit Absenz; leere Listen sind also keine Invalidität.
3.3 sources — Liste von Maps
-
sourcesMUSS, falls gesetzt, eine YAML-Liste von Maps sein. Die Map-/Objekt-Form als Quelle (ein einzelnes Mapping direkt untersources) ist nicht zulässig.sources: [](leere Liste) ist zulässig und gleichbedeutend mit Absenz. -
Jeder Listeneintrag ist eine Map.
resourceist die einzige Pflichtangabe je Eintrag und MUSS gesetzt und nicht leer sein. Die folgenden Angaben sind innerhalb eines Eintrags optional (OKF-0.2-Evidenz-Grammatik):id(stabile Kennung, effizient für Zitat-Attribution),title,author,usage_count(Ganzzahl ≥ 0),last_modified(ISO-DatumYYYY-MM-DD). -
Key-Subset je Ebene: Innerhalb eines
sources-Eintrags sind ausschließlich die Felderresource,id,title,author,usage_count,last_modifiederlaubt. Unautorisierte Keys in einemsources-Eintrag sind strukturell invalide (§7). -
Provenienz-Ziellinie (Verbot):
resourceMUSS auf einen Pfad unterraw/verweisen — auf lokal materialisierte, immutable Evidenz (FR-1/A-4, AD-4b/A0-4).resourceDARF NIEMALS auf einenwiki/-Concept-Pfad auflösen. Pfade insourcessind Provenienz zur Evidenz und ersetzen keine Wiki-Links: Wiki-Links sind die Navigations-/Beziehungsschicht (AD-8) und werden formatseitig von Provenienz unterschieden. -
Deterministische Auflöse-Basis (v1):
resourceist ein relativer Workspace-Pfad, der relativ zur Workspace-Root (oberste Ebene des Git-Arbeitsverzeichnisses) aufgelöst wird. In v1 MUSS der aufgelöste Pfad innerhalbraw/landen; eine URL-Form vonresourceist in v1 nicht zulässig (FR-1, A-4)...-Traversale ist generell unzulässig — unabhängig davon, ob das Auflösungsziel innerhalbraw/liegt:resourceDARF keinen..-Path-Segment enthalten und DARF bei Auflösung NICHT außerhalbraw/landen. Absolute Pfadformen (führender/),file://-Präfixe und Backslash-/Windows-Trenner sind in v1 ebenfalls nicht zulässig;resourcenutzt ausschließlich/-getrennte relative Pfade. -
Existenz-Prüfung als Validator-Verhalten: Die Prüfung, ob die referenzierte
raw/-Datei tatsächlich existiert, ist ein Validator-Verhalten der Story 1.4 und wird hier nicht durchgeführt; sie ist als Normreferenz in §8 vermerkt. -
Beispiel:
sources: - resource: raw/prd/prd-wow20-2026-08-14.md id: s1 title: "Wiki of Wikis PRD" author: "Michael Tamse" usage_count: 3 last_modified: 2026-08-14
3.4 generated
-
generatedist, falls gesetzt, eine Map mit den Feldernbyundat. Die Map-Form ist die einzige zulässige Form; eine Liste ist hier nicht zulässig. -
byist die Pflichtangabe innerhalbgeneratedund MUSS gesetzt und nicht leer sein (leerer String und reiner Whitespace sind verboten). Eingeneratedohneby(nuratoder leer) ist strukturell invalide (§7).atist optional; falls gesetzt, MUSS es ein ISO-8601-Datetime sein. -
Key-Subset: Innerhalb von
generatedsind ausschließlich die Felderbyundaterlaubt. Unautorisierte Keys sind strukturell invalide (§7). -
Actor-Konvention für
by: Agenten/Tools verwenden<producer>/<version>(z. B.wow-compiler/0.1.0); Personen verwendenhuman:<id>(z. B.human:michael). -
generatedkennzeichnet maschinelle Erzeugung. Der v1-Default laut A0-20 ist: maschinell erzeugt und ungeprüft →generatedgesetzt,verifiedungesetzt. -
Beispiel:
generated: by: wow-compiler/0.1.0 at: 2026-08-14T12:00:00Z
3.5 verified
-
verifiedist, falls gesetzt, eine Liste von{by, at}-Ereignissen. Eine einzelne Map (verified: { by: ..., at: ... }) MUSS als 1-Element-Liste interpretiert werden.verified: [](leere Liste) ist zulässig und gleichbedeutend mit Absenz. -
In jedem Eintrag ist
bydie Pflichtangabe (identifiziert den/die Reviewer) und MUSS gesetzt und nicht leer sein (leerer String und reiner Whitespace sind verboten); einverified-Eintrag ohnebyist strukturell invalide (§7).atist optional und MUSS, falls gesetzt, ein ISO-8601-Datetime sein. Konsistenz mit der OKF-0.2-Darstellung: Eine einzelne Map wird als 1-Element-Liste gelesen — diese Toleranz ist Teil des Vertrags und wird von der Schema-Validierung (Story 1.4) entsprechend umgesetzt. -
Key-Subset: Innerhalb eines
verified-Eintrags sind ausschließlich die Felderbyundaterlaubt. Unautorisierte Keys sind strukturell invalide (§7). -
byMUSS der Actor-Konvention aus §3.4 folgen. -
Trust-Klassifikation: Ein
by-Wert mithuman:-Präfix markiert human-reviewed Wissen. Ohnehuman:-Präfix kennzeichnet der Eintrag nicht-userbezogene Prüfung und begründet keine human-review-Klassifikation. Human-reviewed Knowledge bleibt dadurch von ungeprüftem maschinellem Output unterscheidbar (FR-13, AD-15, A0-20). -
verifiedbleibt ungesetzt, solange kein Mensch das Concept reviewed hat (v1-Default, A0-20). -
Beispiel:
verified: - by: human:reviewer-1 at: 2026-08-15T09:30:00Z
3.6 status — Policing (unabhängig von Trust)
- Zulässige Werte von
statussind ausschließlich:draft|stable|deprecated. Kein anderer Wert ist gültig. - Absenz von
statusbedeutet den Defaultstable: Ein Concept ohnestatusgilt alsstable. - Ein gesetzter
statusmit einem Wert außerhalb der erlaubten Menge ist strukturell invalide (§7). - Orthogonalität von
statusund Trust:status(Lifecycle:draft/stable/deprecated) und derverified-Status (Trust/Review) sind unabhängige Dimensionen (AD-15/A0-20). Ein nicht-human-reviewtes Concept ist NICHT deshalb vonstableausgeschlossen; umgekehrt erzwingtverifiedkeinen bestimmtenstatus. Es gibt keine Regel, die „ungeprüft" mit „nicht stable" gleichsetzt. Insbesondere ist der v1-Default „maschinell erzeugt und ungeprüft" (generated ohne verified) mit demstatus-Defaultstablevereinbar.
3.7 stale_after
stale_afterist optional und MUSS, falls gesetzt, ein absolutes Datum im FormatYYYY-MM-DDsein.- Ein Concept gilt als veraltet, wenn das Tagesdatum
today >= stale_aftererfüllt:today >= stale_after⇒ veraltet.
4. (reserviert)
Dieser Abschnitt ist in dieser Revision unbenutzt und für zukünftige Erweiterungen reserviert. Er ist kein Teil der Norm.
5. log.md-Typdefinition (OKF §9)
-
log.mdist ein reservierter Name innerhalb des Bundles. In v1 istlog.mdeine Datei an der Bundleroot (wiki/log.md, Lease-Root-Scope, AD-17b); der reservierte Name darf nicht an anderer Stelle im Bundle verwendet werden. (Eine Ausweitung, z. B.log.mdpro Area, ist eine Normerweiterung und erfordert eine neue Autorisierung.) -
log.mdträgt kein Frontmatter. -
Format: eine flache Liste datumsgruppierter Einträge, neueste zuerst; der Header jedes Gruppenabschnitts ist ein ISO-Datum
YYYY-MM-DD. -
Inhalt:
log.mddokumentiert fachliche Änderungen und Disagreements (AD-16b), einschließlich Konfliktklassifikation samt Begründung, verknüpft mit dem jeweils mutierten Concept-Pfad. Es ist Teil der Lease-Root-Scope (wiki/inklusivelog.md,index.mdund aller Root-Dateien; AD-17b). -
Struktur-Beispiel:
# Log ## 2026-08-15 - AD-16b: `flowable/timers` CORRECTING, ersetzt durch ... (Logik: ...) ## 2026-08-14 - neu: `spring/testing` angelegt (sources: raw/...)
6. Index-Regel und Validitätsprädikate
Index-Regel (progressive Discovery):
- Jede Area innerhalb von
wiki/MUSS eine Dateiindex.mdenthalten, die die Inhalte der Area verlinkt. - Die
index.md-Dateien bilden zusammen mit der Bundle-Hierarchie die erste progressive-Discovery-Ebene: Ein Consumer navigiert von der Bundlerootwiki/index.mdüber die Area-index.md-Dateien zu den Concepts (AD-9/FR-11). - Neue Concepts MÜSSEN in der
index.mdder zugehörigen Area verlinkt werden, damit sie entdeckbar bleiben (Story 2.5). - Area-
index.md-Dateien tragen kein Frontmatter. Frontmatter ist inindex.mdausschließlich in der Bundleroot erlaubt (§2). - Reservierter Status:
index.mdist ein reservierter Name; er ist als Bundleroot-Datei und als Area-index.mderlaubt. Jedeindex.mdim Bundle ist damit vom Invaliditätsfall „nicht-reservierte.md-Datei ohne Frontmatter bzw. ohnetype" (§7, Fall 2) ausgenommen. Die Verletzung der Index-Regel selbst (Area ohneindex.md, fehlender Link eines neuen Concepts) ist strukturell invalide (§7, Fall 11).
6.1 Concept-Prädikat
Ein Concept ist gültig genau dann, wenn alle Bedingungen erfüllt sind:
- Format: Markdown mit YAML-Frontmatter; Frontmatter ist gültiges YAML.
type: vorhanden und nicht leer (§3.1). Eine nicht-reservierte.md-Datei im Bundle ohne Frontmatter bzw. ohnetypeist strukturell invalide (§7).- Feldsubset: das Frontmatter enthält ausschließlich Felder aus §3 (kein zusätzliches, nicht autorisiertes Feld).
sources-Form: falls gesetzt, Liste von Maps mitresourceje Eintrag (§3.3).- Provenienz-Ziellinie & Deterministische Auflösung: kein
resource-Eintrag löst auf einenwiki/-Concept-Pfad auf; keinresource-Eintrag verlässt bei Auflösung relativ zur Workspace-Rootraw/(kein..-Traversal, keine URL-Form) (§3.3, AD-4b/A0-4). - Key-Subset je Ebene: keine unautorisierten Keys innerhalb von
sources/generated/verified-Einträgen sowie keine unautorisierten Frontmatter-Felder (§3.3–3.5). generated/verified-Zulässigkeit: falls gesetzt, entsprechengeneratedundverifiedden Formen und Pflichtangaben aus §3.4/§3.5;byist jeweils gesetzt und nicht leer.status: falls gesetzt, einer der Werte aus §3.6.stale_after: falls gesetzt, DatumYYYY-MM-DD(§3.7).- A0-5/AD-4c (Normreferenz, v1 tautologisch erfüllt): In v1 zeigt
sourcesausschließlich aufraw/-Evidenz; ein generiertes Concept kann nie ein anderes generiertes Concept als alleinige Provenienz führen. Diese Regel ist in v1 daher automatisch (tautologisch) erfüllt und erzeugt kein eigenes Validitätsprädikat. Sie ist als Normreferenz zu §8 dokumentiert und bei späterer Einführung von Quellen, die auf andere generierte Concepts zeigen können (Epic 2+), erneut zu evaluieren.
6.2 Bundle-Root-Prädikat
- Die Bundleroot
wiki/index.mdMUSStype: bundleUNDokf_version: "0.2"tragen; deren Frontmatter ist ausschließlich diese beiden Felder (§2). okf_version: "0.2"DARF NICHT in irgendeiner anderen Datei des Bundles vorkommen (insbesondere nicht in Area-index.md, Concepts oderlog.md).type: bundleDARF NICHT in irgendeiner anderen Datei des Bundles vorkommen.- Nur in der Bundleroot
index.mdist Frontmatter erlaubt; Area-index.mdundlog.mdsind frontmatterlos.
7. Strukturelle Invalidität vs. optionale Felder
- Strukturelle Invalidität schlägt den Compilation Run fehl. Die Liste der strukturell invaliden Zustände ist abschließend; sie umfasst genau die folgenden Fälle:
- ein Concept ohne
typeoder mit leeremtype; - eine nicht-reservierte
.md-Datei im Bundle ohne Frontmatter bzw. ohnetype; - ein
sources-resource-Eintrag, der auf einenwiki/-Concept-Pfad auflöst; - ein
sources-resource-Eintrag, der bei Auflösung relativ zur Workspace-Root außerhalbraw/landet (insbesondere via..-Traversal) oder in v1 eine URL-Form vonresourcedarstellt; - ein verbotener
status-Wert (nichtdraft/stable/deprecated); - ein nicht autorisiertes Frontmatter-Feld (für Concepts oder Bundleroot) oder ein unautorisierter Key innerhalb eines
sources/generated/verified-Eintrags; - eine leere oder fehlende (reiner Whitespace eingeschlossen)
by-Angabe ingeneratedoderverified; - eine Bundleroot
wiki/index.mdohnetype: bundlebzw. ohneokf_version: "0.2", oder ein abweichenderokf_version-Wert (z. B."0.3") in der Bundleroot; okf_version: "0.2"odertype: bundlean einer anderen Stelle als der Bundleroot;- Frontmatter in einer Area-
index.mdoder einerlog.md; - die Verletzung der Index-Regel (§6): eine Area ohne
index.mdoder ein neues Concept ohne Verlinkung in derindex.mdder zugehörigen Area; - ein
sources- oderverified-Eintrag in nicht erlaubter Form (z. B.sources/verifiedals einzelne Map statt Liste, Skalar-Einträge statt Maps) sowie eingeneratedin Listen- statt Map-Form; - ein doppelter Frontmatter-Key (z. B. doppeltes
typeoder doppeltesokf_version) — Duplikat-Keys sind strukturell invalide; - fehlerhafte Wert-Formate:
stale_after/last_modifiedungleichYYYY-MM-DD,atungleich ISO-8601-Datetime,usage_countkeine Ganzzahl ≥ 0,typekein nicht-leerer String.
- ein Concept ohne
- Abschließende Liste: Diese Liste ist abschließend. Erweiterungen der Invaliditätsdefinition sind nur über die Autorisierung bzw. das Story-Verfahren möglich, nicht stillschweigend durch einzelne Producer oder Validator-Implementierungen.
- Fehlende optionale Felder sind niemals ein Fehler: Ein Concept mit nur
typeund ohnesources/generated/verified/status/stale_afterist gültig (A0-2/AD-1b, F-2). Abwesenheit vonstatusbedeutetstable-Default und ist keine Invalidität. Leere Listen (sources: [],verified: []) sind zulässig und keine Invalidität. - Ein fehlgeschlagener Run lässt
raw/unangetastet; die Fehlerursache muss textuell identifizierbar sein (NFR-4/AD-3). - Kalender-Validität und Datum/Vergleich:
YYYY-MM-DD-Felder müssen reale Kalenderdaten sein (z. B. ist2026-02-31invalide, obwohl textuellYYYY-MM-DD-konform). Der Veraltungsvergleichtoday >= stale_aftererfolgt in UTC.
8. Normreferenzen
- PRD §13 — Fixierung von OKF 0.2 als normativer Format-Standard (FR-9, NFR-6); OKF-Spezifikation (Google Cloud,
knowledge-catalog). - AD-1, AD-1a, AD-1b (Schema-Bindung, Validierung F-2/A0-2); AD-2/AD-3 (Bundlegrenze,
raw/immutable); AD-4b/A0-4 (Provenienz-Ziellinie); AD-4c/A0-5 (keine abgeleitete Provenienz; in v1 tautologisch erfüllt, §6.1); AD-9 (Index-Regel/Discovery); AD-15/A0-20 (Trust-Metadaten, v1-Default; Orthogonalitätstatus/Trust); AD-16b (Disagreements inlog.md); AD-17b (Lease-Root-Scope); Structural Seed (Bundlerootwiki/,okf_versionnur in Bundleroot-index.md). - Existenz-Prüfung referenzierter
raw/-Dateien: Validator-Verhalten der Story 1.4 (hier nicht ausgeführt). - Story 1.4 — implementiert die Validierung dieses Vertrags.