Volver a la documentación
Guía 00

Motor de wiki — archivos con esquema, wikilinks y síntesis

El motor de wiki da a cada archivo un modelo de instrucción de tres niveles: reglas duras aplicadas por el código, un prompt de esquema por archivo (directrices editoriales advisory) y campos estructurados (persona, purpose, scope). Modelo mental: schema…

3 min de lectura

El motor de wiki da a cada archivo un modelo de instrucción de tres niveles: reglas duras aplicadas por el código, un prompt de esquema por archivo (directrices editoriales advisory) y campos estructurados (persona, purpose, scope). Modelo mental: schemaPrompt es al wiki lo que un CLAUDE.md es al código de una repo.

Función Community. Referencia operativa para el Wiki Schema Layer (Phase 187, auditada en la barrera v0.25 — WIKS-01/02, verificada contra el código en vivo). Fuente: docs/WIKI_SCHEMA_LAYER.md (v0.28.1). Filas de procedencia: FACT-CENSUS.md F-WIKI-1.

El modelo de 3 niveles

NivelNaturalezaAplicaciónAlcance
Reglas durasaplicadas por el código, incondicionalesvalidateWritablePath + el bloque de prompt siempre inyectadoCada ruta de escritura vinculada al archivo
schemaPromptdirectrices editoriales por archivoSolo datos + prompt (nunca una barrera)Por archivo, opt-in (vacío = desactivado)
Campos estructuradospersona/purpose/scope inyectados por configuraciónel comportamiento synthesis/orchestrator existentePor archivo, sin cambios

Reglas duras (code-enforced)

Dos mecanismos incondicionales, independientes de cualquier configuración:

  1. La guardia del sistema de archivos. validateWritablePath (packages/server/src/utils/archivePath.ts:39-54) rechaza cualquier objetivo de escritura fuera de <archiveBase>/wiki/: primero el control anti-traversal (validateArchivePath), luego el control del prefijo wiki/ — un objetivo fuera de wiki/ lanza Write target outside wiki/ directory: <path>. raw_sources/ is immutable. Tanto createPage como updatePage la invocan antes de cualquier fs.writeFile. Ningún endpoint de API escribe bajo raw_sources/ — es inmutable por diseño.
  2. El espejo a nivel de prompt. HARD_RULE_RAW_SOURCES (archiveConfigService.ts:52-53) es un bloque siempre activo añadido a cada prompt vinculado al archivo: su redacción refleja la guardia (raw_sources/ is immutable), de modo que el modelo nunca intenta siquiera la salida fuera de wiki/ — y si lo intentara, el código garantiza que nada aterrice.

schemaPrompt (advisory)

Un campo de texto libre persistido en el JSON de configuración del archivo:

  • Esquema: schemaPrompt: z.string().max(10000).optional() en archiveConfigSchema — una clave aditiva, cero migraciones. 10000 caracteres ≈ ~2500 tokens.
  • Validación: Zod en cada escritura (PUT /api/archives/:id/config); un payload por encima del tope → 400 { error: "Invalid config", details.schemaPrompt }.
  • Contrato de lectura: GET /api/archives/:id/config sobre un archivo sin fila almacenada → 200 con el config por defecto del esquema ({ rawSourcesImmutable: true }): es la ruta de hidratación del primer guardado; los archivos con fila devuelven el blob almacenado tal cual.
  • El tope en la inyección: los blobs legacy de más de 10000 caracteres se truncan en la inyección con la anotación (truncated at 10000 characters) — las filas legacy nunca se re-validan en la lectura.
  • Advisory por diseño: el bloque entra como DATO con etiqueta advisory explícita, nunca como una concesión de privilegios del system prompt. Sin sanitización más allá del tope de longitud; instrucciones contradictorias = un riesgo de calidad aceptado, mitigado por los textos de ayuda y las plantillas de la UI.

Precedencia

text
reglas duras (código) > schemaPrompt (advisory) > campos estructurados
  1. schemaPrompt nunca puede pasar por encima de las reglas duras (el prompt lo declara; el código lo aplica).
  2. En conflicto con los campos estructurados, gana schemaPrompt (On conflict with the structured fields (persona, purpose, scope), these guidelines take precedence over them.).
  3. Un archivo sin schemaPrompt se comporta como línea base + regla dura — cero mejora, cero degradación (sin secciones de marcador vacías en los prompts).

Dónde aterriza el bloque en el prompt

CosturaDóndeNotas
Chat orchestrator (non-streaming)orchestrator.ts:295-302 (runAgent)regla dura SIEMPRE + el bloque advisory cuando está presente
Chat orchestrator (streaming)orchestrator.ts:805-812 (runAgentStreaming)el gemelo de streaming, mismo orden
Synthesis Pass 4 (decision)synthesisStages.ts:784-788el bloque advisory viaja en el rol SYSTEM; las Pasadas 1/2 y el juicio de contradicciones permanecen undefined

Dentro del system prompt: después del bloque MANDATORY SEARCH RULE, antes del ternario systemPrompt.

wiki_query y wiki_write

Los builtins wiki_query y wiki_write son skills cuyas rutas execute() nunca hacen ninguna llamada a la LLM: la escritura genera previews deterministas (wikiWriteService.ts no contiene invocaciones LLM) — la inyección por skill no alcanzaría ningún modelo; la única superficie cara a la LLM es el system prompt del orchestrator.

rawSourcesImmutable

rawSourcesImmutable: boolean (por defecto true) en archiveConfigSchema es un indicador de documentación, nunca un interruptor de aplicación: la regla de inmutabilidad se aplica sin importar el indicador (la guardia validateWritablePath + el bloque siempre activo la garantizan).

Esta guía cubre la superficie operativa del motor de wiki; la profundidad técnica vive en el post gemelo:

Provenance

SecciónFuente
El modelo de 3 niveles / reglas durasdocs/WIKI_SCHEMA_LAYER.md (§ The 3-layer model, § Layer 1) — F-WIKI-1
schemaPrompt / precedencia / costurasdocs/WIKI_SCHEMA_LAYER.md (§ Layer 2, § Precedence chain, § Injection seams)
AuditoríaPhase 187 commits; finalizada en la barrera v0.25 (WIKS-01/02, Phase 194)

---

Referencia operativa — Simmetric Chat v0.28.1 (documentos actualizados el 2026-10-02, SHA del censo `aca5b8ff`).