spec·loop manual del operador
Manual del operador · corrélo, no lo leas

Vos traés la idea.
El método construye el resto.

Uscha es spec-driven y agnóstico de herramienta, y arranca antes del spec. Este es el manual operativo para correrlo en Claude Code con el uscha-kit: cada jugada te dice cuándo se dispara, qué hacés, y qué lo verifica.

en el kitnuevopropuesta
El loop — ciclo interno, humano en el gate
idea discovery listo SPEC ADR? build verify evidencia gate humano
00Leé el tablero antes de moveren el kit

Uscha rechaza el supuesto de siempre: que ya sabés qué construir. La falla cara es un build confiado de la forma equivocada — por eso la primera jugada es siempre encontrar la forma, y cada jugada posterior avanza sobre evidencia capturada, frenando antes del merge.

disparador
Cualquier sistema nuevo o cambio no trivial.
jugada
Recorré la cadena de arriba en orden. Nunca saltes directo al SPEC.
gate
El merge lo aprueba un humano. Siempre.
01Abrí con un interrogatorio, no con un briefen el kit

Corré /uscha-discovery cuando tenés una idea pero no una forma; corré /uscha-adr-refine cuando la forma ya está y solo faltan los bordes. Ninguno escribe código — corren sobre Read, Write, Glob, Grep (discovery suma WebFetch).

disparador
Idea vaga, o una feature cuyos bordes no están clavados.
jugada
Dejá que te interrogue: contradicciones, términos difusos, modos de falla que faltan.
gate
Converge en una forma antes de emitir nada.
regla operativa

Interrogá, no acuerdes. Un discovery donde el asistente estuvo de acuerdo con todo fracasó — un entrevistador complaciente hereda tus puntos ciegos y te los devuelve formateados como plan. Si no te está apretando, reiniciálo — la fricción es el entregable.

02Cristalizá la charla en archivos del repoen el kit

A medida que se asientan las decisiones, escribilas directo en el repo — no las acumules para el final. El build lee archivos, no el chat.

CONTEXT.mdGlosario de dominio — mata el lenguaje difuso.
DOMAIN-MODEL.mdLa forma aprobada: entidades + relaciones.
SPEC.mdComportamiento, I/O, errores, aceptación, rollback.
docs/adr/*.mdUno por decisión durable; ejecutable.
ACCEPTANCE.mdDoD como - [ ] — lo que mide readiness.
RISKS · HANDOFFRiesgo residual; qué leer antes de codear.
por qué

Los resets de contexto (sesión nueva, /clear, compactación) pierden el chat. Los sub-agentes (y el CI que tengas, si tenés) leen archivos. La verdad vive en archivos versionados.

03Clasificá el cambio antes de gastarle rigorproceso, no mecanizado

Preguntá: ¿qué puede romper esto, y cuánto cuesta la rotura? La respuesta dimensiona el aparato. No arrastres toda la máquina detrás de un ajuste de config. Es una heurística de proceso: en el código/config del kit no existe el concepto de perfil, y ningún perfil selecciona gates automáticamente — los elegís vos.

PerfilEjemploGates mínimos
A · BajoUI menor / configbuild + test relevante
B · Normalfeature local / bugfixtests + estático + review
C · Críticopagos / seguridadunit+integración+seguridad+rollback
D · Multi-sistemaAPI pública / eventoscontract tests + versionado
E · Legacyrefactor / migracióncaracterización + no-regresión
flag

Perfil E → golden testing es obligatorio (ver jugada 08). Baselineá el comportamiento viejo antes de tocarlo.

04Ordená cada hecho en SPEC, ADR o CONSTITUTIONen el kit

Tres documentos, tres niveles de fuerza.

  • SPEC — comportamiento observable. Qué tiene que pasar.
  • ADR — una elección entre alternativas. Por qué esta forma.
  • CONSTITUTION — lo que nunca es aceptable, pese al trade-off que sea.

Escribí un ADR solo si los tres son verdad

  • Difícil de revertir.
  • Sorprendente sin contexto.
  • Resultado de un trade-off real.

Si falta uno → es una línea del SPEC. El Implementation Plan hace ejecutable al ADR; el código enlaza de vuelta con // ADR: <slug>.

freno duro

Un ADR elige; la CONSTITUTION prohíbe. Un ADR puede elegir Postgres vs Redis. Un ADR no puede elegir "guardar el secreto en texto plano" — la CONSTITUTION lo veta antes. El motor no lee CONSTITUTION.md solo: detectar la violación es deber del agente/humano, y el agente debe loguearla con flag-blocker --kind constitution. Una vez logueada, capea readiness ≤65 y bloquea la convergencia hasta el --resolve (humano). Los invariantes están mapeados a CWE.

05Corré /uscha-devloop y dejálo convergeren el kit

El orquestador toma los ADR + ACCEPTANCE.md, construye, y corre un loop de review gateado por severidad que frena. Tres leyes: convergé, no persigas el cero · los tests son un guardarraíl, no el final · generar tests ≠ correrlos.

  1. Setup + Fase 0. qa_ledger.py init; ADR + aceptación adentro. Sin aceptación → corré /uscha-adr-refine primero.
  2. Fase 1 — gate de coverage. Por encima del umbral, la suite existente cuida. Por debajo → escribí tests de caracterización en el borde; el humano los revisa.
  3. Fase 2 — build. Un commit por paso lógico. Frená y proponé un ADR ante nueva dep/patrón/contradicción.
  4. Fase 3 — QA loop. code-review → judgment-day → improve. Aplicá fixes ≥ gate; diferí el resto. Logueá, ingestá, chequeá convergido/oscilación.
  5. Fase 4–5 — integración + verify. Contract tests cross-repo; después el coverage fino diferido.
  6. Fase 6 — PR, y FRENÁ. Convergencia verde en el ledger, abrís PR, se lo pasás al humano.
  7. Fase 7–8 — smoke + docs. Lista de smoke manual; retrospectiva desde el ledger. /uscha-sysdoc es reporte opcional (a pedido), no una fase obligatoria del pipeline.
ojo con

El loop Ralph Wiggum — el agente dispara el token de "listo" demasiado temprano. Lo cierran los gates objetivos más el humano en el merge — nunca una opinión, y el motor solo no lo cierra.

06Confiá en los artefactos, nunca en la narración

Si el que hace escribe su propio boletín, puede loguear exit_code: 0 sin haber corrido nada. Por eso el ledger parsea archivos reales — no transcribe afirmaciones.

# qa_ledger.py lee archivos, no al agente
coverage  ← reporte de coverage (ej. jacoco.xml / lcov)
tests     ← XML de resultados (ej. JUnit / surefire)
estático  ← linters · type-checker · scanner de seguridad
LOC       ← su propio conteo (stdlib)
gates     ← veredictos persistidos con log-gate (pass|fail|not-run)
regla dura

Ausente = sin evidencia, nunca "OK". Un reporte vacío-pero-presente acredita el fix; un reporte ausente significa que el gate no corrió. Una herramienta que no corrió jamás se inventa en verde.

principio

El que hace ≠ el que chequea. El que hace no gradúa su propio trabajo — lo hace un checker de contexto fresco. (Evaluator-optimizer de Anthropic, dic 2024.)

07Que los hechos bloqueen; que las conjeturas solo aconsejen

Un gate que lee un hecho puede bloquear el trabajo. Un gate que conjetura sobre prosa solo puede susurrar. Rompé esto y los falsos positivos matan el gate — el dev lo apaga, y un gate muerto es peor que ninguno.

GateLee
golden-diffbytes vs .approvedBLOQUEA
pit-checkXML de mutación — tier programado/incremental, no del loop interno; si el reporte existe y falla, se persisteBLOQUEA
gate-checkestructura del diff (tests borrados/deshabilitados · thresholds bajados · secretos agregados — 1.12.0)BLOQUEA
static gate4 linters, normalizadosBLOQUEA
spec-check (estructura)falta out-of-scope · aceptación ausente/vacía · cero AC-n trazables — hechos, exit 1BLOQUEA
phase --require pr-readyestado DERIVADO del ledger; rama spike/* jamás pasa (1.18.0–1.19.0)BLOQUEA
regression-checkcierre de findings sin test nuevo = NARRATED (1.16.0); --strict lo gateaACONSEJA
waste-checkclones Type-1/2 del diff vs el repo (reuse-first, 1.26.0) — la duplicación que simplicity-check no ve; flags con file:line a reusar; gatea solo con --gate o defaults.waste.gateACONSEJA
rubric-ingestgrade de la rúbrica (criterio cualitativo versionado, contrato JSON agnóstico, 1.23.0); gatea solo si el humano lo declaraACONSEJA
spec-check (prosa)heurística sobre prosa (vaguedad, EARS); --strict la gateaACONSEJA
nota de campo

Un checker no correlacionado atrapó el 93.4% de lo que atraparon cuatro (Osmani). Apilá opiniones distintas, no cuatro linters parecidos. En /uscha-devloop el agente corre los gates de hecho inline (exit 0/1) y persiste cada veredicto con qa_ledger.py log-gate --kind golden-diff|gate-check|pit-check|simplicity|regression --verdict pass|fail|not-run: un fail bloquea la convergencia y capea readiness ≤65; un not-run queda registrado pero nunca es verde. El loop frena en el merge gate y revisa el humano — el kit no trae workflow de CI.

08Anclá cada migración con un goldennuevo

Todo lo demás lo authorea el agente. El golden es lo único que no puede authorear — y ese es el punto. Capturá lo que el código viejo realmente hace corriéndolo, congelálo como .approved aprobado por humano, y diffeá el código migrado contra eso.

disparador
Cualquier migración / modernización de Perfil E.
jugada
Capturar → humano aprueba → migrar → diffear.
gate
golden-diff limpio, o no hay merge — exit 0 CLEAN · 1 DIVERGE · 2 NOT-RUN (cero fixtures = NOT-RUN, nunca CLEAN).
  • Nunca dejes que el agente genere o edite .approved — un hook PreToolUse bloquea la escritura.
  • Nunca captures razonando sobre la salida; capturá ejecutando contra corpus real.
  • Fijá el locale objetivo, congelá relojes, normalizá GUIDs/orden-de-mapa antes de serializar.
  • Agregá *.approved.* binary al .gitattributes — si no, los fin-de-línea mienten.
por qué es sagrado

Si el agente authoreara el golden, codificaría el mismo entendimiento parcial que perdió la lógica. El golden es un chequeo sobre el agente, no uno que él mismo se otorga — que es precisamente por lo que existe.

09Decidí antes de automatizar el looppropuesta

El loop externo es un latido que dispara al interno con una cadencia. No lo construyas hasta que los cuatro sean verdad.

  • Se repite (semanal+) — si no, un solo prompt es más barato.
  • Verificación automática — un test/build/linter que hace fallar el trabajo sin vos.
  • El presupuesto absorbe el desperdicio — relee y reintenta; quema tokens igual.
  • Herramientas senior — logs, entorno de repro, corre lo que escribe.
# latido envolviendo /uscha-devloop
> /loop 0 3 * * *              # cadencia nocturna
  /goal readiness ≥ 80 AND tests verdes
        AND 0 CRITICAL         # checker de otra familia o al menos otro perfil (proceso, no código)
  > corré /uscha-devloop sobre <scope chequeable por máquina>
    stop    = /goal cumplido (checker fresco) OR sin presupuesto
    on-done = draft PR · escalá toques a la CONSTITUTION
    humano  = merge/deploy SIEMPRE con aprobación
impuesto de seguridad

Loop desatendido = superficie de ataque desatendida. SAST + secret-scan + dep-audit antes de cualquier PR; vetá el origen de cada skill antes de instalarla; logs no-verbosos; re-auditá permisos cada 30d, arrancá read-only; rotá la sesión antes de que se infle. Métrica: costo por cambio aceptado — por debajo del 50% de aceptación, el loop está perdiendo.

tu decisión

Regulado/fiscal, pagos y retail crítico están todos del lado "NO autonomizar". Gateado-por-diseño no es un hueco — es la decisión.

10Sabé cuándo saltear el método por completo
  • Spike / exploración. Sin SPEC. Guardá una nota de lo que aprendiste; especificá solo lo que sobrevive.
  • Prototipo descartable. Marcálo, aislálo, ponele fecha de muerte.
hotfix p0

Arreglá primero. Pero la evidencia mínima (qué cambió, cómo revertir) + un SPEC/ADR retroactivo vencen dentro de 24h. Es una regla de proceso que el equipo se compromete a cumplir — no una feature del kit. Una válvula de escape diseñada mantiene honesto al método bajo presión; una improvisada lo destruye.

Armá el banco de trabajo & clonálo al equipoen el kit

Claude Code + Python + git/gh + skills corren el método. Los pedazos específicos del stack (build tool, driver de base, linters) son el adaptador por-repo en cada CLAUDE.md — no el banco de trabajo.

# instalador nativo — sin Node, se autoactualiza
curl -fsSL https://claude.ai/install.sh | bash   # mac/linux/wsl
irm https://claude.ai/install.ps1 | iex          # windows
cp -r uscha-kit/.claude/skills/* ~/.claude/skills/
scoop bucket add gentleman https://github.com/Gentleman-Programming/scoop-bucket
scoop install gentle-ai                          # toolchain del autor — opcional, el kit no lo requiere
claude --version && claude doctor

Clonarlo a un compañero no es un archivo — son 7 capas: config, plugins, skills, agents+commands, hooks, el CLI externo, y los servidores MCP (taxonomía del setup del autor — no viene en el kit; lo que el kit trae es Claude Code CLI, Python 3.8+, git, gh opcional, las skills copiadas a ~/.claude/skills y config + permisos por repo).

  • Gotcha: settings.json hardcodea C:\Users\…. El bootstrap que tokeniza el path al exportar y lo reescribe al importar es tooling del autor — no viene en el kit.
  • La memoria NO se comparte. engram + MEMORY.md son por-máquina y se construyen solos. El comportamiento se replica; la memoria se gana.
§Referencia de comandos
/uscha-discoveryinterrogatorio idea→forma; propone entidades/endpoints.
/uscha-adr-refinepulir los bordes de una decisión.
/uscha-devloopplan → coverage → build → QA loop → integración.
/uscha-sysdocreporte opcional (a pedido) — deck de dos vistas desde el ledger.
doctordiagnóstico de la instalación (flutter-doctor spirit): python/git, 9 skills, hook INV-GOLDEN-01, config/ACCEPTANCE/ledger, toolchains por type — exit 1 solo con errores (1.22.0).
qa_ledger initarma el ledger desde uscha.config.json.
snapshotcoverage/tests/LOC (--phase pre|post).
check-coverageexit 0 si ≥ umbral (gate de fase 1).
ingest-gateparsea linters, normaliza severidad, diffea IDs.
convergedciclo limpio + static gate limpio.
oscillationrepetición de huella período-2.
readinessKPI 0–100 que reporta (siempre exit 0), con caps duros — no es un gate exit 0/1. Veredicto único (anti-ceremonia, 1.25.0): por default UNA pantalla — veredicto + una línea --- gates: colapsada; --verbose expande las dimensiones y el detalle por repo.
rebuildcompletitud del spec: COVERS/PARTIAL/DIVERGE — exit 1 salvo COVERS.
golden-diffbytes vs .approved — verdad de campo, aprobada por humano; exit 0 CLEAN · 1 DIVERGE · 2 NOT-RUN.
log-gatepersiste el veredicto de un gate de hecho (--kind golden-diff|gate-check|pit-check|simplicity|regression, --verdict pass|fail|not-run).
flag-blockerloguea una violación (ej. --kind constitution): capea readiness ≤65 y bloquea convergencia hasta --resolve (que exige --escape-analysis: qué gate/test debió atraparla — 1.16.0).
resolve-escalationresuelve una escalación; sin resolver, readiness queda capeado ≤75.
regression-checkFind Bugs Once (1.16.0): findings cerrados sin línea nueva de test = NARRATED (avisa; --strict gatea).
waste-checkreuse-first (1.26.0): clones Type-1/2 determinísticos del diff vs el repo — la duplicación que simplicity-check no ve; flags con file:line a reusar; advisory salvo --gate o defaults.waste.gate.
summarymétricas retrospectivas (--json lo consume /uscha-sysdoc); incluye el first-time yield (FTY, 1.27.0): % de repos que pasaron QA en el 1er ciclo — informativo, jamás gatea.
phaseestado del workflow DERIVADO del ledger (plan/build/qa/escalated/pr-ready), jamás declarado; --require pr-ready gatea el PR y veta ramas spike/* (1.18.0–1.19.0).
rubric-ingestingesta el JSON del grader de la rúbrica (evidence-or-nothing, score ponderado vs threshold); advisory por default, --gate o defaults.rubric.gate lo vuelve bloqueante (1.23.0).
initcomando del ledger.
log-stepregistra un pase de una herramienta de QA.
escalateregistra una escalaci?n humana.
production-findingregistra o resuelve feedback de producci?n.
spec-doubtregistra o resuelve una duda de SPEC.
spec-change-requestregistra o resuelve un pedido humano de cambio de SPEC/ADR.
execution-policyimprime el ruteo de modelo/esfuerzo por fase.
dashboardemite el contrato de datos de Mirador.
simplicity-checkeval?a minimalidad y complejidad del diff.
pit-checkeval?a efectividad de tests desde PIT.
gate-checkdetecta debilitamiento de gates o secretos.
spec-checkvalida estructura y trazabilidad de SPEC/ACCEPTANCE.
protocolo md-trackeado

Antes de editar cualquier .md trackeado (CLAUDE.md, docs de plan/delta, docs/adr), traé primero la versión actual del repo. Esos archivos cargan progreso vivo — nunca los regeneres de cero.

la herramienta ejecuta · la metodología gobierna · la evidencia decide · el humano aprueba
Uscha · manual del operador · instanciado en Claude Code vía uscha-kit