Configuración¶
Esta página describe la configuración del DARE Method anclada en el esquema
real: el archivo de proyecto dare.config.json (validado por Zod), el archivo
de backend del grafo dare-graph.yml y las variables de entorno del servidor
MCP.
Todo es opt-in
Los bloques verification y hooks están deshabilitados por defecto.
La ausencia del bloque en dare.config.json equivale a los defaults con
enabled:false / trusted:false. Solo activas lo que quieras, en un diff
versionado.
dare.config.json¶
El archivo en la raíz del proyecto reúne cuatro grupos:
- Identidad del proyecto (
name,structure,backend,frontend,ide,graphrag,rustWorkspaceLayout,cratePrefix) — verProjectConfig. verification— gates de calidad del Ralph Loop (Zodstrict).hooks— automatizaciones determinísticas por evento (Zodstrict).steering— no vive en el JSON; se resuelve a partir de archivos en disco (ver Agentes › Steering files).
{
// ── Identidade do projeto (ProjectConfig) ───────────────────────────
"name": "meu-projeto",
"structure": "monorepo", // 'monorepo' | 'backend' | 'frontend'
"backend": "rust-axum", // opcional; ver tabela abaixo
"frontend": "react", // opcional; ver tabela abaixo
"ide": "cursor", // 'cursor' | 'antigravity' | 'hybrid'
"graphrag": "sqlite", // 'sqlite' | 'json' | 'neo4j'
"rustWorkspaceLayout": "multi", // opcional: 'single' | 'multi'
"cratePrefix": "ars", // opcional: prefixo p/ multi-crate
// ── verification (DEFAULTS de verification/config.ts) ───────────────
"verification": {
"enabled": false,
"mutation": {
"enabled": true,
"minScore": 0.7,
"incremental": true,
"maxMutants": 200,
"timeoutSeconds": 900
},
"failToPass": { "required": true },
"antiTamper": { "enabled": true },
"typeCheck": { "enabled": false },
"loop": {
"policy": "decay", // 'decay' | 'fixed'
"maxAttempts": 5,
"saturationWindow": 3,
"onSaturation": "fresh-start" // 'fresh-start' | 'replan' | 'escalate'
},
"bestOfN": {
"default": 1,
"max": 5,
"budgetTokens": null
},
"prerank": { "enabled": false },
"formal": {
"enabled": false,
"backend": "dafny", // 'dafny' | 'verus' | 'lean'
"modules": [],
"maxRepairIterations": 5,
"proofTimeoutSeconds": 120,
"antiBypass": true
}
},
// ── hooks (HOOK_DEFAULTS de hooks/config.ts) ────────────────────────
"hooks": {
"on": {}, // evento → lista de ações da allowlist
"trusted": false
}
}
Identidad del proyecto¶
Campos de ProjectConfig (packages/cli/src/core/types/project.ts).
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
name |
string |
— (obligatorio) | Nombre del proyecto. |
structure |
'monorepo' \| 'backend' \| 'frontend' |
— (obligatorio) | Forma del repositorio. |
backend |
'rust-axum' \| 'node-nestjs' \| 'python-fastapi' \| 'php-laravel' |
— (opcional) | Stack de backend. |
frontend |
'react' \| 'vue' \| 'rust-leptos' \| 'rust-leptos-csr' |
— (opcional) | Stack de frontend. |
ide |
'cursor' \| 'antigravity' \| 'hybrid' |
— (obligatorio) | IDE/asistente objetivo. |
graphrag |
'sqlite' \| 'json' \| 'neo4j' |
— (obligatorio) | Backend del knowledge graph (ver dare-graph.yml). |
rustWorkspaceLayout |
'single' \| 'multi' |
— (opcional) | single: crates/server + crates/web. multi: {prefix}-core/-server/-web/-cli. |
cratePrefix |
string |
— (opcional) | Prefijo corto para nombres multi-crate (ej.: ars → ars-core, ars-server…). |
verification¶
El bloque entero se valida en verification/config.ts (Zod .strict() — los
campos desconocidos son rechazados). La ausencia del bloque equivale a
enabled:false.
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
enabled |
boolean |
false |
Activa el pipeline de verificación en su conjunto. |
verification.mutation¶
Gate de mutation testing — bloquea el DONE si el score queda por debajo del mínimo.
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
enabled |
boolean |
true |
Activa el gate de mutación. |
minScore |
number (0–1) |
0.7 |
Score mínimo de mutantes eliminados; por debajo, el DONE se bloquea. |
incremental |
boolean |
true |
Solo muta archivos del git diff de la task. |
maxMutants |
number (int > 0) |
200 |
Tope de mutantes por ejecución. |
timeoutSeconds |
number (int > 0) |
900 |
Timeout total del gate, en segundos. |
verification.failToPass / antiTamper / typeCheck¶
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
failToPass.required |
boolean |
true |
Exige el ciclo fail→pass (el test debe fallar antes de pasar). |
antiTamper.enabled |
boolean |
true |
Sub-gate anti-trampa (detecta debilitamiento de tests/asserts). |
typeCheck.enabled |
boolean |
false |
Activa el gate de chequeo de tipos. |
verification.loop¶
Política del Ralph Loop con conciencia de decaimiento.
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
policy |
'decay' \| 'fixed' |
'decay' |
Estrategia de iteración. |
maxAttempts |
number (int ≥ 1) |
5 |
Tope duro de intentos; al alcanzarlo, veredicto ESCALATE. |
saturationWindow |
number (int ≥ 1) |
3 |
Nº de intentos con la misma firma de fallo → saturado. |
onSaturation |
'fresh-start' \| 'replan' \| 'escalate' |
'fresh-start' |
Acción al saturar antes del tope. |
verification.bestOfN¶
Generación de N candidatos en worktrees aislados.
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
default |
number (int ≥ 1) |
1 |
Nº de candidatos por task. Debe ser ≤ max. |
max |
number (int ≥ 1) |
5 |
Tope de candidatos. |
budgetTokens |
number \| null |
null |
Presupuesto de tokens (null = sin tope en la CLI; el agente lo respeta). |
Invariante validada
bestOfN.default debe ser <= bestOfN.max, de lo contrario la validación
Zod falla con bestOfN.default must be <= bestOfN.max.
verification.prerank¶
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
prerank.enabled |
boolean |
false |
Pre-rankea candidatos antes de la verificación completa. |
verification.formal¶
Gate de verificación formal (FORMAL_DEFAULTS). Ausencia del bloque ⇒
enabled:false. Cuando se activa, antiBypass es obligatorio.
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
enabled |
boolean |
false |
Activa el gate formal (segunda puerta más allá de la marcación). |
backend |
'dafny' \| 'verus' \| 'lean' |
'dafny' |
Backend de prueba. |
modules |
string[] |
[] |
Módulos/funciones críticas marcados. Vacío y sin la etiqueta @dare-formal ⇒ el aspecto nunca corre. |
maxRepairIterations |
number (int > 0) |
5 |
Tope de iteraciones del loop de reparación. |
proofTimeoutSeconds |
number (int > 0) |
120 |
Timeout por prueba, en segundos. |
antiBypass |
boolean |
true |
Sub-gate anti-trampa obligatorio cuando enabled. |
hooks¶
Bloque validado en hooks/config.ts (Zod .strict()). Defaults: { on: {}, trusted: false }.
Detalles de eventos, acciones y seguridad en Agentes › Hooks.
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
on |
Record<HookEvent, HookAction[]> |
{} |
Mapa de evento → lista de acciones. Eventos: on-save, on-file-create, on-task-complete, pre-commit. |
trusted |
boolean |
false |
Confianza explícita. Mientras sea false, los hooks no se auto-ejecutan (dare hooks run falla con TRUST_REQUIRED hasta --trust o trusted:true). |
Cada ítem de on[evento] es un HookAction:
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
action |
allowlist | — (obligatorio) | Una de las claves: dare-validate, dare-review, graph-register, lint, test. |
args |
string[] |
— (opcional) | Args extra concatenados como argv (nunca interpolados en shell). Los args con aspecto de ruta pasan por assertRelativeSafe. |
dare-graph.yml¶
Backend del knowledge graph, resuelto por graphrag/factory.ts. Si el archivo
no existe, el fallback es sqlite en .dare/graph.db.
# backend: 'sqlite' | 'json' | 'neo4j'
backend: sqlite
sqlite:
path: .dare/graph.db # default quando backend=sqlite
# json:
# path: .dare/graph.json # default quando backend=json
# neo4j (experimental — exige experimental:true):
# neo4j:
# url: http://localhost:7474
# database: neo4j
# username: neo4j
# password: ...
# experimental: true
| Backend | Bloque | Default de path | Observaciones |
|---|---|---|---|
sqlite |
sqlite.path |
.dare/graph.db |
Backend recomendado (sql.js). |
json |
json.path |
.dare/graph.json |
Archivo único, sin dependencias nativas. |
neo4j |
neo4j.* |
— | Exige neo4j.experimental: true y neo4j.url; de lo contrario createGraph() lanza un error con orientación. |
Campos del bloque neo4j (defaults aplicados en loadGraphConfig):
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
url |
string |
http://localhost:7474 |
Endpoint de Neo4j. |
database |
string |
neo4j |
Nombre de la base de datos. |
username |
string |
— | Usuario (opcional). |
password |
string |
— | Contraseña (opcional). |
auth |
string |
— | Credencial alternativa (opcional). |
experimental |
boolean |
false |
Debe ser true para que el backend arranque. |
Neo4j es experimental
El backend neo4j solo inicializa con experimental: true en
dare-graph.yml. Sin eso, createGraph() lanza:
"Neo4j backend requires neo4j.experimental: true … Use sqlite or json (recommended)."
Para la mayoría de los proyectos, usa sqlite o json.
Variables de entorno del MCP¶
Leídas en mcp-server/boot-config.ts por el binario dare-mcp-server
(mcp-server/bin/server.ts). Detalles del servidor en
Agentes › MCP server.
| Variable | Default | Descripción |
|---|---|---|
DARE_MCP_BIND |
127.0.0.1 |
Host de bind. 0.0.0.0 lo expone a la LAN y emite un aviso. |
DARE_MCP_PORT |
3000 |
Puerto TCP. |
DARE_MCP_TOKEN |
randomUUID() |
Token Bearer. Sin definir, se genera aleatoriamente en cada boot. |
DARE_PROJECT_PATH |
process.cwd() |
Raíz del proyecto servida. |
DARE_MCP_BODY_LIMIT |
1mb |
Límite del cuerpo JSON (express.json). |
No expongas el MCP fuera del loopback sin necesidad
Con DARE_MCP_BIND=0.0.0.0 el servidor acepta conexiones de la red local.
En ese caso el token Bearer pasa a ser tu única protección — define un
DARE_MCP_TOKEN fuerte y úsalo solo en redes confiables.