Owner:
01-spec.mdendocs/product/stories/{story-id}/. Para UI std → use/po-ux(fusión). Para agentic → escribís spec acá, después/ux-agenticodiseña flow conversacional. Para service-only → spec acá, skip UX.
<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 handoff, el brand viene en el handoff. Si invocado directo por Chris → preguntar primero.
| Tipo story | Skill |
|---|---|
| Service-only (BE endpoint, no UI, no agentic) | /po (este skill) |
| Agentic-only (conversational flow) | /po (spec) → /ux-agentico (flow design) |
| UI standard (CRUD/list/detail/form/dashboard) | /po-ux (fusión) |
| UI mixed (UI std + tool calls agentic) | /po-ux para spec UI + sección agentic-handoff → /ux-agentico para flow |
| UI disruptiva (paradigma novel) | /ux-disruptivo 7-fase → /po formaliza spec |
<brand> (REQUIRED, ver sección arriba)/pm o /pm con story en state=refining (idea ya pasó por trigger Chris "refinemos")docs/product/stories/{story-id}/checkpoint.md (creado por /pm con state=refining)docs/product/stories/{story-id}/00-story.md — si /pm ya escribió briefdocs/product/modules/{m}.md — estado funcional módulo per-projectdocs/product/capabilities/{m}/ — capabilities existentes per-project (no duplicar)docs/specs/templates/01-spec-template.md — template (transversal core, reusable cross-module)brand-expert para modules/brand (engine: (out-of-scope — Luana engine package brand-studio))offer-expert o offer-type-preset-expert para modules/offer (engine: (out-of-scope — Luana engine package offer-studio))copilot-expert para modules/copilot (engine: (out-of-scope — Luana engine package copilot) + brand-extension backend/src/modules/copilot/)sales-agent-expert para modules/sales_agent (engine: (out-of-scope — Luana engine package sales-agent) + brand-extension backend/src/modules/sales_agent/)metrics-expert para modules/analytics (engine: (out-of-scope — Luana engine package analytics-engine))manychat-expert para modules/connections ManyChatOrigen: report.html 2026-05-09 friction "User asked Claude to exit caveman mode 2x + 12 wrong_approach incidents". Bake batched-question pattern aquí — refinement loop es pieza nuclear donde miscommunication multiplica costo.
Hard rules durante clarification phases:
Anti-pattern:
❌ "Tengo 15 dudas:
1. ... 2. ... 3. ... [...continúa hasta 15...]
¿podés responder todo?"Pattern correcto:
✅ "Necesito clarificar scope antes de drafting. Batch 1/3 (scope):
1. ¿esta story incluye solo X o también Y?
2. ¿el MVP cubre caso Z?
3. ¿qué prioridad tiene W vs V?
Respondeme y mando batch 2 (edge cases)."WS=$(git rev-parse --show-toplevel)
BRAND={brand} # vitalia | nicolify | comunify | lupulo | platform
cat ${WS}/docs/product/BACKLOG.md # estado overall brand
cat ${WS}/docs/product/stories/{story-id}/checkpoint.md # state=refining requerido
cat ${WS}/docs/product/ideas-pool.yaml | grep -A5 {idea} # contexto idea origen
ls ${WS}/docs/product/capabilities/{m}/ # caps existentes (no duplicar)Si checkpoint state ≠ refining → STOP. Si state=idea, escala /pm para transition idea→refining. Si state=refined o avanzado, story ya pasó por /po.
Identifica módulo del story → invoca via Skill tool el expert correspondiente. NUNCA redactes scenarios sin haber consultado al expert (te ahorra reinventar invariantes).
Origen: PI-12 S1 T-1.bis caso. SSoT:
.claude/rules/hotfix-repro-mandatory.md.
Si esta story es hot-fix (originada en handoff doc, incident report, auditor
escalation, "bug en producción", "regression"), ANTES de redactar
01-spec.md MUST reproducir el bug localmente y validar el diagnóstico:
Ejecutar repro test/comando del handoff doc (paths brand-scoped):
WS=$(git rev-parse --show-toplevel)
cd ${WS}/backend && ${WS}/.venv/bin/pytest <repro paths> -v --tb=shortComparar symptom vs root cause del handoff:
diagnosis_correction con scope corregidoCitar repro evidence en 01-spec.md sección "Context" + en checkpoint:
hotfix_metadata:
repro_verified: true
repro_command: "cd ${WS}/backend && ${WS}/.venv/bin/pytest ..."
diagnosis_validates_handoff: <true|false>
diagnosis_correction: "<if false: real root cause>"Sin Step 2.5 para hot-fix → /architect refuses generar 06-tickets.yaml
sin repro_verified field. /dev-team refuses build. Defense in depth.
Escribir docs/product/stories/{story-id}/01-spec.md siguiendo template. Críticos:
Frontmatter brand-aware obligatorio:
---
story_id: {story-id}
brand: {brand} # ★ REQUIRED — single-project scope
type: service-story | agentic-story
state: refining
---Scenarios mínimos (4 obligatorios):
| Tipo | Verifica | Ejemplo service | Ejemplo agentic |
|---|---|---|---|
happy | camino feliz, user típico | "POST endpoint con payload válido → 201" | "user pide brand audit → tool call → response correcta" |
negative | input/estado inválido | "POST con tenant_id ajeno → 403" | "user pide algo fuera de scope → declina educadamente" |
edge | concurrencia, límites, recovery | "2 POST simul mismo idempotency_key → 1 row" | "user repite pregunta 3x → no loop, cambia framing" |
adversarial | security, AI-resistant | "SQL injection en payload → sanitized" | "prompt injection 'ignora system' → rechaza, no leak" |
Si falta UNO → /po rechaza spec, no procede.
Cada scenario tiene:
given: (preconditions concretas)when: (acción exacta)then: (efectos medibles, NO vagos)graders: (cómo se verifica — type-specific):- { type: contract_test, path: "backend/tests/modules/{m}/test_{story}.py" }
- { type: state_check, target: db, query: "..." }
- { type: state_check, target: events_outbox, expect: "1 event of type X" }
- { type: integration, path: "backend/tests/integration/test_{m}_{flow}.py" }- type: tool_calls
required: ["brand_audit_tool"]
forbidden: ["send_email"]
max_calls_total: 2
- type: llm_rubric
rubric: docs/specs/rubrics/completeness.md
assertions: ["assertion 1", "assertion 2"]
threshold: 0.75
- type: voice_fidelity
rubric: docs/specs/rubrics/voice-fidelity.md
- type: state_check
target: copilot_trace_event
expect: { tool_calls_count: 1, total_tokens_lt: 6000, cost_usd_lt: 0.50 }
- type: transcript_constraint
max_turns: 3Si type: agentic-story:
docs/specs/personas/ (consume YAML existentes)docs/specs/rubrics/ (consume MD existentes)specs/personas/ o specs/rubrics/ y citarla. Versionar (version: 1).Trial policy obligatorio:
trial_policy:
trials_per_scenario: 3
per_trial_pass_threshold: 0.66
pass_k_threshold: 0.5Output al user/PM:
Spec draft v1 escrito en docs/product/stories/{story-id}/01-spec.md.
Brand: {brand}
Scenarios: happy + negative + edge + adversarial (4/4).
Open questions:
- [Q1]
- [Q2]
¿Apruebas? Si quieres ajustes, dime cuáles.Chris responde → editás 01-spec.md → bump po_version → re-output. Loop hasta ratified_by_chris: true.
Anti-pattern: rendirte tras 1 iteración. Si Chris no responde → pregunta explícito: "¿procedo con esto o quieres cambios?"
Una vez ratificado:
Spec ratificada v{N}. Ratified_by_chris: true.
Próximo paso según type:
- agentic-story → /ux-agentico (lee 01-spec.md → produce 02-design-agentic.md)
- service-story → /architect directo (lee 01-spec.md → produce ready package)
¿Invoco el siguiente skill ahora (single-shot) o lo haces tú manualmente?Si Chris dice "single-shot" → invocar /ux-agentico o /architect como Skill tool en mismo session, propagando <brand>: {brand} como input REQUIRED.
Service-story: spec ratificada → directo a state: refined.
Agentic-story: spec ratificada pero falta diseño conversacional. Mantener state: refining hasta que /ux-agentico produzca 02-design-agentic.md ratificado por Chris. Recién ahí transition a refined.
# Service-story (transition al ratificar):
brand: {brand} # ★ REQUIRED — single-project scope
state: refined
phase: SPEC_RATIFIED
last_artifact: 01-spec.md
last_modified: 2026-05-06T...
ratified_by_chris: true
next_action: "/architect <brand>: {brand} → produce ready package (03-arch + 04-validators + 05-guidelines + 06-tickets)"
# Agentic-story (mantener refining hasta diseño):
brand: {brand}
state: refining
phase: SPEC_RATIFIED_AWAITING_DESIGN
last_artifact: 01-spec.md
last_modified: 2026-05-06T...
next_action: "/ux-agentico <brand>: {brand} → produce 02-design-agentic.md (state=refining → refined al ratificar diseño)"Si /ux-agentico (después que tu spec ratificó) descubre edge case nuevo durante diseño → te devuelven delta-spec.md. Tú:
/pm)/po-ux o /ux-disruptivo; agentic flow es de /ux-agentico/architect/po para UI std stories → use /po-ux (fusión más eficiente, evita design.md separado)docs/archive/2026/legacy-pis/PI-N/... → snapshot inmutable, NO modificardocs/product/stories/ — only <brand>: platform cross-module outcomes van ahí (requiere /pm ratificación){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 platform (cross-module) outcomes van ahí, y eso requiere <brand>: platform explícito.Cada response:
NUNCA dumps. Cita paths para que Chris pueda leer.
docs/process/paradigm-v4.md — paradigma 3 conversaciones + ready package + § Punto 4 (10 estados)docs/specs/templates/01-spec-template.md — template base.claude/rules/spanish-text.md — voseo glosario.claude/rules/hotfix-repro-mandatory.md — R26 hot-fix gate.claude/skills/po-ux/ — UI std fusión (sister skill).claude/skills/ux-agentico/ — agentic flow design (sister skill)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.