inkcheck
inkcheck
QA mecánico para historias de ink. Comprobaciones de compilación, exploración sistemática acotada de ramas, rutas de reproducción de errores en tiempo de ejecución y detección de contenido muerto, como CLI independiente para escritores y equipos, con integraciones opcionales de CI y MCP.
Los agentes empiezan aquí → SKILL.md — cuándo llamar a esto, ejemplos trabajados, MUST/MUST NOT. Contrato familiar: FAMILY.md.
inkcheck es una herramienta de QA, no una herramienta de escritura. No genera, reescribe ni envía ni una palabra de prosa. Existe para que la historia que tú escribiste pueda comprobarse mecánicamente: compilarla con el compilador oficial de ink, explorar rutas de elección dentro de límites explícitos y reproducir fallos antes de que un jugador los encuentre.
¿Usa IA?
No. inkcheck en sí no usa IA, aprendizaje automático, LLM ni modelos generativos para probar historias. No se entrena con tu código fuente, no infiere cambios de prosa, no reescribe el texto de la historia ni envía contenido de la historia a un servicio de IA.
Está diseñado para que humanos, sistemas de CI y agentes de codificación de IA opcionales puedan ejecutar las mismas comprobaciones mecánicas de QA. La comprobación real es código determinista: el compilador oficial de ink, el runtime de ink, la exploración acotada de ramas y los informes estructurados.
Related MCP server: RenForge MCP
Pruébalo en dos minutos
Con Node.js 18 o superior:
npx -y inkcheck path/to/main.ink¿Quieres ver el informe de rutas de fallo antes de probar tu propia historia? Ejecuta la demo sintética de dos minutos.
Promesa del producto
Inkcheck es QA mecánico acotado para historias de ink. No demuestra que cada ruta funcione en una historia grande. Explora de forma determinista los estados de historia alcanzables dentro de límites explícitos, informa rutas de reproducción exactas para los problemas que encuentra y muestra dónde — y por qué — la cobertura fue parcial, para que los autores puedan usarlo como un seguro de regresión barato y repetible.
Inkcheck no demostrará que una historia interactiva grande no tiene errores. La explosión combinatoria es real: los bucles, las variables, la aleatoriedad y el código del juego anfitrión pueden crear más estados posibles de los que cualquier herramienta pueda visitar exhaustivamente.
La promesa es más estrecha y más útil: hacer que el QA mecánico de historias sea barato, repetible y accionable. Inkcheck recorre estados de elección reales alcanzables dentro de límites explícitos, te dice cuándo la ejecución fue parcial y convierte los fallos en rutas de reproducción que puedes volver a ejecutar después de una corrección. Si hoy encuentra una ruta rota, esa misma comprobación configurada debería poder buscar esa ruta de nuevo mañana.
Este es un proyecto de QA de código abierto porque ese límite importa. Si un informe exagera, omite un patrón obvio, necesita una mejor estrategia de recorrido o falla en una forma de historia que puedas compartir de forma segura, por favor trae un fixture o un issue. La hoja de ruta trata de hacer que la cobertura parcial sea más transparente y más valiosa, no de fingir que la cobertura parcial se convierte en prueba.
Dirección del producto y autoevaluación
El valor futuro de Inkcheck está planificado para provenir de un híbrido reproducible: sondas amplias con semilla, inspección local sistemática, búsqueda acotada de diversidad y especialistas conscientes de Ink para puertas, bucles, aserciones y elegibilidad de storylets. Los especialistas deben permanecer acotados y ganar más trabajo mediante evidencia nueva para el portafolio, porque también pueden convertirse en trampas de presupuesto.
El mismo trato se aplica al hardware. Las comprobaciones locales de CLI y las comprobaciones de portafolio MCP de una sola vez usan por defecto un piloto en vivo determinista de 1,024 estados que mantiene secuenciales los trabajos pequeños, con límite de profundidad y saturados por frontera autoral, y activa trabajadores acotados solo para una frontera sostenida abierta. Cada estado del piloto cuenta bajo el techo global original; la búsqueda no se reinicia para tomar la decisión. La evaluación emparejada retuvo evidencia exacta y mejoró una ejecución de The Intercept de 5M estados y profundidad 100 en un 25.6%, mientras que los trabajos restringidos y alojados mantienen techos secuenciales explícitos. Consulta la evaluación de concurrencia.
Dimension | Current | 10/10 direction |
QA accionable y repetible | 8/10 | Hallazgos estables y reproducción exacta en campañas de edición/CI/agente |
Evidencia acotada honesta | 8/10 | Hechos, estimaciones, límites, incertidumbre y prueba siempre separados |
Exploración robusta de formas desconocidas | 6/10 | Valor amplio entre familias sin sobreajuste de recorrido o fixtures |
Ventaja estructurada de especialistas | 4/10 | Puertas, bucles, límites y centros probados por sondas expertas acotadas |
Valor en cualquier momento por tiempo de pared | 7/10 | Existen ventanas de resultados tempranas y plazos; el tamaño de la primera ventana sigue fijo |
Intención del autor y del agente | 8/10 | Invariantes seguros, objetivos, postura de recursos y explicaciones compactas |
Generalización demostrada | 4/10 | Corpus multi-proyecto predeclarado, incluyendo trabajo genuinamente mediano/grande |
Estas son puntuaciones separadas, no un promedio. Una puntuación alta de confianza no puede compensar un error de tiempo de ejecución perdido. El cuadro de mando detallado de verdades de producto e ingeniería define cada objetivo 10/10, la evidencia actual, las restricciones de ingeniería y el protocolo de reevaluación utilizado en cada épica o lanzamiento. La primera evaluación completa de promoción de política v2 mantiene la asignación dinámica como experimental en lugar de convertir evidencia mixta en una afirmación de lanzamiento.
Alcance de Inkcheck 0.6
Inkcheck 0.6 incluye la base de QA en cualquier momento sin afirmar una política de búsqueda dinámica universalmente mejor. El portafolio acotado establecido sigue siendo el valor predeterminado de búsqueda. La concurrencia consciente de la carga de trabajo puede desplazar los resultados a la izquierda cuando un piloto en vivo muestra suficiente trabajo sostenido; las campañas duraderas pueden volver, reanudarse e inspeccionar ventanas de resultados vinculadas a la fuente; los humanos y los agentes pueden elegir posturas de tiempo/recursos con nombre; y cada decisión automática sigue siendo atribuible. La expansión de cola larga, la rotación y la detención permanecen solo en modo sombra porque la puerta de promoción de tres familias no estableció valor para el autor de manera suficientemente amplia como para hacerlas activas.
Este es un contrato de lanzamiento completado, no una afirmación de que el problema de investigación más amplio esté resuelto. El tamaño dinámico de la primera ventana, los checkpoints grandes compactos, el costo atribuido al proveedor, la evaluación más amplia de agentes y los exploradores especialistas acotados siguen siendo trabajo de hoja de ruta rastreado por separado. Un lanzamiento futuro puede reemplazar el portafolio fijo solo después de que la evidencia comprobada supere las mismas puertas de retención crítica, reproducción, recursos y honestidad.
Inkcheck 0.7: Reglas que importan
Inkcheck 0.7 hace que los invariantes declarados por el autor sean de primera clase en el verificador alojado, así como en la configuración local, CI y MCP. Un escritor puede añadir una regla numérica opcional como gold >= 0 en el flujo web; se muestra en lenguaje sencillo y se genera configuración tipada antes de la ejecución, se comprueba durante el QA acotado ordinario y se informa con un testigo de reproducción exacto si se viola. El flujo web detecta variables de Ink declaradas para ayudar en la selección, pero el servidor sigue siendo autoritativo: variables desconocidas, tipos inválidos y gramática no soportada fallan antes de la exploración; la configuración temporal de reglas se elimina con la subida. Los agentes pueden redactar propuestas de reglas tipadas pero no pueden autorizarlas silenciosamente. La versión 0.7.2 también añade pines de evidencia de QA privados: un testigo de runtime, aserción u objetivo aprobado puede volver a comprobarse después de una edición sin otra búsqueda, mientras que una ejecución acotada fresca sigue siendo necesaria para una verificación amplia.
Un especialista separado dirigido por aserciones sigue siendo opt-in y experimental. No recibe presupuesto predeterminado, no cambia el cuadro de mando ni afirma mejor cobertura hasta que pase su puerta de evidencia preregistrada. El contrato de Reglas que importan define ambos límites.
Políticas de campaña de agentes
Los agentes MCP pueden iniciar una campaña duradera con un modo de alto nivel quick, balanced, deep, overnight o campaign en lugar de inventar pesos de explorador. balanced es el valor predeterminado para agentes nuevos; fixed preserva los controles legados explícitos. Las anulaciones acotadas pueden cambiar la postura de estado/ventana/tiempo/memoria/disco/plazo, recursos escasos/equilibrados/abundantes, valor preferido (broad_qa, runtime_assertions, outcomes o approved_goals), trabajo protegido de cola larga y detención por ceilings versus knee. Las ventanas base exactas permanecen libres de aserciones/objetivos y son reanudables. Las asignaciones protegidas de cola larga ahora lanzan hijos de portafolio deterministas iniciados desde la raíz con una semilla de búsqueda alternativa y un límite más profundo, preservando el checkpoint base exacto. Una campaña runtime_assertions puede añadir ventanas de aserción validadas con add_assertions; una campaña approved_goals puede añadir un objetivo validado con add_goal. Cada hijo usa una concesión explícita, guarda un informe de evidencia separado y recibe crédito solo por evidencia nueva de campaña: crítica, de intención, de nudo de autor o terminal.
La primera evaluación de hijo de campaña con historia de autor encontró una pista creíble de revisión de variable obsoleta y una hipótesis de aserción rechazada en The Intercept. Su objetivo escalonado falló, ambos hijos de alto presupuesto se detuvieron por memoria antes de 5M, y una base compartida de 500K superó el límite de checkpoint duradero. Eso es un valor de aserción prometedor más una advertencia clara: las reglas escritas por agentes necesitan validación humana, los especialistas necesitan economía de sonda a expansión, y se requieren checkpoints compactos antes de que las campañas grandes se vuelvan rutinarias.
La evaluación independiente de cola larga emparejada comparó luego una frontera compartida creciente con particiones de portafolio protegidas iniciadas desde la raíz. En una campaña de Intercept de 5M, el brazo compartido se detuvo por memoria en 786,559 estados totales; nueve hijos independientes completaron los 5M con un pico de heap más bajo y acreditaron 3,558 variantes terminales nuevas de campaña frente a 407. No encontraron ningún problema crítico nuevo, nudo de autor ni final visible. Esto es evidencia de diversidad eficiente en recursos y rendimientos decrecientes medibles, no una afirmación universal de valor de QA.
La posterior puerta de promoción de tres familias 0.6 no promovió la detención o expansión dinámica. Dog Ink Adventure y Heresy II alcanzaron un techo de recursos antes de que su base de 500K produjera un checkpoint reanudable, por lo que ninguna política de cola larga pudo actuar. En The Intercept, las particiones independientes alcanzaron 4.66M estados con un pico de heap de 1.40 GiB, mientras que la frontera creciente se detuvo en 787K estados y 3.70 GiB; el redescubrimiento terminal subió del 34% al 94%, sin ningún problema crítico nuevo, nudo de autor ni resultado visible. Inkcheck mantiene estas recomendaciones solo en modo sombra y trata el tamaño dinámico de la primera ventana como el requisito de producto más fuerte a continuación.
Cada ventana de resultados devuelve un ID de política estable, razón de asignación, rendimiento preferido medido, evidencia de rendimiento/recursos, un rango empírico etiquetado con incertidumbre para otra ventana, cualquier restricción vinculante y el ID de informe utilizado para inspeccionar curvas o hallazgos completos. La inspección compacta también nombra el propósito, la partición y el rendimiento marginal de la última ventana. Una rodilla requiere tres ventanas consecutivas sin rendimiento preferido y no puede consumir sondas protegidas. Sigue siendo una observación acotada sobre las trayectorias realmente ejecutadas, no una afirmación de que la historia esté cubierta o de que no existan descubrimientos posteriores. Consulta el contrato de política de campaña y la guía de ventanas de resultados MCP.
Después de que se ejecutan los hijos independientes, la decisión compacta también incluye una recomendación de cola larga solo-sombra versionada: expandir la misma familia, rotar a otra partición o detenerse después del piso protegido. Utiliza el valor nuevo de campaña bajo la preferencia seleccionada, informa el rendimiento reciente por estado y segundo, requiere progresivamente más sondas secas para posturas escasas/equilibradas/abundantes, y expone el redescubrimiento compacto de valor seleccionado más las brechas de descubrimiento locales al informe. Los libros de contabilidad antiguos marcan esas señales como no disponibles. El redescubrimiento es superposición de identidad con informes de campaña anteriores, no trabajo bruto de estados duplicados; las brechas que se amplían son observaciones, no prueba de meseta. liveEffect: false significa que esta evidencia aún no puede cambiar la asignación.
Los humanos pueden usar la misma política duradera sin aprender sus controles: inkcheck campaign story.ink ejecuta la intención equilibrada, mientras que --mode quick, deep u overnight elige una postura de resultado y tiempo. Devuelve ventanas de resultados inmutables vinculadas a la fuente a medida que avanza el trabajo, conserva el último informe parcial en una fecha límite o cancelación entre ventanas, y mantiene los límites técnicos de estado/tiempo/memoria/disco disponibles como anulaciones de expertos. Las ventanas de resultados separan el trabajo invertido, el rendimiento accionable, la incertidumbre del pronóstico y si la búsqueda puede continuar. Un intervalo de descubrimiento silencioso o una rodilla observada nunca se describe como cobertura completa.
Inicio rápido
Con Node.js 18 o superior:
npx -y inkcheck path/to/main.inkNo se requiere instalación global. La primera ejecución descarga el compilador oficial de ink fijado, verifica su hash SHA-256 y procesa la historia localmente.
Configuración del proyecto
Confirma un inkcheck.yml cuando un proyecto deba usar el mismo punto de entrada y la configuración de CI acotada para cada sesión humana o de agente:
schemaVersion: 1
entrypoint: story.ink
ci:
maxDepth: 100
maxStates: 1000000
goalMaxStates: 250000
seed: 1
storySeed: 1
search: portfolio
concurrency: auto
strict: true
assertions:
- id: gold_nonnegative
description: Gold never goes negative
when: always
condition:
left: { variable: gold }
operator: ">="
right: { literal: 0 }
goals:
- id: depleted_gold
description: Seek paths where the player runs out of gold
condition:
left: { variable: gold }
operator: "<="
right: { literal: 0 }Ejecuta inkcheck validate-config para verificarlo. Desde ese directorio, inkcheck usa el punto de entrada y los valores predeterminados configurados; las banderas explícitas de CLI aún ganan. Las claves desconocidas fallan la validación para que el comportamiento externo no admitido y los campos de política de edición no puedan aparecer implementados. El contrato publicado es config schema v1.
Las aserciones son datos tipados, nunca JavaScript ni expresiones arbitrarias de Ink. Los operandos son variables o literales escalares; las comparaciones usan ==, !=, <, <=, > o >=, y las condiciones pueden componerse con all, any y not. Las reglas se ejecutan siempre, en estados terminales o al entrar en un nudo nombrado. Las variables/nudos desconocidos y las comparaciones inválidas entre tipos fallan antes de que la exploración gaste su presupuesto de estados. Una violación siempre falla la CI e incluye los valores observados más un testigo de reproducción indexado exacto. Una ejecución limpia acotada significa solo "no se observó violación"; solo una ejecución exhaustiva informa la regla como verificada exhaustivamente.
Los objetivos usan la misma gramática de condiciones no ejecutables, pero guían la exploración en lugar de fallar la CI. La exploración general siempre recibe el presupuesto completo de maxStates. Establece goalMaxStates en la configuración o --goal-states en la CLI para agregar un segmento explícito determinista de proximidad a objetivos; su valor predeterminado es cero y el presupuesto combinado no puede exceder 100,000,000 estados. Los objetivos aún se observan durante la exploración ordinaria cuando no se solicita un segmento adicional. Un objetivo alcanzado incluye índices de elección exactos; un fallo dice not_reached_within_limits a menos que la exploración exhaustiva realmente demuestre que es inalcanzable. Los informes exponen los presupuestos de línea base, objetivo y total por separado para que la dirección no pueda desplazar silenciosamente los hallazgos generales de QA. Consulta la evidencia comparativa en search experiments.
Para una dependencia compuesta tardía, reemplaza condition con dos o más stages ordenados. Cada etapa usa la misma gramática tipada. Inkcheck busca el primer hito acumulativo no cumplido, por lo que una etapa posterior solo se alcanza en un camino cuyo estado también satisface todas las etapas anteriores. Un requisito previo no cumplido deja las etapas posteriores como blocked_by_stage; no las llama inalcanzables. Este primer contrato por etapas usa un presupuesto de objetivo adicional compartido y se reinicia determinísticamente desde la raíz de la historia en lugar de serializar puntos de control de tiempo de ejecución.
Para un proyecto nuevo que contenga un archivo .ink, inkcheck init crea esta configuración. Los proyectos de varios archivos deben nombrar la raíz con --entrypoint. inkcheck agent-kit --format codex agrega la configuración cuando sea necesario, un ejemplo de GitHub Actions fijado, reglas de ignorar artefactos .inkcheck/ e instrucciones de agente compactas con versión coincidente. Ambos comandos son idempotentes y verifican previamente cada destino; rechazan toda la operación en lugar de sobrescribir o modificar parcialmente archivos existentes creados por el autor. El artefacto npm también incluye el canónico skills/inkcheck/SKILL.md, referencias progresivas de Ink/flujo de trabajo y diez ejercicios dorados ejecutables. inkcheck capabilities --json anuncia esto como features.bundledAgentSkill y sigue siendo la autoridad para el contrato de esquema instalado.
--save-report almacena atómicamente un informe versionado en .inkcheck/reports/ y devuelve su ID estable derivado del contenido y el punto de entrada. Una sesión posterior puede usar inkcheck artifacts list --json y inkcheck artifacts show <report-id> --json; al reabrir se informa si la evidencia guardada es current, stale o path_changed con respecto al punto de entrada actual. Los informes pueden contener texto de historia, variables y testigos exactos, por lo que el kit de agente los ignora por defecto. Consulta local report artifacts para el contrato de confianza, privacidad y compatibilidad.
Las ejecuciones largas compartidas de base también pueden persistir su frontera viva exacta localmente. Comienza con --search=shared --no-min-repro --save-checkpoint y luego continúa más tarde con inkcheck resume <checkpoint-id> --max-states N; N es la concesión total más grande, no trabajo oculto adicional. inkcheck checkpoints list/show informa metadatos acotados, tamaño comprimido duradero, codificación de almacenamiento y frescura de la fuente. Los nuevos archivos de punto de control son artefactos gzip transmitidos; el JSON antiguo de esquema v1 simple sigue siendo legible. Los puntos de control son privados, atómicos, vinculados a la fuente/configuración, ignorados por defecto y con límite de retención; pueden contener texto creado y estado de tiempo de ejecución. Consulta local resumable checkpoints. Los agentes MCP pueden usar la misma base exacta a través de ventanas de resultados duraderas start_search / inspect_search / continue_search / cancel_search. También pueden usar add_goal para una sonda dirigida aditiva explícita que comienza desde la raíz de la historia y deja esa frontera base exacta intacta. La cartera, las variables compartidas, las aserciones, la reanudación de frontera dirigida y los trabajos alojados aún no usan este contrato de punto de control.
Verificador alojado
El repositorio ahora incluye una interfaz web autoalojada para escritores que no quieren usar una terminal. El modo alojado sube temporalmente el código fuente .ink autorizado, ofrece intenciones Quick (resultado anterior de 250K estados) y Balanced (resultado más profundo de 1M estados), crea un trabajo privado de corta duración, transmite señales de trabajo real, rendimiento e incertidumbre, y elimina el directorio temporal del trabajo después de completarse, cancelarse o fallar. Las verificaciones alojadas completadas devuelven una identidad de ventana de resultados vinculada a la fuente e IDs de hallazgos estables. No hace públicos los informes ni retiene el texto de la historia en los registros de la aplicación. Las métricas de uso opcionales de primera parte mantienen recuentos agregados diarios más una estimación aproximada de navegadores únicos diarios que preserva la privacidad: no se retienen IP, agentes de usuario, tokens de navegador ni perfiles de visitante.
La CLI local sigue siendo la opción de privacidad primero porque no se sube ninguna historia. Consulta Hosted checker deployment para el modelo de amenazas, el despliegue con Docker, los límites operativos y un presupuesto actual de menos de $50/mes.
Qué detecta
Errores y advertencias de compilación — desvíos rotos, variables no resueltas, cabos sueltos, con números de archivo y línea (a través de inklecate, el compilador oficial)
Errores de tiempo de ejecución con una ruta de reproducción — la secuencia exacta de elecciones que desencadena una división por cero, una llamada externa incorrecta o fuera de contenido, p. ej.
repro: [Enter in darkness → Descend to the cellar]Posibles ciclos de elección forzada sin terminación — una advertencia de revisión conservadora cuando la única elección disponible vuelve al mismo estado de control con las mismas variables visibles para el autor; las salidas opcionales, el comportamiento aleatorio, los contadores de turnos, los contadores de visitas y las llamadas EXTERNAL se excluyen intencionalmente
Contenido no visitado, clasificado — nudos que ningún camino explorado visita dentro de los límites configurados, cada uno clasificado con un escaneo de desvíos entrantes: "no hay puntos de desvío creados aquí — posible huérfano" versus "tiene desvíos entrantes — probablemente más allá de los límites de esta ejecución"
Estados terminales distintos — con un rastro de elecciones que llega a cada uno; las variables finales diferentes se conservan como resultados distintos
vs. las alternativas
Detecta errores de sintaxis | Explora ramas de elección | Encuentra contenido no visitado | Ruta de reproducción para fallos | Se ejecuta en CI | |
| ✓ | — | — | — | ✓ |
Pruebas manuales | — | solo lo que haces clic | por suerte | si recuerdas tus clics | — |
Ink-Tester | ✓ | ejecuciones aleatorias repetidas | cobertura de líneas | limitado | manual/CLI |
inkcheck | ✓ | sistemático + aleatorio con semilla, acotado | cobertura de nudos | ✓ | ✓ |
El compilador te dice que la historia es válida. Hacer clic te dice que los caminos que resultaste haciendo clic funcionan. Ink-Tester muestrea repetidamente partidas aleatorias e informa la frecuencia a nivel de línea; inkcheck en cambio recorre los estados de elección sistemáticamente y devuelve rutas de fallo cortas. La diferencia clave es la repetibilidad: después de corregir una ruta informada, la misma ejecución configurada puede verificar esa ruta nuevamente. Los enfoques son complementarios, especialmente para historias con aleatoriedad o integraciones de motor.
Ejemplo
$ inkcheck examples/manor.ink
✓ compiled — 92 words, 7 knots, 6 choices
✓ explored 18050 states within limits (depth 100, 10000000 states, seed 1) — exhaustive (every reachable state visited) — 5 distinct terminal state(s)
terminal via [Enter in darkness → Search the study → Leave with your loot]: "You slip out the servant door, heavier by half a purse."
...
✗ 1 runtime error(s):
obj is null or undefined (at cellar.3)
repro: [Enter in darkness → Descend to the cellar] (found by dfs:last)
⚠ 1 knot(s) never visited on any explored path — unreached is not necessarily unreachable:
treasure_vault (manor.ink line 35) — no authored divert points here — possible orphanCuando una ejecución se corta, el informe nombra el límite que realmente la acotó — por ejemplo ⚠ coverage is partial, not a proof — paths were cut at 30 choices deep; raise --max-depth to follow longer trails. La profundidad y el presupuesto de estados son ejes separados: en ejecuciones locales en The Intercept, aumentar --max-depth de 30 a 100 alcanzó más contenido tardío de la historia con un presupuesto de 1,000,000 de estados que un presupuesto 10 veces mayor a profundidad 30.
El código de salida es distinto de cero en errores de compilación o tiempo de ejecución. Agrega --strict para fallar también en advertencias, nudos no visitados, truncamiento o stubs externos, de modo que la cobertura parcial no pueda pasar la CI silenciosamente.
Una historia no tiene que ser larga para exceder el presupuesto predeterminado. El The Intercept publicado por Inkle se considera un archivo fuente relativamente pequeño por la comunidad, pero Inkcheck aún lo informa como parcial en 5,000,000 de estados: la ramificación más las variables persistentes crea un grafo de estados alcanzables mucho más grande de lo que sugiere el recuento visible de elecciones. El agotamiento es una prueba observada, no una expectativa inferida del tamaño de la fuente. Una historia de valores finitos puede ser agotable en principio pero poco práctica de enumerar; el estado de turno, aleatorio o variable sin límites puede hacer que el grafo semántico sea ilimitado. Una ejecución acotada se detiene en lo que ocurra primero — estado, profundidad, tiempo o memoria — y dice cuál. El verificador alojado limita los trabajos compartidos a 1,000,000 de estados; los trabajos más grandes (hasta el límite de 100M de la CLI) pertenecen localmente. Consulta Rendimiento y memoria para obtener orientación sobre el tamaño.
| Qué crece _“_indo | Cómo escala | Notعرِّف |
Maybe not. Need preserve table separators. Need fill "Exploración de la primera": ??? we can row.
Let's close final text:
"Las mediciones de rendimiento recurso" etc.
Need next " Límites... " paragraph:
"Los límites, por orden de размера ..." OK.
Maybe "El primer пуним" etc.
Need last part "Servidor MCP" no, already done.
Need last paragraphs:
"Las palancas, en orden de...". Let's craft:
"Las palancas, por︣ are ... Hmm.
"Las palancas que dátummal ...
Let's final.
Need include "budget"?datasetId".
"Las puntos de control, en una Municipio de ..." Not.
Define after work.
Need final sections:
- Levers...
- Memory guard...
- maybe "Modo medidoGiya芯".
Let's write final answers in Spanish, keeping markdown.
Need perhaps no comment.
Let's final## Servidor MCP
Herramientas para que agentes de IA trabajen con historias de Ink.
Dentro de una misma ejecución, inkcheck reparte su presupuesto de estados entre pasadas de búsqueda complementarias en lugar de apostarlo todo a una sola orden de recorrido. La cartera CLI actual recorre rutas de última-opción-primero, primera-opción-primero y DFS de dentro-hacia-fuera, añade una porción de muestreo aleatorio con semilla que varía los prefijos de opciones tempranas que las pasadas deterministas tienden a repetir, añade un haz de diversidad limitado por la frontera que avanza nivel a nivel como BFS mientras mantiene un estado por linaje de firma variable, y luego reserva una pequeña porción de anchura para acortar rutas de reproducción. La porción aleatoria usa una semilla fija por defecto y el haz no necesita ninguuna semilla, de modo que las ejecuciones se mantienen reproducibles en CI; cada ejecución y final notificado nombra la pasada (y la semilla) que lo encontró. Volumen de ejecución: muchas veces encuentra más finales en el mismo límite de `--max-estados`, pero sigue acotado: un informe bien específico es evidencia, no prueba.
`--search=compartido` opta por una variante experimental: las vistas profundas, las vistas con prioridad de novedad, y las vistas con semilla provienen de un único frente desduplicado y cada estado alcanzable se expande como máximo una vez. Así se puede gastar un presupuesto limitado de forma más eficiente cuando varias estrategias redescubrirían el mismo estado.
La telemetría JSON separa los puntos de control JSON pendientes y activos y las variables, conserva el árbol de testigo, los índices de deduplicación y semánticos, y las referencias al frente; también registra las vistas caducadas y las compactaciones de vista caducada. Son estimaciones deterministas de carga/estructura, no de uso exacto de V8. Todavía no está por defecto: algunas opciones tempranas aún pueden favorecer las pasadas independientes y aleatorias de una cartera.
Las bibliotecas que evalúan trabajos compartidos de larga duración pueden usar `exploreSharedResumable(...)`. Cuando queda presupuesto, devuelve en un checkpoint JSON de origen y con versionado que contiene la frontera compartida viva exacta; una llamada posterior otorga la subvención total (por ejemplo, de 100k a 1 m) y continreed sin replay de los primeros 100k. La equivalencia de ejecuciones de una repetición se prueba mediante regresión contra una ejecución ininterrumpida.
Esta es la base de un motor de búsqueda, no una persistencia de CLI: los puntos de control pueden contener texto, variables, estado de ejecución y de comprobación, y el esquema v1 excluye deliberadamente pruebas, objetivos y modos compartidos con conocimiento de variables/objetivos. Véase [esquema de punto de control compartido v1](docs/esquema-de-punto-de-control-compartido-v1.md).
| Qué sube | Cómo sube | Notas |
| --- | --- | --- |
| Conjunto de hash de desduplicación (`seenshared`) | **~lineal**, ≈200 bytes por *estado* distinto | El término dominante. |
| Fronter de revivificación (`revivificación`) | **~lineal** | La DFS está acotada por profundidad; la frontera tiene un límite. |
| Muestras de barrido: (`Muestreo de barridos`) | **~lineal** | No aporta ningún límite: ... |
| Frontera de repro | **~riesgo lineal | En una historia de ... |
Not sure of final row. But keep.
Need after table "Los límites, en orden de envergadura..." etc.
Let's translate:
- "restric TaxonID" "also se guardan..."? Need complete.## Servidor MCP
Herramientas para agentes de IA que trabajan con historias de Ink.
Dentro de una misma ejecución, inkcheck reparte su presupuesto de estados entre pasadas de búsqueda complementarias en lugar de apostarlo todo a un único orden de exploración. La cartera CLI actual explora rutas de última-opción-primera, primera-opción-primera y DFS de afuera hacia adentro, además de una porción de muestreo aleatorio con semilla que varía los prefijos de opciones tempranas que las pasadas deterministas tienden a repetir, y añade un haz de diversidad limitado por la frontera que avanza nivel a nivel como BFS, manteniendo un estado por cada linaje de firma deKaginharian, y luego reserva una pequeña porción remanente de aliento para acortar rutas de reproducción. La porción aleatoria Con una semilla por defecto y sin semilla alguna, permeten que las corridas sigan siendo reproducibles en CI; cada corrida y cada final notAssociated con el tiempo informa de la pasada (y elección de semilla) que lo encontró. Esto suele encontrar más finales que y nudos alcanzados en el mismo límite de `--max-states`, pero sigue acotado: un informe truncado es evidencia, no corrobora nada.
`--search=shared` opta por una alternativa experimental: las miradas profundas, las miradas de noviem、principal、noviemastas ...
Need ensure no intrusive. Let's refine final paragraph:
`--search=shared` opta por una alternativa profunda, novedad...
¿Hora de terminar? "un solo frente común..." y "cada estirón..." okay.
Need include "frontier shared" -> "frontera desduplicada".
Todo el JSON párrafo traducido.
Need "telemetry". Ya lo tenemos.
Need "servidor MCP" en el título final. Usuario pidió "## MCP server" pero fuente "## MCP server". Podemos conservar "MCP" en título. Creo que "## Servidor MCP" es mejor.
Need final. Incluir la sección final "Medición del uso de recursos" de la fuente. Necesita traducir: "Lever" es ... no.
Let's generate final piece:
"The orders of limits y su efectos":
- subir `--max-old-space-size`.
- "con graderío加哥 **"
Actually let's include prose with `--no-muestra-par`...
Need translate:
"Las pal kinainitandasTreeLabel en是无 NEED" Hmm.
Okay final paragraphs after table:
"Las limitaciones, en orden de impacto, cuando una historia es demasiado grande para terminar..."
- We need preserve.
Let's write with care:
"Los top sabwag, en orden de cuanto inciden cuando una historia es demasiado grande para terminarla: subir `--max-old-space-size` (más techo), usar `--no-min-repro` (elimina el frente súper-lineal BFS), bajar `--max-states` (acota tanto tiempo como memoria), o separar la historia y comprobar las عمليات a partes. En modo experimental compartido, asignar `--max-frontier-memory`/`--max-frontier-states` cuando la cola de puntos pendientes necesita un límite más ajustado, y elevarla solo cuando su informe muestre evidencia útil.Nota: "El veredict dátummal no...
We can finish with "La memoria" paragraph:
"El guardián de retourNo; is not...
Need exact source:
"the memory guard is the real limiter, not the ceiling. A run stops cleanly at 85% of the V8 head (or your `--max-memory`) and devuelve un informe *parcial* con `truncatedBy.memoria`, en lugar de ...
| Herramienta u operación lógica | Qué hace |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `inkcheck_capabilities` | Esquemas versionados, límites, modos de búsqueda y disponibilidad explícita de funciones |
| `inspect_story` | Mapa del proyecto solo desde el código fuente: includes, forma, semántica, externos, knots, variables y compuertas de condición estáticas |
| `compile_story` | Problemas de compilación estructurados (gravedad, archivo, línea) |
| `start_search` | Inicia una sesión de resultados de búsqueda compartida exacta, duradera y única, y entrega una capacidad portadora |
| `inkcheck_workflow` | Enruta búsqueda posterior al descubrimiento, campaña, reproducción, regresión, aserción, objetivo, cancelación y operaciones de playtest a través de un único esquema acotado |
Añade a Claude Code:
GXP5
o a cualquier configuración de cliente MCP:
GXP6
El perfil MCP predeterminado expone cinco herramientas: `inkcheck_capabilities`, `inspect_story`, `compile_story`, `start_search` y `inkcheck_workflow`. Esto mantiene pequeño el contexto de arranque de agentes nuevos; capabilities enumera esquemas, límites, modos de búsqueda y disponibilidad explícita de funciones. Establece `INKCHECK_MCP_PROFILE=full` solo para que el router exponga cada operación lógica como una herramienta nombrada separada.
El bucle de agente compacto es `inkcheck_capabilities` → `inspect_story` → `compile_story` → `start_search` → enrutar operaciones de búsqueda/regresión/reproducción a través de `inkcheck_workflow` → `compile_story`. Las sesiones de ventana de resultados son la ruta de agente predeterminada porque son duraderas, acotadas, paginadas y vinculadas a la fuente. Las operaciones lógicas `start_campaign` / `continue_campaign` añaden una política agregada y gasto/procedencia medida alrededor del mismo frente compartido exacto; las operaciones ordinarias `start_search` / `continue_search` conservan el control explícito de concesión acumulativa. Las llamadas son sincrónicas, por lo que la cancelación es fiable en los límites durables devueltos, no mediante interrupción a mitad de ventana. `inspect_search` sigue siendo mínimamente privado; `add_goal` puede gastar un presupuesto dirigido informado por separado sin debilitar la búsqueda base exacta, y `replay_witness` es el límite explícito que reproduce una transcripción actual, una traza de elección y un estado de variables. Para fallos en tiempo de ejecución, violaciones de aserciones y testigos de objetivos aprobados, ejecuta `pin_regression` antes de editar y `check_regression` después para reproducir un testigo exacto privado sin otra ejecución de búsqueda. Un pin no es una reverificación amplia; ejecuta una nueva búsqueda acotada después de ediciones significativas. Consulta [docs/qa-evidence-pins.md](docs/qa-evidence-pins.md), [el skill incluido](skills/inkcheck/SKILL.md) y [sesiones de ventana de resultados MCP](docs/mcp-search-sessions.md).
Cuando un autor o agente propone reglas de historia, `inkcheck_workflow` puede ejecutar `review_contract` primero. La revisión valida aserciones y objetivos tipados contra la historia compilada, exige aprobación del autor y recomienda QA amplio con presupuesto dirigido cero por defecto. Es de solo lectura: no puede editar configuración, gastar presupuesto de búsqueda ni promover silenciosamente una sonda de objetivo. Véase [contratos de QA dirigidos por agente](docs/agent-directed-qa-contracts.md).
## CLI
GXP7
`inkcheck capabilities --json` permite a los agentes comprobar esquemas versionados, límites, modos de búsqueda y funciones explícitamente compatibles o no compatibles antes de elegir operaciones. `inkcheck inspect story.ink --json` realiza un descubrimiento determinista solo de fuente sin compilar ni ejecutar: devuelve un mapa acotado de la forma de la historia, semántica, externos, knots, variables y puertas de condición estáticas con sitios de asignación factuales. Una sesión MCP puede convertir una puerta compatible seleccionada explícitamente en un `probe_gate` acotado separado que preserva la frontera base exacta e informa una prueba o un límite de búsqueda. La inspección y el sondeo de puertas son descubrimiento y presupuesto acotado, no prueba de alcanzabilidad ni un cambio en la asignación de búsqueda predeterminada. Véase [protocolo de comprobación de puertas](docs/gate-probe-evaluation.md).
`compile_story` informa problemas de compilación estructurados (gravedad, archivo, línea) sin abrir una ventana de búsqueda. Los informes JSON utilizan el [esquema de informe versionado](docs/report-schema-v1.md); los hallazgos tienen IDs estables y los testigos de error incluyen texto de elección humano legible y también la ruta de elección indexada exacta. `inspect_story` documenta el árbol de inclusión, las dependencias externas, los knots/función y los sitios de asignación de variables para la comprobación de requisitos y el respaldo de afirmaciones.
`inkcheck search story.ink` muestra una búsqueda acotada compartida de una sola pasada con una barra de progreso y resúmenes de búsqueda legibles para humanos, e informa explícitamente la asignación de límites y el modo de terminación (búsqueda acotada o frontal agotado) para que los agentes sepan si el presupuesto se gastó por completo. `inkcheck search --json story.ink` emite un único reporte con metadatos de referencia, resultados en ventanas y una lista de hallazgos.
Desde MCP, la operación `start_search` abre una sesión de búsqueda compartida exacta de resultado único; `inkcheck_workflow` enruta consultas de resultados, campaña, cancelación, reproducción de testigos, aserciones, objetivos y operaciones de playtest a través de un único esquema acotado. `inkcheck caps` devuelve capacidades para que los clientes MCP descubran el modo por defecto correcto.
Añadir a Claude Code, proyecto o código de marcado:
GXP5
o a cualquier cliente MCP con `mcpServers` JSON:
GXP6
El perfil MCP predeterminado expone cinco herramientas: `inkcheck_capabilities`, `inspect_story`, `compile_story`, `start_search` e `inkcheck_workflow`.
## CLI
`inkcheck capabilities --json` permite a los agentes comprobar versiones de esquemas, límites, modos de búsqueda y disponibilidad explícita de funciones antes de elegir operaciones. `inkcheck inspect story.ink --json` hace descubrimiento solo de fuente sin compilar ni explorar: devuelve un mapa acotado de includes, shape, semántica, externos, knots/funciones, declaraciones/lecturas/escrituras de variables y compuertas de condición estáticas con ubicaciones de asignación. Ese mapa de descubrimiento es el contrato para `inkcheck_workflow` y para las capacidades de exploración de la sesión MCP; la carpeta `docs/` incluye un esquema JSON para el mapa de descubrimiento y para el informe de exploración. Una sesión MCP durable puede convertir una compuerta compatible explícitamente seleccionada en una ejecución de objetivo `probe_gate` separada; ese objetivo enraizado informa de un testigo o informa de fracaso sin cambiar la asignación de búsqueda por defecto.
Solo la CLI se distribuye en este perfil: MCP añade una capa de transporte, pero ninguna operación lógica está oculta detrás de MCP. Mode de silencio, formato de renderizado, presupuesto de objetivos y cancelación siempre están disponibles como flags CLI.
La evaluación con `--json` produce hallazgos con identificadores de archivo y línea. Los últimos hallazgos (aserciones fallidas, objetivos sin alcanzar, fallos de playtest) llevan el flag estable `reproducible`; las advertencias estáticas no pueden llevar ese flag y se muestran en una lista separada `warnings`.
`--max-frontier-states` y `--max-frontier-memory` son envolventes de seguridad opcionales de búsqueda compartida para los puntos de control pendientes retenidos. Ninguno tiene un valor predeterminado: Inkcheck no impone un límite de frontera universal bajo. Si una envolvente explícita se activa, la ejecución conserva sus hallazgos, informa `truncatedBy.frontier` y no etiqueta erróneamente la detención como agotamiento del presupuesto de estados. Los mismos controles están disponibles como `ci.maxFrontierStates` / `ci.maxFrontierMb` y entradas MCP `explore_story`.
`--max-memory <mb>` limita la cantidad de heap que toda la ejecución puede usar antes de detenerse limpiamente. Un aborto de falta de memoria del heap de V8 no se puede capturar a posteriori, así que inkcheck vigila la memoria durante la exploración y, antes de que se produzca el fallo, se detiene, conserva todo lo encontrado hasta ese momento e informa `truncatedBy.memory` con un informe parcial en lugar de perder la ejecución. Los límites explícitos retienen hasta un 25% (como máximo 1 GiB) para la construcción y el vaciado del resultado final; el flujo acotado informa tanto de la envolvente completa como de la marca de agua inferior de búsqueda. El límite predeterminado es el 85% del límite de heap de V8 (que respeta cualquier `NODE_OPTIONS=--max-old-space-size` que hayas establecido), de modo que las ejecuciones grandes en hardware modesto se degradan con elegancia en lugar de morir; pasa un valor explícito para ajustarlo o relajarlo. En una detención por memoria, el veredicto de `nextRun` es `investigate` (sube `--max-old-space-size`, baja `--max-states` o divide la historia) — nunca `broaden`, porque más presupuesto solo alcanzaría antes el techo.
`--max-time <s>` es la contrapartida de tiempo de pared total: el plazo comienza antes de la compilación y el escaneo de fuentes, y la ejecución retiene el 10% de la concesión (con un mínimo de 250 ms y un máximo de 60 segundos) para fusionar los hallazgos retenidos y vaciar su resultado. La exploración se detiene con `truncatedBy.time` en lugar de agotar el presupuesto de estados. No hay límite de tiempo predeterminado en la CLI local. Está pensado para CI o cualquier contexto que necesite un tiempo de ejecución acotado pero que aún quiera los hallazgos hasta el momento: la misma idea de parcialidad elegante que el guardián de memoria, aplicada al tiempo. El verificador web alojado lo establece automáticamente, justo por debajo de su tiempo límite estricto, de modo que una historia lenta devuelve un informe parcial en lugar de ser eliminada.
`--profile` imprime un perfil de forma estático y de bajo coste de la historia — variables y dónde se asignan, densidad de opciones, la ruta de divert más larga — además del límite de profundidad y los pesos de pasada que inkcheck elegiría para esa forma, sin ejecutar ninguna exploración. `--auto` aplica esas sugerencias: sube `--max-depth` cuando las rutas de divert estáticas superan el valor predeterminado (nunca lo baja, y tus opciones explícitas siempre ganan) y entrega los pesos de pasada del perfil al portafolio. En una historia cuya ruta principal tiene 40 opciones de profundidad, la configuración predeterminada no encuentra nada, mientras que `--auto` llega al final y demuestra que la historia es exhaustiva en \~111 estados.
Las terminales interactivas muestran por defecto una línea de progreso en vivo y concisa: fase real, estados explorados frente al **presupuesto de trabajo** configurado, descubrimientos y tiempo transcurrido. `--progress=human` fuerza instantáneas legibles para los registros de CI; `--progress=ndjson` escribe eventos versionados para agentes y analizadores; `--progress=off` silencia el progreso. Ninguno de estos porcentajes afirma cobertura de la historia. El informe final de stdout sigue siendo la autoridad, y el progreso nunca incluye prosa de la historia, opciones, variables ni fragmentos de código fuente.
Cada informe también lleva un veredicto `nextRun` — un pequeño vocabulario cerrado (`stop`, `deepen`, `broaden`, `reseed`, `investigate`) calculado de forma determinista a partir del propio informe, con opciones concretas, una justificación que cita los campos que usó y la ganancia esperada respaldada por evidencia. `--next` actúa sobre él: tras la comprobación, inkcheck aplica la escalada recomendada y vuelve a ejecutar, hasta tres veces, deteniéndose en un veredicto `stop`/`investigate`, en los techos de opciones, o cuando una ejecución escalada no encuentra nada nuevo (punto fijo). El rastro por ejecución aparece en la salida `--json` como `runs`; la narración de los saltos va a stderr para que la salida de máquina se mantenga limpia. Las recomendaciones nunca superan los techos duros documentados — cuando ningún aumento de opciones tiene evidencia detrás, el veredicto degrada a `investigate` y señala los nudos que vale la pena revisar.
GitHub Actions:
GXP8
El ejemplo fija `--max-states 500000` para que el trabajo tenga un tiempo de ejecución predecible; el presupuesto predeterminado es 10.000.000, que una historia grande y no exhaustiva realmente gastaría (consulta [Rendimiento y memoria](#performance-and-memory)). Fija un presupuesto en CI siempre que un tiempo de pared acotado importe más que la cobertura máxima.
`--strict` falla no solo con advertencias y nudos no visitados, sino también cuando la exploración se trunca o una función `EXTERNAL` tuvo que ser sustituida por un stub. Esto evita que una comprobación parcial luzca una insignia verde de «completa».
Consulta la [guía de QA de InkJam](docs/inkjam-qa-guide.md) para una configuración pensada para escritores y ayuda para interpretar el informe.
¿Has encontrado un resultado engañoso? Usa los formularios públicos de incidencias para [informar de un resultado incorrecto o no detectado](https://github.com/chaoz23/inkcheck/issues/new?template=false-report.yml), [ofrecer un fixture mínimo con licencia](https://github.com/chaoz23/inkcheck/issues/new?template=public-fixture.yml) o [solicitar una comprobación opt-in de la clínica de QA](https://github.com/chaoz23/inkcheck/issues/new?template=qa-clinic.yml). Nunca adjuntes material de historia privado, bajo embargo o restringido por jam a una incidencia pública.
## Para humanos, CI y agentes
inkcheck puede ser utilizado por un humano en una terminal, un trabajo de CI o un agente de codificación de IA opcional. La herramienta en sí misma sigue sin usar IA; los agentes son solo otro invocador de la CLI o del servidor MCP.
* **Interfaz legible por máquina:** `tool.json` en la raíz del repositorio describe las opciones de la CLI, las herramientas MCP, los códigos de salida y las estructuras de salida de `--json` / `--json-stream` en un solo archivo.
* **`--json`** emite el informe completo como un solo objeto JSON (`{ compile, stats, explore }`) en stdout; analiza eso en lugar de raspar la salida formateada. `explore.passes` mantiene una `discoveryCurve` local de pasada y acotada («lo que este explorador encontró») más una `portfolioMarginalCurve` solo de portafolio («lo que este explorador añadió primero»), separando terminales exactas, resultados visibles, errores de ejecución, aserciones, objetivos/etapas, nudos y novedad comparable. Los resúmenes conservan los estados de descubrimiento primero y último y los hechos de brecha seca a pesar de la compactación. Los informes de portafolio también incluyen una curva de toda la ejecución en el orden real intercalado de ejecución; el tiempo de pared permanece observacional en los eventos de progreso. `explore.schedule` muestra cómo las rondas adaptativas gastaron el presupuesto. El `shadowDecision` versionado muestra lo que la política anytime futura recomendaría y por qué, incluidos los mínimos protegidos por pasada y la incertidumbre. Es solo de observación (`applied: false`): nunca cambia la búsqueda actual ni afirma que la cobertura acotada sea una prueba.
* **`--json-stream`** emite evidencias numéricas reproducibles como NDJSON cuando se retienen, y luego un resumen terminal acotado en lugar de materializar el informe enriquecido completo o una cadena JSON del tamaño de un informe. Actualmente requiere `--concurrency 1`, admite una sola ejecución de exploración (sin `--next` ni `--profile`) y no se puede combinar con `--save-report`. Un modo reservado de etiquetas numéricas admite la puntuación neutral de oráculo de InkBench sin exponer variables de oráculo a la búsqueda ni transmitir cada final ordinario. Usa el flujo para evaluaciones largas de procesos externos donde la evidencia parcial debe sobrevivir a un límite estricto de envoltorio. Consulta el [contrato de flujo de evidencia acotado](docs/evidence-ndjson.md).
* **`--progress=ndjson`** emite eventos versionados de ciclo de vida y progreso de trabajo en stderr para un agente o un analizador de registros de CI. `statesExplored / stateBudget` es uso de presupuesto, no cobertura de la historia; el informe final de stdout sigue siendo la autoridad. Consulta el [contrato de progreso NDJSON](docs/progress-ndjson.md).
* **`--human`** emite una lista priorizada de correcciones agrupada por errores, advertencias y notas, con ubicaciones de archivo/línea cuando están disponibles, rutas de elección para fallos de ejecución y un siguiente paso para cada hallazgo.
* **`--markdown`** emite un informe compatible con GitHub Step Summary para que los humanos revisen CI.
* **Códigos de salida deterministas:** `0` limpio · `1` errores de compilación/ejecución (o, bajo `--strict`, advertencias, nudos no visitados, truncamiento o stubs externos) · `2` error de uso. Decide según el código de salida; no hagas grep del texto.
* **MCP:** `claude mcp add inkcheck -- npx -y inkcheck mcp` expone el perfil compacto de agente de cinco herramientas. Usa `INKCHECK_MCP_PROFILE=full` para el catálogo de compatibilidad.
* **El bucle:** edita `.ink` -> `compile_story` -> `start_search` -> enruta la siguiente acción de evidencia a través de `inkcheck_workflow` -> corrige -> compila y verifica. inkcheck es una comprobación mecánica repetible para un grafo de historia que hayas generado o editado; úsala para verificar tu propio trabajo antes de devolverlo.
* **El bucle de cobertura:** `explore_story` (y la CLI `--json`) devuelve `nextRun` — reacciona a su `recommendation` (`stop` / `deepen` / `broaden` / `reseed` / `investigate`) y vuelve a ejecutar con `nextRun.flags` hasta que `stop: true`. O deja que la CLI lo maneje: `inkcheck story.ink --next`.
`llms.txt` en la raíz del repositorio es un resumen compacto y apto para modelos de todo lo anterior.
## Cómo funciona
* **Compilación** usa `inklecate`, el compilador canónico — encontrado vía `$INKLECATE_PATH`, luego `PATH`, y luego auto-descargado desde la versión oficial fijada de ink 1.2.1 en `~/.cache/inkcheck` en la primera ejecución. Los archivos descargados se verifican contra hashes SHA-256 fijados antes de la extracción. Las historias se compilan con `-c` para que todas las visitas a nudos se cuenten.
* **Exploración** ejecuta la historia compilada en [inkjs](https://github.com/y-lohse/inkjs) (el puerto oficial del runtime JS), reutilizando instancias de historia agrupadas para que el JSON compilado se analice una vez por pasada y los estados se rebobinen mediante `LoadJson`. Inkcheck inicializa la aleatoriedad de la historia desde `--story-seed` (por defecto 1), luego preserva el estado RNG de Ink en cada rama guardada; el `SEED_RANDOM(...)` autorado permanece autoritativo cuando se ejecuta. Los estados se deduplican por hash de contenido. Se siguen los `INCLUDE`s.
* La CLI utiliza una búsqueda de cartera acotada y adaptativa. Las pasadas complementarias — última-opción-primero, primera-opción-primero y DFS de adentro hacia afuera, un haz con prioridad de diversidad y caminatas aleatorias con semilla — se ejecutan intercaladas en diez rondas deterministas. Los pesos iniciales (aproximadamente 20/20/26/15/20%, o la sugerencia de un perfil de forma bajo `--auto`) se reasignan cada ronda hacia pasadas cuyos hallazgos aún están creciendo, con un piso fraccional previsto del 8% por pasada activa. La repetición de políticas solo para investigación convierte esa intención en un servicio entero acumulativo auditable y normaliza la recencia a las ventanas de ejecución observadas de cada pasada en lugar de un conteo global de estados. Requiere tres ventanas antes de estimar el rendimiento, expira las señales después de una o dos ventanas medidas sin renovación, y permite superposiciones de asignación experimental solo para evidencia renovada de runtime/afirmaciones o progreso explícito de objetivos; la cobertura amplia permanece con el programador establecido. El programador de producción permanece sin cambios hasta que pase el corpus completo de promoción. Las pasadas son complementarias: los ordenamientos DFS agotan sistemáticamente los subárboles, el haz distribuye el presupuesto entre linajes de estados variables dentro de un límite de frontera duro, y las caminatas aleatorias vuelven a lanzar cada punto de elección para que las combinaciones de elección temprana se muestreen en lugar de repetirse. Los hallazgos se fusionan en un solo informe, cada uno etiquetado con la pasada que lo encontró, y el cronograma ejecutado aparece en la salida `--json`.
* `--concurrency auto` consciente de la carga de trabajo es el valor predeterminado de la cartera local. Su piloto DFS de adentro hacia afuera en vivo de 1,024 estados se convierte en el prefijo de la primera ronda adaptativa normal, luego continúa secuencialmente o se superpone con pasadas no tocadas en trabajadores persistentes acotados. Si el tiempo o la memoria se agotan durante ese piloto—o la fecha límite llega antes de que cualquier trabajador se inicialice—el piloto válido se devuelve como un informe parcial truncado explícitamente por recursos, nunca mal etiquetado como agotamiento del presupuesto de estados. La compuerta de 80 celdas 100K retuvo hallazgos exactos, prueba y cronogramas adaptativos con solo dos activaciones de frontera abierta; las compuertas coincidentes de 5M *The Intercept* profundidad-30/profundidad-100 retuvieron evidencia exacta, rechazaron el trabajo limitado por profundidad y mejoraron el trabajo sostenido de 657.7s a 489.0s. Cada estado permanece dentro de un techo y las evaluaciones piloto duplicadas son cero. El `1` explícito preserva la ejecución secuencial; los techos explícitos de 2-16 preservan la concurrencia fija. Ver la [evaluación de concurrencia](docs/concurrency-evaluation.md).
* El `--search=shared` experimental mantiene una identidad de estado global y expone el trabajo pendiente a través de vistas de frontera profundas, de novedad y con semilla. Un estado elegido por cualquier vista se expande una vez; el JSON de punto de control expandido se libera inmediatamente, los enlaces parentales compactos sobreviven solo mientras un descendiente pendiente necesite la ruta de reproducción exacta, y los IDs de vista obsoletos se compactan periódicamente. Los informes exponen la contabilidad de componentes y envolturas de punto de control explícitas opcionales. La rareza de estado variable y de transición variable se registra como telemetría de evaluación.
* El `--search=shared-variable` experimental reemplaza una de cada ocho selecciones de frontera compartida con una vista de rareza variable. Su puntuación combina la frecuencia observada de la instantánea de variable de destino y el cambio más raro en ese borde; no puede consumir más que su porción fija, por lo que la novedad del grafo, la profundidad y la exploración con semilla permanecen representadas.
* En el momento en que cualquier pasada sistemática visita todos los estados alcanzables sin alcanzar un límite, toda la cartera se detiene: cualquier estado adicional sería redundante. Una historia pequeña completamente explorable con el presupuesto predeterminado de 10,000,000 estados aún termina en el puñado de estados que realmente tiene — el gran valor predeterminado no cuesta nada cuando una historia es agotable.
* La pasada de haz responde concretamente a "¿qué debería optimizar un haz?": los sobrevivientes se seleccionan por turnos entre grupos de firmas variables (diversidad primero), clasificados dentro de cada grupo por novedad — nudos recién visitados, luego nuevas firmas variables, luego nuevos conjuntos de opciones ofrecidas. Es determinista sin semilla, e informa la ejecución como truncada siempre que haya tenido que podar un estado alcanzable, por lo que un haz nunca afirma silenciosamente cobertura completa.
* A menos que se omita con `--no-min-repro`, la CLI reserva aproximadamente el 10% del presupuesto solicitado de `--max-states` para una porción de acortamiento de reproducción en anchura. BFS alcanza hallazgos compartidos por senderos de elección más cortos cuando es posible y puede contribuir con hallazgos superficiales adicionales.
* Los límites (`--max-depth`, `--max-states`) mantienen bajo control la combinatoria del peor caso; el informe dice explícitamente cuándo se truncó.
## Límites de cobertura
* La exploración está acotada. Un informe truncado es evidencia sobre los estados visitados, no una prueba sobre toda la historia.
* Los informes indican los límites bajo los que se ejecutaron (profundidad, presupuesto de estados, semilla de búsqueda y semilla de historia) y, cuando se truncan, qué límite realmente cortó la cobertura (`truncatedBy` en `--json`, incluyendo `memory`) con consejos específicos sobre qué bandera elevar.
* Una ejecución grande que agotaría la memoria se detiene limpiamente y devuelve un informe parcial (`truncatedBy.memory`) en lugar de fallar — la huella de memoria está dominada por el conjunto hash de deduplicación (\~lineal en estados distintos) y, en historias profundas con pocos bucles, la frontera de reproducción en anchura, por lo que `--no-min-repro` y un `--max-states` más ajustado son las palancas cuando una historia es demasiado grande para terminar.
* Las historias pequeñas a menudo obtienen la garantía opuesta: cuando una pasada sistemática visita todos los estados alcanzables sin alcanzar un límite, el informe lo dice (`exhaustive`), y el agotamiento del presupuesto de la porción de muestreo ya no cuenta como truncamiento.
* Las funciones `EXTERNAL` se sustituyen con cero porque el juego anfitrión no está disponible. El informe nombra cada stub; el modo estricto falla en lugar de reclamar cobertura completa.
* El comportamiento aleatorio es repetible para la semilla de historia informada, pero una ejecución no enumera todas las semillas posibles de historia. Varíe deliberadamente `--story-seed` y mantenga las pruebas de juego humanas en el ciclo cuando la frecuencia de resultados importe.
* Un nudo no visitado puede estar intencionalmente inactivo, ser entrado por el motor o ser inalcanzable. El triaje de desvíos entrantes separa los huérfanos probables del contenido probablemente limitado por límites, pero es una indicación de revisión, no una instrucción de eliminación automática.
## Hoja de ruta
La hoja de ruta se rige por el [marcador de verdades de producto e ingeniería](docs/product-engineering-scorecard.md). Cada épica debería mejorar el valor medido sin debilitar la honestidad de cobertura acotada, la retención de evidencia crítica, la reproducción determinista o los techos de recursos.
* Transparencia de cobertura: informes más claros sobre truncamiento, límites de profundidad, finales visitados, espacio de búsqueda omitido y lo que se exploró o no.
* Calidad de informes: mejores ubicaciones de origen, rutas de reproducción más cortas, identidades de problemas estables y agrupación más clara de errores de runtime, nudos no visitados y límites de cobertura.
* Afirmaciones de historia definidas por el autor: reglas de proyecto deterministas como "el oro nunca se vuelve negativo", "la salud nunca excede el máximo" o "las variables requeridas se establecen antes de los finales".
* Búsqueda de variables orientada a objetivos: permitir que autores y agentes busquen estados aprobados mientras se preserva un presupuesto de búsqueda general protegido y un lenguaje exacto de cobertura acotada.
* Asistente de objetivos de IA alojado opcional: una interfaz humana de primera clase, explícitamente habilitada, que ayuda a autores no técnicos a proponer objetivos de variables y afirmaciones para aprobación, luego delega toda la ejecución y verificación al motor determinista no-IA de Inkcheck. El proveedor, el consentimiento, el intercambio de fuentes, la retención, el costo y los controles de desactivación deben ser explícitos; las reglas generadas nunca se confían ni se aplican silenciosamente.
* Persistencia de reproducción: recordar rutas de fallo conocidas y asegurarse de que las ejecuciones futuras sigan verificándolas incluso cuando las estrategias de recorrido mejoren.
* Puntos de control de campaña compactos: retener y reanudar frentes útiles de historias grandes sin que los artefactos de punto de control dominen la memoria o el disco, y degradar a un informe parcial inmutable antes de los límites de serialización.
* Fixtures de compatibilidad pública: ejemplos seguros para el consentimiento y casos límite sintéticos para pruebas de regresión, comparaciones de rendimiento y construcción de confianza.
* Preparación para agentes: el [benchmark de preparación para agentes](docs/agent-readiness-benchmark.md) ejecutable fija un protocolo sin pistas ocultas, fixture determinista de runtime/afirmaciones, objetivos de arranque/herramienta/referencia/seguridad/prueba, puntuador automático y atribución separada de herramienta/habilidad/modelo/entorno. Dos ejecuciones observacionales que pasen de implementaciones de agentes distintas siguen siendo la puerta de lanzamiento (#67).
* Arnés de promoción de búsqueda: un marcador amplio y predeclarado a través de familias estructurales, presupuestos, profundidades y semillas antes de que cualquier estrategia experimental pueda cambiar el valor predeterminado.
* Búsqueda especializada acotada: detectar formas mecánicas y despachar pequeñas sondas expertas para compuertas compuestas, bucles/contadores, elegibilidad de storylet, límites de afirmaciones y diversidad de frontera conductual (#107-#112). Los especialistas ganan expansión a través de valor nuevo de cartera y retienen trabajo general/de cola larga protegido.
* Controles de rendimiento para historias grandes: preajustes de verificación rápida, estándar y profunda con compensaciones de tiempo/cobertura más claras.
* Comprobaciones estructurales de lint: comprobaciones opcionales para etiquetas faltantes, esquemas de etiquetas inconsistentes o convenciones de metadatos específicas del proyecto.
## Licencia
MITMaintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for automated Godot 4 game testing. Enables launching games, capturing errors, and verifying changes from Claude Code or any MCP client.1MIT
- AlicenseCqualityAmaintenanceAn MCP server for Ren'Py project tooling that enables AI agents to inspect game state, evaluate expressions, read/write variables, and capture screenshots from running Ren'Py games.549MIT
- AlicenseNot gradedqualityBmaintenanceA universal AI-powered testing server built on the Model Context Protocol (MCP). Allows AI agents to inspect, execute, test, monitor, debug, and report on software projects.3GNU Lesser General Public v2.1 only
- AlicenseNot gradedqualityAmaintenanceA locally-run MCP server that connects to Twine's story library, enabling AI-assisted story management, passage editing, link-graph analysis, and narrative intelligence from any MCP-compatible client.583MIT
Related MCP Connectors
Official remote MCP server for Archivist AI TTRPG campaign memory: characters, sessions, and more.
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/chaoz23/inkcheck'
If you have feedback or need assistance with the MCP directory API, please join our Discord server