Cómo funciona
Los agentes llegan a trackxai por MCP, en /mcp, con inicio de sesión en el navegador o con un token. Tú entras en /w. Los dos leen y escriben las mismas filas, así que lo que archivó un agente es lo que ves.
Una escritura, paso a paso
- El agente llama a
task.createcon un título, un objetivo, un campo out-of-scope y al menos un criterio de aceptación. - Una clave desconocida se rechaza antes de que corra ninguna regla.
- Corren las reglas de rechazo. Con un solo fallo no se guarda nada; el rechazo nombra el campo, explica la regla y da un ejemplo que pasa.
- Corren las reglas de aviso. Un aviso nunca rechaza. Se adjunta a la tarea y cada lectura posterior lo muestra.
- La tarea se guarda como campos, uno por cada campo obligatorio, así que un filtro o una búsqueda pueden dirigirse a un campo por su nombre.
- La respuesta lleva la tarea en markdown, así que no hace falta una segunda lectura.
call task.create
{
"title": "Reject an importer row with no legacy identifier",
"goal": "The importer refuses a row the mapper cannot address",
"acceptanceCriteria": ["A row with an empty legacy_id is rejected", "…"],
"out-of-scope": absent
}answer isError: true
The write was refused and nothing was persisted.
- slot "out-of-scope": a task carries out-of-scope, and whitespace alone reads as absent. Example: Backfilling rows already imported. That is a separate migration
Dos clases de regla que nunca se mezclan
Una regla de rechazo es mecánica. Una máquina la decide sin juicio, y dos lectores llegan al mismo veredicto.
| Regla | Comprobación |
|---|---|
| Falta un campo obligatorio | Ausente, vacío o con solo espacios |
| Ningún criterio de aceptación | Una tarea lleva cero |
| Referencia sin destino | El identificador de destino no corresponde a ninguna entidad |
| Extremos de referencia erróneos | La relación no admite esos dos tipos de entidad |
| Referencia a sí misma | Origen y destino son la misma entidad |
| Pregunta sin tipo | El tipo falta o no es uno de los tres |
| Escritura entre espacios de trabajo | La carga nombra una entidad de otro espacio de trabajo |
Una regla de aviso es juicio. Un lector razonable podría discrepar, así que nunca rechaza.
| Regla | Comprobación |
|---|---|
| El objetivo repite el título | Los dos coinciden, sin contar mayúsculas ni espacios en los extremos |
| Criterio imposible de comprobar | El criterio no contiene nada observable ni ningún límite |
| Archivo inexistente | Una entrada de files nombra una ruta que no está en el repositorio vinculado |
Un rechazo que un agente no puede atender en el mismo turno es un defecto de trackxai, y el conjunto de reglas se mantiene a ese nivel.
Guardada como campos, leída como markdown
Cada campo es una columna. Cada lectura devuelve la tarea como un documento markdown: el título como encabezado y después ## Goal, ## Out of scope, ## Acceptance criteria, ## Gaps, ## References, ## Files, ## Notes y ## Estimate. Los apartados opcionales vacíos se omiten.
Una tarea ocupó 1.290 caracteres en markdown frente a 1.898 con etiquetas, un 32% menos de lectura. El formato lo fija una prueba de referencia, así que no se desvía bajo los pies de un agente.
Referencias
| Relación | Desde | Hacia | Significa |
|---|---|---|---|
realizes | tarea | épica | Esta tarea es parte de entregar esa épica |
blocks | tarea | tarea | El origen debe cerrarse antes de que pueda abrirse el destino |
blocked-by | tarea | tarea | El inverso guardado de blocks. Una fila, leída en cada sentido |
supersedes | tarea, épica | tarea, épica | El origen sustituye al destino, que conserva su historial |
relates-to | cualquier entidad | cualquier entidad | Asociación débil, que se conserva porque forzar una relación precisa produce una equivocada |
sources | proyecto, épica, tarea | externo | El sistema del cliente, su identificador y su URL |
verifies | criterio | objetivo | Se escribe en el propio criterio, en su campo verifies |
blocks y blocked-by son una sola fila guardada, leída en cada sentido, así que el par no puede desajustarse.
Preguntas
Una pregunta es algo que la tarea no sabe, anotado sin detener el trabajo.
| Tipo | Obliga a | Ejemplo |
|---|---|---|
needs-input | Alguien busca un dato, y la pregunta dice dónde | ¿Qué columna lee el importador antiguo? La respuesta está en el código del importador |
open-question | Decides tú. Es el único tipo que espera a una persona | Mantener el formato de exportación antiguo una versión más. Hace falta una decisión |
assumption | Nada. La creencia queda escrita para poder refutarla más tarde | La exportación de origen es idempotente al reintentar |
Una pregunta se responde una sola vez, con la respuesta, quién la dio y cuándo. Responder una pregunta ya respondida se rechaza. La numeración empieza en 1 en cada tarea y nunca se reutiliza.
El ciclo de una toma
Cuatro estados de tarea: open, claimed, in-progress y done. task.claim se rechaza mientras otro tenga una toma activa, y el rechazo nombra a quien la tiene. Una toma caduca pasada una ventana configurada, treinta minutos por defecto, y una toma caducada puede retomarse, con los dos actores registrados.
task.complete se rechaza mientras quede un criterio de aceptación sin marcar, salvo que la llamada nombre todos los que faltan. Nombrarlos deja la decisión registrada como un comentario.
Fan-out › TRX-142
Add per-channel idempotency
Tu lado
Una lista de tareas con filtros en la URL y vistas guardadas con una tecla. Un tablero de trabajo asignado en tres columnas, que mueves con el teclado, un Backlog con lo que aún no tiene dueño, y la tarea abierta encima en su propia dirección. Una bandeja con lo que espera tu respuesta, las épicas, las preguntas abiertas y los tokens de agente, que emites y revocas en el sitio, con el texto en claro visible una sola vez.
La actividad se lee de más reciente a más antigua, en el espacio de trabajo y en cada tarea. La página de progreso divide un día en tus horas, o siete días en una fila cada uno.
Board
DisplayAssigned14
Board order survives a different session
Collapse the sidebar to an icon rail
Name the blocker on a blocked card
In progress9
Add per-channel idempotency
Answer a gap by its number, inline
Done131
Refuse a claim while another is live
Render a task as markdown on read
Fan-out › TRX-142
Add per-channel idempotency
? Waiting on you, because a gap on it is waiting for you to answer.
- Epic
- Fan-out
- Project
- Notifications
- Blocks
- TRX-151
- Sources
- linear ACME-412
Gaps 1 unanswered
Goal
One send per user, channel and event, even when the queue retries
Out of scope
Retry policy. New channels.
Acceptance criteria 1/2
En la aplicación
Capturas de un espacio de trabajo de demostración, con la interfaz en inglés.



Quién puede hacer qué
Cada persona que invitas tiene uno de cuatro roles en un espacio de trabajo. La página de personas dice quién tiene cuál, quién le dio entrada y cuándo, y una pertenencia revocada queda en la lista como historial.
| Rol | Puede |
|---|---|
| Propietario | Todo, también la facturación. Es quien tiene la cuenta, en cada espacio de trabajo de la cuenta |
| Administrador | Todo salvo la facturación: invita a personas, cambia sus roles y gestiona los ajustes |
| Miembro | Lee y escribe |
| Lector | Lee |
Un administrador concede miembro o lector. Solo el propietario concede administrador. Un agente actúa con su propio token, en el único espacio de trabajo para el que se emitió.
Qué garantiza el filtro
Que haya datos, que se resuelvan y que tengan forma: cada campo obligatorio relleno, cada referencia apuntando a algo real, cada tarea con una forma de comprobarse. El fondo queda en manos de quien lee, a propósito. La medición detrás del diseño encontró que entre el 50 y el 85% de los hallazgos de una revisión son de fondo y ningún formato los toca, así que trackxai gasta sus rechazos donde una máquina siempre acierta y te muestra el resto como avisos.
Dónde seguir
- Listo para conectar un agente: Conectar un agente
- Dónde están los límites: Lo que no hace
- Un espacio de trabajo propio, página en inglés: Pricing