Retour à la documentation
Guide 00

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è…

3 min de lecture

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.md F-WIKI-1.

Le modèle à 3 niveaux

NiveauNatureEnforcementPortée
Règles duresappliquées par le code, inconditionnellesvalidateWritablePath + le bloc prompt toujours injectéTout chemin d'écriture lié à l'archive
schemaPromptlignes directrices éditoriales par archiveDonnées + prompt seulement (jamais une barrière)Par archive, opt-in (vide = désactivé)
Champs structuréspersona/purpose/scope injectés par configle comportement synthesis/orchestrator existantPar archive, inchangé

Règles dures (code-enforced)

Deux mécanismes inconditionnels, indépendants de toute configuration :

  1. 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éfixe wiki/ — une cible hors de wiki/ déclenche Write target outside wiki/ directory: <path>. raw_sources/ is immutable. Chacun de createPage et updatePage l'appelle avant tout fs.writeFile. Aucun endpoint d'API n'écrit sous raw_sources/ — c'est immuable par conception.
  2. 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 de wiki/ — 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() sur archiveConfigSchema — 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/config sur une archive sans ligne enregistrée → 200 avec 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

text
règles dures (code) > schemaPrompt (advisory) > champs structurés
  1. schemaPrompt ne peut jamais passer outre les règles dures (le prompt le déclare ; le code l'applique).
  2. 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.).
  3. 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

CoutureOù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-788le 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

SectionSource
Le modèle à 3 niveaux / règles duresdocs/WIKI_SCHEMA_LAYER.md (§ The 3-layer model, § Layer 1) — F-WIKI-1
schemaPrompt / précédence / couturesdocs/WIKI_SCHEMA_LAYER.md (§ Layer 2, § Precedence chain, § Injection seams)
AuditPhase 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`).