Pular para o conteúdo principal

Auditoria: fluxo.yml × código (v3, ADR 0085)

Sessão de auditoria isolada — só leitura. Cruza docs/fluxo.yml (o modelo-alvo declarado pelo ADR 0085) com o código real, para responder duas perguntas: o que falta para o código honrar tudo que o fluxo declara como active, e o que está genuinamente escadeado atrás de cada gatilho da tabela de ativação do modelo-de-time.md. Nenhuma linha de código de produção foi alterada nesta sessão; nenhum dos três documentos-modelo (fluxo.yml, gates.yml, agent-areas.ts) foi editado — cada divergência encontrada entre eles é tratada como achado, não como licença para corrigir de passagem.

Doutrina do ADR 0085: papel proposto declara quem o absorve hoje e o critério objetivo de separação — o organograma-alvo é sequência de ativação, nunca aspiração. Esta auditoria não antecipa nenhum papel proposto/planned; onde encontrou algo além do que deveria existir, está marcado explicitamente como achado.

Como ler este documento​

  • Seção A — Divergências. O fluxo declara X, o código (ou o gates.yml irmão) faz Y. É conflito entre fontes e exige decisão do dono do produto — nenhuma foi corrigida aqui.
  • Seção B — Lacunas de papéis ativos. Trabalho declarado (nunca "proposto") sobre papéis que já operam hoje — implementável já, sem esperar gatilho nenhum.
  • Seção C — Escadeado por gatilho. O que cada gatilho da tabela de ativação destravaria, com estimativa de escopo, e se ele já disparou.
  • Seção D — Plano de ondas. Proposta de sequenciamento, ordenada do gate mais barato de verificar por script para o mais caro (o que exige ADR e decisão de produto).

A. Divergências​

#SeveridadeItemEvidência
A1Críticagate_saida: paralelismo-autorizado do dev-lead — docs/fluxo.yml (papel dev-lead) declara status: ativo; docs/gates.yml:239-248 declara status: planned, com o comentário "FASE 14d — entra active quando ela fechar". A FASE 14d fechou em 2026-08-07 (mesmo dia da FASE 15, que criou o gates.yml) e o mecanismo está ativo, testado e em produção desde então — gates.yml nunca foi atualizado depois.Mecanismo real: apps/api/src/application/use-cases/execution/request-parallelization.use-case.ts:35-78 (acima do teto, cria proposed_action tipo parallelize); trava contra auto-aprovação em apps/api/src/domain/actions/decide.ts:266-276 (parallelize/raise_max_parallel nunca saem de require_approval); testes: apps/api/test/application/use-cases/execution/request-parallelization.use-case.spec.ts:97, apps/api/test/domain/actions/decide.spec.ts:273-303. O próprio docs/fluxo.yml já registra esse gate como ativo — a divergência é gates.yml × (fluxo.yml + código), não fluxo.yml × código.
A2AltaSaída plano-de-paralelismo do dev-lead, declarada via: proposed_action (RN-083/154). O que o código produz é o evento simples execution.plan_proposed (apps/engine/lib/engine/agents/dev_lead_tools.ex:14-18,60-77), sem pipeline de aprovação — decisão deliberada, documentada no próprio comentário do código ("transformar a proposta em ação a decidir faria o usuário decidir duas vezes"). O proposed_action tipo parallelize que de fato existe (mesma peça do A1) é disparado por ação do usuário na UI pedindo reforço acima do teto (apps/web/src/routes/ProjectOverviewTab.tsx:361 → POST /sessions/:sessionId/execution/parallelize), não pela saída inicial do plano do dev-lead. fluxo.yml funde dois mecanismos distintos numa única saída.apps/engine/lib/engine/agents/dev_lead_tools.ex:14-18,60-77; apps/web/src/routes/ProjectOverviewTab.tsx:361; apps/engine/lib/engine_web/router.ex:57.
A3MédiaMáquina de estados do dev — fluxo.yml:134 declara 4 estados (working|awaiting_gate|idle|idle_tripped); o código real tem 5: acrescenta :awaiting_approval (Fase 12e, ADR 0052), estado persistido com transições próprias, não transitório.apps/engine/lib/engine/dev/dev_agent_server.ex:17-18,300-333,622-654.
A4BaixaCitação de RN-160 anexada à entrada backlog-promovido (origem po) do Arquiteto. A RN-160 real trata do gate "Confirmar arquitetura pronta" do lado de saída (Arquiteto → Dev Lead), não da entrada PO → Arquiteto.docs/business-rules.md:5606-5622 vs. docs/fluxo.yml (papel arquiteto, entradas).
A5BaixaCitação de RN-161 anexada à saída handoff-duplo do Arquiteto. A RN-161 real (ADR 0069) trata do passo seguinte — aceitar o handoff pro Dev Lead encadeia a ativação de execução —, não do duplo handoff em si.docs/business-rules.md:5624-5644 vs. docs/fluxo.yml (papel arquiteto, saídas).
A6BaixaO gate "Confirmar arquitetura pronta" (RN-160, ≥1 história promovida) só é garantido no cliente (SessionPage.tsx, hasPromotedStory); o backend (OfferInfraHandoffUseCase) não revalida. Uma chamada direta à rota interna, sem passar pela UI, ignoraria a regra. Não é uma divergência declarada em fluxo.yml — é achado adicional da auditoria.apps/api/src/application/use-cases/agents/offer-infra-handoff.use-case.ts:19-38.
A7InformativaO artefato de saída do Criativo é artifact.product_brief no código, não literalmente necessidade-de-negocio — é o mesmo conceito com nome de evento diferente; imprecisão terminológica, não estrutural.apps/engine/lib/engine/agents/criativo_server.ex:396-420.
A8BaixaEntrada worktree-por-agente do dev rotulada "origem: harness"; WorktreeManager vive em Engine.Dev, não é um dos 4 componentes listados para o papel harness (PromptAssembler, ToolLoop, ContextManager, Hooks, fluxo.yml:244).apps/engine/lib/engine/dev/worktree_manager.ex:19-49 vs. docs/fluxo.yml (papel harness, componentes).
A9Nuance (não-divergência)Saída pr-remota do dev declara destino simultâneo [area-qa, secops]; o mecanismo real é sequencial e ordenado por máquina de estados — QA sempre antes de SecOps, nunca em paralelo. Não chega a contradizer o fluxo.yml (os dois são de fato destinos finais), mas pode induzir leitura de fan-out simultâneo.apps/api/src/domain/execution/pr-gate-state-machine.ts:21-30.

Achado do sub-agente descartado por verificação. Uma exploração inicial apontou o rótulo achado_aberto: AE (fluxo.yml:158, papel area-qa) como "referência órfã". Verificação: é referência real e documentada — docs/explanation/achados-execucao-real.md:618 (### AE. O agente de QA tenta consertar o código que julga (P2)) e docs/explanation/backlog.md:40. Sem divergência aqui; registrado para não repetir a busca.


B. Lacunas de papéis ativos (trabalho implementável já)​

Todos os itens abaixo estão sobre papéis com status: active — nenhum depende de um papel proposto/planned existir primeiro.

#LacunaOnde no modeloO que falta, concretamente
B1Delegação Dev Lead → dev (ADR 0053 item 5)fluxo.yml, saída delegacao do dev-lead, status: lacunaConfirmado ausente: dev_lead_server.ex só registra DevLeadTools.spec() (apps/engine/lib/engine/agents/dev_lead_server.ex:75); a tabela delegations já aceita area: text genérico (apps/api/src/db/schema.ts:1051-1091), mas os únicos chamadores de RecordDelegationUseCase são qa_lead_server.ex e infra_lead_server.ex — nenhum com area = 'dev'. O padrão a copiar já existe duas vezes (QA e Infra); falta reproduzi-lo no Dev Lead.
B2Gate necessidade-validada (Criativo → PO)modelo-de-time.md, "Estado da malha" — "gate novo = ADR"Não existe em gates.yml, nem em código. modelo-de-time.md já lista uma proposta em aberto ("Anti-padrão do Criativo como validação real do gate") — falta a decisão do critério objetivo, o ADR e o registro em gates.yml (pode nascer warn, como implementavel/operavel).
B3Gate implementavel (gate_futuro do dev-lead)docs/gates.yml:250-259, status: planned, dono dev-leadO dev-lead já é papel ativo; o gate não depende de qa-estrategia/appsec existirem — é o contrário: é a CRIAÇÃO deste gate que os ativa (ver C1). Falta o critério de "implementável" (ex.: história com critério de aceite mínimo, sem dependência bloqueante) e o registro em gates.yml.
B4Métricas de produto → POfluxo.yml, entrada metricas-de-produto do po, status: lacuna; saída_alvo do analytics (proposto)po_server.ex não tem nenhuma ferramenta de métricas de produto (apps/engine/lib/engine/agents/po_server.ex:86-99). modelo-de-time.md:21-25 já registra o princípio: "analytics nasce como saída nova do medicao antes de ser papel" — ou seja, isto NÃO precisa esperar o papel analytics separar; é uma extensão do medicao (já ativo, com sumGroupedBy em produção) que, ao existir, é o próprio ato de cruzar o gatilho "métricas de produto viram entrada do PO" (ver C2).
B5docs/gates.yml desatualizado (mesmo achado A1)—Corrigir status: planned → active para paralelismo-autorizado, com evidência event_log/proposed_action.created filtrado por actionType: parallelize, onde: request-parallelization.use-case.ts. É correção de metadado, verificável instantaneamente por pnpm --filter api validacao:gates — o script já teria evidência real para citar.
B6RN-160 sem revalidação no backend (achado A6)—Hardening opcional: OfferInfraHandoffUseCase passa a exigir ≥1 história promovida antes de emitir o handoff duplo, hoje só a UI barra o botão.
B7Relatório DORA via medicaofluxo.yml, papel delivery-metricas (proposto, status: — (nunca) na tabela de gatilhos — "vira RELATÓRIO do medicao, nunca agente")Como o papel nunca vira agente, este item não está atrás de gatilho nenhum — é trabalho disponível hoje sobre o medicao já ativo: lead time, deployment frequency, MTTR e change failure rate extraídos do event log + gates.yml, no mesmo padrão de medir:execucao/sumGroupedBy.

C. Escadeado por gatilho​

Tabela de ativação (modelo-de-time.md:52-62), cada linha com o estado real verificado nesta auditoria.

GatilhoPapéis que ativaDisparou?Escopo estimado, se cruzado
Gate implementavel criadoqa-estrategia + appsec — "segundo momento" dos agentes existentes (qa-lead/secops ganham modo "design", sem agente novo)Não. implementavel segue planned, sem nenhuma rota/caso de uso consumindo-o (busca exaustiva: zero ocorrências fora de gates.yml)M. Depende de B3 fechar primeiro. Depois: dev-lead invoca qa-lead/secops num modo "design" (plano-de-teste, threat-model) antes de propor paralelismo — reusa os agentes, sem tabela nova nem worker novo.
Métricas de produto viram entrada obrigatória do POanalytics separa do medicaoNão — mas o trabalho de cruzá-lo é B4, já ao alcance hojeP/M para produzir a métrica (B4); a separação do papel analytics em si fica atrás de outro critério subjetivo ("quando virar entrada obrigatória", ainda proposta em aberto no modelo-de-time.md) — decisão de produto, não escopo técnico adicional.
DEPLOY_ENABLED flipaplatform ativa → depois secops-runtimeNão. Nenhuma leitura real de DEPLOY_ENABLED em código de aplicação — só menções em comentários/docs; tag-release.yml documenta explicitamente que não há job de deploy escondidoG. Programa próprio: ambiente de deploy real, GitHub Environments, pipeline verde consumido por platform, SLO/dashboard/runbook — e só depois secops-runtime (detecção com tráfego real). Maior item do backlog do fluxo.
Anamnese sai do refinamentoGatilho do staff volta a ter donoNão — e foi na direção contrária. ANAMNESE_ENABLED=false desde 2026-08-10, decisão explícita do usuário ("hoje ele não está trazendo dados de muito valor", RN-115, docs/business-rules.md:4597-4655)A pendência "autor-da-proposta-de-teto (RN-086)" citada em fluxo.yml:263 está implementada e testada em código (ProposeMaxParallelUseCase, ator hardcoded anamnese; apps/engine/lib/engine/workers/anamnese_worker.ex:270-286; testes em anamnese_worker_test.exs:387-411) — só dormente por flag. Não é lacuna de engenharia; é decisão de produto pausada, aguardando o "refinamento futuro do que a Anamnese deriva" (docs/explanation/backlog.md:349).
Projeto gerenciado com UI própriaux-designer separa do CriativoNão. Busca por artefato de protótipo/design entregue a projeto-cliente (fora de design_handoff_brabo/, que é do próprio Brabo): zero ocorrênciasG. Depende da aba Code ganhar capacidade de EDIÇÃO/design de UI — hoje é declaradamente só-leitura (FASE 26).
Volume real de dadosdbre separa de Dev Lead/PlatformNão. Nenhuma métrica de carga/volume de produção real referenciada em códigoG. Depende de operação em produção real com escala, fora do controle do time hoje.
— (nunca)delivery-metricas vira relatório, não agenteN/A por desenhoVer B7 — o relatório em si não espera gatilho.

D. Plano de ondas proposto​

Ordenado do gate mais barato de verificar por script (metadado puro, sem lógica nova) para o mais caro (exige ADR e decisão de produto). Cada onda é uma sessão futura com um entregável único — nenhuma foi iniciada nesta sessão.

OndaEntregável únicoItensCustoVerificação
1fluxo.yml/gates.yml em diaA1/B5 (status do gate paralelismo-autorizado), A3–A5, A8 (citações de RN e máquina de estados do dev corrigidas)Ppnpm docs:check verde; pnpm --filter api validacao:gates citando evidência real para paralelismo-autorizado
2Dev Lead delega ao dev; arquitetura pronta se prova no backendB1 (ferramenta de delegação privada no dev-lead, mesmo padrão de qa_lead_server.ex/infra_lead_server.ex), B6 (RN-160 revalidada em OfferInfraHandoffUseCase)MTeste que prova delegations gravado com area='dev'; teste que a rota interna recusa handoff duplo sem história promovida
3medicao fala de produtoB7 (relatório DORA), B4 (métricas-de-produto como entrada do PO — cruza o gatilho C2)MScript extrai as 4 métricas DORA de fixture conhecida; teste que o PO lê metricas-de-produto quando presente
4O gate implementavel nasceB3 (critério de "implementável" no dev-lead, registro em gates.yml — pode nascer warn)M, com ADRADR aceito; validacao:gates cobrindo a evidência nova
5QA e SecOps ganham o segundo momentoC1 (qa-lead/secops em modo "design": plano-de-teste, threat-model) — depende da Onda 4 fechadaMTeste que o dev-lead recebe plano-de-teste e threat-model antes de propor paralelismo
6Gate necessidade-validadaB2 (critério objetivo de validação de necessidade, ADR, registro em gates.yml)M, com ADR e decisão préviaADR aceito; validacao:gates cobrindo a evidência nova

Fora de onda (backlog registrado, sem estimativa de sessão — dependem de decisão de escala/infra real ou de o dono do produto religar algo, não de engenharia agendável): DEPLOY_ENABLED/platform/secops-runtime (C3, G, programa próprio), reativação de Anamnese/gatilho do staff (C4, decisão do usuário), ux-designer (C5, depende da aba Code ganhar edição — congelada como só-leitura pela FASE 26), dbre (C6, depende de volume real de dados em produção).


Nota de infraestrutura de documentação (fora do escopo desta auditoria)​

docs/explanation/modelo-de-time.md existe e está completo, mas não está listado em website/sidebars.ts — só é alcançável por link direto, não pelo menu do site. Não é um achado de fluxo.yml × código; é uma lacuna de publicação pré-existente, sinalizada aqui para não se perder, sem correção nesta sessão (fora do escopo declarado: "nenhuma mudança de código").


Resumo​

  • 9 divergências (A1–A9): 1 crítica (gate mal marcado planned num documento que já opera active), 1 alta (mecanismo de aprovação do plano de paralelismo não bate com o declarado), 2 médias, 4 baixas, 1 informativa, 1 nuance sem contradição real.
  • 7 lacunas de papéis ativos (B1–B7), todas implementáveis sem esperar gatilho.
  • 7 gatilhos da tabela de ativação, nenhum disparado — um deles (Anamnese) andou na direção contrária desde a última leitura do fluxo.yml.
  • Zero achados de código antecipando papel proposto/planned — as lacunas declaradas estão genuinamente vazias em todos os papéis auditados.