Onboarding técnico · trabajo real dentro de las barandas

Guía del practicante
de Agent Squad

El arco tiene dos etapas: primero el anillo de verificación (el asiento con mejor vista del sistema entero), después una pieza del catálogo con tu nombre. Todo lo de esta guía es verificable con un comando — acá nada "está listo" porque alguien lo diga: está listo porque algo lo recorrió y lo probó.

REPO agent-squad-app STACK Bun · Hono · SvelteKit 5 · Postgres · Inngest ACTUALIZADA 2026-06-12
0/0

DÍA 0 El entorno — que todo corra antes de tocar nada

Cada checkpoint tiene su comando y su resultado esperado. Si un número no te da, NO sigas: avisale a tu mentor con el output completo — un entorno torcido te va a hacer perder días persiguiendo fantasmas.

MAPA El sistema en 10 lecturas, en este orden

No leas "todo el repo": leé estas 10 piezas en orden y anotá UNA pregunta por archivo para tu mentor. El orden importa — va del borde al corazón.

01

docs/superpowers/plans/

Cómo se especifica acá: cada task con archivos exactos y un bloque Done when verificable. Vas a escribir los tuyos igual.

02

apps/api/src/index.ts

Un server entero en una pantalla. Notá el idleTimeout: 120 y preguntate por qué existe — es una cicatriz real: el default de Bun (10s) mataba el streaming del chat cuando el modelo razonaba en silencio.

03

apps/api/src/middleware/rate-limit.ts

Una ventana deslizante pura con reloj inyectable. Es la clase magistral de "cómo hacer testeable algo que depende del tiempo".

04

packages/substrate-spec/src/templates/standup-digest-v1.ts

Un Plan es un grafo tipado de pasos: quién firma cada uno, qué reintentos tiene, dónde está la compuerta humana. Acá entendés qué ES el trabajo en este sistema.

05

apps/api/src/inngest/operations/index.ts

El catálogo: 17 operations, 16 con handler. La que falta — human_gate.approve — no es un olvido: la ejecuta el propio executor suspendiendo el workflow. Cuando entiendas por qué, entendiste la arquitectura.

06

apps/api/src/substrate/launch-plan.ts

assertHumanGatePresent: la gobernanza escrita como código. Ningún plan sin aprobación humana terminal puede ejecutarse — ni los de fábrica, ni los que compone la IA.

07

apps/api/src/substrate/nova-compose.ts

El ÚNICO lugar donde el LLM "diseña" — y por eso el más vigilado: whitelist, grafo sin ciclos, tope de pasos, costo calculado por el servidor. La filosofía de la casa: validá al modelo, no le creas.

08

apps/web/src/hooks.server.ts

El guardián de CADA request: cookie, refresh de sesión, gate de acceso fail-closed (error al leer = no autorizado). Mirá también el doble candado del bypass de tests (dev && CI).

09

apps/web/src/lib/stores/userState.ts

La write-queue: por qué dos escrituras del estado del usuario jamás se pisan, y el revert compare-and-swap. Todo estado del usuario pasa por acá — nunca por un fetch directo.

10

db/substrate/migrations/0001_init.sql

El modelo de datos ES el producto: intents → plans → traces → artifacts/claims con provenance obligatoria. Leé los comentarios SQL — explican cada porqué.

ETAPA 1 El anillo de verificación

Semanas 1-3. Para verificar un paso tenés que entender todas las capas que atraviesa — por eso se empieza acá.

Misión 1 · tu primer test E2E

Escribí un spec E2E nuevo con el mock del motor

Elegí con tu mentor un flujo chico sin cubrir. El patrón de la casa: la web se prueba contra un mock del motor en el puerto 4998 — sin LLM, sin producción, determinista.

  1. Leé tests/e2e/16b-nova-compose.spec.ts y tests/e2e/helpers/substrate-mock.ts — ahí está el patrón completo (handlers por endpoint, beforeEach que resetea estado).
  2. Si tu flujo necesita un endpoint que el mock no tiene, agregale el handler calcando uno existente.
  3. Escribí el spec: primero el caso feliz, después el fail-soft (¿qué ve el usuario si el motor devuelve 500?). En Svelte 5, waitForLoadState('networkidle') antes de cada click — sin ese gate, los listeners pueden no estar montados.
  4. Corré TODO dos veces — los tests que pasan "a veces" no pasan.
Done when

ETAPA 2 Una pieza del catálogo con tu nombre

Semanas 4+. La Operation es LA unidad de aprendizaje: contrato tipado, costo, reintentos, evaluación. Chica, real y segura.

Misión 2 · tu primera Operation

Construí una operation determinista de punta a punta

Con tu mentor definan una operation SIN LLM (ej.: una transformación de texto, un agregado sobre claims existentes). Sin modelo en el medio, el feedback es instantáneo y aprendés el contrato puro.

  1. Definí la spec en el catálogo (packages/substrate-spec): id versionado (tuop.algo@1.0.0), inputs y output tipados. Mirá cómo lo hace audience.load — la operation pura más simple del catálogo.
  2. TDD: escribí el test del handler ANTES del handler (patrón de los tests vecinos en apps/api/src/inngest/operations/).
  3. Implementá el handler y registralo en operations/index.ts con registerOperation.
  4. Probá que un plan que la usa pasa la validación del catálogo — y que tu operation registra su costo (aunque sea $0: el contrato es el contrato).
Done when

REGLAS Las 8 de la casa — cada una con su cicatriz

Ninguna es teórica: todas salieron de un incidente real. Conocer la cicatriz es lo que evita repetirla.

R1
Test primero, código después.Los planes de acá traen "Done when" por algo: si no sabés cómo se verifica, no sabés qué estás construyendo.
R2
CI=true para todo E2E local.Sin eso el bypass de auth no se activa y vas a "encontrar" regresiones que no existen.
R3
Al mockear el módulo LLM, mockeá SOLO generateLLMText.El mock de módulos de Bun es GLOBAL: stubear exports de más pisó los reales y rompió 6 tests de streaming de otro archivo. Costó un review encontrarlo.
R4
Identidad, sesiones y auth no se tocan en pasantía.Ahí los errores no son aprendizajes: son incidentes de seguridad.
R5
Todo estado del usuario va por la write-queue.El endpoint escribe el estado COMPLETO por request: dos escrituras en paralelo se pisan. Un fetch directo "que funcionaba en mi máquina" le borró squads a un usuario en el camino.
R6
Texto que ve el usuario: cero jerga.Prohibido draft/plan/template/catálogo en la UI — se dice "SuperSkill", "equipo", "trabajo". El vocabulario técnico es nuestro, no del founder.
R7
El workspace de pruebas es COMPARTIDO: lo sintético se limpia.Un approve "ciego" del harness una vez aprobó un entregable real del founder. Desde entonces: identificar lo propio por timestamp + contenido exacto, y limpiar siempre.
R8
Cuando cambia el contrato, deploy del motor ANTES que la web.Motor viejo + web nueva = respuestas que la web no entiende. El orden de deploy es parte del diseño.

VOCAB Ocho palabras y ya hablás el idioma

TérminoQué es
IntentEl pedido por escrito: qué quiere lograr quién. El punto de partida auditado de toda ejecución.
PlanEl Intent compilado a un grafo tipado de pasos, validado por el servidor antes de existir.
OperationLa unidad de trabajo con contrato: inputs tipados → output + costo. 17 en el catálogo.
TraceUna ejecución concreta de un plan, paso a paso, con costo real por step.
ArtifactLo producido (digest, brief, video…), direccionable por contenido, con máquina de estados.
ClaimUn hecho tipado (sujeto·predicado·objeto) con provenance. La memoria del equipo, consultable con SQL.
Human gateLa compuerta: el workflow se SUSPENDE hasta 24h esperando a un humano. La decisión se vuelve claims.
SuperSkillLa palabra de producto para un flujo empaquetado — de fábrica o promovido por el usuario.

"No te escondemos en una esquina inofensiva: te damos trabajo real dentro de las mismas barandas que le pusimos a la IA. Si la arquitectura contiene a un modelo impredecible, te contiene a vos — y por eso desde la semana uno tu trabajo cuenta."

— La regla de la casa para practicantes