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…
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.mdF-WIKI-1.
El modelo de 3 niveles
| Nivel | Naturaleza | Aplicación | Alcance |
|---|---|---|---|
| Reglas duras | aplicadas por el código, incondicionales | validateWritablePath + el bloque de prompt siempre inyectado | Cada ruta de escritura vinculada al archivo |
| schemaPrompt | directrices editoriales por archivo | Solo datos + prompt (nunca una barrera) | Por archivo, opt-in (vacío = desactivado) |
| Campos estructurados | persona/purpose/scope inyectados por configuración | el comportamiento synthesis/orchestrator existente | Por archivo, sin cambios |
Reglas duras (code-enforced)
Dos mecanismos incondicionales, independientes de cualquier configuración:
- 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 prefijowiki/— un objetivo fuera dewiki/lanzaWrite target outside wiki/ directory: <path>. raw_sources/ is immutable.TantocreatePagecomoupdatePagela invocan antes de cualquierfs.writeFile. Ningún endpoint de API escribe bajoraw_sources/— es inmutable por diseño. - 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 dewiki/— 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()enarchiveConfigSchema— 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/configsobre un archivo sin fila almacenada →200con 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
reglas duras (código) > schemaPrompt (advisory) > campos estructurados- schemaPrompt nunca puede pasar por encima de las reglas duras (el prompt lo declara; el código lo aplica).
- En conflicto con los campos estructurados, gana schemaPrompt (
On conflict with the structured fields (persona, purpose, scope), these guidelines take precedence over them.). - 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
| Costura | Dónde | Notas |
|---|---|---|
| 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-788 | el 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ón | Fuente |
|---|---|
| El modelo de 3 niveles / reglas duras | docs/WIKI_SCHEMA_LAYER.md (§ The 3-layer model, § Layer 1) — F-WIKI-1 |
| schemaPrompt / precedencia / costuras | docs/WIKI_SCHEMA_LAYER.md (§ Layer 2, § Precedence chain, § Injection seams) |
| Auditoría | Phase 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`).