Wiki knowledge engine — Archive mit Schema, Wikilinks und Synthese
Die Wiki-Engine gibt jedem Archiv ein dreistufiges Instruktionsmodell: harte Regeln, vom Code erzwungen, ein pro-Archiv-Schema-Prompt (advisorische redaktionelle Leitlinien) und strukturierte Felder (persona, purpose, scope). Mentales Modell: schemaPromp…
Die Wiki-Engine gibt jedem Archiv ein dreistufiges Instruktionsmodell: harte Regeln, vom Code erzwungen, ein pro-Archiv-Schema-Prompt (advisorische redaktionelle Leitlinien) und strukturierte Felder (persona, purpose, scope). Mentales Modell: schemaPrompt verhält sich zum Wiki wie eine CLAUDE.md zum Code einer Repo.
Community-Funktion. Betreiber-Referenz für den Wiki Schema Layer (Phase 187, beim v0.25-Gate auditiert — WIKS-01/02, gegen den Live-Code verifiziert). Quelle:docs/WIKI_SCHEMA_LAYER.md(v0.28.1). Provenienz-Zeilen:FACT-CENSUS.mdF-WIKI-1.
Das 3-Schichten-Modell
| Schicht | Natur | Enforcement | Scope |
|---|---|---|---|
| Harte Regeln | vom Code erzwungen, bedingungslos | validateWritablePath + der immer injizierte Prompt-Block | Jeder archiv-gebundene Schreibpfad |
| schemaPrompt | redaktionelle Leitlinien pro Archiv | Nur Daten + Prompt (nie ein Gate) | Pro Archiv, Opt-in (leer = aus) |
| Strukturierte Felder | konfigurierte persona/purpose/scope | das bestehende synthesis/orchestrator-Verhalten | Pro Archiv, unverändert |
Harte Regeln (code-enforced)
Zwei bedingungslose Mechanismen, konfigurationsunabhängig:
- Die Dateisystem-Wache.
validateWritablePath(packages/server/src/utils/archivePath.ts:39-54) weist jedes Schreibziel außerhalb von<archiveBase>/wiki/zurück: zuerst der Anti-Traversal-Check (validateArchivePath), dann derwiki/-Präfix-Check — ein Ziel außerhalb vonwiki/wirftWrite target outside wiki/ directory: <path>. raw_sources/ is immutable.SowohlcreatePageals auchupdatePagerufen sie vor jedemfs.writeFileauf. Kein API-Endpoint schreibt unterraw_sources/— es ist per Design unveränderlich. - Der Prompt-Layer-Spiegel.
HARD_RULE_RAW_SOURCES(archiveConfigService.ts:52-53) ist ein immer aktiver Block, der an jeden archiv-gebundenen Prompt angehängt wird: sein Wortlaut spiegelt die Wache (raw_sources/ is immutable), sodass das Modell den Weg auswiki/heraus nie einmal versucht — und falls doch, garantiert der Code, dass nichts landet.
schemaPrompt (advisory)
Ein Freitextfeld, gespeichert im Config-JSON des Archivs:
- Schema:
schemaPrompt: z.string().max(10000).optional()aufarchiveConfigSchema— ein additiver Schlüssel, null Migrationen. 10000 Zeichen ≈ ~2500 Tokens. - Validierung: Zod bei jedem Schreibzugriff (
PUT /api/archives/:id/config); ein Payload über der Obergrenze →400 { error: "Invalid config", details.schemaPrompt }. - Read contract:
GET /api/archives/:id/configbei einem Archiv ohne gespeicherte Zeile →200mit der Schema-Default-Konfiguration ({ rawSourcesImmutable: true }): der Hydratations-Pfad des ersten Speicherns; Archive mit Zeile liefern den gespeicherten Blob unverändert zurück. - Die Injektions-Obergrenze: gespeicherte Legacy-Blobs über 10000 Zeichen werden bei der Injektion mit dem Vermerk
(truncated at 10000 characters)abgeschnitten — Legacy-Zeilen werden beim Lesen nie re-validiert. - Advisory per Design: der Block tritt als DATEN mit expliziter Advisor-Etikettierung ein, nie als Privilegien-Grant des System-Prompts. Keine Sanitization über die Längen-Obergrenze hinaus; widersprüchliche Anweisungen = ein akzeptiertes Qualitätsrisiko, gemildert durch die Hilfetexte und Templates der UI.
Präzedenz
harte Regeln (Code) > schemaPrompt (advisory) > strukturierte Felder- schemaPrompt kann die harten Regeln nie überstimmen (der Prompt deklariert es; der Code erzwingt es).
- Im Konflikt mit den strukturierten Feldern gewinnt schemaPrompt (
On conflict with the structured fields (persona, purpose, scope), these guidelines take precedence over them.). - Ein Archiv ohne schemaPrompt verhält sich als Baseline + harte Regel — null Enhancement, null Degradation (keine leeren Platzhalter-Abschnitte in Prompts).
Wo der Block im Prompt landet
| Nahtstelle | Wo | Hinweise |
|---|---|---|
| Chat orchestrator (non-streaming) | orchestrator.ts:295-302 (runAgent) | harte Regel IMMER + der advisorische Block, wenn vorhanden |
| Chat orchestrator (streaming) | orchestrator.ts:805-812 (runAgentStreaming) | der Streaming-Zwilling, dieselbe Reihenfolge |
| Synthesis Pass 4 (decision) | synthesisStages.ts:784-788 | der advisorische Block reist auf der SYSTEM-Rolle; die Pässe 1/2 und das Contradiction-Judging bleiben undefined |
Innerhalb des System-Prompts: nach dem MANDATORY SEARCH RULE-Block, vor dem systemPrompt-Ternär.
wiki_query und wiki_write
Die Builtins wiki_query und wiki_write sind Skills, deren execute()-Pfade keinen LLM-Aufruf machen: der Schreibpfad erzeugt deterministische Previews (wikiWriteService.ts enthält null LLM-Aufrufe) — die Per-Skill-Injektion würde kein Modell erreichen; die einzige LLM-Seite ist der System-Prompt des Orchestrators.
rawSourcesImmutable
rawSourcesImmutable: boolean (Default true) auf archiveConfigSchema ist ein Dokumentations-Flag, nie ein Enforcement-Toggle: die Immutabilitätsregel gilt unabhängig vom Flag (die validateWritablePath-Wache + der immer-aktive Block garantieren sie).
Diese Anleitung behandelt die Betriebsoberfläche der Wiki-Engine; die technische Tiefe steckt im Zwillingsbeitrag:
Provenance
| Abschnitt | Quelle |
|---|---|
| Das 3-Schichten-Modell / harte Regeln | docs/WIKI_SCHEMA_LAYER.md (§ The 3-layer model, § Layer 1) — F-WIKI-1 |
| schemaPrompt / Präzedenz / Nahtstellen | docs/WIKI_SCHEMA_LAYER.md (§ Layer 2, § Precedence chain, § Injection seams) |
| Audit | Phase 187 commits; abgeschlossen am v0.25-Gate (WIKS-01/02, Phase 194) |
---
Betreiber-Referenz — Simmetric Chat v0.28.1 (Dokumente aktualisiert am 2026-10-02, Census-SHA `aca5b8ff`).