Pular para o conteúdo

Roadmap — apêndice de épicos (E*)

Status: corrigir · Escopo: Inventário histórico de épicos — não é o guia diário · Atualizado em: 2026-08-04

[!IMPORTANT] Guia diário de prioridade: focus.md (agora / próximo / depois). Escopo de produto: DIRECTION.md.

Este arquivo é apêndice: notação E# / E#.T#, útil pra arqueologia e status pontual. Vários itens estão desalinhados com o shipped atual — corrigir ao tocar, não usar como fila.

MarcaSignificado
Escopo da task entregue — código + testes (ou harness) ponta a ponta
✅ parcialCaminho feliz wired; falta borda, prod multi-tenant, persistência ou hardening
(vazio)Não iniciado ou só schema/spec
Pendência explícita na sequência
N/A v1Decisão consciente de não fazer na v1
riscadoCancelada ou absorvida por outra task

Tabelas E0–E4 e E28 usam coluna Status. Demais épicos prefixam a Descrição com a mesma marca (ex.: ✅ parcial | …).

Docs de apoio vivos:


O roadmap não termina quando “funciona no harness”. Ele termina quando o produto passa por estes gates:

GateCritérioPor quê importa
G0 — Qualidade basepnpm quality verde; contratos gerados sem drift; worker e LLM typecheck verdesSem gate verde, qualquer tuning vira areia movediça
G1 — Isolamento tenantRLS fail-closed + runInTenantScope real + teste cross-tenant negativoCross-tenant leak mata produto enterprise
G2 — Exactly-once práticoProva por testes de crash/retry inbound e outbound; nenhuma duplicata silenciosaMensagem duplicada ou sumida destrói confiança
G3 — Conversa consultivaGolden/replay cobre greeting, informação, objeção, deferral, concorrente, reengage, handoffO produto ganha no detalhe da conversa, não no “tem IA”
G4 — Tuning rápidoToda regressão vira fixture/replay; bot score melhora sem depender só de chat manualResolve o gargalo atual de otimizar comportamento
G5 — Dados de outcometreatment_snapshot + outcome_signals + propensity auditáveis por SQLMoat de dados só existe com causalidade
G6 — Produção multi-tenantMeta credentials por endpoint, opt-out/consent por canal, dashboards operacionaisBase para clientes reais e expansão

PProgramaEntrega 10/10Épicos
P0Deploy produção (tactflow.io)Worker no domínio real, secrets, seed demo, Stripe webhook — ver production-deploy-v1.mdE34
P0Distribuição / trilha GDesign partners pagantes, case com número de conversão, pricing validado — ver docs/archive/gtm-execution-v1.mdG0–G5 (comercial)
P0Gate verde e isolamentoTypecheck/testes verdes, tenant scope fail-closed, repo guards auditadosE0, E16, E21
P0Exactly-onceInbound/outbound com crash-window testado e fallback explícitoE3.T7, E10.T8
P1Conversation Quality LabReplay de conversas reais, golden cases, LLM judge calibrado, taxonomia de regressõesE18, E20
P1Orchestrator sustentávelQuebrar god functions em fases; ports claros; menos remendos regexE6, E10, E29
P1Memória/RAG útilIngest cliente real, recall confiável, promoção profile, claims groundedE13, E14
P2Learning loopExperimentos com propensity, OPE, canary e policy patches allowlistedE19
P2Pesquisa aplicada profundaRAG/memória/harness, prompt engineering e ciência comportamental viram protótipos/evalsE30
P2Produto comercialAdmin, copilot workspace, multicanal/outbound, dogfooding como caseE22–E27

Regras de execução:

  • Não promover prompt por gosto. Mudança comportamental precisa virar fixture, replay ou outcome.
  • Regex é triagem, não semântica. Regex pode detectar mecânica local (pontuação, idempotência, PII), mas não deve decidir intenção comercial complexa quando há contrato/LLM/eval melhor.
  • Locale copy não entra hardcoded no core. PT-BR de exemplo vive em fixtures, policy, RAG ou eval; runtime deve ser language-agnostic quando possível.
  • Guard não reescreve voz. Guard bloqueia segurança/policy mecânica; voz e estilo são generate/eval.
  • Toda divergência blueprint ↔ código entra em blueprint-code-alignment.md.

Execução paralela atual — modelo forte vs Composer

Seção intitulada “Execução paralela atual — modelo forte vs Composer”

Use esta divisão para manter velocidade sem transformar decisões de produto em refactor mecânico.

FaixaDono recomendadoPróximas entregasCritério de pronto
Quality review UXComposer 2.5Ajustes no pnpm quality:review, navegação, resumo, docs, testesquality:review --help, quality:reviews:summary, eval:quality-lab verdes
Fixture/golden expansionComposer 2.5Minerar reviews, exportar fixtures, atualizar IDs/seed, ampliar casos multilínguesNenhum skippedCaseIds; expected sem P-ASSUME-CANDIDATE/L-LOCALE
Quality insightsModelo forteTransformar quality-reviews.jsonl em diagnóstico: causa raiz, camada provável, hipótese mínimaDiagnóstico antes de editar; 1 causa raiz por batch; evals definidos
Replay realModelo forteeval:replay --conversation <id> com reconstrução de contexto e comparação before/afterSem LLM live por padrão; diff auditável; promove só com evidência
Judge/rubricaModelo forteLLM judge calibrado contra reviews humanosViés medido; judge não bloqueia deploy sem calibração
Mudança comportamentalModelo forte → ComposerModelo forte define hipótese/policy; Composer implementa patch pequeno/testáveleval:quality-lab + golden/replay relevante verdes
Hardening mecânicoComposer 2.5SQL dashboards, docs, anti-hardcode scan, refactors localizadosSem mudança ampla de tese; typecheck/testes verdes

Regra prática: se a tarefa decide como o bot deve se comportar, começa com modelo forte. Se a tarefa aplica uma decisão já escrita, Composer executa.


flowchart LR
F[Fase 0<br/>Fundação + walking skeleton] --> C[Fase 1<br/>Core runtime v1]
C --> Q[Fase 1<br/>Qualidade/segurança v1]
Q --> O[Fase 2<br/>Optimization + simulação v1.1+]
O --> FUT[Fase 3<br/>Copilot/outbound/booking — futuro]

Walking skeleton primeiro: uma fatia fina inbound→ack→fila→persistência→outbound trivial→entrega, ponta a ponta, antes de qualquer inteligência. Tudo depois pendura nesse esqueleto.


Fase 0 — Fundação + walking skeleton (v1, caminho crítico)

Seção intitulada “Fase 0 — Fundação + walking skeleton (v1, caminho crítico)”
TaskStatusDescriçãoDepsRef
E0.T1Monorepo: apps/api-worker (TS/Workers) + apps/llm-service (Python/FastAPI) + packages/contracts + packages/test-fixtures§4.4, §20
E0.T2Tooling + quality gates: Astral (uv, Ruff, ty), Biome, Vitest/pytest, dependency-cruiser, import-linter, pre-commit — ver docs/live/engineering/coding-standards.mdE0.T1§6.2
E0.T3Wrangler config (Workers, Queues, DO, R2 bindings); .dev.vars.exampleE0.T1§4.1, §6
E0.T4Cliente Neon + camada de acesso a dados (storage/client, repos observability TS, writer llm_calls Python)E0.T1§6
E0.T5Contratos: Pydantic → OpenAPI → TS (pnpm contracts:gen); FastAPI /v1/*; LlmGateway HTTP adapterE0.T1§4.4, §14

E1. Schema & harness de validação (anti-regressão)

Seção intitulada “E1. Schema & harness de validação (anti-regressão)”
TaskStatusDescriçãoDepsRef
E1.T1Migrations versionadas a partir do data-model-v1.md (schema/migrations)E0.T4§DataModel
E1.T2seed.sql + canonical_queries.sql + invariants.sqlE1.T1§10b
E1.T3ensure_monthly_partitions + schema/jobs/ensure-partitions.sql; GHA mensal (.github/workflows/ensure-partitions.yml)E1.T1§C6, §10b
E1.T4CI: branch Neon efêmera (parent production) ou DATABASE_URL dev → harness → derrubaE1.T2proc §4b
E1.T5uuid_generate_v7 + extensões (pgcrypto,vector) em 0001_extensions.sqlE1.T1§0
TaskStatusDescriçãoDepsRef
E2.T1Webhook inbound: ack rápido (202) + enfileira payload normalizadoE0.T3§4.6, §8
E2.T2Consumer de fila: persiste messages + idempotência + observabilityE2.T1, E1.T1§8
E2.T3ConversationRuntimeDO — serialização /turn + alarm stubE2.T2§7
E2.T4Outbound trivial (echo) via outbox + mark sentE2.T2§9
E2.T5Writers de observabilidade (timeline_events,runtime_logs) no fluxoE2.T2§5.10, §6.4

Gate Fase 0: mensagem real entra, persiste, é coordenada pelo DO e sai — com trace. A partir daqui, cada componente é incremento.


TaskStatusDescriçãoDepsRef
E3.T1Verificação de assinatura/secret do webhook (Meta) + GET hub.challengeE2.T1§5.1
E3.T2Normalização → contrato unificado de mensagem (Meta WABA + compat dev stub)E2.T1§5.1
E3.T3Idempotência inbound: consumer tryClaim + webhook hasInboundKey skip re-enqueueE1.T1§4.7, §10b
E3.T4Captura seletiva payload raw → R2 + índice channel_payloadsE2.T2§6.5
E3.T5✅ parcialNormalização mídia + media_ref (Graph download quando META_ACCESS_TOKEN; senão media_id)E3.T2§4.13, §5.1
E3.T6Reply-to inbound: message.context.idmessages.reply_to_external_id + quoted_message no packE3.T2§14, schema-decisions 8.2
E3.T7✅ parcialInbound idempotency: claimed→processed, duplicate terminal, recovery when message persisted but turn not processed; inbound outbox still futureE3.T3§4.7, reliability-exactly-once.md
E3.T8Meta credentials por channel_endpoints (multi-WABA)E3.T1§4.9
TaskStatusDescriçãoDepsRef
E4.T1Resolver endpoint do negócio por phone_number_id → tenant+unitE3.T2§4.9, §5.2
E4.T2Resolver/crear channel_identitiescontacts (escopo tenant)E4.T1§5.2
E4.T3Get-or-create conversations (tenant+unit+endpoint+contact)E4.T2§5.2, §5.3
TaskDescriçãoDepsRef
E5.T1Máquina de estados runtime_state (transições no DO + fallback worker)E2.T3
E5.T2Burst handling: coletar, debounce, selar (message_bursts)E5.T1
E5.T3Working memory (DO/Redis) N/A v1 — working layer = Postgres + Context Pack; DO só burst/timer/engagementE5.T1§16.2
E5.T4pacing_state sync com eventos runtimeE5.T1
E5.T5Interrupção multi-burst: inbound em decision_pending/response_scheduled/respondinginterruptedE5.T2
E5.T6Runtime FSM: responding + interruptedcollecting_burst (P0 unicorn)E5.T5
E5.T7Transições pacing ghost (response_sent, awaiting_reply, cooldown/dormant)E5.T4
TaskDescriçãoDepsRef
E6.T1✅ parcialContrato de decisão (input/output §14)E5.T2
E6.T2✅ parcialLLM propõe response_delay_ms; Worker clamp + interrupt; ver pacing-planner.mdE6.T1
E6.T3Fragmentação + verbosidade → response_plans + response_fragments (conteúdo no send)E6.T1
E6.T4Gate memory_commit + timeline committed/skippedE6.T1
E6.T5Confidence gate → escalated + handoff_pendingE6.T1, E12
E6.T6delivery_mode + window_state_at_decision (janela 24h)E6.T1, E8
E6.T7✅ parcialSteering + style envelope (policy + lead inference; persist E13 pendente)E6.T1, E7.T3
TaskDescriçãoDepsRef
E7.T1✅ parcialpolicy_profiles tenant default + override por unit → merge no orchestratorE1.T1
E7.T2Disclosure level (none / brand_assistant / explicit_ai) → ContextPack.disclosure_level + generate promptE7.T1
E7.T3✅ parcialEnvelope de comunicação (rules.communication) → style_hints + pacing rulesE7.T1
E7.T4rules.escalation.enabled (opt-in, default off) + confidence_threshold → confidence gate / objectiveE7.T1, E12.T3
TaskDescriçãoDepsRef
E8.T1Derivação de window_state por messaging_window_expires_at (inbound + decision snapshot)E4.T3
E8.T2message_templates — espelho de status da Meta + categoriasE1.T1§4.10
E8.T3Messaging tier / rate por channel_endpoints aplicado no outboxE10.T1§4.10
TaskDescriçãoDepsRef
E9.T1✅ parcialpipeline_stage_* no Context Pack via workflow_instances + fallback tenant defaultE1.T1
E9.T2workflow_instances: criar no get-or-create + backfill lazy — docs/archive/implementation-e13-t7-e9-t2.md § E9.T2E9.T1, E4.T3
E9.T3evaluateStageTransition pós-understand; advanceToStage + timeline workflow_stage_advanced / workflow_stage_handoffE9.T2
E9.T4handoff_context_exported timeline + outcome_signals.handoff on escalationE9.T3

E10. Actions Layer + resiliência outbound (§5.8, §4.7)

Seção intitulada “E10. Actions Layer + resiliência outbound (§5.8, §4.7)”
TaskDescriçãoDepsRef
E10.T1✅ parcialDO alarm + outbox + Meta outbound (dev stub); fila outbound-send ✅ (E10.T9); Meta live multi-tenant pendenteE2.T4
E10.T2Retries + backoff exponencial + DLQ (dead) no send alarm; resume parcial por fragmentoE10.T1
E10.T3Rich/interactive (botões, listas)E10.T1§5.8
E10.T4✅ parcialTemplate send fora da janela 24h (execute-template-send, dev_stub; Meta live multi-tenant pendente)E10.T1, E8.T2
E10.T5Ação operacional: agendamento (intenção) + link de pagamento (Pix)E10.T1§5.8
E10.T6Follow-up/reengage via DO Alarm + generate; followup_schedule wired (seed + mode from policy) — spec reengagement-objections-v1.mdE2.T3, E8.T1
E10.T7Outbound reply-to: citar mensagem do usuário (context.message_id Meta)E10.T1, E3.T6schema-decisions 8.2
E10.T8✅ parcialOutbound exactly-once: claimSending + provider_trace_id + resume skip + ambiguous sending fail-closed (dead)E10.T1
E10.T9Fila outbound-send consumer — DO enfileira, worker executa LLM/send + /outbound-send-completeE10.T8
TaskDescriçãoDepsRef
E11.T1Agente Pydantic AI em /understand (output_type=UnderstandingResult); fallback heurístico sem OPENROUTER_API_KEYE0.T5
E11.T2✅ parcialContext pack: working + episodic (episodic_summary, structured arrays) + profile (profile_facts)E11.T1, E13
E11.T3✅ parcial/generate no send com fragments[] + agent/stub; typing por bloco no texto geradoE11.T1, E10.T1
E11.T4Variantes de resposta (variant_id)E11.T3§17.4
E11.T5Audit llm_calls (modelo, tokens, custo, latência, prompt_ref) em understand/generate/guardE11.T1
E11.T6✅ parcialHumanização explícita no prompt /generate via style_hintsE11.T3, E6.T7
TaskDescriçãoDepsRef
E12.T1/v1/guard antes do send (LLM ou local); guard_blocked timelineE11.T3
E12.T2Defesa inbound prompt injection (wrap + timeline)E11.T1
E12.T3confidence_evaluated timeline + threshold → escala/handoffE11.T3
TaskDescriçãoDepsRef
E13.T1Episodic: conversation_summaries (append/version)E1.T1§16.2
E13.T2✅ parcialLeitura contact_profile_facts.communication.* no orchestratorE1.T1
E13.T3✅ parcialConsumer memory.extract pós-memory_commit — structured (E13.T3b) + LLM /v1/memory/extract + persist episodic/profileE6.T4, E11.T1
E13.T3b✅ parcialIdentificador estruturado → upsertFact sem LLME13.T3
E13.T4Promoção episodic→profile por confidence thresholdE13.T3§16.1
E13.T5Timeline memory_committed / memory_commit_skipped no orchestratorE13.T3
E13.T6✅ parcialEpisódico estruturado no Context Pack (episodic_key_events, episodic_objections, episodic_intents)E13.T3
E13.T7✅ parcialRecall reativo (memory.recall): janelas SQL + /v1/memory/recall-windowrecall_evidence no pack — ver docs/archive/implementation-e13-t7-e9-t2.md § E13.T7E13.T3, E11.T2
TaskDescriçãoDepsRef
E14.T1✅ parcialIngestão single URI + batch sitemap/urls + HTML→texto + timelineE1.T1
E14.T2✅ parcial/v1/embed (OpenRouter ou stub determinístico) + seed com embedding harnessE14.T1, E11.T1
E14.T3✅ parcialRetrieval HNSW (cosine) com pré-filtro tenant/unit + fallback keyword ILIKEE14.T2
E14.T4✅ parcialgrounded_on persistido no plano + guard local bloqueia hard claims sem chunksE14.T3, E6.T1
E14.T5✅ parcialReindex incremental: source_version bump + purge chunks < versionE14.T2

Prioridade ↑ (2026-06): E15.T1 deixa de ser “futuro” — lead BR manda áudio o tempo todo; sem transcrição, qualquer deploy WhatsApp BR real é capenga (docs/archive/path-to-valuation.md §brechas item 2). Pré-requisito prático do primeiro design partner BR (trilha G1).

TaskDescriçãoDepsRef
E15.T1Transcrição de áudio → messages.transcript (Whisper/Deepgram via gateway LLM) — gate de deploy BRE3.T5, E11.T1§4.13
E15.T2Visão de imagem/documento → descriçãoE3.T5, E11.T1§4.13
TaskDescriçãoDepsRef
E16.T1Repositórios por entidade (escopo tenant/unit — C9)E1.T1§5.9, §C9
E16.T2Retenção Hot/Warm/Cold (Neon drop partition + R2 lifecycle) — gate escala, não Ato 1; ver payload-retention.mdE1.T3§6.6
E16.T3Tracing correlacionado (trace_id) ponta a pontaE2.T5§6.4
E16.T4Queries operacionais Postgres-first (dashboards via SQL)E16.T1§6.4
TaskDescriçãoDepsRef
E17.T1Consent management (consent_events, scope tenant/unit)E1.T1§4.11
E17.T2Enforcement de opt-out (bloqueia envio/reengage; consent_events)E17.T1, E10.T6
E17.T3Erasure: anonimização in-place (PII null + erased_at)E16.T1§4.11, §10b
E17.T4Cripto de PII (envelope encryption)E0.T3§4.11
E17.T5Profundidade healthcare em camadas (decisão): a tese é dominar a operação inteira da vertical (switching cost), entrando por camadas — comercial (agora) → relacionamento → gestão operacional → clínica/prontuário (camada 4, gate explícito). Camada 4 só com: vertical 1 vencida (G5), caixa p/ compliance (LGPD art. 11, cripto E17.T4, BAA/HIPAA em dental/healthcare US) e demanda registrada na trilha G. Dado de saúde citado em conversa já é sensível → E17.T1/T4 sobem de prioridade ao entrar clínica BR séria — ver docs/archive/master-strategy-v1.md §6strategy §6
TaskDescriçãoDepsRef
E18.T1✅ parcialGolden eval-cases.json + worker suite + eval_runs repo + pnpm eval:golden:record; LLM judge FU via py:evalE11.T1
E18.T2✅ parcialoutcome_signals writer (user_replied) + join plan↔outcome; exploration/propensity em response_plans (delay) — ver analytics-optimization.mdE10.T1
E18.T2bprompt_version no plano pós-generateE18.T2
E18.T3✅ parcialReplay offline de decisão/policy (replay-policy-decision, fixtures policy-replay-cases.json, adapter timeline_events → input, pnpm eval:replay:record)E18.T1
E18.T4✅ parcialpnpm eval:conversation <id> — triagem heurística por plano (DB); replay com reexecução LLM pendenteE18.T3, E16.T4
E18.T5✅ parcialTaxonomia Q-*/P-*/F-*/G-*/L-LOCALE em heurísticas + fixtures âncora; eval:quality-fixtures:audit; persistência em eval_runs parcialE18.T1
E18.T6LLM judge calibrado para objective_fulfillment, maieutic_quality, anti_pitch, mobile_ergonomics, grounding, policy_compliance, naturalnessE18.T1, E18.T4§5.14
E18.T7✅ parcialÂncoras reais exportadas (conversation-anchor-cases.json, eval:conversation:export-anchor) — 019e8709019e8879E18.T4
E18.T8✅ parcialpnpm eval:mine-regressions — SQL (F-DROP, G-REGEN, LLM error/fallback, fragmento longo) + heurísticas no sampleE18.T2, E16.T4
E18.T8a✅ parcialpnpm quality:review — revisão humana TUI com score 1–5, labels, root cause guess e fixture export opcionalE18.T5, E18.T8
E18.T8b✅ parcialpnpm quality:insights — agrupar quality-reviews.jsonl, separar falso positivo/needs improvement/fixture e sugerir 1 causa raiz prioritária (diagnóstico, sem editar código)E18.T8a, E18.T11
E18.T9eval:compare --before --after com diff de respostas, scores e rationale; usado antes de promover prompt/policyE18.T4, E18.T6§5.14
E18.T10Anti-hardcode suite: falha se regra de negócio depender de frase PT-BR fixa no core sem fixture/eval correspondenteE18.T5coding-standards.md
E18.T11Dashboard Postgres-first de qualidade: regressões por tipo, fallback/model errors, guard revisions, opt-out pós-reengage, custo por turnoE18.T8, E16.T4§6.4

Motivo E18: hoje o tuning do bot depende demais de inspeção manual (pnpm chat). E18 transforma todo bug conversacional em fixture/replay, reduzindo o ciclo de melhoria e evitando regressões por prompt.

Definition of done E18 10/10:

  • Todo bug percebido em conversa real tem conversation_id, classificação e replay.
  • Golden/replay roda em CI sem chamar LLM live por padrão.
  • LLM judge é calibrado contra amostra humana antes de bloquear deploy.
  • Nenhum prompt/policy amplo é promovido sem diff antes/depois.
  • Conversas âncora reais não regrediram.

Gate Fase 1 (v1): todas as features ✅ do escopo §3 entregues, com captura de aprendizado (§17.3) ligada desde o dia 1.

Gate runtime produto (validação consultiva — sem UI)

Seção intitulada “Gate runtime produto (validação consultiva — sem UI)”

Motor técnico ✅ — inbound→orchestrator→LLM→outbound roda em dev (pnpm chat, Neon, stub/live parcial). Produto consultivo 🟡 — falta confiança em objeção, concorrente e regressão (E18). E28 CLI entregue cedo para dogfood; o gate abaixo mede confiança de conversa, não existência do pipeline.

CapacidadeStatusO que falta (se 🟡/⏳)Épico(s)
Contexto rico no turno🟡Episodic append maduro (E13.T1/T4); recall já no packE13.T6–T7, E13.T1
Funil com intençãoAdmin/regras por cliente (E27 futuro)E9.T2–T4
Triagem / qualificação🟡Sinais wired; falta golden + tuning de stage/objectiveE9, E6, E11, E18
Playbooks de objeção🟡playbookObjectiveExtension wired; falta cobertura OBJ-* / deferral evalE6, E18, reengagement-objections-v1.md
Concorrente / comparação🟡RAG + guard wired; falta ingest cliente real + eval “não inventar”E14.T1–T4, E18
Reengage proativofollowup_schedule + alarm + generateE10.T6, E7
Policy → promptTenant/unit merge, objectives, disclosure, escalação opt-inE7, client-config-surface.md
Qualidade / regressão🟡Golden suite ✅ + replay policy offline ✅; falta expandir LLM judge OBJ/COMP + replay de conversas reais completasE18.T1–T3
Dev ergonomiapnpm chat + --debug (generate_objective completo)E28

Próximo foco: E18 (golden + replay) + E14 ingest real → fechar gate 🟡→✅. Exactly-once final (E3.T7/E10.T8) e tenant guard repos (E21) em paralelo para prod multi-tenant.


Gate: Ato 2+ / volume WhatsApp async com exploration ligada. Ato 1 (single-turn web) usa eval offline + SQL de conversão — payload-retention.md.

TaskDescriçãoDepsRef
E19.T1Feature mart SQL: (contexto, treatment, outcome) canônico por response_plan_idE18.T2, E16.T4§17 (L2)
E19.T2Export de eventos/features (Parquet/warehouse)E19.T1§17 (L2)
E19.T3Modelos de sobrevivência para timing e follow-up (reply_latency_ms, dormancy, reengage)E19.T1§17.4
E19.T4Uplift / efeito causal dos nudges e fragmentação (fragment_count, verbosity, reengage mode)E19.T1§17.4
E19.T5OPE (IPS/SNIPS/DR) antes de qualquer patch automático em policyE19.T4analytics-optimization.md
E19.T6Canary 1–5% por tenant/unit com guardrails (opt_out, complaint, delivery_error, cost`)E19.T5§17
E19.T7Patch allowlisted em policy_profiles.rules com rollback automáticoE19.T6parameter-registry.ts
E19.T8Relatório semanal: quais parâmetros melhoraram outcome real vs proxy judgeE19.T7§17

Motivo E19: sem loop causal fechado, “AI que aprende” é narrativa. E19 transforma instrumentação em vantagem composta.

Definition of done E19 10/10:

  • Cada treatment otimizável tem exploration, propensity, contexto e outcome.
  • Nenhuma mudança automática é promovida só por LLM judge.
  • Todo patch tem OPE, canary, guardrails e rollback.
  • O produto consegue responder: “qual política converte melhor, para qual contexto, com qual confiança?”
TaskDescriçãoDepsRef
E20.T1simulation_personas — liga de personas (action_space, p_ghost)E1.T1§17.5
E20.T2Runner: persona-LLM ⇄ contrato de inbound (environment)E20.T1, E2.T1§17.5
E20.T3Não-contaminação: filtros production + dedicação de custoE20.T2§10b C10
E20.T4Calibração sim-to-real (distribuição de outcomes)E20.T2, E19.T1§17.5
E20.T5Export branch→prod (postgres_fdw, só agregados)E20.T2§17.5, Q32
E20.T6Persona adversarial suite: confuso, apressado, preço, objeção trust, concorrente, opt-out, ghostE20.T2, E18.T5conversation-quality-lab.md
E20.T7Simulação de regressão por conversa âncora: persona tenta reproduzir falhas reais já vistasE20.T6, E18.T7§17.5
E20.T8Score sim-to-real: distância entre distribuição simulada e tráfego real por intent/outcomeE20.T4, E19.T1§17.5

Motivo E20: simulação acelera exploração e stress test, mas não substitui tráfego real. Usar para achar bugs antes, não para declarar PMF.

TaskDescriçãoDepsRef
E21.T1✅ parcialRLS Postgres + FORCE RLS + runInTenantScope wired (inbound/outbound/DO/knowledge ingest)E16.T1
E21.T1a✅ Tenant RLS predicate fail-closed: app.tenant_id unset não permite tenant row; seed/harness setam tenant explícitoE21.T1Q17
E21.T1brunInTenantScope escopa queries/batches com set_config na mesma transaçãoE21.T1aQ17
E21.T1c✅ parcialTeste integração valida predicate fail-closed e scoped client A≠B; row visibility A≠B ainda depende de role sem BYPASSRLSE21.T1a
E21.T1d✅ parcialRepo tenant guard audit: guards explícitos em conversation, messages, summaries, pacing, response plans, outcomes, bursts e stage context; role sem BYPASSRLS ainda pendenteE16.T1, E21.T1c
E21.T2Logfire / OTel SaaS (telemetria de IA)E11.T5Q13
E21.T3Grafana (datasource Postgres)E16.T4Q12
E21.T4Gate verde obrigatório: worker typecheck, LLM ty, tests e boundaries sem erro antes de qualquer tuning de promptE0.T2coding-standards.md
E21.T5LLM degradation policy: stub/fallback gera timeline/alert e nunca degrada silenciosamente em prodE11.T3, E11.T5audit P1
E21.T6HTTP LLM gateway com retry/backoff/circuit breaker para falha transitória, preservando idempotênciaE11.T1, E16.T3§4.7
E21.T7✅ parcialRuntime observability single pane: pnpm conversation:trace <id> junta thread, plans/findings, timeline, llm_calls e deliveries; outcome ainda pendenteE16.T4, E18.T11

Motivo E21: é a fronteira entre “demo séria” e produto multi-tenant confiável.

Definition of done E21 10/10:

  • Typecheck e testes verdes na branch principal.
  • Cross-tenant leak impossível por teste e por RLS.
  • Degradação LLM é visível e acionável.
  • Operador consegue diagnosticar uma conversa ruim sem abrir 5 tabelas manualmente.

Deferido de propósito — REPL no terminal para simular lead (WhatsApp dev stub), ver bolhas outbound, timeline e debug de policy. Não é produto nem substitui E20 (simulação em escala). Não inclui UI de vendedor (E22).

TaskStatusDescriçãoDepsRef
E28.T1pnpm chat: loop REPL → POST /webhooks/whatsapp (contrato dev harness) → poll messages outboundE2dev ergonomics
E28.T2Modo --fast: hint BURST_DEBOUNCE_MS reduzido (iteração local)E28.T1, E7
E28.T3Modo --debug: timeline, steering_mode, generate_objective completo, prompt_versionE28.T1, E16.T3observability
E28.T4✅ parcialDoc: client-config-surface.md § chat + README quick startE28.T1README / engineering

Nota E28: CLI entregue para dogfood local; gate runtime produto ainda 🟡 até E18 + RAG cliente validarem objeção/concorrente.


Reduzir complexidade acumulada sem refatorar por estética. O alvo é tornar o runtime mais fácil de testar, explicar e evoluir sem quebrar conversa real.

TaskDescriçãoDepsRef
E29.T1Quebrar run-post-burst-orchestration.ts em fases explícitas: bootstrap, understand, memory/recall, policy, decision, stage/handoff, plan persistE18.T3, E21.T4coding-standards.md
E29.T2Quebrar execute-scheduled-send.ts em phases: generate, guard/polish, delivery, reconcile, scoreE10.T8, E21.T4§4.7
E29.T3Afinar ConversationRuntimeDO: wiring/alarm apenas; lógica de domínio em application servicesE5, E10.T9§7
E29.T4Ports explícitos para cross-context em application/; reduzir imports diretos entre contextsE29.T1boundaries
E29.T5Auditoria anti-regex/hardcode: mover exemplos PT-BR para fixtures/policy/eval quando forem regra de negócioE18.T10conversation-quality-lab.md
E29.T6Slice tests por fase do orchestrator, reduzindo dependência de um teste monolítico com dezenas de mocksE29.T1§10
E29.T7ADRs curtos para divergências aceitas: LLM propõe timing, guard auto-fix, NativeOutput Qwen, tenant scopeE21, E18blueprint-code-alignment.md

Motivo E29: os três hotspots (run-post-burst-orchestration.ts, execute-scheduled-send.ts, conversation-runtime-do.ts) concentram valor, mas também risco de manutenção. Fatiar por fases reduz regressão e acelera tuning.

Definition of done E29 10/10:

  • Cada fase crítica tem função/serviço nomeado, input/output testável e timeline clara.
  • Teste de regressão conversa não precisa mockar o mundo inteiro.
  • Regex/locale hardcode restante tem justificativa, fixture e owner.

E30. Pesquisa aplicada — memória, prompt e comportamento humano

Seção intitulada “E30. Pesquisa aplicada — memória, prompt e comportamento humano”

Esteira contínua para estudar profundamente técnicas novas e antigas que podem tornar a Tactflow uma máquina superior de conversa, memória, consulta e persuasão ética.

Documento-base: applied-research-agenda.md.

TaskDescriçãoDepsRef
E30.T1Survey RAG/memória/harness contemporâneo: RAT, Self-RAG, CRAG, HyDE, RAG-Fusion, RAPTOR, GraphRAG, LongRAG, MemGPT, eval harnessesE18, E13, E14applied-research-agenda.md
E30.T2Survey prompt engineering/orquestração: instruction hierarchy, structured output, ReAct, Tree/Graph of Thoughts, DSPy, prompt compression, model routingE11, E18idem
E30.T3Survey comportamento humano/persuasão: maiêutica, SPIN, Challenger, Cialdini, Voss, MI, Fogg, JTBD, Kahneman/Tversky, DBT validationE18, E6idem
E30.T4Prototipar 2 técnicas de consulta/memória em replay real antes de adotarE18.T4, E14idem
E30.T5Prototipar prompt optimization por eval e comparar contra prompt manualE18.T6, E18.T9idem
E30.T6Red-team de persuasão ética: detectar pressão indevida, urgência falsa, manipulação e over-personalizationE18.T5, E12idem
E30.T7Revisão trimestral research → roadmap: adotar, rejeitar, adiar ou transformar em policy/evalE30.T1–T6idem

Motivo E30: o moat de longo prazo não vem de uma regra de prompt; vem de estudar continuamente memória, raciocínio, linguagem e comportamento humano melhor que concorrentes.

Definition of done E30 10/10:

  • Toda técnica pesquisada tem memo, decisão e critério de adoção.
  • Nenhum paper entra no runtime sem protótipo + eval.
  • Playbooks humanos têm limite ético explícito e teste red-team.
  • O research backlog alimenta E13/E14/E18/E19, não vira biblioteca morta.

E27. Backoffice / admin do cliente (antecipação parcial — gap de ops)

Seção intitulada “E27. Backoffice / admin do cliente (antecipação parcial — gap de ops)”

Auditoria 2026-06-15: o maior gap de operação não é conversa, é não haver superfície para o dono do negócio. Hoje config vive em seed-demo-tenant.mjs + config/tenants/*.json + DB, e observabilidade é CLI do time (report:conversion, conversation:trace). E27 é épico de Fase 3 (painel de rede), mas um subconjunto mínimo é Ato 1 — operado por nós no primeiro design partner, self-serve depois. Ver docs/archive/master-strategy-v1.md §5 item 4.

TaskDescriçãoDepsRef
E27.T1Backoffice mínimogap não mapeado em task, auditoria 2026-06-15: CRUD de service_offerings, business_hours, config.requireDeposit + feed de conversas e de agendamentos/pagamentos (substitui editar via seed/DB)E16.T1, E31.T1strategy §5
E27.T2Auth/RBAC de tenantgap não mapeado: login + sessão + escopo por negócio (hoje só API-key de plataforma; assignees.user_id é “auth futuro”)E21.T1§4.9
E27.T3Dashboard do cliente: conversão (lead→depósito) e saúde do bot visíveis ao dono (hoje só pnpm report:conversion no terminal; reusa E18.T11)E16.T4, E18.T11§6.4

Motivo E27 (antecipação): sem T1/T2 cada design partner depende de nós editando JSON/SQL — não escala além de “operado à mão”. É a ponte de “vendável operado por nós” → “self-serve” da auditoria.


E31. Loop de receita — hardening transacional (book → depósito → confirma)

Seção intitulada “E31. Loop de receita — hardening transacional (book → depósito → confirma)”

O V5 Walking Skeleton (docs/live/product/v5-walking-skeleton-runbook.md) provou o loop qualificar → check_availabilitybook_appointmentgenerate_checkoutpaid_confirmed ponta a ponta, mas só no canal web (/book/:slug/chat) e com mecânicas centrais ainda stub. Este épico fecha o que a tese competitiva vende como diferencial e hoje não está enforced. Ver §8 de docs/archive/competitive-matrix-v1.md.

TaskStatusDescriçãoDepsRef
E31.T1✅ parcialTrava de no-show: releaseExpiredHolds (held vencido → cancelled + cancel_reason) chamado on-read antes de check_availability/book_appointment; listBookedInRange ignora holds vencidos → slot volta a ser ofertado e re-bookável. Pendente: varredura agendada (cron) p/ holds nunca reconsultados, marcar payment expired, contabilizar no_showE2, billingrunbook §loop
E31.T2Encadeamento determinístico book→checkout: estado pending_payment + auto-injeção de appointment_id no generate_checkout em vez de depender do LLM chamar dentro do budget de 3 açõesE31.T1web-turn.ts, dispatch.ts
E31.T3Depósito explícito no prompt: rotular o valor como depósito (não preço) e tornar a regra “agendamento só finaliza após pagamento” inequívoca no agent_turn_rules.pyE31.T2agent_turn.py
E31.T4✅ parcialLembrete/expiração visível ao lead: mensagem “seu horário segura até HH:MM” + follow-up in-page 10 min antes do reaper (web widget); follow-up proativo fora da sessão web pendenteE31.T1§followup
E31.T5Loop transacional no WhatsApp (gate BR, P0 — auditoria 2026-06-15): reusar check_availability/book_appointment/generate_checkout (já existem no path web) no caminho WhatsApp/orchestrator; hoje o WhatsApp só qualifica (booking_ready vira só outcome, não agenda). Alinhar thesis-brazil.md WhatsApp-firstE31.T2, E6, E15.T1thesis-brazil
E31.T6Eval/golden do loop: hold expira e libera, double-book bloqueado, checkout reemitido — booking-loop-cases.json + booking-loop-golden.test.tsE31.T1, E18§quality
E31.T7Depósito/checkout opcional por tenant/unit (config.requireDeposit, default true): quando false, generate_checkout não é ofertado, book_appointment confirma na hora (sem hold/expiração, reaper-safe), objetivo e regras do LLM (build_agent_turn_rules) removem o passo de depósitoE31.T1, E31.T2client-config-surface
E31.T8Confirmação de pagamento BR (Asaas webhook)gap não mapeado, auditoria 2026-06-15: POST /webhooks/asaas idempotente → confirma appointment + paid_confirmed, espelhando o caminho Stripe (handle-checkout-completed.ts). Hoje create-asaas-checkout.ts cria a cobrança PIX mas nunca confirma (webhook ausente do router.ts)E31.T2competitive-matrix §8
E31.T9Take rate / pilar payments (3b) — preservar opção barata (docs/archive/master-strategy-v1.md §4, docs/archive/pricing-packaging-v1.md §5): coluna fee_bps/application_fee_cents (nullable) na próxima migration que tocar payments + Stripe Connect application_fee_amount. Não ativar agora; só não fechar a portaE31.T2strategy §4

Motivo E31: a tese de valor (“agenda + cobra de verdade, anti no-show”) só é defensável se a trava existir de fato — hoje o hold de 30 min é metadado decorativo (HOLD_MINUTES escrito, nunca liberado). Depósito é table-stakes nos PMS verticais; o diferencial é a execução transacional confiável acoplada à qualificação consultiva.

Definition of done E31 10/10:

  • Slot held sem pagamento é liberado automaticamente e some da disponibilidade.
  • book_appointment bem-sucedido sempre leva a um checkout (determinístico), sem depender de sorte do modelo.
  • No-show e expiração de pagamento são estados reais, auditáveis por SQL e por eval.
  • O mesmo loop roda em ≥1 canal além do web demo, ou há decisão consciente registrada de não fazer.

E32. Canal web instalável + agenda externa (gates de venda US)

Seção intitulada “E32. Canal web instalável + agenda externa (gates de venda US)”

Os dois bloqueadores de adoção do mercado US (docs/archive/master-strategy-v1.md §5): o produto US é um widget que o dono cola no site (embed.js ✅ parcial), e clínica real não migra a agenda — a Tactflow precisa sincronizar com a agenda que já existe. Ambos alimentam diretamente a trilha G (demo G0, objeção recorrente G1).

Decisão produto (2026-06-14): um runtime, perfis de conversa distintos — ver docs/archive/product-today.md §Perfis de conversa. Web wedge = transacional (self_serve) ou concierge leve (concierge); WhatsApp = consultivo (orchestrator); landing_chat = superfície futura (E32.T8).

TaskDescriçãoDepsRef
E32.T1✅ parcialembed.js instalável: <script src=".../embed.js" data-slug> → balão + iframe /book/:slug/widget; tema via config.theme no widget. Smoke: pnpm smoke:booking (+ --harness); snippet GTM em docs/archive/gtm-execution-v1.mdE31.T2
E32.T2✅ parcialUI rica no widget: offered_slots → botões clicáveis; checkout Stripe em modal; reschedule unificado chat+widget; FAQ via grounded_snippets. Pendente (auditoria 2026-06-15): copy do checkout modal ainda hardcoded em inglês → localizar en/pt/esE32.T1
E32.T3✅ parcialGoogle Calendar sync (read+write): OAuth, freebusy, create/delete on hold expiry; pendente hardening com OAuth de clínica real em piloto + UX self-serve de conexão (clínica conecta sozinha; hoje OAuth é rota interna com API-key)E31.T1
E32.T4Webhook/iCal fallback para agendas não-Google (Outlook, iCal feed)E32.T3
E32.T5Adapters de PMS vertical (Mangomint/Boulevard/iClinic) — avaliar por demanda da trilha G, não especularE32.T3, G1matriz §2.1
E32.T6✅ parcialVanity paths: public_site_routes (route_key legível + aliases); resolver unificado; slug legado backward compatE32.T1
E32.T7Custom domain (book.cliente.com): public_hostnames, routing por Host, SSL — gate Ato 3 / WLE32.T6public-routes-v1.md · matriz §8
E32.T8landing_chat profile (backlog): superfície /landing/:slug ou rota dedicada com mais persuasão que self_serve, menos peso que orchestrator WhatsApp; só se G1 registrar abandono pré-pickerE32.T2, E14docs/archive/product-today.md
E32.T9Onboarding Demo Effect (spawn:demo chain)gap de eng não mapeado, auditoria 2026-06-15: site do prospect → fetch + Readability/Firecrawl (reusa E14) → LLM structured extract (serviços/preços/horários) → seed-demo-tenant/book/:slug em minutos. Braço de engenharia de docs/archive/gtm-execution-v1.md G0.T1bE14.T1, E31.T7gtm G0.T1b
E32.T10Booking E2E (Playwright)gap não mapeado, auditoria 2026-06-15: fluxo real no widget book→hold→checkout→paid_confirmed + restore de picker, rodando em CI antes da demo G0 (hoje só pnpm smoke:booking)E32.T2, E31.T6scorecard wedge
E32.T11Encerramento pós-booking — confirmação → “mais alguma dúvida?” → Q&A via LLM (sem tools) → end_conversation / timeout → runtime_state=closed + rotação de session_id + fade no widget e /book/:slug. Hub “meus agendamentos / reagendar” fica backlog futuroE31.T7, E32.T2
E32.T12⚠️ parcial“Continuar como X” / resume profile — profile phone-only; lead stage unlock no widget; edge cases multi-tab pendentesE32.T2
E32.T13Restore UI pós-reload/history re-hidrata offered_slots, checkout modal state, contact form (não só transcript)E32.T2, E32.T10web-booking-wedge.md §Gaps

Motivo E32: sem T1 não há produto instalável para vender nos EUA; sem T3 a objeção “minha agenda já vive no Google/PMS” mata a venda. São gates comerciais, não features.

Definition of done E32 10/10:

  • Dono de clínica instala o widget em < 5 min num site WordPress/Webflow sem suporte.
  • Booking via bot aparece na agenda Google da clínica em segundos; slot ocupado no Google some da disponibilidade do bot.
  • Demo G0.T1 usa o widget real, não a hosted page.
  • URLs públicas: slug técnico estável; vanity path (T6) antes de exigir custom domain (T7).

E33. Voz inbound US — Vapi adapter (home services wedge)

Seção intitulada “E33. Voz inbound US — Vapi adapter (home services wedge)”

Decisão revisada (2026-06-17): voz continua sendo hero product US (docs/archive/competitive-matrix-v1.md §1), mas não construímos STT/TTS/telephony DIY no Ato 1. Usamos Vapi como adapter; moat permanece no Worker (dispatchAction, booking, Neon). Home services exige voz antes de med spa fechar 100% do chat — ver docs/archive/voice-architecture-v1.md.

Gate: chat happy path documentado (E32.T10–T13 backlog explícito) ou proposta HS vendendo só voz + SMS owner.

TaskDescriçãoDepsRef
E33.T0✅ parcialVapi webhook (POST /webhooks/vapi): assistant-request + tool-callscheck_availability / book_appointment; tenant via config.voice.vapiPhoneNumberId; owner SMS Twilio pós-bookE31.T7, E32.T2
E33.T0.1Qualificação estruturadarecord_service_intake + profile facts → owner SMS (urgency, address, summary); tool VapiE33.T0
E33.T0.2Owner SMS no path com depósito (pós-Stripe) + helper compartilhado + intake no web chatE33.T0.1
E33.T0.3Piloto manual: número Vapi real + smoke scriptE33.T0.1
E33.T1Piloto E2E: 1 número Vapi + 10 ligações instrumentadas + owner SMS + case gravadoE33.T0.3G1 design partner HS
E33.T2Provisionamento de número — API Vapi/Twilio; 1 número/tenant; area code; registro em channel_endpoints; runbook onboarding (forward vs substituir site)E33.T1matriz §3
E33.T3Port-in número existente do cliente + cláusula contratual (número nosso até port-out)E33.T2
E33.T4(deferido) Twilio/Telnyx inbound DIY → STT streaming → agent turn → TTS — só se Vapi limitar latência/custo em escalaE33.T1legado E33
E33.T5Latência alvo < 1.5s por turno (preset Vapi + respostas curtas + barge-in)E33.T0
E33.T6Rebilling voz — fair use min/mo + overage retail (docs/archive/pricing-packaging-v1.md)E33.T1, G3§1b

E34. Deploy produção — tactflow.io (gate antes de G0 comercial)

Seção intitulada “E34. Deploy produção — tactflow.io (gate antes de G0 comercial)”

O produto não é ofertável com link *.workers.dev nem site antigo de agência no apex. Runbook: production-deploy-v1.md.

TaskDescriçãoDepsRef
E34.T1Remover site antigo (Pages) + rotas tactflow.io / www → Workerwrangler routes
E34.T2PUBLIC_BASE_URL, secrets prod, seed glow-medspa, smokeE34.T1seed + smoke
E34.T3Stripe webhook + redirect URLs em tactflow.ioE34.T2billing

Definition of done: prospect abre https://tactflow.io/book/glow-medspa, agenda, paga depósito test mode.


ÉpicoDescriçãoRef
E22Copilot UI / workspace do vendedor§2.4
E23Sugestões em tempo real + copilot de negociação§2.4
E24Booking completo (bookings,resources,offerings)§11 v1.1+
E25Outbound / outreach (cadências, SMS, email) — tese globalthesis-global
E26Canais adicionais (Instagram, webchat, voz)§5.1
E27Painel admin de rede/unidades — subconjunto mínimo (T1/T2/T3) antecipado para Ato 1, ver seção E27§3
E28CLI de conversa local (dev) — dogfood; gate produto consultivo ainda 🟡§dev tooling
E29Code health & arquitetura sustentável — reduzir hotspots e hardcodes§20
E30Pesquisa aplicada profunda — memória, prompt, harness e comportamento humanoresearch
E31Loop de receita — hardening transacional (trava no-show, book→checkout determinístico, loop multicanal)runbook V5 / matriz §8
E32Canal web instalável (embed.js) + sync agenda externa (Google Calendar/PMS) — gates de venda US, prioridade de Ato 1strategy §5 / matriz §8
E33 ✅Voz inbound US — Vapi adapter + gestão de números (HS wedge); DIY Twilio deferido (E33.T4). Shipped: atende, intake, disponibilidade, agenda, remarca (supersede). Cancelar não existe (nem tool, nem ação) — ver voice-runtime-map.md §3. Mapa técnico: voice-runtime-map.mddocs/archive/voice-architecture-v1.md
E34 ✅ parcialDeploy produção — no ar em workers.dev; chat.tactflow.io (DNS + [[routes]]) adiado. Secrets de voz ok, TWILIO_* pendentes (A2P). — Worker + DNS + secrets + Stripe webhook + runbook executávelproduction-deploy-v1.md
E35 ✅Follow-up pós-intake de voz (30 min) — lead de voz qualificado que não agendou recebe follow-up contextual; o fosso vs GHLrevenue-recovery-cycle.md
E36 ✅Confirmação + lembrete de agendamento (T-24h/T-1h, quiet-hours, consentimento TCPA). ⚠️ construído mas não entrega: TWILIO_* ausente em produção (bloqueado em A2P 10DLC)revenue-recovery-cycle.md
E37 ⏳Review request pós-job automático (social proof → leads orgânicos)revenue-recovery-cycle.md
E38 ⏳Integração field-service software (ServiceTitan/Jobber) — lock-in permanente. Hoje só Google Calendar existerevenue-recovery-cycle.md
E39 ⏳Follow-up pós-orçamento não respondido (cadência 24h/3d/7d)revenue-recovery-cycle.md
E40 ⏳Text-back de chamada perdida — ligação não atendida/abandonada → SMS imediato. Hoje end-of-call-report não é tratado em handle-vapi-webhook.ts. É o coração do “never lose a lead”DIRECTION.md §3
E41 ⏳SMS inbound (Twilio) — fundação existe (normalize-twilio-inbound, twilio-signature, sms-opt-out) mas não há rota /webhooks/twilio. Destrava remarcar por textoDIRECTION.md §3
E42 ⏳Value report — relatório de valor pro dono (chamadas atendidas, bookings, $ estimado recuperado). Conservador, evidence-linked, rotulado como estimativa. Primeiros clientes: concierge, não maquinárioDIRECTION.md §3

Esteira de prontidão para produção (auditoria 2026-05)

Seção intitulada “Esteira de prontidão para produção (auditoria 2026-05)”

Due diligence técnica: docs/archive/unicorn-readiness-audit.md · personalização: customization-model.md · exactly-once design: reliability-exactly-once.md

PrioridadeTaskStatus
P0E5.T6 — interrupt em responding
P0E3.T7 — inbound idempotency ordering✅ parcial
P0E10.T8 — outbound exactly-once✅ parcial
P1E9.T1 — stage no Context Pack✅ parcial
P1E13.T6 — episodic structured no pack✅ parcial
P1E7.T4 — escalation opt-in + confidence threshold from policy
P1E10.T9 — outbound queue consumer
P1E21.T1 — RLS Postgres✅ parcial
P2E5.T7 — pacing ghost states
P2E13.T7 — recall reativo✅ parcial

Sequência sugerida (atualizada 2026-06): E5.T6E3.T7/E10.T8 parcialE7.T4E13.T7E9.T2–T4E10.T6E10.T9E14 parcialE28 CLIE18 review/insights (quality:reviewquality:insights) → E18 replay/judge (eval:replay, judge calibrado) → E14 (ingest cliente + eval concorrente) → E13.T1/T4gate runtime produto ✅ → E21/E3/E10 hardening prod.

Trilha de venda em paralelo (atualizada 2026-06-17): E34 deploy tactflow.io → E31 ✅ → E32.T1–T2 ✅ parcial → chat hardening backlog explícito (E32.T11–T13)E33.T0 Vapi (HS)G0 comercial → E32.T9 (spawn:demo) → E32.T3 piloto real → gate BR (E31.T5/T8). Ver docs/archive/voice-architecture-v1.md.

Ciclo de recuperação de receita (atualizado 2026-07-02): o fosso competitivo vs GHL/agências. Não é “atende ligações” (commodity) — é o loop completo de recuperação de lead. E35 ✅ e E36 ✅ construídos (E36 aguarda A2P para entregar). Próximos: E40 text-back de chamada perdidaE41 SMS inboundE42 value report → E37 (review) → E39 (orçamento) → E38 (lock-in). Escopo e fila: DIRECTION.md §3. Ver revenue-recovery-cycle.md.


Scorecard produto (2026-06-14) — ⚠️ DESATUALIZADO

Seção intitulada “Scorecard produto (2026-06-14) — ⚠️ DESATUALIZADO”

⚠️ Snapshot de 2026-06-14, pré-pivô de voz. Trata “wedge web booking” como o wedge (hoje é voz) e não reflete E33/E35/E36. Mantido só pela nota honesta de 0 clientes pagantes, que segue verdadeira. Estado atual: DIRECTION.md §1–§2.

Snapshot honesto para alinhar engenharia vs comercial. Narrativa: docs/archive/product-today.md.

ÁreaNotaGap principal
Arquitetura / runtime8/10Exactly-once enterprise, RLS prod, E18 judge
Wedge web booking (E32)7/10E2E Playwright, restore de picker, multi-lead browser
Convencimento web5/10self_serve + FAQ ok; landing_chat (E32.T8) não existe
Comercial / G02/100 clientes pagantes; G0.T2–T5 não iniciados
Saída Ato 1 (20+ logos, US$ 15k MRR)3/10Receita e case — não demo técnica

Regra anti-dispersão (reforço): retorno marginal imediato está em G0, não em polish do wedge. E32.T8 e backlog browser multi-lead só entram com evidência de G1.


Mapeamento auditoria de produto US/BR (2026-06-15)

Seção intitulada “Mapeamento auditoria de produto US/BR (2026-06-15)”

Rastreabilidade dos gaps da auditoria de prontidão (US web wedge vs BR WhatsApp) para o roadmap. Regra aplicada: reusar task existente; criar nova só quando o gap não estava mapeado. “novo” = task criada nesta passagem.

Gap (auditoria)MercadoMapeado emSituação
No-show enforcement (cron sweep, payment expired, no_show)US/BRE31.T1já mapeado (pendência descrita na task)
Encadeamento determinístico book→checkoutUSE31.T2✅ entregue
Loop transacional no WhatsAppBRE31.T5já mapeado; reescopado como gate BR P0
Confirmação de pagamento BR (Asaas webhook)BRE31.T8 (novo)não estava mapeado → criado
Take rate / Connect application_feeUS/BRE31.T9 (novo) + pricing §5parcial (preservar coluna, não ativar)
Transcrição de áudio inboundBRE15.T1já mapeado (gate de deploy BR)
Multi-tenant Meta credentials (multi-WABA)BRE3.T8 / E10.T1já mapeado, não iniciado
WhatsApp interativo (botões/listas, card PIX)BRE10.T3 / E10.T5já mapeado
Outbound reply-to no WhatsAppBRE10.T7já mapeado
Google Calendar self-serve (clínica conecta sozinha)USE32.T3parcial; nota self-serve adicionada
Checkout modal localizado (en/pt/es)USE32.T2nota adicionada à task
Booking E2E (Playwright) em CIUSE32.T10 (novo)não estava mapeado → criado
Onboarding Demo Effect (spawn:demo chain)US/BRE32.T9 (novo) + gtm G0.T1bbraço de eng não estava em task → criado
Backoffice mínimo do clienteUS/BRE27.T1 (novo)épico existia só como linha futura → task criada
Auth/RBAC de tenantUS/BRE27.T2 (novo)não estava mapeado → criado
Dashboard de conversão/qualidade p/ clienteUS/BRE27.T3 (novo) / E18.T11parcial (CLI existe, falta superfície)
Cancelamento iniciado pelo lead + política/feeUS/BRE24 (futuro)mapeado como futuro; não puxar p/ Ato 1

Leitura: dos 17 gaps, 9 já estavam mapeados (só ajustei escopo/notas), 6 viraram task nova (E31.T8/T9, E32.T9/T10, E27.T1/T2) e 2 ficaram como parcial/futuro consciente. O motor (runtime, RLS, exactly-once, loop web) está construído; o que falta é distribuição + operação + paridade transacional no WhatsApp.


flowchart LR
E0[E0 scaffold] --> E1[E1 schema+harness] --> E2[E2 walking skeleton]
E2 --> E3[E3 gateway] --> E4[E4 identity] --> E5[E5 state+burst]
E5 --> E6[E6 orchestrator] --> E11[E11 prompting]
E6 --> E10[E10 actions/outbox]
E11 --> E13[E13 memory] & E14[E14 grounding] & E12[E12 guardrails]

Orchestrator (E6) + Prompting (E11) são o coração. Tudo de qualidade (E12/E13/E14/E18) pendura neles. E10 (outbox) e E3/E4/E5 são pré-requisito de qualquer resposta real.


Componente / princípioÉpico(s)
5.1 Channel GatewayE3
5.2 Identity/ContactE4
5.3 Conversation StateE5
5.4 Orchestrator ⭐E6
5.5 Policy EngineE7
5.6 Workflow RuntimeE9
5.7 Prompting LayerE11
5.8 Actions LayerE10
5.9 PersistenceE16
5.10 ObservabilityE16
5.11 Memory LayerE13
5.12 Knowledge/GroundingE14
5.13 Safety/GuardrailsE12
5.14 Quality/EvalE18
4.6 Aceitar rápidoE2, E3
4.7 Resiliência (filas/outbox)E10
4.9 Tenant/unitsE4, E7
4.10 Channel-awareE8
4.11 Privacy/LGPDE17
4.12 GroundingE14
4.13 MultimodalE15
4.14 Safety/confidenceE12
4.15 Quality loopE18
16 Memória (4 camadas)E5 (working), E13 (episodic/profile/recall), E7 (policy)
17 Analytics/optimizationE19
17.4 Parâmetros de controleE6 (captura), E19 (otimização)
17.5 SimulaçãoE20
Pesquisa aplicada (memória/prompt/comportamento)E30
Dev CLI conversa (pós-produto runtime)E28
Validação executável (proc §4b)E1

Cobertura 100%: todo macrocomponente (5.1–5.14) e princípio acionável (4.6–4.15, §16, §17) tem ≥1 épico. Itens ❌ do escopo §3 estão na Fase 3 (futuro), conscientemente fora do v1.