Developer team router v4 (Conv 2 — autonomous build, post pm-redesign 2026-05 Punto 4 + story-closure-gate 2026-05-18). Reads ready package (01-spec.md + 03-arch.md + 04-validators.yaml + 05-guidelines.md + 06-tickets.yaml) en docs/product/stories/{story-id}/ state=ready. Itera ticket-por-ticket: implement → run validators (4 categorías: non_functional/functional/visual/agentic_eval) → fix targeted file → repeat hasta GREEN o cap_reached. Decide owner según owner_eligibility + production_code flag (R23). qwen-opencode/Sonnet preferido para BE/FE no-agentic + tests/docs sobre agentic. Opus 4.7 obligatorio para AGENTIC production code. Mantiene T-{n}-impl-log.md vivo. TDD obligatorio. On pickup: state=ready→developing. On all GREEN all tickets: state=developing→developed + AUTO-HANDOFF /auditor (default, salvo defer_audit:true en checkpoint con razón documentada). REFUSE pickup nueva story si current worktree tiene story en state ∈ {developing, developed, reviewing} sin defer_audit. On cap reached: state=developing→blocked, escalate. Activa cuando user dice: '/dev-team', 'toma ticket T-N', 'implementa T-N', 'arranca build', 'autonomous build'.
Owner:
T-{n}-impl-log.md+T-{n}-result.mdendocs/product/stories/{story-id}/. Toma 1 ticket → ejecuta TDD + iteración contra04-validators.yaml→ push. On pickup: state=ready→developing. On GREEN all tickets → state=developing→developed + AUTO-HANDOFF a/auditor(default post 2026-05-18 — story-closure-gate). Escape valve explícita:checkpoint.md::defer_audit: truecon razón documentada + ratificación Chris. REFUSE pickup nueva story si current worktree tiene story en state ∈ {developing, developed, reviewing} sindefer_audit: true(defense-in-depth Layer 2 del story-closure-gate).
<brand> ∈ (single-brand project — no brand selector). Si Chris no lo provee, PREGUNTAR antes de proceder. platform = stories cross-module que tocan engine (raro — requiere /pm autorización).
Si invocado vía /pm o /architect handoff, el brand viene en el handoff. Si invocado directo por Chris → preguntar primero.
<brand> (REQUIRED, ver sección arriba)docs/product/stories/{story-id}/06-tickets.yaml — pila tickets del storydocs/product/stories/{story-id}/04-validators.yaml — ★ comandos shell ejecutables, must_pass:true ★docs/product/stories/{story-id}/05-guidelines.md — patterns required/forbidden + files in scopedocs/product/stories/{story-id}/03-arch.md (+ 03-arch-{be,fe,agentic}.md)docs/product/stories/{story-id}/01-spec.md (+ 02-design-agentic.md si aplica)T-{n} con state: ready)docs/product/stories/{story-id}/checkpoint.md — state=ready requeridoWS=$(git rev-parse --show-toplevel)
BRAND={brand} # vitalia | nicolify | comunify | lupulo | platform
STORY_DIR=${WS}/docs/product/stories/{story-id}
cat ${STORY_DIR}/checkpoint.md # verify state=ready (o state=developing si retomas)
cat ${STORY_DIR}/06-tickets.yaml # pila tickets
cat ${STORY_DIR}/04-validators.yaml # ★ corazón autonomous loop ★
cat ${STORY_DIR}/05-guidelines.md # patterns + files in scopeSi state=ready → transition a building (primera vez):
# checkpoint.md
state: developing # ★ TRANSITION ready → developing ★
phase: BUILD_T1WIP cap check: developing ≤ 1 por worktree (post 2026-05-18 story-closure-gate). Si excedido → escala Chris antes proceder.
ANTES de pickup este ticket (o cualquier ticket de esta story), verificar que NO hay otra story abierta en el mismo worktree pendiente de cierre:
WS=$(git rev-parse --show-toplevel)
BRAND={brand}
# Listar todos los checkpoints stories del brand
for cp in ${WS}/docs/product/stories/*/checkpoint.md; do
STORY_ID=$(basename $(dirname $cp))
STATE=$(grep -E "^state:" $cp | head -1 | awk '{print $2}')
DEFER=$(grep -E "^defer_audit:" $cp 2>/dev/null | awk '{print $2}')
if [[ "$STATE" =~ ^(developing|developed|reviewing)$ ]] && [[ "$DEFER" != "true" ]]; then
echo "BLOCK: story $STORY_ID en state=$STATE sin defer_audit"
fi
doneSi encuentro otra story open (developing/developed/reviewing) en el mismo worktree
SIN defer_audit: true ratificado por Chris → REFUSE pickup. Output verbatim:
❌ Story closure gate: cannot pickup ticket T-{n} de story {new-story-id}
porque story {open-story-id} está en state={state} sin defer_audit.
Acciones disponibles:
1. Continuar story {open-story-id} hasta state=done (default forward-motion)
2. Ratificar defer_audit:true en {open-story-id}/checkpoint.md con razón
documentada + Chris explícito
3. Cleanup-session el worktree actual y crear nuevo
(scripts/git/new-session.sh --story-id {new-story-id})
SSoT regla: .claude/rules/story-closure-gate.md (Layer 2)NO arrancar el ticket. Esperar acción explícita Chris.
Origen: process-improvement 2026-05-05 R1. Sin context-builder cada subagent re-lee 30-50k tokens spec+arch+rules. Brief Haiku 5-8k tokens amortiza.
Antes de tomar ticket, asegurás CONTEXT-BRIEF.md fresco existe en story-folder.
BRIEF=$STORY_DIR/CONTEXT-BRIEF.md
LATEST_COMMIT=$(git log -1 --format=%H -- $STORY_DIR)Decidir si spawn context-builder:
CONTEXT-BRIEF.md no existe → SPAWNCONTEXT-BRIEF.md existe + header Faithfulness flag: blocking → SPAWN re-buildCONTEXT-BRIEF.md más viejo que último commit story → SPAWN refreshclean|partial → SKIPSi SPAWN:
Agent({
description: "Build context brief for ticket T-{n} brand={brand}",
subagent_type: "context-builder",
model: "haiku",
prompt: "<brand>: {brand} # ★ REQUIRED — single-project scope
<pr_folder>: <STORY_DIR absolute>;
<modules>: <comma list from story spec>;
<phase>: builder;
<subsystem_keywords>: <comma list>;
<frameworks>: <fastapi, langgraph, anthropic, sqlalchemy, pydantic, etc.>"
})Espera context-builder + context-validator. Lee header. Si flag blocking → STOP, escalate Chris.
Pasás CONTEXT-BRIEF.md path + <brand>: {brand} en TODO prompt subagent downstream.
SSoT:
.claude/rules/hotfix-repro-mandatory.md.
Si ticket es hot-fix (señales: title contiene bug|hot-fix|regression|incident|bis|revert, origin handoff doc|incident|escalation, sub-num T-N.bis, scope quirúrgico ≤2h), ANTES de spawn builder, reproducir bug local + validar diagnóstico (paths brand-scoped, e.g. cd ${WS}/backend && ${WS}/.venv/bin/pytest ...). Cita repro_evidence en ticket entry de 06-tickets.yaml.
Si repro_verified: false o ausente en hot-fix ticket → REFUSE spawn:
ERROR — hot-fix ticket missing repro_verified per
.claude/rules/hotfix-repro-mandatory.md.
Run repro command first, document evidence, then proceed.Detalle workflow Step 1-3 (reproduce → diagnóstico → cite evidence) en rule SSoT.
Filtrar tickets con state: ready (deps cumplidas). Decidir owner según owner_eligibility + production_code flag (R23):
| Surface | production_code | Owner preferido | Razón |
|---|---|---|---|
| BE no-agentic | true | qwen-opencode | costo, qwen capable |
| BE no-agentic | false (tests/docs/tooling) | qwen-opencode o claude-sonnet | trivial test/doc work |
| FE no-agentic | true | qwen-opencode | costo, qwen capable |
| FE no-agentic | false | qwen-opencode | trivial |
| AGENTIC | true | claude-opus (MISMA sesión, NO opencode) | brand voice + protected surfaces + Opus prompt eng |
| AGENTIC | false (tests/docs only) | claude-sonnet | R23 — test-only/doc-only sobre módulo agentic NO requiere Opus |
| Migration aislada | true | qwen-opencode | trivial DDL |
| Cross-module shared | true | claude-sonnet o opus | complexity |
Reglas hard:
production_code: true → SIEMPRE Opus 4.7. Esto se ejecuta en MISMA sesión Claude Code (tú como /dev-team con Opus).production_code: false → Sonnet OK. Tests/docs/tooling
sobre modules/{copilot,sales_agent}/ no requieren Opus reasoning.Update 06-tickets.yaml ticket T-{n}:
state: assigned
assigned_to: qwen-opencode | claude-opus | claude-sonnet
assigned_at: 2026-05-06T...
transitions:
- { state: assigned, at: ..., by: "/dev-team", to: "<owner>" }Crear docs/product/stories/{story-id}/T-{n}-impl-log.md con plan inicial + iteration_log empty.
Antes de cualquier git commit por el builder, MUST cumplir gate hard:
acceptance.validator_ids en 06-tickets.yaml)ruff check src/ + ruff format --check src/ BE; eslint + tsc --noEmit FE).EVAL_GOLDENS_COST_BUCKET_VERIFY=1) → builder MUST run con env real, NO skip.HARD rule: builder commitea SOLO con todos los gates GREEN. Auditor catch-bugs-pre-existing era cost-leak Opus 2-3x. Pre-commit gate cierra esto.
Builder prompts en Step 2A/2B/2C citan este gate verbatim. Si builder pushea con RED → /dev-team rebota a state: tests-failing ANTES Step 4 verify.
Antes de spawn builder, /dev-team LEE 05-guidelines.md § must_load_skills y EXTRACTA la lista completa (con when: conditions evaluadas según ticket surface). Pasa la lista RESOLVIDA al builder spawn como bloque verbatim.
Builder MUST entregar en T-{n}-result.md una sección obligatoria:
## Skills consulted (must_load enforcement v4.1)
| Skill / Rule | Status | When consulted |
|---|---|---|
| backend-expert | ✅ loaded | Step 0 — DDD pattern check |
| frontend-expert | n/a | surface=BE only |
| .claude/rules/tenant-isolation.md | ✅ loaded | mid-build — verify query filter |
| .claude/rules/anti-duplication.md | ✅ loaded | Step 0 grep cross-module |
| playwright-expert | ✅ loaded | mid-build — POM patterns |
| ... | ... | ... |Auditor verification: auditor Step 2 verifica esa sección existe + lista todas las skills must_load. Si missing/incomplete → CHANGES_REQUESTED automático (categoría: process discipline). Auditor self-fix puede agregar la sección si builder olvidó documentar pero cargó las skills (whitelist #12 docstring trivial análogo).
Construir prompt para qwen invocando opencode CLI. Paths brand-scoped + workspace root parametrizado (${WS} resuelto via git rev-parse --show-toplevel):
WS=$(git rev-parse --show-toplevel)
BRAND={brand} # vitalia | nicolify | comunify | lupulo | platform
STORY_DIR=${WS}/docs/product/stories/{story-id}
cat > /tmp/T-{n}-qwen-prompt.md <<EOF
Eres developer Luana ({brand} brand) ejecutando T-{n} de story {story-id}.
Brand scope: ${BRAND} — TODO edit debe respetar paths bajo . NO editar ${WS}/core/luana-core-*/src/ (engine, requires /pm promotion gate). NO editar {other_brand}/... (cross-module).
PRIORITY READ — CONTEXT-BRIEF (Haiku-built, 5-8k tokens, contiene spec+arch+rules+anti-dup+canonical docs):
- ${STORY_DIR}/CONTEXT-BRIEF.md
Lee TAMBIÉN estos archivos del READY PACKAGE (si brief insuficiente):
- ${STORY_DIR}/01-spec.md — Gherkin scenarios + (si UI std) wireframes
- ${STORY_DIR}/03-arch.md — technical decisions (★ v4.1: incluye § Test Construction Plan)
- ${STORY_DIR}/04-validators.yaml — ★ comandos must_pass + § test_construction_plan (orden + POMs + fixtures + scenario_to_test mapping)
- ${STORY_DIR}/05-guidelines.md — patterns required/forbidden + § must_load_skills (★ v4.1 enforceable)
- ${STORY_DIR}/06-tickets.yaml — find your ticket entry T-{n} + gherkin_coverage
★ MUST LOAD SKILLS (v4.1 enforceable — DEBE cargar TODAS antes de codear):
<LIST EXTRACTED FROM 05-guidelines.md § must_load_skills RESOLVED, e.g.:>
- backend-expert
- playwright-expert (si test_construction_plan.playwright_required=true)
- .claude/rules/tenant-isolation.md
- .claude/rules/anti-duplication.md
- .claude/rules/spanish-text.md
- .claude/rules/auditor-self-fix-policy.md (saber qué auditor self-fix vs spawn dev-team)
- tessl__fastapi (si BE endpoint nuevo)
- ... (extractar verbatim según ticket surface + module)
AUTONOMOUS LOOP:
1. Load must_load_skills listed above (Step 0). Each Skill tool invocation registrado.
2. Read 04-validators.yaml § test_construction_plan — sigue creation_order para Playwright tests (no inventes orden).
3. Read 04-validators.yaml validators list. Run validators ASOCIADOS al ticket T-{n} (acceptance.validator_ids list).
4. RED: tests fallarán (no implementation yet).
5. Implementá MÍNIMO para que validators GREEN — solo files dentro 05-guidelines.md "Files in scope" (TODOS brand-scoped bajo ).
6. Re-run validators. Si fallan: fix targeted file por error trace, re-run failing validator only.
7. Repeat hasta TODOS validators GREEN o iteration cap reached (default 10).
8. Update T-{n}-impl-log.md con iteration_log VIVO mientras trabajás (cada iter: timestamp + validator + result + fix applied).
9. ★ v4.1: T-{n}-result.md MUST incluir sección "Skills consulted (must_load enforcement v4.1)" con tabla skill/rule + status + when consulted (ver dev-team SKILL.md § must_load_skills enforcement).
Reglas TDD obligatorias:
1. RED: validators fallan primero (sin implementation)
2. GREEN: implementa mínimo
3. REFACTOR: limpiar
Convenciones (.claude/rules/* — citados también en 05-guidelines.md):
- backend-ddd.md o frontend-fsd.md
- tenant-isolation.md
- spanish-text.md (Spanish neutro, no voseo)
- backend-migrations.md (idempotente)
- anti-duplication.md (cross-module mirror ban)
- tdd-mandatory.md
- git-safety.md (triple-branch: wip/* | main | release/*; NO 'origin development')
Quality gates antes push (★ HARD — G5 pre-commit smoke gate):
- TODOS validators de 04-validators.yaml asociados al ticket → GREEN antes commit
- Lint + format clean (cd backend && ../../.venv/bin/ruff check + ruff format --check; cd frontend && npx eslint + tsc --noEmit)
- Env-gated validators corridos con env real (NO skip si validator dice EVAL_*=1)
- Case-sensitivity check si validator compara enum/string-literal
- 05-guidelines.md "Files in scope" respected (no escape; SOLO paths)
- RED bloquea commit. Fix file → re-run validator → repeat hasta GREEN.
Push destination (triple-branch policy):
- git push origin "\$(git branch --show-current)" # wip/{slug} autosave, main post squash, release/vX.Y.Z
- NUNCA 'git push origin development' (branch eliminado en reorg 2026-05-15)
Output al terminar:
- T-{n}-result.md con diff resumen + validator gates output literal + commit SHA
- Estado ticket: pushed (en 06-tickets.yaml)
- Last line del response: "done -> T-{n}-result.md"
Si cap_reached (10 iter sin GREEN):
- T-{n}-impl-log.md sección "Cap reached — escalating"
- Estado ticket: blocked
- Last line: "blocked -> T-{n}-impl-log.md (see iteration_log)"
EOF
cd ${WS}
opencode run \
--prompt-file /tmp/T-{n}-qwen-prompt.md \
--workspace ${WS} \
--model qwen-coder \
--max-iterations 50
# Si opencode falla / API no disponible → fallback: copiá prompt + Chris ejecuta manual:
# echo "Pegá esto en opencode CLI: $(cat /tmp/T-{n}-qwen-prompt.md)"Mientras qwen trabaja → tú NO interfieres. Cuando termina:
T-{n}-result.md existe y dice state: pushed (o blocked)06-tickets.yaml ticket → state: pushed o blockedSpawnás agent builder-agentic (Opus 4.7) via Agent tool. REQUIRED: pasá <brand>: {brand} en prompt.
Agent({
description: "Build agentic ticket T-{n} brand={brand}",
subagent_type: "builder-agentic",
prompt: "<brand>: {brand} # ★ REQUIRED — single-project scope
<pr_folder>: docs/product/stories/{story-id}/
PRIORITY READ: docs/product/stories/{story-id}/CONTEXT-BRIEF.md (Haiku-built, 5-8k tokens compresses spec+arch+rules+anti-dup+canonical docs)
READY PACKAGE (todos bajo docs/product/stories/{story-id}/): 01-spec.md + 02-design-agentic.md + 03-arch.md (★ v4.1: incluye § Test Construction Plan) + 03-arch-agentic.md + 04-validators.yaml (★ v4.1: 5 categorías + test_construction_plan + scenario_coverage sub-categorías) + 05-guidelines.md (★ v4.1: must_load_skills enforceable) + 06-tickets.yaml (gherkin_coverage por ticket)
★ MUST_LOAD SKILLS (v4.1 enforceable): <list extracted from 05-guidelines.md § must_load_skills resolved per ticket surface — typical agentic: copilot-expert/sales-agent-expert + tessl__langgraph + claude-api + graceful-degradation + auditor-self-fix-policy.md + tenant-isolation.md + spanish-text.md>
★ MUST DELIVER in T-{n}-result.md: sección "Skills consulted (must_load enforcement v4.1)" con tabla skill/rule + status + when. Auditor flag CHANGES_REQUESTED si missing.
Surface scope: SOLO backend/src/modules/{copilot,sales_agent}/{tools,extractors,workflows,personas,goldens,kb}/ (brand-extension). NUNCA core/luana-core-*/src/ (engine — requires /pm lift).
AUTONOMOUS LOOP: implement → run validators (acceptance.validator_ids) → fix → repeat hasta GREEN o cap_reached
TDD: eval goldens RED first, integration tests, tools tests, etc.
★ G5 PRE-COMMIT SMOKE GATE: validators GREEN + lint + format + env-gated tests con env real + case-sensitivity match — TODO antes commit.
★ Test Construction (v4.1): seguir test_construction_plan.creation_order del 04-validators.yaml para Playwright tests (no inventar orden, POMs ni fixtures).
Push destination: git push origin \$(git branch --show-current). NUNCA 'origin development'.
Output: T-{n}-result.md (con Skills consulted) + commit pushed
Last line: done -> docs/product/stories/{story-id}/T-{n}-result.md (o blocked -> T-{n}-impl-log.md)"
})builder-agentic corre validators + push. Devuelve done -> T-{n}-result.md.
Spawnás agent builder-backend o builder-frontend con model=sonnet (default). Prompt SIEMPRE referencia CONTEXT-BRIEF.md + propaga <brand>:
Agent({
description: "Build {surface} ticket T-{n} brand={brand}",
subagent_type: "builder-{backend|frontend}",
model: "sonnet",
prompt: "<brand>: {brand} # ★ REQUIRED — single-project scope
<pr_folder>: docs/product/stories/{story-id}/
Read docs/product/stories/{story-id}/CONTEXT-BRIEF.md FIRST (saves 30-50k tokens vs raw docs).
READY PACKAGE (todos bajo docs/product/stories/{story-id}/): 01-spec.md + 03-arch.md (★ v4.1 § Test Construction Plan) + 04-validators.yaml (★ v4.1 5 categorías) + 05-guidelines.md (★ v4.1 must_load_skills) + 06-tickets.yaml
★ MUST_LOAD SKILLS (v4.1 enforceable): <list extracted from 05-guidelines.md § must_load_skills resolved>
★ MUST DELIVER in T-{n}-result.md: sección "Skills consulted (must_load enforcement v4.1)".
Surface scope: SOLO backend/src/ + frontend/src/. NUNCA core/luana-core-*/src/ (engine). NUNCA {other_brand}/...
AUTONOMOUS LOOP: implement → run validators → fix → repeat
TDD obligatorio.
★ G5 PRE-COMMIT SMOKE GATE: validators GREEN + lint + format + env-gated tests con env real + case-sensitivity match — TODO antes commit. RED bloquea commit.
★ Test Construction (v4.1): seguir test_construction_plan.creation_order del 04-validators.yaml.
Push destination: git push origin \$(git branch --show-current). NUNCA 'origin development'.
Last line: done -> docs/product/stories/{story-id}/T-{n}-result.md"
})Mientras el dev (qwen | builder-{be,fe,agentic}) trabaja, tú:
T-{n}-impl-log.md periodically con timestamps "still in progress"blocked → registrar en log + escala /pmCuando dev termina, leer T-{n}-result.md + verificar gate-output.json:
Validators de 04-validators.yaml asociados al ticket → todos ✅?
gate-output.json existe en story-folder + overall.any_fail = false?
Si missing → builder no invocó gate-runner. SPAWN gate-runner directo aquí:
Agent({ description: "Force gate-runner T-{n} brand={brand}", subagent_type: "gate-runner", model: "haiku", prompt: "<brand>: {brand}; <pr_folder>: docs/product/stories/{story-id}/; <command>: test-{backend|frontend|all}; <iter>: <N>" })
**R22 post-spawn validation (origen 2026-05-05 caso T-1.bis):**
Después del spawn, VERIFY el artifact realmente escribió a disco. Si gate-runner
reporta "ERROR — gate-output.json write failed" en su last-line, OR si el
file no existe post-spawn, NO confíes en stdout output del agent — re-spawn
UNA segunda vez con mismo prompt. Si segunda invocación también falla:
```bash
# Fallback manual: orchestrator escribe gate-output.json directo (paths brand-scoped + workspace root parametrizado)
WS=$(git rev-parse --show-toplevel)
cd ${WS}/backend && ${WS}/.venv/bin/{ruff,pytest} ... > /tmp/gate.log 2>&1
python3 -c "import json; ..." > ${WS}/docs/product/stories/{story-id}/gate-output.json
```
Documentar en T-{n}-impl-log.md sección "Gate-runner failover" + escalar
backlog R22 retry.
Read JSON. Si `any_fail=true` → ticket vuelve a `tests-failing`, hand off `/dev-team` con findings.Commit SHA presente + git log lo confirma?
Push exitoso (git push origin "$(git branch --show-current)" — wip/* | main | release/vX.Y.Z. NUNCA 'origin development')?
Si cualquier gap → ticket vuelve a tests-failing o building. Si dev itera ≥5x sin éxito → blocked + escala.
Origen R2 process-improvement 2026-05-05 (D2): sin gate-runner enforcement orchestrator, cada subagent corre su propio pytest cycle (~10-15% tokens duplicados). gate-runner Haiku produce JSON estructurado consumible por auditor sin re-correr suite ni parsear stdout.
Origen v4.1 cement 2026-05-19. Antes de cerrar TODO el story (auto-handoff auditor),
/dev-teamverifica LOCALMENTE que cada Gherkin scenario de01-spec.mdmapea a ≥1 test PASS. NO espera al auditor para descubrir gaps.
WS=$(git rev-parse --show-toplevel)
STORY_DIR=${WS}/docs/product/stories/{story-id}
# Extract scenarios from 01-spec.md
grep -nE "^### Scenario" ${STORY_DIR}/01-spec.md > /tmp/scenarios.txt
SCENARIO_COUNT=$(wc -l < /tmp/scenarios.txt)
# Extract gherkin_coverage from 06-tickets.yaml
grep -A 10 "gherkin_coverage:" ${STORY_DIR}/06-tickets.yaml > /tmp/coverage.txt
COVERED_COUNT=$(grep -c "scenario:" /tmp/coverage.txt)
if [ $SCENARIO_COUNT -gt $COVERED_COUNT ]; then
echo "❌ Phase D local gap: $SCENARIO_COUNT scenarios en 01-spec.md, $COVERED_COUNT cubiertos en gherkin_coverage"
echo " STOP — agrega entries faltantes a 06-tickets.yaml::gherkin_coverage antes auto-handoff auditor"
exit 1
fi
# Verify cada test citado existe + PASS
# (lectura gherkin_coverage + pytest/playwright targeted run + report)
echo "✅ Phase D local coverage: $SCENARIO_COUNT/$SCENARIO_COUNT scenarios mapeados"Si Phase D local detecta gap → /dev-team REFUSE auto-handoff. Update T-{n}-impl-log.md § Phase D gap + revolver al loop autonomous para completar cobertura. Si gap es de spec (scenario sin test natural) → ESCALATE Chris ("scenario X de 01-spec.md no es testeable como definido").
Justificación: auditor Phase D antes detectaba gaps post-handoff → CHANGES_REQUESTED round-trip. Pre-check local en dev-team cierra el loop sin desperdiciar audit cycle Opus.
Update 06-tickets.yaml:
state: pushed
push_commit_sha: abc1234
transitions:
- { state: tests-passing, ... }
- { state: pushed, ..., commit: "abc1234" }Si quedan tickets ready → continuar Step 1 con next ticket.
Si TODOS tickets pushed → transition story a developed + AUTO-HANDOFF /auditor (Conv 3 default post 2026-05-18):
# docs/product/stories/{story-id}/checkpoint.md
brand: {brand} # ★ REQUIRED — single-project scope
state: developed # ★ TRANSITION developing → developed ★
phase: HANDOFF_TO_AUDITOR
last_artifact: T-{N}-result.md (last ticket)
next_action: "/auditor <brand>: {brand} toma story {id} para Conv 3 review+merge (AUTO-HANDOFF default)"Verificar defer_audit: true en checkpoint:
DEFER=$(grep -E "^defer_audit:" ${STORY_DIR}/checkpoint.md 2>/dev/null | awk '{print $2}')/auditorSi defer_audit no está set o es false → EMITIR handoff verbatim, NO arrancar nueva story:
✅ Story {story-id} all tickets pushed.
- T-1 (commit abc1234) ✅
- T-2 (commit def5678) ✅
- T-3 (commit 9876abc) ✅
Quality gates: validators all GREEN.
Story state: developing → developed.
WIP cap check: developing (was 1) now 0; developed (was 0) now 1 / cap 1.
→ AUTO-HANDOFF /auditor <brand>: {brand} story={story-id}
(Conv 3 default post 2026-05-18 story-closure-gate.
Lee T-{n}-result.md + Phase D gherkin verification + CHECKPOINTS.md C1-C5.
No arrancar nueva story hasta state=done de esta.)STOP la sesión /dev-team aquí. Chris (o auto-handoff harness) invoca /auditor siguiente.
Si defer_audit: true ratificado:
✅ Story {story-id} all tickets pushed.
Story state: developing → developed.
defer_audit: true (razón: "{defer_audit_reason}", ratified_by: {defer_audit_ratified_by})
⏸ AUDIT DEFERRED.
/pm-{brand} bootstrap pingeará esta deuda en cada sesión futura hasta
resolución. Cuando Chris quiera reanudar, dice "audita {story-id}" y
/auditor toma el handoff con full context del defer.STOP la sesión /dev-team.
❌ NUNCA: cerrar state=developed + pickup ticket de otra story en el mismo worktree.
Layer 2 enforcement: si Step 0.4 detecta otra story abierta sin defer_audit,
REFUSE pickup. Si esta story (la actual) acaba de cerrar developed, ANTES
de cualquier nueva story el worktree debe llegar a state=done (auditor → merge → archive).Origen: process-improvement A1 partial (2026-05-05). Foundation para medir ROI cross-PI. Token-level detail viene del transcript via
scripts/extract_baseline_metrics_from_transcripts.py; aquí emitimos orchestrator-level metadata (verdict + commit_sha + ticket + phase) que NO está en transcript.
Antes de cerrar Step 5, append metric row a docs/process/metrics/runs.jsonl:
WS=$(git rev-parse --show-toplevel)
python3 ${WS}/scripts/emit_process_metric.py \
--brand "{brand}" \
--story "{story-id}" \
--ticket "T-{n}" \
--phase build \
--agent-type "<builder-backend|builder-agentic|builder-frontend|qwen-opencode>" \
--verdict "<tests-passing|tests-failing|pushed|blocked>" \
--commit-sha "$(git log -1 --format=%h)" \
--total-tokens "<from agent tool result if visible, else omit>" \
--tool-use-count "<from agent tool result if visible, else omit>" \
--duration-ms "<wall-clock ms agent ran, else omit>" \
--iter <N> \
--note "<1-line context if relevant>"runs.jsonl is gitignored (rolling). Periodic aggregation: post-story close,
/pm runs analysis script comparing runs.jsonl to baseline.
If python3 scripts/emit_process_metric.py fails (script missing, etc.) →
log warning + continue. Metrics emission is best-effort, NEVER blocks the
pipeline.
Si dev itera ≥10x sin GREEN (cap from 04-validators.yaml iteration.max_iterations):
# docs/product/stories/{story-id}/checkpoint.md
brand: {brand} # ★ REQUIRED — single-project scope
state: blocked # NOT review — autonomous failed
phase: BUILD_T{n}_BLOCKED
last_artifact: T-{n}-impl-log.md
next_action: "Chris reviews iteration_log to decide: refine validators / refine guidelines / split ticket / restart"Output:
Story {id} ticket T-{n} BLOCKED — autonomous loop cap reached (10 iter).
Last error trace (verbatim):
---
{paste last validator failure}
---
iteration_log summary:
- Iter 1-3: implementation phase, RED on validator X
- Iter 4-6: refactor approach Y, still RED
- Iter 7-10: edge case Z not handled by guidelines
Story state: developing → blocked.
Próximo: Chris reviews docs/product/stories/{story-id}/T-{n}-impl-log.md →
decide:
- Refine 04-validators.yaml (validator was wrong)
- Refine 05-guidelines.md (missing pattern guidance)
- Split T-{n} (too large)
- Restart with different approachSi 2 tickets independientes (no depends_on) están ready simultáneamente:
git add . / git add -A / git add -u (parallel-safety)git commit --no-verifygit pull antes commit (parallel-safety)git pull. STOP, escala.git push origin development — branch eliminado en reorg 2026-05-15. Triple-branch: wip/* | main | release/vX.Y.Z.docs/archive/2026/legacy-pis/PI-N/... o docs/archive/2026/snapshot-pre-single-project-pm-redesign/ (snapshot inmutable)/auditor Conv 3/home/chris/AISALESHT/... o /home/chalreme/Proyectos/... — usar ${WS} resuelto via git rev-parse --show-toplevel{other_brand}/... cuando trabajás en {brand}. Si la story necesita tocar otra brand → STOP, escalate /pm (outcome cross-module).core/luana-core-*/src/ directamente. Requiere lift via /pm (promotion gate).docs/product/stories/ — solo <brand>: platform (cross-module) outcomes van ahí, y eso requiere autorización explícita /pm.<brand>: {brand} en el prompt — sub-agent puede editar fuera del scope brand.Cada update al user/PM:
docs/process/paradigm-v4.md — paradigma 3 conversaciones + autonomous build.claude/rules/tdd-mandatory.md — TDD obligatorio + R31 default flag flips.claude/rules/anti-duplication.md — inventario shared abstractions.claude/rules/hotfix-repro-mandatory.md — R26 hot-fix gate.claude/rules/parallel-safety.md — M1-M8 multi-session.claude/agents/builder-{backend,frontend,agentic}.md — sub-builders specs.claude/agents/gate-runner.md — gate-output.json producer (Haiku).claude/agents/context-builder.md — CONTEXT-BRIEF.md producer (Haiku)caa08df
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.