La lista de tareas de la sesión se evapora
Las listas de tareas propias del runtime del agente son por sesión. Cuando se reinicia el contexto, se pierde todo lo que el agente sabía sobre el estado del trabajo.
Substrate es un gestor de trabajo local-first que vive en tu repo y que tus agentes de código manejan por MCP. El proceso se define una sola vez, como datos: así todos los agentes —esta sesión y la siguiente— leen el mismo estado durable y pasan por los mismos gates en el momento de escribir.
La v0.7.0 es pre-release: todavía no está en npm, así que hasta que salga se instala desde el código fuente.
CLAUDE.md o GitHub Issues?Hay dos cosas que esas opciones no pueden hacer, y son toda la razón por la que Substrate existe.
Las listas de tareas propias del runtime del agente son por sesión. Cuando se reinicia el contexto, se pierde todo lo que el agente sabía sobre el estado del trabajo.
Un CLAUDE.md es durable pero no tiene estructura, y es solo una recomendación: a medida que se llena el contexto, los agentes se van alejando, y nada les avisa en el momento en que lo incumplen.
GitHub Issues es durable y estructurado, pero está fuera del árbol de trabajo: es una ida y vuelta que el agente tiene que acordarse de hacer, y no modela tus gates.
El estado de Substrate vive en .substrate/, al lado del código. Una sesión nueva —o un segundo agente— lee exactamente en qué punto está el trabajo y qué gates faltan, sin tener que deducirlo del git log.
Un solo binario en tu proyecto. Dos procesos, un directorio, todo local.
.substrate/boards/*.json define los boards, los grupos, tu propio field_schema y las políticas. Se commitean junto con el código y se leen de nuevo en cada llamada: al editar el JSON, el cambio aplica al instante. Sin migraciones ni cascadas.
Las tareas, los comentarios y un log de eventos append-only viven en una base SQLite local (libsql, modo WAL, seguro para agentes concurrentes). Está en el .gitignore: el estado de ejecución se queda en tu máquina.
substrate serve levanta un inspector solo en localhost: un kanban en vivo que se refresca solo, así que cuando un agente mueve una tarea se ve a los pocos segundos. Solo observa: nunca escribe, y no hay drag-and-drop.
.substrate/
config.json # project id + name
boards/*.json # boards, groups, field_schema, policies, team (committed)
members/*.json # optional team registry (committed)
data.sqlite # tasks, comments, event log (gitignored)
attachments/ # (gitignored)
logs/substrate.log # warnings + errors from mcp/serve (gitignored) El JSON se commitea. La base de datos y los adjuntos quedan en el .gitignore por defecto.
Dos clases de políticas. Ese es todo el modelo.
transition_guard — bloqueaBloquea el pase de un grupo a otro cuando falta un campo requerido y le devuelve transition_blocked al agente en el mismo instante de la escritura, nombrando el campo que falta.
agent_responsibility — sugiereAdjunta sugerencias no bloqueantes a las escrituras que coinciden. Cada escritura devuelve un envelope con la lista de políticas que se dispararon.
Marca un campo como human_only y las herramientas de escritura del agente se niegan a asignarlo: solo una persona puede, desde la CLI. Un guard que lo exige es una firma que un agente sin supervisión no puede darse a sí mismo.
{
"ok": false,
"error": {
"code": "transition_blocked",
"message": "Policy 'tests-before-review' blocks moving from 'Build & Test' to 'Review'.",
"details": {
"policy_id": "pol_01HX…",
"from_group": "Build & Test",
"to_group": "Review"
}
}
} El campo que revisa un gate es autodeclarado: el agente pone tests_passing: true por su cuenta, nadie corre tus tests. Un gate es un paso de confesión, no un control: registra la afirmación y bloquea hasta que se haga, pero no verifica que sea cierta. Una barrera dura en el momento justo sigue ganándole a una recomendación escrita de la que el agente ya se alejó, pero conviene decirlo con precisión.
human_onlySi un campo se marca human_only, las herramientas de escritura del agente se niegan a setearlo, y update_board se niega a desprotegerlo. Solo una persona puede hacerlo, desde la CLI: substrate approve <task_id> <field>. Un guard que exige un campo human_only es una aprobación que un agente sin supervisión no puede darse a sí mismo. substrate pending-approval lista todo lo que está esperando una firma humana.
Node 20 o superior, y unos minutos.
Substrate todavía no está en npm. Hay que clonar el repo, compilarlo y linkear el binario una sola vez: después, substrate funciona igual en todos lados.
git clone https://github.com/42pe/substrate.git
cd substrate && pnpm install && pnpm build && pnpm link --global
substrate install-skill # installs the agent skill into ~/.claude/skills/
cd /path/to/your-project && substrate init
substrate serve # inspect at http://localhost:7475 Agregar el servidor MCP por stdio a la config de tu runtime de agentes. A partir de ahí, el agente llama a whoami y sigue solo: 32 herramientas y un set documentado de convenciones.
{
"mcpServers": {
"substrate": {
"command": "substrate",
"args": ["mcp"]
}
}
} Cinco comandos. Todos fallan con un error claro si el directorio no tiene un .substrate/.
substrate init.substrate/ en el directorio actual, opcionalmente con un flujo de arranque. Los tableros se commitean a git; el estado de ejecución queda fuera, en el .gitignore.substrate serve127.0.0.1:7475 — y busca hasta el 7499 si ese puerto está ocupado. Un solo serve por directorio.substrate explainsubstrate pending-approvalsubstrate approve exacto para destrabar cada una. --json devuelve el agregado estructurado.substrate approve <task_id> <field>human_only: la única escritura que las herramientas de un agente rechazan por diseño. Queda firmada en el log como persona, y no mueve la tarea — eso lo hace el agente en su próximo intento. substrate unapprove la revierte.La referencia completa, con todos los flags y los casos borde, va en la documentación. Documentación
En qué consiste esto, antes de dedicarle una tarde.
.gitignore, así que un git worktree o un clon nuevo trae los boards pero arranca con una base de tareas vacía. Substrate avisa al iniciar cuando eso pasa, para que no te sorprenda en silencio.team de un board es metadata descriptiva para orientarse, nunca un permiso.Lo que todavía no está listo, y qué cambia cuando lo esté. Cada punto desaparece de esta lista el día que sale.
Hoy Substrate se instala desde el código fuente. Cuando el paquete esté publicado, la instalación pasa a ser un solo comando npx y la configuración de MCP deja de apuntar a una ruta local.
La presentación de la charla f13, publicada tal como se dio.
Nada de marketing, solo noticias sobre el desarrollo de Substrate.
Este sitio. Las analíticas vienen de PostHog: qué páginas se visitan, en qué se hace clic, más o menos desde dónde. Mailchimp carga un script propio para que el dominio cuente como conectado a la lista de correo. Entre los dos dejan cookies con identificadores al azar, para que una segunda visita no se cuente como una persona nueva. Sin trackers publicitarios, no se comparte ni se vende nada, y no se intenta averiguar quién eres. Lo único más que queda en tu navegador es la preferencia de idioma — y nada de esto alcanza a Substrate en sí, que es el punto de abajo.
La herramienta en sí. Substrate no recolecta ni envía nada. No tiene telemetría y la CLI nunca hace una llamada de red: tus boards, tus tareas y tus logs se quedan en tu máquina.