Master plan + canonical template + 13 epic files covering MVP-B implementation (~133 stories, ~430 points, 8-12 weeks calendar): - EPIC-00 Foundation & Tooling (8 stories, 21 pts) - EPIC-01 Auth & App Shell (12 stories, 38 pts) - EPIC-02 Tenant Onboarding (8 stories, 26 pts) - EPIC-03 Inbox + Messaging (15 stories, 55 pts) ★ heart of product - EPIC-04 Pipeline Kanban (10 stories, 34 pts) - EPIC-05 Customer 360 + Contacts (9 stories, 28 pts) - EPIC-06 AI Agent + RAG (12 stories, 42 pts) - EPIC-07 Nuvemshop Integration (11 stories, 37 pts) - EPIC-08 LGPD Compliance (8 stories, 29 pts) - EPIC-09 Team & Permissions (7 stories, 19 pts) - EPIC-10 Audit & Settings (9 stories, 26 pts) - EPIC-11 Super-Admin Platform (14 stories, 48 pts) - EPIC-12 Hardening + E2E + Polish (10 stories, 31 pts) Each epic file fully self-contained for autonomous execution by epic-executor: - Frontmatter (epic_id, depends_on, exposes_contracts, points, priority) - Goal + DoD - Architecture contracts (consumed + emitted) - Stories in dependency order with: files-to-create, implementation steps, ACs in Gherkin, QA test cases tabela, contracts emitted YAML, decisions, DoD checklist - Cumulative regression suite catalog - Risks + mitigations - New ADRs proposed Total documentation generated: ~85k words across epic files. Reconciliation R-06 added to docs/specs/RECONCILIATION-LOG.md: EPIC-09 ↔ EPIC-10 dependency cycle resolved by relocating auditLog() helper to EPIC-01 (foundation layer); both epics now run in parallel after EPIC-01. Master plan at docs/stories/epics/MASTER.md: - Full catalog of 13 epics with dependency graph (Mermaid) - Recommended execution order in 8 phases (Foundation → Auth → Core Operations → Differentiators → Compliance → Operational → Admin → Hardening) - Architecture contracts snapshot per epic completion - Instructions for human runner: clear chat → /epic-executor → reference epic file by path Canonical template at docs/stories/epics/TEMPLATE.md establishes story shape that all 13 epics follow. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.5 KiB
title, version, status, date, owner
| title | version | status | date | owner |
|---|---|---|---|---|
| Specs Reconciliation Log | 1.1 | ativo | 2026-04-28 | Rafael Melgaço |
Specs Reconciliation Log
Registro canônico das reconciliações entre Specs/Epics quando conflitos são detectados durante consolidation passes. Decisões aqui sobrescrevem texto em arquivos individuais que conflite — texto antigo permanece pra histórico mas as edições foram aplicadas in-place.
R-01 — Nomenclatura de canal Realtime: plural
Conflito: Spec 04 §4.2 usava useChannelSession com canal nomeado org-{orgId}-channel-session (singular). Spec 09 §6 padronizou plural alinhado ao nome da tabela.
Decisão canônica: canal é channel-sessions-{orgId} (plural).
Aplicação: Spec 04 §4.2 atualizado in-place.
R-02 — Error code canônico para "sem credencial válida"
Conflito: Spec 01 §7.5 catalogou auth_required (401). Specs informais usaram unauthenticated.
Decisão canônica: auth_required é o único error code aceito pra HTTP 401. unauthenticated é proibido como código.
Aplicação: Spec 01 §7.5 — nota canônica adicionada.
R-03 — Error codes ausentes em Spec 01 §7.5
Conflito: Specs 02, 04 e 09 referenciavam codes que não estavam no catálogo canônico.
Decisão canônica: 6 novos error codes adicionados a Spec 01 §7.5: conversation_already_claimed, pipeline_immutable_use_clone, lost_reason_required, lost_reason_invalid, phone_must_be_e164, merge_irreversible.
Aplicação: Spec 01 §7.5 — tabela ampliada.
R-04 — OCC com expected_updated_at em mutations de leads
Conflito: Spec 02 sugeriu OCC via If-Unmodified-Since ou body expected_updated_at. Pergunta: a coluna existe e é confiável?
Decisão canônica: CONFIRMADO. crm_leads.updated_at existe via migration 0003 com trigger fn_set_updated_at. Pode ser usada como token OCC. Em conflito, retorna 409 com error code concurrent_update.
Aplicação: sem mudança em código/spec — comportamento já correto.
R-05 — connectNuvemshop como Server Action
Conflito: Spec 06 §4.2 documentou OAuth start como rota REST. Spec 09 ADR-02 prescreveu Server Actions.
Decisão canônica: Server Action connectNuvemshop() é o caminho default da UI. A rota REST permanece como fallback legacy.
Aplicação: Spec 06 §4.2 atualizado + Spec 09 §11 listou Server Actions catalog.
R-06 — Ciclo de dependência EPIC-09 ↔ EPIC-10
Conflito: Durante o consolidation pass dos epics (2026-04-28), EPIC-09 (Team) e EPIC-10 (Audit + Settings) declararam um o outro como depends_on, criando ciclo:
- EPIC-09 declarava
depends_on: [EPIC-00, EPIC-01, EPIC-10]justificando que precisava do helperauditLog() - EPIC-10 declarava
depends_on: [EPIC-01, EPIC-09](sem justificativa estrutural — viewer de audit log não depende de Team)
Causa raiz: o helper auditLog() é um utilitário de baixo nível (INSERT em api_audit_log). Não é uma capacidade de Settings — é uma camada de foundation que vários epics consomem.
Decisão canônica: helper auditLog() (SQL + TS wrapper) é exposto pelo EPIC-01 Auth & App Shell (faz sentido — é onde a infra de auth + audit fica wired) e fica disponível pra todos a partir daí.
Aplicação:
- ✅ EPIC-09 —
depends_on: [EPIC-00, EPIC-01](removeu EPIC-10) - ✅ EPIC-10 —
depends_on: [EPIC-00, EPIC-01](removeu EPIC-09) - 🔁 EPIC-01 deve expor
lib/audit/auditLog.tscomo utilitário (cobrir em uma das suas 12 stories — provavelmente na S-01.06 ao desenharuseAuth+ audit context, ou story dedicada se necessário)
Justificativa: quebra o ciclo, mantém topological order, permite EPIC-09 e EPIC-10 rodarem em paralelo após EPIC-01.
Política pra próximas reconciliações
- Conflitos detectados durante implementação devem ser logados aqui com IDs sequenciais (R-07, R-08, ...)
- Decisões canônicas sobrescrevem texto em arquivos individuais — edição in-place + nota cruzada
- Wave de implementação que tocar uma área conflitada deve ler este log antes de codar
- Reconciliações que mudam contratos públicos versionam o changelog em
CHANGELOG.md
Próximas reconciliações esperadas (a verificar)
- Naming de hooks (
useFoovsuseFooQueryvsuseFooMutation) — ADR a registrar - Convenção de slug pra rotas dinâmicas (
[id]vs[fooId]) — registrar quando primeira tela for implementada - Política de cache TanStack Query (
staleTime,gcTime) por tipo de recurso