Moteur de wiki — archives à schéma, wikilinks et synthèse
Le moteur de wiki donne à chaque archive un modèle d'instruction à trois niveaux : des règles dures appliquées par le code, un prompt de schéma par archive (lignes directrices éditoriales advisory) et des champs structurés (persona, purpose, scope). Modè…
Le moteur de wiki donne à chaque archive un modèle d'instruction à trois niveaux : des règles dures appliquées par le code, un prompt de schéma par archive (lignes directrices éditoriales advisory) et des champs structurés (persona, purpose, scope). Modèle mental : schemaPrompt est au wiki ce qu'un CLAUDE.md est au code d'une repo.
Fonctionnalité Community. Référence opérateur pour le Wiki Schema Layer (Phase 187, audité à la barrière v0.25 — WIKS-01/02, vérifié contre le code en direct). Source :docs/WIKI_SCHEMA_LAYER.md(v0.28.1). Lignes de provenance :FACT-CENSUS.mdF-WIKI-1.
Le modèle à 3 niveaux
| Niveau | Nature | Enforcement | Portée |
|---|---|---|---|
| Règles dures | appliquées par le code, inconditionnelles | validateWritablePath + le bloc prompt toujours injecté | Tout chemin d'écriture lié à l'archive |
| schemaPrompt | lignes directrices éditoriales par archive | Données + prompt seulement (jamais une barrière) | Par archive, opt-in (vide = désactivé) |
| Champs structurés | persona/purpose/scope injectés par config | le comportement synthesis/orchestrator existant | Par archive, inchangé |
Règles dures (code-enforced)
Deux mécanismes inconditionnels, indépendants de toute configuration :
- La garde du système de fichiers.
validateWritablePath(packages/server/src/utils/archivePath.ts:39-54) rejette toute cible d'écriture hors de<archiveBase>/wiki/: d'abord le contrôle anti-traversal (validateArchivePath), puis le contrôle du préfixewiki/— une cible hors dewiki/déclencheWrite target outside wiki/ directory: <path>. raw_sources/ is immutable.Chacun decreatePageetupdatePagel'appelle avant toutfs.writeFile. Aucun endpoint d'API n'écrit sousraw_sources/— c'est immuable par conception. - Le miroir au niveau du prompt.
HARD_RULE_RAW_SOURCES(archiveConfigService.ts:52-53) est un bloc toujours actif ajouté à chaque prompt lié à une archive : son libellé reflète la garde (raw_sources/ is immutable), si bien que le modèle ne tente jamais même la sortie hors dewiki/— et s'il s'y hasardait, le code garantit que rien n'atterrit.
schemaPrompt (advisory)
Un champ texte libre persisté dans le JSON de configuration de l'archive :
- Schéma :
schemaPrompt: z.string().max(10000).optional()surarchiveConfigSchema— une clé additive, zéro migration. 10000 caractères ≈ ~2500 tokens. - Validation : Zod à chaque écriture (
PUT /api/archives/:id/config) ; un payload au-dessus de la plafond →400 { error: "Invalid config", details.schemaPrompt }. - Contrat de lecture :
GET /api/archives/:id/configsur une archive sans ligne enregistrée →200avec le config par défaut du schéma ({ rawSourcesImmutable: true }) : c'est le chemin d'hydratation du premier enregistrement ; les archives avec une ligne retournent le blob stocké tel quel. - Le plafond à l'injection : les blobs legacy de plus de 10000 caractères sont tronqués à l'injection avec l'annotation
(truncated at 10000 characters)— les lignes legacy ne sont jamais re-validées à la lecture. - Advisory par conception : le bloc entre comme une DONNÉE avec une étiquette advisory explicite, jamais comme une subvention de privilège du system prompt. Aucune sanitisation au-delà du plafond de longueur ; des instructions contradictoires = un risque de qualité accepté, atténué par les textes d'aide et les templates de l'UI.
Précédence
règles dures (code) > schemaPrompt (advisory) > champs structurés- schemaPrompt ne peut jamais passer outre les règles dures (le prompt le déclare ; le code l'applique).
- En conflit avec les champs structurés, schemaPrompt l'emporte (
On conflict with the structured fields (persona, purpose, scope), these guidelines take precedence over them.). - Une archive sans schemaPrompt se comporte comme baseline + la règle dure — zéro amélioration, zéro dégradation (aucune section vide dans les prompts).
Où le bloc atterrit dans le prompt
| Couture | Où | Notes |
|---|---|---|
| Chat orchestrator (non-streaming) | orchestrator.ts:295-302 (runAgent) | règle dure TOUJOURS + le bloc advisory quand présent |
| Chat orchestrator (streaming) | orchestrator.ts:805-812 (runAgentStreaming) | le jumeau streaming, même ordre |
| Synthesis Pass 4 (decision) | synthesisStages.ts:784-788 | le bloc advisory voyage sur le rôle SYSTEM ; les Passes 1/2 et le jugement des contradictions restent undefined |
À l'intérieur du system prompt : après le bloc MANDATORY SEARCH RULE, avant le ternaire systemPrompt.
wiki_query et wiki_write
Les builtins wiki_query et wiki_write sont des skills dont les chemins execute() ne passent jamais par la LLM : l'écriture génère des previews déterministes (wikiWriteService.ts ne contient aucune invocation LLM) — l'injection par skill n'atteindrait aucun modèle ; la seule surface face à la LLM est le system prompt de l'orchestrator.
rawSourcesImmutable
rawSourcesImmutable: boolean (défaut true) sur archiveConfigSchema est un drapeau de documentation, jamais un interrupteur d'application : la règle d'immuabilité s'applique quel que soit le drapeau (la garde validateWritablePath + le bloc toujours actif la garantissent).
Ce guide couvre la surface opérationnelle du moteur de wiki; l'approfondissement technique vit dans la publication jumelle :
Provenance
| Section | Source |
|---|---|
| Le modèle à 3 niveaux / règles dures | docs/WIKI_SCHEMA_LAYER.md (§ The 3-layer model, § Layer 1) — F-WIKI-1 |
| schemaPrompt / précédence / coutures | docs/WIKI_SCHEMA_LAYER.md (§ Layer 2, § Precedence chain, § Injection seams) |
| Audit | Phase 187 commits ; finalisé à la barrière v0.25 (WIKS-01/02, Phase 194) |
---
Référence opérateur — Simmetric Chat v0.28.1 (docs actualisées le 2026-10-02, SHA du census `aca5b8ff`).