Documentação em português · deck 0.1.0

deck

Um plano de controle para agentes de codificação que trabalham em vários repositórios: o mapa, as decisões, o contexto, a prova e quanto custou.

Esta página é a tradução e a consolidação, em português do Brasil, dos seis documentos em inglês do repositório. Ela cobre o que o deck é, por que existe, o que ele de fato faz, todos os comandos com todas as suas opções, e onde ele ainda não chega. Os nomes de comandos, flags e arquivos ficam em inglês, exatamente como são digitados.
Código-fonte · English landing page

Um agente de codificação escreve o código. O que ele não tem como saber é como a sua equipe entrega esse código: quais repositórios uma mudança realmente alcança, até onde esta entrega em particular precisa ser verificada antes que alguém a chame de pronta, quais máquinas ela pode tocar, o que a equipe decidiu meses atrás e o que ainda precisa ser perguntado.

Esse conhecimento mora na cabeça das pessoas, em hábitos e numa página de wiki que ninguém abre — que é exatamente por que a saída de um agente é irregular e por que revisá-la cansa. O deck é onde uma equipe escreve isso: uma vez, sob controle de versão, num formato contra o qual um agente consegue agir e que um revisor consegue conferir depois.

Antes de tudo

O deck não escreve o seu código, não cria agentes, não cria worktrees e não desenha interface própria. O Claude Code já faz as três coisas, e melhor. O deck fornece a parte que um runtime de agente não tem como saber — o seu workspace — e a entrega pelos mecanismos que o Claude Code já tem. É uma CLI antes de qualquer outra coisa: tudo funciona num terminal, num script ou na CI, sem nenhum agente presente.

1.O problema#

Peça uma funcionalidade a um agente num sistema de vários repositórios e três modos de falha aparecem. Nenhum deles é um problema do modelo.

FalhaComo ela apareceO que está realmente faltando
Ele esquece a cadeia O schema muda, o cliente não. O build passa e o comportamento não existe. Um grafo declarado do que uma mudança propaga.
Ele decide em silêncio Escolhe o caminho rápido de implantação, ou pula a suíte de regressão, e nada na saída diz isso. Decisões recorrentes declaradas uma vez, com um estado explícito de “me pergunte”.
Ele não consegue provar nada “Pronto” é uma afirmação. Ninguém consegue conferir qual degrau de verificação foi alcançado. Gates que registram evidência e nunca arredondam não executado para passou.

Nada disso é conhecimento que um modelo consiga derivar do código. É conhecimento sobre o seu sistema, e precisa estar escrito em algum lugar. O deck é esse lugar — e nada além disso.

Três coisas vêm de você

O deck entrega um motor e nenhum conhecimento de domínio. Três coisas são suas, e nenhuma delas é uma lacuna da ferramenta:

  • As arestas — quais repositórios uma mudança obriga você a tocar. Um manifesto declara um checkout, nunca uma propagação, então nenhum importador consegue derivá-las.
  • Os comandos — como o seu projeto compila, implanta e testa. O deck executa as strings que o seu pack declara; ele nunca ouviu falar de bitbake nem de helm.
  • As decisões — as escolhas que a sua equipe refaz toda semana, escritas uma vez.

2.As quatro naturezas, e a regra que decide entre elas#

Esta é a espinha dorsal de tudo. Se você levar só uma coisa desta página, leve esta seção.

Uma equipe quer segurar uma lista longa de coisas: arquitetura, padrões, estilo, formatação, diretrizes, segurança, qualidade, métricas, testes, build, deploy, release. Toda coisa dessa lista é uma de quatro naturezas. Acertar a natureza é a maior parte do trabalho, porque cada uma tem um custo diferente e um modo de falha diferente.

NaturezaO que éOnde moraComo ageQuanto custa
Fato algo verdadeiro sobre este workspace o descriptor, versionado na coleção responde a uma pergunta nada
Invariante uma restrição que está sempre valendo rules/ e skills/ num pack chega ao agente como contexto contexto toda vez que um arquivo correspondente é lido
Decisão uma escolha com mais de uma resposta defensável toggles/ num pack é perguntada, uma vez, e registrada uma pergunta, uma vez
Prova um comando que passa ou falha gates/ num pack produz evidência nada até rodar
A regra

Se uma máquina consegue verificar, é um gate — nunca uma regra.

Contar a um agente sobre indentação, ordem de imports ou vírgula final é pagar tokens para sempre por algo que ruff format resolve em 40 milissegundos. Guia de estilo pertence à configuração do formatador, e o formatador pertence à escada de verificação.

Regras são para o que nenhum comando consegue decidir: para que lado uma dependência pode apontar, por que esta fronteira existe, o que quebra se você atravessá-la. Uma regra de arquitetura ganha o seu lugar quando nomeia a consequência: “handlers validam na borda; nada abaixo reconfere formatos” vale contexto. “Este diretório contém handlers” não vale — o agente consegue ver isso sozinho.

A mesma regra ordena as decisões: se existe uma resposta certa, não é uma decisão — escreva como regra ou imponha como gate. Um toggle cujo valor ninguém jamais mudaria é uma pergunta que você vai obrigar pessoas a responder para sempre.

Quando nenhuma das quatro serve, é uma pergunta

Uma decisão tem mais de uma resposta e você consegue dizer o que defende cada uma. Quando você não consegue — dois trechos de código discordam e ninguém sabe se aquilo foi decidido ou se derivou —, nenhuma das quatro naturezas serve, e forçar uma delas destrói a única coisa que valia a pena guardar. Arquivada como toggle, aquilo passa a ler-se como “nós escolhemos”. Arquivada como regra, lê-se como “nós exigimos”. As duas são mentiras sobre algo que ninguém explicou.

Para isso existe a consulta: deck ask registra a pergunta, uma pessoa responde, e a resposta sobrevive à sessão que a levantou. Veja §16.

3.Vocabulário#

Termos próprios do deck, usados no resto desta página. Introduzidos aqui para que nenhuma seção adiante dependa de você adivinhar.

TermoO que significa no deck
workspacea árvore que o deck administra, com um ou mais repositórios. Nomeada pelo seu descriptor — _workspaces/<nome>/<escopo>/workspace.yaml na coleção, ou .deck/workspace.yaml quando não há coleção
descriptoresse arquivo: o registro de repositórios, as arestas entre eles, os alvos, os quadros
registryo bloco repos: — toda unidade de mudança que o deck conhece
unidade de mudançaum repositório, ou um pacote dentro de um monorepo. O deck não faz distinção
scopeum subconjunto nomeado do registry: uma iniciativa, com quadro e postura próprios
packum diretório de conhecimento da equipe — decisões, comandos, regras, skills. Também é um plugin do Claude Code
toggleuma decisão com mais de uma resposta defensável, escrita uma vez com o seu raciocínio
gateum comando que passa ou falha, num degrau da escada
escada (ladder)os degraus que a verificação sobe: static → build → deploy → behavior
degrau (rung)um nível dessa escada
mountcolocar as regras de um pack dentro dos repositórios que uma tarefa toca, pela duração daquela tarefa
posturao conjunto de valores de toggle em vigor — para um workspace, um scope, um repositório ou uma tarefa
impacto / alcancequais repositórios uma mudança obriga você a revisitar. Não quais você vai editar
bundlea página de prontidão para merge: o que mudou, o que foi verificado, o que não foi
consulta (consultation)uma pergunta para a qual o catálogo de decisões não tem entrada, registrada por deck ask

4.Motor e pack: onde o deck fica#

O motor conhece a forma das coisas. Todo específico — um comando de build, um passo de implantação, uma decisão de domínio, um marcador de detecção — chega de um pack de extensão, como dado declarativo.

   deck (motor, MIT)                 pack (seu, privado ou compartilhado)
   ─────────────────────             ──────────────────────────────────────
   como uma escada funciona   ←───   quais degraus, e seus comandos
   como toggles se resolvem   ←───   quais decisões existem neste domínio
   como um workspace é achado ←───   quais arquivos identificam um
   como artefatos são colocados ←─   quais artefatos, e onde se aplicam

A regra que mantém isso honesto: se atender a uma organização exige editar o motor, a funcionalidade está na camada errada. Uma palavra de domínio aparecendo no código do motor é um bug, e a regra do próprio projeto (_workspaces/all/default/rules/design-line.md (em deck-ai-packs)) diz isso.

Quatro camadas, cada uma mais específica

   deck                    o motor, e um catálogo universal de decisões
     │                     vem com a ferramenta · sem conhecimento de domínio
     ▼
   foundations pack        DRY, SRP, coesão, fail-fast, testabilidade…
     │                     publicado, agnóstico de linguagem · opcional
     ▼
   organisation pack       sua arquitetura, seu build, sua postura de segurança,
     │                     seus comandos, seus hosts, suas convenções
     ▼
   project / repo pack     o que este produto ou este repositório acrescenta

Recusar é melhor que adivinhar

Dois packs reivindicam o mesmo nome; dois gates compartilham um id; uma variável não resolve; um repositório não está no descriptor. Em todos os casos o deck reporta e para. Ele não ranqueia, não assume um padrão, não escolhe o provável. Uma ferramenta que adivinha sobre uma mudança em vários repositórios é uma ferramenta que ninguém consegue auditar depois.

5.O que o deck deliberadamente não constrói#

Esta é a metade importante do projeto. O Claude Code já entrega boa parte do que um “sistema multiagente de entrega” reinventaria.

CapacidadeO Claude Code já temA posição do deck
Criar e coordenar agentessubagentes; o runtime de WorkflowNunca reimplementado. O deck emite um plano; um workflow o executa
Isolar trabalho paralelo--worktree, isolation: worktree, limpeza automáticaNunca reimplementado. Uma worktree é feita de um repositório; um workspace do deck costuma ter vários, e a raiz muitas vezes nem é um checkout. O que separa tarefas concorrentes aqui é o agrupamento
Carregar instruções por diretórioCLAUDE.md, .claude/rules/ com paths:, skillsUsado como mecanismo. O mount coloca artefatos nessas superfícies em vez de inventar um carregador
Habilitar extensões por diretórioplugins em escopo user / project / localUsado como mecanismo. Um mount é, em boa parte, três linhas em settings.local.json
Perguntar algo ao operadorAskUserQuestionUsado como mecanismo. O deck fornece o texto; o Claude Code desenha a caixa
Pausar para aprovaçãoplan modeO toggle plan_approval é a política; o plan mode é o mecanismo
Revisar código e segurança/code-review, /security-reviewNão reconstruído. O deck não revisa código: ele nomeia as revisões que ainda faltam
Reportar custo da sessãocost.total_cost_usdTratado como autoritativo. O deck mostra o número do Claude Code ao lado da própria estimativa

O que sobra é a parte que nenhum runtime de agente tem como saber: este workspace. É toda a área de atuação do deck.

Dito com todas as letras

O deck registra uma arquitetura; ele não a impõe. Uma regra de arquitetura chega ao agente como texto e o agente pode ignorá-la. O que é imposto por código, e não por instrução, está listado em §19 — e a lista é curta de propósito.

6.Instalação#

git clone https://github.com/devfilipe/deck.git ~/tools/deck
ln -s ~/tools/deck/plugins/deck/bin/deck ~/.local/bin/deck
deck --help

Python 3.10+ e PyYAML. git para quase tudo; tmux só para deck ui. Sem passo de build e sem virtualenv: o ponto de entrada roda o pacote a partir do clone.

As opções globais

-h, --helpExiste em todos os níveis. deck --help lista os 33 comandos de primeiro nível; deck <comando> --help lista as opções daquele comando; e nos sete comandos que têm subcomandos, deck <comando> <sub> --help desce mais um nível.
--versionImprime a versão. Hoje: deck 0.1.0.
--scope NAMEVem antes do comando e existe porque um produto grande é trabalhado em pedaços. Um scope nomeia um subconjunto do registry — “esta iniciativa são estes seis de quarenta” — e carrega o quadro daqueles repositórios e a postura que vale enquanto se trabalha neles. deck --scope payments board plan restringe o comando à iniciativa. Ele nunca restringe o grafo: deck impact continua reportando a cadeia inteira e marcando o que cai fora, porque um subconjunto que esconde uma aresta é pior do que nenhum subconjunto.

Instalar também como plugin do Claude Code

claude plugin marketplace add ~/tools/deck      # ou a URL do GitHub
claude plugin install deck@deck

Isso adiciona onze skillsworkspace, toggles, gates, metrics, board, bundle, mount, packs, asking, cost, doctor — que ensinam o Claude a consultar o plano de controle em vez de adivinhar, mais dois hooks: SessionStart, que registra a sessão como seguradora do que está montado, e SessionEnd, que devolve o que ficou montado.

Isso é pago em toda sessão. claude plugin details deck imprime o custo do que você instalou, que é o único número que vale citar. Instalar habilita em escopo user — todo projeto, use deck ou não. A maioria das equipes quer o contrário:

claude plugin disable deck@deck --scope user      # não em todo lugar
cd ~/work/projs
claude plugin enable deck@deck --scope project   # aqui, e para a equipe

Do zero a um workspace utilizável

cd ~/work/projs
deck setup --packs-root ../ai-packs --create-packs

Um comando: lê como a sua árvore está montada, escreve o descriptor, cria um pack esqueleto por projeto, liga os dois, e termina nas duas ou três coisas que só uma pessoa pode decidir.

O que é uma coleção, e onde ela fica

Uma coleção é um diretório — nada além disso. O que a torna uma coleção é o que ela tem no topo: _workspaces/ ou _repos/. Um diretório apontado por packs_root que não tem nenhum dos dois o deck recusa, dizendo exatamente isso.

O repositório não é a coleção. O repositório dá versionamento, revisão e permissões; a coleção é o subdiretório que o deck lê. Por convenção ela se chama packs/:

   xyz-ai-packs/            ← o REPOSITÓRIO: versionado, revisado, com permissões
   └── packs/               ← a COLEÇÃO: é para cá que packs_root aponta
       ├── _workspaces/
       │   └── all/default/     vale para todo repositório, sempre
       └── _repos/
           ├── api/             vale só para o repositório `api`
           └── web/

Os nomes fazem a ligação — não há tabela de mapeamento, porque tabela de mapeamento é arquivo que ninguém mantém atualizado.

   projs/                       xyz-ai-packs/packs/
   ├── group1/                  ├── _workspaces/
   │   ├── proj1/               │   └── all/default/    ← todo repositório
   │   └── proj2/               └── _repos/
   └── group2/                      ├── proj1/  ◄──────── casado pelo nome
       ├── proj3/                   ├── group1/proj2/  ← grupos espelhados
       └── proj4/                   └── group2/proj3/
                                    (proj4 não tem pack — o deck diz isso
                                     em vez de ficar quieto)

Dois eixos, e eles são independentes

Onde a coleção mora é só um caminho em packs_root. Um repositório separado, um diretório dentro de um repositório de produto, qualquer lugar do disco — o deck não distingue. Esse eixo decide quem revisa o conhecimento, e nada mais.

A que o pack se aplica vem de onde ele está. _repos/<nome>/ é aquele repositório e nenhum irmão. _workspaces/<nome>/<escopo>/ é uma camada sobre o workspace: all e default sempre existem e são a base, e uma camada sob outro nome ou outro escopo se sobrepõe a ela, arquivo a arquivo.

   ordem de mesclagem, do mais geral para o mais específico:

   _workspaces/all/default   →   _workspaces/all/<escopo>
                             →   _workspaces/<nome>/default
                             →   _workspaces/<nome>/<escopo>
                             →   _repos/<repo>

   o mais específico tem a última palavra

Quando os dois eixos discordam sobre um mesmo arquivo, o nome vence: um workspace é um lugar e um escopo é uma fase, e a fase é a coisa temporária.

Duas coleções podem ter, cada uma, um all/default

Isso é camada, não colisão: elas mesclam na ordem escrita em packs_root, e deck packs imprime o que a posterior tomou da anterior. Colisão é o mesmo nome dentro de uma coleção — aí o deck recusa, porque o vencedor seria a ordem que o filesystem devolveu.

Os quatro fluxos, em uma página

Tudo abaixo é composto destes quatro. Se você ler só uma coisa desta página, leia esta.

A · Começar um workspace — uma vez por checkout.

   você                    deck                         disco
   ────                    ────                         ─────
   deck setup          ──► lê como a árvore está     ──► X/_workspaces/<nome>/default/
     --packs-root X        montada, deriva o registry        workspace.yaml (versionado)
     --workspace <nome>                                 ──► ~/.deck/workspaces/<nome>/
     --create-packs        cria o esqueleto da coleção        machine.yaml (só seu)
                                                          ──► X/_repos/<cada repo>/
                           │
                           └─► e para nas duas coisas que só você decide:
                               as arestas `impacts:`  ·  a allowlist `targets:`

B · Uma tarefa, do início ao fim — o laço do dia a dia.

   deck mount --task T --repos api --brief "..."
        │
        ├─► expande pelo grafo: api força server? server entra também
        ├─► camada de workspace  ──► <raiz>/.claude/  +  CLAUDE.local.md
        └─► pack de cada repo     ──► <repo>/.claude/
        │
        ▼
   ┌─ abrir a sessão Claude AQUI, e não antes ────────────────────┐
   │  skills, agents e CLAUDE.local.md são lidos no lançamento    │
   │  regras com `paths:` carregam quando um arquivo casa         │
   └──────────────────────────────────────────────────────────────┘
        │
        ▼
   deck gate run --task T        a escada, e a evidência em disco
        │
        ▼
   deck save --task T            o que a IA corrigiu volta à coleção
        │                        (deck doctor avisa se você esquecer)
        ▼
   deck bundle --task T          o que o revisor lê em vez do diff
        │
        ▼
   deck unmount --task T         a árvore volta ao que era

C · Uma mudança que atravessa repositórios — por que o deck existe.

   deck impact api-schema
   ┌──────────────────────────────────────────────────────────┐
   │ a change in api-schema reaches 3 repositories            │
   │                                                          │
   │   1. api-schema     build api-schema     ◄── você mexeu  │
   │   2. api-server     build api-server     ◄── tem que     │
   │   3. web-client     build web-client         acompanhar  │
   │   4. e2e-suite      (downstream — não produz artefato)   │
   └──────────────────────────────────────────────────────────┘
        │
        └─► deck mount --task T --repos api-schema
            monta os quatro, não um — esquecer um deles é o
            erro que a expansão existe para impedir

D · O conhecimento se acumula — o que separa a segunda tarefa da primeira.

   tarefa 1        a IA descobre algo, ou uma regra estava errada
       │
       │  deck save
       ▼
   COLEÇÃO         você revisa o diff e commita     ← vira do time AQUI
       │
       │  deck mount
       ▼
   tarefa 2        a IA já começa sabendo
   tarefa 3
   ...

   sem o save, cada tarefa recomeça do zero e a mesma
   correção é feita de novo, por outra pessoa, na semana seguinte
A ordem que evita retrabalho

save antes de unmount. O unmount sozinho preserva o que foi editado — não apaga —, mas deixa a edição órfã na árvore de trabalho, e aí já não há manifesto que saiba de onde ela veio.

7.O mapa — onde está tudo, e o que uma mudança alcança#

O conceito: um registry de unidades de mudança e as arestas entre elas. O registry o deck consegue derivar de como a sua árvore já está montada. As arestas, não — e é por isso que existem comandos separados para as duas coisas.

Dois tipos de aresta

impacts: é direcional e ordenada. Ela responde duas perguntas com uma aresta: o que preciso revisitar e em que ordem. É a forma certa para a maior parte de um workspace, e é o que torna possível a ordem topológica, a cadeia de build e a checagem de ciclos.

É a forma errada para uma relação que responde à primeira pergunta e não tem resposta para a segunda. Um repositório de schema semeia uma configuração que um repositório de scripts lê, e o repositório de scripts é dono da linha de comando que o primeiro chama em tempo de execução: cada lado quebra o outro, com evidência de arquivo e linha nos dois, e nenhum vem primeiro. Havia três formas de segurar isso e só uma preserva as duas metades:

AlternativaO que ela custa
Declarar uma direção e escrever a outra como regra em prosaA restrição sobrevive como texto. Nenhum comando consegue usá-la, e deck impact no segundo repositório não menciona o primeiro
Declarar as duas como impacts:Um ciclo. A ordem topológica deixa de existir para aquele par, e todo consumidor de deck order — a escada, o plano, o bundle — passa a lidar com um grafo que não tem mais uma
Um terceiro tipo de arestacouples:, simétrica e sem ordem

couples: é lida por deck impact, que a lista separada da cadeia ordenada, e por deck mount, que coloca os packs de um repositório que o trabalho talvez tenha de editar. Ela é lida por nada que ordena: a ordem topológica e a checagem de ciclos nunca a olham, que é exatamente por que um acoplamento nunca consegue tornar o grafo cíclico. É simétrica — declarar de um lado basta — e não é transitiva, porque “força uma mudança em” compõe e “se puxam mutuamente” não.

A regra que decide onde ela aparece: uma superfície que reporta lê couples:; uma superfície que ordena, agenda ou exclui, não.

$ deck impact schema
a change in schema reaches 1 repository

execution order:
  1. schema
  2. gen  build gen-all

coupled with, in no order:
  - runtime   (declared by schema)

  A coupling is mutual and carries no order: revisit these, do not sequence them.
  They take no part in the execution order above, and never in a build order.

Saída real, de um workspace sintético de três repositórios.

Os comandos do mapa

deck root

Imprime a raiz do workspace resolvida. Sem opções. A resolução da raiz tem quatro fontes e nunca adivinha; este comando diz qual venceu.

deck info [--json]
--jsonA mesma informação como JSON, para um script ou uma skill consumir em vez de fazer parsing de texto.

Resumo: raiz, de qual fonte ela veio, se o descriptor existe, quais packs estão em jogo, os repositórios e os targets.

deck repos [--verbose] [--downstream-only] [--buildable-only]
--verboseAcrescenta o caminho e o build_target de cada repositório, além do nome.
--downstream-onlySó os repositórios marcados downstream: true no descriptor. Downstream é a unidade que precisa ser mantida em dia mas não produz artefato — uma suíte fim a fim, tipicamente. Esse marcador não é decorativo: ele muda o agrupamento do quadro (§13).
--buildable-onlyO complemento: tudo que não é downstream, ou seja, o que a cadeia de build de fato constrói.
deck path <repo>

O caminho absoluto de um repositório. Existe para que um script ou um gate não precise saber onde a sua árvore está montada.

deck get <key>

Um campo do descriptor, por chave pontuada: deck get repos.schema.path. É o acesso de leitura ao descriptor sem escrever um parser de YAML no seu script.

deck packs [--repo REPO] [--json]
--repo REPOSó os packs que se aplicam a esse repositório. Um pack pode ser do workspace inteiro, de um repositório, ou de um scope.
--jsonSaída para máquina.

Mostra quais packs estão em jogo, em ordem de merge (do mais geral para o mais específico) e quem sobrescreve quem. Estender uma entrada que o núcleo define exige repetir o id com overrides: true; uma colisão sem essa flag é recusada, para que ninguém sombreie uma decisão do núcleo por acidente.

deck paths [--json]

Os diretórios nomeados que o workspace usa mas não muda. O deck faz uma pergunta sobre cada árvore que fica fora do workspace: você a edita ou só a invoca? Algo que você edita é um repositório, mesmo morando fora da raiz — ganha arestas, um pack e um lugar na escada. Algo que você só invoca é um path: não carrega arestas, não declara gates, nunca recebe mount. Um gate se refere a ele como ${path.scripts}, que é o que mantém o pack portátil — o pack nomeia scripts, e o seu descriptor, que não é versionado, diz onde está o seu.

deck targets [--json]

A allowlist de implantação: as máquinas que o deck deixa qualquer coisa alcançar. Uma lista vazia significa nenhuma implantação e nenhum gate de comportamento, o que é um começo perfeitamente razoável. Veja §19 para o que essa allowlist de fato impede hoje.

deck scopes [--json]
deck scope <name> [--json]

scopes lista os subconjuntos nomeados do registry; scope <name> abre um: seus repositórios, seu quadro, sua postura. O relatório de um scope diz o que a iniciativa alcança e não contém, pelos dois caminhos por onde ela vaza: a cadeia ordenada que seus impacts: alcançam, e qualquer par couples: do qual ela segura um lado só. As duas metades são impressas separadas e nunca fundidas numa lista — só uma delas carrega ordem, e uma lista única emprestaria essa ordem à outra.

deck impact <repo> [--json]

O que uma mudança naquele repositório alcança, em ordem de execução, mais os acoplamentos, separados. Esta é a pergunta que o agente não consegue responder sozinho, e é o motivo de o deck existir.

deck order <repos...>

A ordem topológica para um conjunto de repositórios. Editar o backend antes do schema produz um build que passa e um comportamento que não existe; este comando é o que diz a ordem certa a um script.

deck setup [--root ROOT] [--packs-root PACKS_ROOT] [--create-packs] [--repos [NAME ...]] [--force] [--dry-run]
--root ROOTA raiz do workspace, quando a detecção não é o que você quer.
--packs-root PACKS_ROOTOnde a coleção de packs mora, ou deveria morar. Esta é a decisão que o setup não toma por você: ele para de propósito e pergunta onde o conhecimento vai viver.
--create-packsCria um pack esqueleto para cada repositório, com todos os comentários intactos. Sem essa flag, o setup apenas liga o que já existe — que é o caminho de quem está entrando numa equipe que já tem a coleção.
--repos [NAME ...]Só estes, separados por vírgula ou espaço. Existe porque um checkout não é a mesma coisa que o seu trabalho: um manifesto traz vinte repositórios onde seis são a obra. Curar aqui é mais barato do que podar depois um arquivo que o deck acabou de gerar — ninguém poda uma lista que não escolheu fazer.
--forceRecomeçar sobre um workspace que já tem configuração.
--dry-runSó descoberta: o que o deck enxerga e o que faria, sem escrever nada.
deck init [--force] [--from [SOURCE]]
--forceSobrescreve arquivos existentes.
--from [SOURCE]Além de criar .deck/, já importa o registry. Aceita repo, submodules ou npm; omita o valor para autodetectar.

Cria .deck/ a partir dos templates disponíveis. Se um pack traz templates/workspace/workspace.yaml, o deck usa esse em vez do genérico, e diz que usou — é assim que a segunda pessoa a montar o mesmo tipo de workspace recebe a mesma forma sem que ninguém lhe explique qual é.

deck import [source] [--write]
sourcerepo (manifesto do Google repo, com includes), submodules (via o próprio git) ou npm (globs de workspace). Autodetectado quando omitido.
--writeGrava o resultado no descriptor. Sem ela, o comando só mostra o que acrescentaria.

Nenhum importador deriva impacts, e isso não é uma limitação a ser resolvida: um manifesto declara um checkout, nunca uma propagação. Escreva as arestas à mão uma vez, ou peça um rascunho com deck propose impacts (§17).

Monorepo

O motor não se importa se uma unidade de mudança é um checkout ou um diretório. repos: é um registro de unidades; path: é onde cada uma mora. Nada no grafo de impacto, na escada, no escopo dos packs ou no quadro depende de a unidade ter um .git próprio. deck setup encontra as unidades por evidência: um diretório com um manifesto de pacote — pyproject.toml, package.json, Cargo.toml, go.mod, pom.xml e afins — declara-se uma unidade.

O que de fato difere é do git, não do deck: há um .git só, um .git/info/exclude compartilhado, e a raiz do workspace é o próprio repositório do produto. As duas consequências são estruturais — os padrões de exclusão precisam estar ancorados na raiz da árvore de trabalho, e cada bloco precisa ser marcado por tarefa e caminho, senão a escrita de uma unidade substitui a da anterior. Erre isso e um agente rodando git add -A comita os artefatos do deck dentro do produto.

8.As decisões — toggles#

Um toggle é uma decisão com mais de uma resposta defensável, escrita uma vez, com o raciocínio junto. O catálogo do núcleo traz 27 decisões e 5 perfis; um pack acrescenta as do seu domínio.

Três estados, e um deles não é um valor

Um toggle tem um valor, ou tem o valor especial ask. ask não é um valor: é uma instrução para apresentar ao operador a pergunta que está escrita no próprio catálogo, no estágio declarado. O texto vem do pack, não do agente que perguntou — que é o que faz a mesma tarefa, pedida por uma pessoa sênior e por alguém na primeira semana, produzir a mesma pergunta com as mesmas palavras.

Sete camadas de precedência

   mais forte ──────────────────────────────────────────────────► mais fraca

   task file   DECK_<ID>    repos:         scopes:      values:    profile   catálogo
               no ambiente  bloco          bloco        bloco                padrão
   ─────────   ──────────   ──────         ───────      ───────    ───────   ───────
   uma tarefa  um comando   um repositório uma          esta       uma       a política
                                           iniciativa   máquina    postura   da equipe

Cada camada é mais larga que a anterior: esta tarefa, este comando, este código, esta iniciativa, esta máquina. A mais estreita que tem um valor vence.

Por que este valor, e não só de onde ele veio

Uma camada diz quem decidiu; ela não diz por quê. Um gate_level foi rebaixado de deploy para build num workspace real porque a entrega passava por um caminho de atualização de firmware que ninguém tinha ligado ao deck. O valor estava certo e a frase que o explicava vivia num histórico de chat — então, meses depois, nada o distinguia de um valor que ninguém tinha revisitado.

deck toggle set gate_level build --at workspace \
  --why "a entrega passa por um caminho de firmware que ninguém ligou ao deck ainda"

--why é registrado num mapa reasons: ao lado do mapa values: que ele explica, no mesmo arquivo. É um irmão, e não um valor mais rico, para que values: continue sendo a lista de duas colunas que uma pessoa edita à mão, e para que um arquivo antigo sem reasons: se leia como “não tem nenhuma” em vez de “tem metade”.

deck toggle explain imprime duas frases separadas, porque elas têm dois autores: por que o toggle existe é o rationale do catálogo, revisado por quem é dono do domínio; por que este valor foi escolhido é de quem escolheu, e pertence a este workspace apenas. Um valor sem nada registrado diz isso, e nomeia o comando que registraria — em vez de ficar debaixo do parágrafo do catálogo e passar por justificado.

Uma razão pertence ao valor para o qual foi escrita, então definir um valor sem --why descarta a razão anterior e avisa que descartou: uma frase deixada para trás continuaria justificando uma decisão que não está mais no arquivo.

Os comandos das decisões

deck toggle [--repo REPO] [--session SESSION] <subcomando>
--repo REPOForça o contexto de repositório. Existe porque a camada repos: é real: o valor efetivo de um toggle pode ser diferente conforme o repositório em que você está.
--session SESSIONO id de sessão que identifica o arquivo de estado da camada de tarefa (.deck/state/toggles-<session>.yaml). Existe para endereçar a postura de uma tarefa que não é a sua sessão atual.
deck toggle list [--stage {plan,implement,verify,deliver}] [--group GROUP] [--json]
--stageUm toggle declara em que estágios do trabalho ele importa. Filtrar por estágio é o que evita apresentar a alguém, no planejamento, uma decisão que só faz sentido na verificação.
--group GROUPFiltra por grupo do catálogo: quality, build, security, delivery, docs, agent.
--jsonSaída para máquina, carregando também a frase do --why como reason — para que um consumidor não precise chamar explain uma vez por toggle.
$ deck toggle list --stage plan
-- Quality and verification
    gate_level             deploy         catalog default (core)
    unit_tests             opportunistic  catalog default (core)
  ? api_compat             ask            catalog default (pack)

-- Delivery
    plan_approval          always         catalog default (core)
  ? requirement_link       ask            catalog default (core)

  ? = will be asked when it matters

Saída real de ./docs/tour.sh, recortada. O ? não é um valor faltando: é uma pergunta esperando o momento certo.

deck toggle get <id>

O valor efetivo de um toggle, e só isso. É a forma que um script ou um gate usa: deck toggle get gate_level.

deck toggle explain <id>

Significado, valor efetivo, de qual camada ele veio, risco, estágios, as duas frases de raciocínio, o impacto de cada valor, e todas as camadas da mais forte para a mais fraca. É o comando para quando alguém pergunta “por que estamos fazendo assim?”.

$ deck toggle explain target
target — Deployment target
  Which host from the allowlist receives the deployment.

  effective  : bancada.example.com
  source     : workspace
  risk       : high
  depends on : {'gate_level': ['deploy', 'behavior']} → satisfied

  why this value was chosen (workspace):
    a única bancada declarada

  layers (strongest first):
    bancada.example.com   workspace   (why recorded)
    ask                   catalog default (core)
deck toggle set <id> <value> [--at task|workspace|<scope>] [--why REASON]
--atEm qual camada gravar. As opções são task, workspace ou o nome de um scope — as camadas nas quais o deck escreve arquivos. Existe porque uma decisão tem camadas: “só nesta tarefa” e “neste workspace, para sempre” são duas afirmações diferentes e precisam ir para arquivos diferentes. Sem --at, a gravação é na camada de tarefa, isto é, só nesta sessão.
--why REASONPor que este valor, aqui. Gravado ao lado dele, no mesmo arquivo. Definir sem --why apaga a razão anterior, e o deck diz que apagou.
deck toggle profile [name] [--at task|workspace|<scope>]
nameOmitido: mostra o perfil em vigor. Informado: aplica aquele perfil.
--atEm qual camada gravar a escolha de perfil, pelo mesmo motivo de toggle set.

Um perfil move a postura inteira numa frase — perguntar mais e verificar até o fim para quem é novo, pegar o caminho curto num hotfix — em vez de discutir isso por tarefa. O núcleo traz cinco: standard, guided, autonomous, hotfix e offline.

deck toggle ask-plan --stage {plan,implement,verify,deliver} [--files [FILES ...]]
--stageObrigatório. Quais perguntas ainda pendentes pertencem a este momento do trabalho.
--files [FILES ...]Os arquivos que estão sendo tocados, para filtrar pelo applies_to do toggle. Uma pergunta sobre contrato de API não deve aparecer numa mudança que não toca em nenhum schema.

Emite as perguntas pendentes já em formato de pergunta pronta — cabeçalho, opções e descrições — para o Claude Code desenhar a caixa. O deck fornece o texto; o runtime desenha.

$ deck toggle ask-plan --stage plan --files services/api-schema/openapi.yaml

  May this change alter the published API contract?   [high risk]
    Additive only      Clients in the field keep working.
    May break          Needs a migration note and a version bump.
deck toggle validate [--strict]
--strictAvisos também reprovam. É o modo que a CI usa: um catálogo que só avisa é um catálogo que passa.

Confere o catálogo, os perfis e as escolhas gravadas. Entre outras coisas, ele recusa um catálogo em que um toggle do grupo security tenha padrão ask: política de segurança se decide de antemão, não se negocia no meio da tarefa com um agente com pressa.

9.O contexto — mount#

Mount é colocar os artefatos certos nos diretórios certos para um pedaço de trabalho, e retirá-los depois. O deck não inventa um carregador de contexto: ele escreve nas superfícies que o Claude Code já lê, na seguinte ordem de preferência.

   pack (fora do repositório)                repositório (de outra pessoa)
   ───────────────────────                   ───────────────────────────
   config/mount.yaml          ──plugin──►    .claude/settings.local.json
   rules/api-contract.md      ──rule────►    .claude/rules/deck-api-contract.md
   (gerado para esta tarefa)  ──cópia───►    CLAUDE.local.md

                          manifesto ──► .deck/mounts/<task>.json
                          exclusões ──► .git/info/exclude   (nunca .gitignore)

Duas garantias

Ele só remove o que colocou. Cada entrada carrega um hash. Uma regra que alguém editou, um arquivo de settings onde outra pessoa acrescentou um plugin, um briefing que foi estendido — cada um é reportado e deixado em paz.

Ele não suja o git status. As exclusões são locais, em .git/info/exclude, nunca em .gitignore — que é um arquivo versionado do repositório de outra pessoa. Nada que o deck escreve pertence a um repositório de produto, e nada que ele coloca lá sobrevive a um unmount.

Um mount é segurado, não possuído

Quem monta toma o primeiro hold, e toda sessão de agente que começa sob a mesma tarefa toma um também. Quando uma sessão termina, ela libera o seu próprio hold, e o mount só é desfeito quando não sobra nenhum. Fechar um painel não pode tirar as regras do painel que ainda está trabalhando na tarefa.

Os comandos do contexto

deck mount [--task TASK] [--repos [REPOS ...]] [--no-expand] [--brief BRIEF] [--dry-run]
--task TASKO id da tarefa. Sem ele, o id da sessão. Tudo que o deck grava por tarefa — o manifesto do mount, a evidência dos gates, o bundle, a janela de custo — é indexado por esse nome, e é por isso que ele aparece em quase todo comando adiante.
--repos [REPOS ...]Os repositórios em jogo, separados por vírgula ou espaço.
--no-expandNão seguir o grafo de impacto. Por padrão o mount expande: se você nomeia o schema, ele também coloca os packs do que o schema alcança e do que ele acopla, porque esses são repositórios que o trabalho talvez tenha de editar, e editá-los sem orientação é exatamente a falha que a expansão existe para evitar. Esta flag desliga isso quando você sabe que a mudança é local.
--brief BRIEFO texto do CLAUDE.local.md da tarefa — o enunciado do trabalho. - lê da entrada padrão. Pode chegar depois do mount, porque normalmente é aí que se sabe: rodar de novo sobre uma tarefa já montada reescreve o enunciado e não toca em mais nada. Um enunciado que uma pessoa editou à mão nunca é sobrescrito, e montar sem enunciado nenhum diz isso — é permitido, e frequentemente certo no começo, mas não pode passar despercebido, ou nunca é acrescentado.
--dry-runMostra o que seria colocado, e coloca nada.
deck unmount [--task TASK] [--session] [--all]
--task TASKDesmontar uma tarefa específica. Sem ela, a da sessão atual.
--sessionTudo que esta sessão montou. É o que o hook SessionEnd chama, e é por isso que o argumento existe: um hook não sabe nomes de tarefa.
--allTodo mount deste workspace. Para limpar depois de uma sessão que morreu sem executar o hook.
$ deck unmount --task TOUR-1
  removed  .../services/api-schema/.claude/rules/deck-api-contract.md
  removed  .../CLAUDE.local.md

  2 removed · 0 left alone

Saída real de ./docs/tour.sh. “0 left alone” é a contagem do que foi encontrado modificado e por isso preservado.

deck hold

Registra esta sessão como seguradora do que está montado aqui. Sem opções. Você nunca digita este comando: o hook SessionStart do plugin o executa.

deck mounts [--json]

O que está montado agora neste workspace. deck doctor reporta um mount que sobreviveu à sua sessão.

Onde cada artefato pousa, e quando o Claude o lê

O mount copia — nunca link simbólico. Um link em .claude/rules/ falha em silêncio: o mount reporta sucesso, o ls -l parece certo, e a regra nunca chega ao agente.

   COLEÇÃO                              ÁRVORE DE TRABALHO

   _workspaces/all/default/
     CLAUDE.md          ──────────────► <raiz>/CLAUDE.local.md
     rules/house.md     ──────────────► <raiz>/.claude/rules/deck-house.md
     skills/rev/        ──────────────► <raiz>/.claude/skills/deck-rev/
     agents/qa.md       ──────────────► <raiz>/.claude/agents/deck-qa.md

   _repos/api/
     rules/contract.md  ──────────────► <raiz>/api/.claude/rules/deck-contract.md

A camada de workspace pousa uma vez, na raiz; o pack de um repositório pousa naquele repositório e em nenhum irmão. O prefixo deck- existe para o .git/info/exclude poder nomear os arquivos do deck sem reivindicar um diretório que o repositório também usa.

Medido, não suposto

Que o Claude Code encontra os quatro no nível do projeto foi medido: um diretório com uma skill, um agente e uma regra paths:, cada um carregando uma palavra que nada mais na sessão poderia fornecer, posto a uma sessão aberta ali.

   SKILL:     sim    .claude/skills/<nome>/SKILL.md, na listagem de skills
   AGENT:     sim    .claude/agents/<nome>.md, como tipo do Agent
   CLAUDE_MD: sim    CLAUDE.local.md na raiz, nas instruções
   RULE:      não    .claude/rules/<nome>.md — e então SIM, depois que a
                     sessão leu um arquivo que o `paths:` dela casa

A última linha é o mecanismo, não uma falha: uma regra carrega quando algo que ela descreve é lido. Ela também teve que ser perguntada duas vezes — um não isolado se lê exatamente como uma regra que nunca chega.

Consequência prática: o mount vem antes de abrir a sessão. Skills, agents e o CLAUDE.local.md são lidos no lançamento; só as regras toleram chegar depois.

O ciclo inteiro, e por onde o conhecimento volta

O mount leva conhecimento para fora da coleção. O deck save é a volta, e sem ele o que a IA aprendeu morre com o diretório de trabalho.

        ┌──────────────────────────────────────────────────┐
        │  COLEÇÃO  (xyz-ai-packs/packs)  — versionada      │
        └──────────────────────────────────────────────────┘
              │                                    ▲
              │ 1. deck mount                      │ 3. deck save
              │    --task X --repos api            │    --task X
              │    --brief "..."                   │
              ▼                                    │
        ┌──────────────────────────────────────────────────┐
        │  ÁRVORE DE TRABALHO  — .claude/, CLAUDE.local.md │
        │                                                  │
        │        2. a sessão Claude trabalha aqui          │
        │           lê as regras · corrige uma             │
        │           escreve uma nova                       │
        └──────────────────────────────────────────────────┘
              │
              │ 4. deck unmount --task X     (a árvore volta ao que era)
              ▼
        ┌──────────────────────────────────────────────────┐
        │  5. você revisa o diff na coleção e commita      │
        │     — o único momento em que vira do time        │
        └──────────────────────────────────────────────────┘

1 · deck mount — antes de abrir a sessão

--task <id>        sob que id tudo é registrado. Sem ele, o id da sessão —
                   que dentro do tmux vem da JANELA, então dois painéis de
                   uma janela são uma tarefa só.
--repos a b c      o que está em jogo. Vírgula ou espaço. EXPANDE pelo grafo
                   de impacto: montar o pack do schema e não o do servidor
                   que ele força a mudar é como um agente acaba editando um
                   repositório sobre o qual não sabe nada.
--no-expand        só o que você nomeou.
--brief "texto"    escreve o CLAUDE.local.md na raiz. Com `-`, lê do stdin.
                   Numa tarefa já montada, substitui só o enunciado — porque
                   o enunciado normalmente chega DEPOIS do mount.
--dry-run          o plano, sem escrever nada.

3 · deck save — o que a IA mudou volta

--task <id>        qual tarefa. Sem ele, o id da sessão.
--dry-run          o que escreveria, escrevendo nada.

Para onde volta não é adivinhação: o manifesto do mount gravou a origem de cada artefato, então a edição volta para o arquivo de onde veio, na camada de onde veio. Três situações, e a terceira é a mais conservadora:

   changed   a cópia não bate mais com a fonte     → escreve de volta na fonte
   new       arquivo que ninguém colocou           → vai para o pack dono do
                                                     lugar, SEM o prefixo deck-
   gone      artefato colocado que sumiu           → REPORTA e não propaga

Remover uma regra de um pack é uma edição ao pack — não algo a inferir de uma cópia de trabalho que sumiu.

Por que save é comando, e não parte do unmount

O hook SessionEnd desmonta. Um hook que também escrevesse numa coleção versionada poria edições que ninguém revisou no git status de alguém a cada painel fechado. Levar trabalho de volta se pede.

4 · deck unmount — tira de volta exatamente o que colocou

--task <id>        aquela tarefa. É o que você digita.
--session          tudo que ESTA sessão montou. É o que o hook SessionEnd
                   chama — e ele solta apenas o hold dela: fechar um painel
                   não arranca as regras do painel que ainda trabalha.
--all              todo mount deste workspace. A vassoura.

Ele nunca apaga o que alguém editou. Um arquivo que não bate com o gravado fica, com a razão dita, e o relatório conta os dois lados: 12 removed · 0 left alone. Também desfaz o que não é arquivo — a entrada em settings.local.json, o bloco no .git/info/exclude — e poda os diretórios que ele mesmo criou, só enquanto vazios.

Depois de um save, o que atravessou é retirado: deixou de ser trabalho não salvo. Uma edição feita depois do save continua protegida.

E se você esquecer o save?

O deck doctor avisa. Ele vigia as duas direções da deriva:

$ deck doctor
mounted artifacts
  OK C2  1 artifact(s), this session
  !! C2  stale: all/default changed house.md since it was placed
         ↑ o PACK andou à frente das cópias — remonte
  !! C2  unsaved: 1 edited, 1 written here — nothing in the collection holds them yet
         ↑ as CÓPIAS andaram à frente do pack — deck save --task C2

10.Os packs — onde o conhecimento da equipe mora#

Um pack é um diretório versionado e revisado como qualquer outro código. Ele é, ao mesmo tempo, um plugin do Claude Code: o mesmo diretório carrega skills/, agents/ e hooks/, que o Claude Code lê diretamente, mais um config/ que só o deck lê.

Arquivo em config/O que ele responde
detect.yamlo que este workspace é — os marcadores que fazem este pack se aplicar, e opcionalmente o scope: a que ele pertence
toggles.yamlas decisões deste domínio, com rationale e o impacto de cada valor
gates.yamla escada: quais degraus, quais comandos, e opcionalmente o que medir
mount.yamlo que aterrissa num repositório, e onde
profiles.yamlposturas nomeadas deste domínio

Mais rules/ (invariantes, escopadas por paths:), skills/ (procedimentos com passos) e templates/workspace/workspace.yaml — a forma do descriptor que a equipe compartilha.

Os comandos dos packs

deck pack new <name> [--dir DIR] [--description DESCRIPTION] [--from-workspace] [--scope NAME] [--force]
--dir DIROnde escrever. Padrão: ./packs/<name>.
--description DESCRIPTIONA descrição que vai para o plugin.json, e que é o que faz o Claude Code decidir carregar o pack.
--from-workspaceSemeia os marcadores de detecção e o template de descriptor a partir deste workspace. É como a forma de um workspace que funciona vira a forma que a próxima pessoa recebe.
--scope NAMEAmarra o pack a uma iniciativa: ele carrega só sob deck --scope NAME e em nenhum outro lugar. Existe porque uma iniciativa tem conhecimento próprio que não deve pesar no contexto de quem não está nela.
--forceSobrescreve arquivos existentes.

Cria o esqueleto inteiro com todos os comentários intactos — eles explicam o que vai em cada arquivo e por quê, e são a documentação de referência de fato.

deck pack review [--json]

O que cada pack custa, e o que parou de merecer esse custo. Ele cruza o que o pack declara com a evidência que este workspace guardou: quantas vezes cada gate rodou, quantas vezes pegou alguma coisa, quantas vezes foi pulado. Um gate que roda sempre e nunca pega nada é um custo sem retorno; uma regra que nenhum arquivo casa é contexto que nunca chega.

$ deck pack review
gate history, from the evidence this workspace kept
  deploy-remoto    ran   3  caught   3  skipped   2
  build            ran   2  caught   2  skipped   0
  lint             ran   3  caught   0  skipped   0
deck pack list [--json]

Os packs em jogo e o que cada um contribui — toggles, gates, regras.

deck pack sources [--vendored] [--into INTO]
--vendoredEm vez das fontes conhecidas, o que já está dentro deste pack, com a proveniência de cada arquivo.
--into INTOQual diretório de pack olhar. Padrão: o atual.

Sem flags, lista fontes conhecidas de skills e agents. O texto de cada uma diz também quando não vendorizar — uma metodologia que você vendorizou é uma metodologia que parou de receber as correções do autor.

deck pack add <source> [--into INTO] [--skills [...]] [--agents [...]] [--all] [--with-hooks] [--ref REF] [--force] [--yes]
sourceowner/repo, uma URL git, ou um nome de deck pack sources.
--into INTOO diretório de pack de destino. Padrão: o atual.
--skills [SKILLS ...]Quais skills trazer.
--agents [AGENTS ...]Quais agents trazer.
--allTrazer todos os skills e agents.
--with-hooksTrazer também os hooks/. Precisa ser pedido explicitamente porque um hook é um comando de shell que roda na sua máquina. Nunca é trazido por omissão.
--ref REFBranch ou tag da origem. Faz parte da proveniência registrada.
--forceSubstitui o que já está lá.
--yesEscrever, em vez de só listar o que seria trazido. Sem essa flag o comando é uma prévia.
deck pack update [artifact] [--into INTO] [--check] [--force] [--timeout TIMEOUT] [--json] [--yes]
artifactUm caminho vendorizado, ou um glob. Padrão: todos.
--into INTOO diretório de pack. Padrão: o atual.
--checkSai com código diferente de zero se alguma coisa mudou na origem. É o modo pensado para virar um gate: assim “o que vendorizamos está desatualizado” deixa de ser algo que alguém precisa lembrar de conferir.
--forceToma a cópia da origem mesmo por cima de edições locais.
--timeout TIMEOUTSegundos permitidos por clone. Existe porque a origem é a rede.
--jsonSaída para máquina.
--yesAplicar as atualizações, em vez de apenas reportá-las.
deck pack validate [dir]

Confere se um pack se sustenta, e reporta como aviso o que está faltando ou malformado — por exemplo um .claude-plugin/plugin.json ausente, que faria o Claude Code não carregar o pack como plugin. Padrão: o diretório atual. A redação do catálogo é conferida separadamente, por deck toggle validate --strict.

11.A prova — a escada de gates#

Um gate é um comando que passa ou falha, num degrau da escada. A escada do núcleo tem quatro degraus, e um pack pode inserir os seus estendendo o toggle gate_level — não editando o motor.

   gate_level:  static ──► contract ──► build ──► deploy ──► behavior
                                ▲
                                └── um pack inseriu este degrau estendendo o
                                    toggle gate_level, não o motor

   cada gate declara:  from_level · per_repo ou once · only_repos · when · timeout
                       · measures  (opcional: um número a extrair da saída)
   cada resultado é:   passed · failed · could-not-run · not-applicable
                       └─ os dois últimos sempre carregam o motivo

Os quatro degraus, e o que cada um acrescenta

Cada degrau inclui os anteriores — a escada é cumulativa, não uma escolha entre alternativas. Estas quatro linhas não são invenção desta página: são o campo impact: do toggle no catálogo do núcleo, e você as lê sem abrir arquivo nenhum com deck toggle explain gate_level.

DegrauAcrescentaQuando é a resposta certa
static Lint e checagens estáticas, e nada mais. Uma mudança que comprovadamente não altera comportamento — uma correção de documento, um comentário.
build Compila e empacota os artefatos afetados, sem tocar em nada rodando. O trabalho do dia a dia: o código muda, mas nada precisa ser instalado para você acreditar nele.
deploy Instala onde aquilo roda, e confirma que subiu. Nenhuma asserção funcional. O padrão. Prova que o artefato existe, instala e não morre ao subir — três coisas que um build sozinho não prova.
behavior Asserções contra o sistema rodando. Uma mudança num contrato publicado. É o único degrau em que “funciona” é uma medição, e não uma inferência.
contract não é do núcleo

O diagrama acima mostra cinco degraus e o núcleo declara quatro: values: [static, build, deploy, behavior]. O contract está ali como exemplo de um degrau que um pack inseriu — a rationale do toggle diz “packs may insert intermediate rungs”, e é assim que uma equipe cujo produto tem um contrato publicado ganha um degrau entre o lint e o build sem que o motor saiba o que é um contrato.

Num workspace sem pack de domínio, deck toggle explain gate_level lista quatro.

Baixar o degrau é permitido e é sempre visível: o relatório sempre diz até onde chegou, e a decisão fica no registro em vez de virar um silêncio. É a diferença entre “verificamos até o build, de propósito” e “achamos que estava verificado”.

Três propriedades foram escolhidas no lugar de funcionalidades

  1. Um gate que não rodou nunca é reportado como tendo passado.
  2. Um comando com uma variável não resolvida não roda.
  3. Toda execução deixa evidência em disco, passando ou falhando.

Isso não é uma promessa em prosa. É o que a saída mostra:

$ deck gate run --task T-2 --level build; echo $?
task T-2 · level build · 3 repositories

  ok   lint         schema                     0.0s
  ok   lint         gen                        0.0s
  ok   lint         runtime                    0.0s
     build        schema                     unresolved: ${repo.build_target}
     build        gen                        unresolved: ${repo.build_target}
     build        runtime                    unresolved: ${repo.build_target}
  --   deploy-remoto gate_level is `build`; this gate starts at `deploy`

  1 gate(s) passed in 6 run(s) · 1 could not run · 1 not applicable
  evidence: .deck/gates/T-2.json

  A gate that did not pass is never reported as passed. Fix it, or lower
  `gate_level` deliberately — the report will say which rung was reached.
1

Saída real de um workspace sintético. Três coisas aconteceram e as três estão na tela: três execuções passaram, três não puderam rodar (e o motivo é a variável exata que faltou), e uma não se aplica (e o motivo é o degrau). O código de saída é 1.

E quando não há gate nenhum declarado, o deck se recusa a reportar sucesso:

$ deck gate run --task T-1; echo $?
deck: no gate is declared, so nothing was verified.
Gates come from a pack's config/gates.yaml — check `deck packs`
resolves the pack you expect.
1

Saída real. Isso já foi diferente: a CI do próprio deck imprimia 0 gate(s) passed e saía com 0 — um checkmark verde sobre nada.

A allowlist de máquinas

Um agente com acesso ao shell alcança qualquer host que um comando nomeie. O bloco targets: do descriptor é uma allowlist, e o toggle target só aceita um valor que esteja nela:

$ deck gate run --task T-3 --level deploy; echo $?
deck: target `fora-da-lista` is not in the allowlist. Declare it under
`targets:` in the descriptor, or pick one that is.
1

Saída real. Leia §19 para o que essa allowlist não cobre — a diferença importa.

Os comandos da prova

deck gate list [--repos [REPOS ...]] [--level LEVEL] [--json]
--repos [REPOS ...]Só sobre estes repositórios.
--level LEVELSobrescreve gate_level só para esta listagem. Existe para responder “o que rodaria se eu subisse até deploy?” sem mudar a postura gravada.
--jsonSaída para máquina.

Quais gates se aplicam a esta mudança, e por quê. Ele imprime também os que não se aplicam, com o motivo — porque a lista dos que ficaram de fora é metade da resposta.

deck gate run [--task TASK] [--repos [REPOS ...]] [--level LEVEL] [--only [ONLY ...]] [--keep-going] [--dry-run]
--task TASKO nome sob o qual a evidência é gravada. Sem ele, o id da sessão.
--repos [REPOS ...]Restringe a execução a estes repositórios.
--level LEVELSobrescreve gate_level para esta execução. Baixar deliberadamente é permitido — o relatório vai dizer qual degrau foi alcançado, que é a coisa toda.
--only [ONLY ...]Rodar apenas estes gates, pelo id. Existe porque uma escada tem degraus e alguém quer reexecutar um deles depois de um conserto, sem subir a escada inteira. Cuidado: hoje --only substitui a evidência da tarefa em vez de acrescentar a ela — registrado na issue #64.
--keep-goingContinuar depois de uma falha. Por padrão a escada para no primeiro gate que falha, e os degraus acima são reportados como not attempted, com esse motivo. Esta flag existe para quando você quer o panorama inteiro de uma vez em vez do primeiro problema.
--dry-runResolve os comandos e não executa nenhum. É como você vê o comando exato, já com as variáveis substituídas, antes de deixá-lo tocar uma máquina.
deck gate report [--task TASK] [--json]

Lê de volta a evidência de uma tarefa, depois — possivelmente muito depois, e numa outra sessão. É a diferença entre “passou” como afirmação e “passou” como registro: os logs de cada execução ficam em .deck/gates/logs/<task>/.

12.A tendência — o que o gate mediu#

Um gate é um limiar, e um limiar tem um ponto cego: tudo que está dentro dele parece igual. Cobertura escorregando de 86% para 81% sob um piso de 80% passa em toda execução, e a execução que finalmente falha é a de depois que a queda terminou.

   o gate              a série
   ─────────           ──────────────────────────────────────────────
   passa / falha  +    86.1 → 84.0 → 82.7 → 81.2  em quatro execuções
   contra um           todas passaram; esse é o achado
   número que          └─ um bundle carrega isso como uma ressalva, nunca
   alguém escolheu        como um bloqueio: uma tendência sobre a qual
                          ninguém pôs um limite não pode virar um limite
                          que ninguém escolheu

Um gate declara measures: — um id, uma expressão regular, uma unidade e, opcionalmente, qual direção é melhor. O motor aplica isso aos bytes que o comando já imprimiu, nunca a uma segunda execução, que poderia discordar da primeira. Um padrão que não casa com nada não registra nada e diz isso: uma amostra faltando nunca é um zero, porque um zero pareceria uma medição que alguém tomou.

Onde a série vive é uma decisão, não um padrão silencioso: metrics_store vale workspace, shared ou off, e shared sem um diretório declarado é recusado em vez de escrito por máquina.

Os comandos da tendência

deck metrics list [--json]

Toda métrica, declarada ou já registrada, e a sua tendência. Uma métrica declarada e ainda sem amostra é listada assim mesmo, dizendo quando será medida.

$ deck metrics list
store    workspace · .deck/metrics
declared 1 measurement(s), by 1 gate(s)

  cobertura.cobertura  (gen)         cobertura
       one sample, 82.7 % on T-9 — a trend needs a second

Saída real de um workspace sintético. “a trend needs a second” é o deck se recusando a chamar uma amostra de tendência.

deck metrics show <id> [--repo REPO] [--limit LIMIT] [--json]
id<gate>.<metric>, como deck metrics list imprime.
--repo REPOSó a série tomada neste repositório. A mesma métrica em repositórios diferentes é uma série diferente, guardada num arquivo diferente — <gate>.<metric>@<repo>.jsonl.
--limit LIMITQuantas amostras mostrar. Padrão: 20.
--jsonSaída para máquina.

As amostras por trás de uma tendência, cada uma com a tarefa e o degrau em que foi tomada, mais o arquivo de onde vieram. Os arquivos são append-only: um histórico que pode ser reescrito não é evidência.

$ deck metrics show cobertura.cobertura
  when                  task             rung            value
  2026-09-07T03:10:45   T-9              build            82.7

  one sample, 82.7 % on T-9 — a trend needs a second
  Nothing here failed anything. A gate reports a threshold; this reports a direction.

13.O quadro — onde está o trabalho, e o que pode rodar junto#

Não existe protocolo de sincronização no deck, e não deveria existir. O trabalho de uma equipe já vive num rastreador que é auditado, tem permissões e sobrevive a qualquer laptop — então o rastreador é o estado compartilhado, e o deck lê dele. Jira, GitLab, GitHub, Gerrit ou um arquivo.

O que o deck acrescenta é a única coisa de que a coordenação precisa e que um rastreador não impõe: a reivindicação. deck board claim atribui uma tarefa e recusa uma que outra pessoa já segura, porque dois agentes editando a mesma cadeia produzem um merge que ninguém consegue revisar.

$ deck board claim EX-2 "outra pessoa" --yes; echo $?
deck: EX-2 is already claimed by <quem já segurava>.
  Two agents on one task produce a merge nobody can review.
  Use --force only after talking to them.
1

Saída real de um quadro em arquivo, num workspace sintético.

Uma reivindicação vale o que o rastreador diz que ela vale

O GitHub responde 201 a uma atribuição para um login que ele está prestes a descartar: o status diz que a requisição estava bem formada e só o corpo diz que ninguém foi atribuído. Foi assim que deck board claim passou a reportar uma atribuição que nunca aconteceu. A escrita agora é lida de volta: cada backend reporta o assignee que a resposta diz ter sido gravado, um nome que o rastreador descartou vira um erro que o nomeia, e uma resposta que não presta contas de nada é reportada como isso — não presumida como sucesso.

Agrupamento: o que pode rodar ao mesmo tempo

   tarefas ──► fecho de edição por tarefa ──► grafo de conflito ──► grupos ordenados

   conflito quando:  os fechos de edição se cruzam
                     as duas precisam do mesmo target  (uma bancada é exclusiva)
                     qualquer uma está marcada exclusive
                     uma tarefa não nomeia repositório  (poderia tocar em tudo)

   NÃO é conflito:   as duas apenas *alcançarem* um repositório downstream

Aquela última linha é toda a sutileza, e ela veio de ter errado primeiro. A regra inicial conflitava por alcance, e num quadro de cinco tarefas produziu cinco grupos de uma: toda tarefa alcançava a suíte fim a fim, então todo par colidia. Hoje o fecho de edição de uma tarefa é: os repositórios que ela nomeia, mais tudo que esses alcançam por impacts:, menos os que estão marcados downstream: true e que ela não nomeia diretamente.

couples: deliberadamente não é lido aqui: um acoplamento diz “revisite antes de entregar”, e uma revisita que não muda nada não colide com nada.

$ deck board plan
3 open task(s) · parallelism 2

  group 1 (parallel)
    EX-2                     ajustar o gerador
      reaches: gen
    EX-3                     revisar o runtime
      reaches: runtime, schema, gen

  group 2 (alone)
    EX-4                     manutenção da bancada
      reaches: (no repository named)

  !! EX-3 reaches gen, which EX-2 edits. If EX-3 has to update it too, name it
     in its `repos`.

  This is a plan, not a run. deck does not orchestrate agents: Claude Code
  already does that.

Saída real de um workspace sintético. Note o aviso !!: o deck não serializa por causa de um alcance, mas também não fica calado sobre ele.

Os comandos do quadro

deck board list [--json]

As tarefas que as fontes declaradas seguram, com os repositórios que cada uma nomeia. Uma leitura de rastreador segue as páginas do serviço em vez de pegar só a primeira, tem um teto (uma consulta que ninguém quis não deve segurar a CLI por centenas de requisições) e uma leitura que atingiu o teto é reportada como parcial ao lado das tarefas que trouxe.

deck board plan [--parallelism PARALLELISM] [--json]
--parallelism PARALLELISMSobrescreve o toggle board_parallelism — quantas tarefas cabem num grupo. Existe como flag porque o número certo depende da máquina de quem está rodando, e isso não é uma decisão da equipe.
--jsonSaída para máquina. É esta que o workflow /deck:board consome.
deck board show <id> [--json]

Uma tarefa: status, os repositórios que ela nomeia, o que ela alcança, e os critérios de aceite com quantos foram aceitos.

deck board claim <id> [who] [--force] [--yes]
whoSob que nome. Sem ele: $DECK_USER, depois git user.name para um quadro em arquivo e $USER para um rastreador.
--forceReivindicar uma que outra pessoa segura. O próprio texto de ajuda manda falar com ela primeiro.
--yesEnviar a escrita sem perguntar. Escrever num rastreador aparece sob o nome de alguém e outras pessoas veem, então isso é governado pelo toggle tracker_writes, cujo padrão é perguntar. Uma máquina que só deve ler põe o toggle em off e não consegue escrever de jeito nenhum.

Qual nome uma reivindicação carrega são duas perguntas, não uma. Uma reivindicação num rastreador nomeia uma conta que se autentica naquele rastreador — e um nome que o rastreador não aceita já é um erro, porque a escrita é lida de volta. Um quadro em arquivo não tem esse leitor: ele é comitado e publicado, e a única coisa que algum dia vê o nome é uma pessoa, depois, num diff público. Por isso uma reivindicação escrita num arquivo é gravada sob a identidade que aquele repositório publica — o user.name do git, lido no diretório onde o arquivo do quadro mora. Sem nada para ler, a reivindicação é recusada em vez de preenchida a partir do login.

deck board ask-plan [--stage {all,plan,implement,verify,deliver}] [--json]
--stageQual momento do trabalho. all junta todos.
--jsonSaída para máquina.

Toda decisão que o quadro aberto está esperando, perguntada de uma vez só. É o oposto de interromper alguém uma vez por tarefa.

deck board template

Um item de quadro bem formado, para copiar. Sem opções. Ele traz o briefingas_a, so_that — que é o que um agente precisa para escolher entre duas maneiras plausíveis de fazer a mesma coisa, e os acceptance, que são a definição de pronto nas palavras de quem vai julgar.

deck board done <id> [--accept CRITERION] [--force] [--yes]
--accept CRITERIONUm critério de aceite que esta mudança satisfaz, literalmente. Repetível. A comparação é por texto exato contra o que está no quadro.
--forceFechar sem evidência, ou com um gate que falhou. Existe porque há trabalho que a escada não cobre, e recusar sem saída seria uma ferramenta que se contorna por fora.
--yesEnviar a escrita sem perguntar, sob tracker_writes.
$ deck board done EX-1; echo $?
deck: no gate evidence for EX-1 — nothing has been verified under that name.
  Run it:      deck gate run --task EX-1
  Or say so:   --force, for a task the ladder does not cover
1

Saída real.

O que isto não garante

Os critérios de aceite são texto livre. O deck confere que eles foram marcados como aceitos, comparando a string exata — ele não tem como conferir que foram cumpridos. E uma tarefa vinda de um rastreador não carrega critério nenhum, então essa guarda simplesmente não tem o que segurar (issue #15). O bundle diz isso em voz alta em vez de omitir.

deck board new <title> [--repos [...]] [--id ID] [--ext PROVIDER:ID] [--body BODY] [--to TO] [--exclusive] [--yes]
--repos [REPOS ...]Os repositórios que a tarefa edita. É o que alimenta o fecho de edição e, portanto, o agrupamento.
--id IDO id, quando você quer escolher em vez de deixar o rastreador nomear.
--ext PROVIDER:IDA identidade que este trabalho tem em outro sistema — por exemplo jira:PROJ-412. Existe porque uma peça de trabalho frequentemente vive em dois lugares, e um deles não é onde o deck lê.
--body BODYO corpo da tarefa.
--to TOPara qual tipo de fonte escrever, quando há mais de uma declarada.
--exclusiveMarca que ela precisa rodar sozinha. É a saída de emergência do agrupamento para o trabalho que o fecho de edição não descreve — manutenção de bancada, uma migração.
--yesEnviar a escrita sem perguntar, sob tracker_writes.

O que o deck reporta é a url ou a chave que o rastreador deu à tarefa nova — nunca uma palavra substituta para algo que ele não nomeou.

deck board whoami

Para cada fonte, qual conta agiria, qual nome seria escrito, e de onde esse nome veio. Sem opções. Ele nunca imprime o token.

$ deck board whoami
  type       host or repo             token     from            user
  tasks      docs/board.yaml          n/a       git user.name   ...

  A token is resolved at call time: $DECK_TOKEN_<TYPE>, then the
  conventional variable, then ~/.netrc, then a `token_command` the
  descriptor names. It is never read from the descriptor itself.
deck board why <a> <b>

Por que duas tarefas não podem rodar juntas — ou a confirmação de que podem. Existe porque um agrupamento sem explicação é uma decisão que ninguém consegue contestar.

$ deck board why EX-1 EX-3
EX-1 and EX-3 must not run together: both would edit gen, schema

$ deck board why EX-2 EX-3
EX-2 and EX-3 can run at the same time

14.A entrega — o bundle de prontidão para merge#

deck bundle é a última coisa porque lê todas as outras. Ele monta numa página o registro dos gates, a cadeia de impacto, as camadas de toggle com a razão gravada ao lado de cada uma, as consultas e o git. Ele deriva tudo e afirma nada: cada alegação nomeia o arquivo de onde veio.

O que ele diz, explicitamente:

  • quais repositórios a mudança alcançou, e quais deles terminaram sem commit nenhum;
  • qual degrau a escada alcançou, quais degraus ela nunca tentou, e quais não têm gate algum — um degrau ao qual a escada subiu e encontrou vazio é uma lacuna de cobertura, não um degrau alcançado;
  • e, separadamente, os degraus cujos gates foram todos pesados contra esta mudança e considerados não aplicáveis, com o motivo que cada um deu — porque no primeiro caso ninguém declarou um gate e no segundo alguém declarou, e isso é uma diferença;
  • quais decisões estavam em vigor, de onde veio cada valor, e por que quem escolheu escolheu — ou que ninguém escreveu razão nenhuma;
  • o que continua sem commit ou ainda colocado num diretório de trabalho;
  • e, para cada um desses, o arquivo de onde a alegação veio.

Ele sai com código diferente de zero enquanto qualquer coisa estiver no caminho, para que um pack que queira prontidão de merge imposta possa declarar um gate que o execute.

$ deck bundle --task T-9
T-9

  NOT READY — 2 things in the way

  !! nothing has been verified under this name
       deck gate run --task T-9
  !! no commit is attributable to this task, so the change set is unknown
       — not empty
       commit naming T-9 in the message, or pass --since <timestamp>

  .. no declared board holds T-9, so nothing says which repositories it names

what was decided
    target                 bancada.example.com   from workspace
       why  a única bancada declarada

where each claim comes from
  the change set           git log, in each repository listed above
  verification             nothing recorded under this task
  decisions                deck toggle explain <id>
  what it cost             deck cost --task T-9

Saída real. Repare em “the change set is unknown — not empty”: o deck se recusa a reportar ausência de commits como ausência de mudanças.

deck bundle [--task TASK] [--since SINCE] [--markdown] [--write] [--json]
--task TASKA tarefa. Sem ela, o id da sessão.
--since SINCEAtribuir commits por este timestamp em vez de pelo primeiro mount da tarefa. Existe por causa de uma limitação real: o bundle atribui um commit a uma tarefa exatamente quando a mensagem a cita, que é o que o toggle requirement_link: required já pede. Com esse toggle em off, a base passa a ser a janela do mount — todo commit feito num repositório alcançado enquanto a tarefa esteve montada, por quem quer que seja. O bundle diz qual das duas bases usou.
--markdownRenderiza para um pull request em vez de para o terminal.
--writeSalva o markdown em .deck/bundles/. Esse arquivo é derivado do resto — reexecute em vez de editá-lo.
--jsonSaída para máquina, carregando também a razão de cada decisão como reason.

15.A conta — quanto custou#

   transcript (~/.claude/projects/<project>/<session>.jsonl)
        │  uso por mensagem: input · output · cache write · cache read
        │  deduplicado por id de mensagem — uma mensagem em streaming aparece duas vezes
        ▼
   tokens  ──── exato ─────────────────────────────► reportado como fato
        │
        └── × tabela de preços ── estimativa a preço de tabela ──► rotulada como estimativa
                                       ▲
   status line ── cost.total_cost_usd ──┘ mostrada ao lado, e sinalizada
                  (o número do próprio Claude Code)  quando as duas divergem >10%

Os tokens são exatos, lidos do transcript da sessão. Os dólares são uma estimativa a preço de tabela, e o relatório diz que são. Onde o número do próprio Claude Code está disponível, o deck o trata como autoritativo e mostra a sua estimativa ao lado.

A janela de uma tarefa vem do que o deck já registra: um mount a abre, uma execução de gates a fecha. Nenhum dos dois existe para medir custo — que é exatamente por que a medição é confiável.

deck cost [--task TASK] [--since SINCE] [--until UNTIL] [--session SESSION] [--all-sessions] [--any-project] [--json]
--task TASKUsa a janela que um mount e uma execução de gates registraram. É a forma normal.
--since SINCETimestamp ISO de início, para uma janela que você define.
--until UNTILTimestamp ISO de fim.
--session SESSIONUm id de sessão. Sem ele, esta sessão.
--all-sessionsTodo transcript, não só o desta sessão. Uma tarefa pode atravessar sessões.
--any-projectNão restringir a este workspace. Existe por causa de uma armadilha real, descrita abaixo, e reporta também o que outros projetos gastaram — que quase nunca é o que você quer.
--jsonSaída para máquina.

Os agentes de um workflow escrevem os seus transcripts sob o diretório de projeto da sessão que os lançou, não do workspace em que trabalharam. Rode um quadro de um workspace a partir de um terminal que está em outro, e o custo aterrissa no segundo. O deck lê caminhos; ele não enxerga intenção. Conduza a execução de dentro do workspace a que ela se refere, ou passe --any-project e leia a janela você mesmo.

Quando não há transcript, o deck diz isso em vez de reportar zero:

$ deck cost --task TOUR-1
deck: no session of this workspace has a transcript yet (~/.claude/projects/...)
  Sessions opened elsewhere are not counted. Use --any-project to widen,
  which reports what other projects spent and is almost never what you want.

Saída real de ./docs/tour.sh. Uma janela vazia é a resposta honesta; um zero não seria.

16.As perguntas — consultas#

Uma consulta é a quinta saída de §2: algo que não é fato, nem invariante, nem decisão, nem prova. Um agente escreve a pergunta, continua trabalhando, e uma pessoa responde depois. A resposta sobrevive à sessão que a levantou e é citada no bundle que um revisor lê.

Nada espera por ela. O próprio deck diz isso ao registrar: “diga no seu relatório o que você fez enquanto isso, e o que mudaria se a resposta for para o outro lado”. Uma consulta é um registro, não um bloqueio.

deck ask new <question> [--task TASK] [--context CONTEXT] [--options OPTIONS] [--json]
questionA pergunta, nas suas palavras.
--task TASKA tarefa que a levantou, para que ela apareça no bundle daquela tarefa.
--context CONTEXTO que uma pessoa precisa saber para responder. É a diferença entre uma pergunta respondível em dez segundos e uma que fica parada.
--options OPTIONSSeparadas por vírgula, quando a escolha já é estreita. Elas viram os valores padrão se a consulta depois virar um toggle.
--jsonSaída para máquina.
deck ask list [--resolved] [--all] [--json]
(sem flag)O que está esperando uma pessoa.
--resolvedO que já foi respondido, com a resposta.
--allAs duas coisas.
--jsonSaída para máquina.
deck ask show <id> [--json]

Uma consulta inteira: a pergunta, o contexto, as opções, quem perguntou e quando, e — se houver — a resposta, quem respondeu e quando.

deck ask resolve <id> <answer> [--who WHO]
--who WHOQuem respondeu. Fica gravado junto e viaja tão longe quanto um assignee: viaja: a consulta sobrevive à sessão por projeto, é lida pela execução seguinte e é citada no bundle.

Ao responder, o deck diz o que aquilo provavelmente quer virar — e diz também por que ainda não virou:

$ deck ask resolve <id> "renovar o token no início do job"
  This answer is a transcript until someone writes it down.
  It probably wants to become: toggle — it had named options, so it may be
  a decision that recurs

  Fold it:   deck ask fold <id> --as <rule|toggle|gate> --into <pack>
  Until then the next run has to ask again.

Saída real.

deck ask fold <id> --as {rule,toggle,gate} --into INTO [...]

Escreve uma consulta respondida dentro de um pack, carregando a pergunta e a resposta, para que o raciocínio sobreviva à sessão que o produziu. Qual das três naturezas ela vira continua sendo julgamento de uma pessoa — se uma resposta recorre não é algo que se saiba de uma única ocorrência, e esse julgamento é a diferença entre conhecimento e transcrição. O deck nunca dobra uma consulta por conta própria.

--as {rule,toggle,gate}Obrigatório. As três naturezas de §2 em que uma resposta pode se transformar. A quarta, fato, não aparece aqui porque um fato vai para o descriptor e não para um pack.
--into INTOObrigatório. O diretório do pack de que ela passa a fazer parte.
--title TITLEComo chamá-la. Padrão: a própria pergunta.
--paths PATHSrule: um glob a que ela se aplica; repetível, e obrigatório. Obrigatório porque uma regra sem paths: custa contexto em toda leitura de arquivo do repositório inteiro.
--text TEXTrule: o texto da regra. Padrão: a resposta, literal.
--command COMMANDgate: o que uma máquina executa para conferir aquilo.
--from-level FROM_LEVELgate: o degrau em que ele começa.
--gate-id GATE_IDgate ou toggle: o id. Padrão: derivado do título.
--values VALUEStoggle: separados por vírgula. Padrão: as opções da consulta.
--group GROUPtoggle: quality, build, security, delivery, docs ou agent.
--impact IMPACTtoggle: <valor>=<o que escolher isso significa>, uma vez por valor. É a frase que faz um toggle ser respondível por quem não estava na conversa.
--default DEFAULTtoggle: o valor escolhido. Padrão: o que a resposta nomeia.
--header HEADERtoggle: 12 caracteres ou menos. O texto de ajuda diz que isso torna o toggle askable; a issue #70 registra que hoje não torna.
--againDobrar a mesma consulta uma segunda vez, num outro pack. Sem ela, uma consulta já dobrada é recusada.

Uma regra dobrada sai assim, com a proveniência em comentários:

---
paths: ["servicos/**"]
---

# renovação do token antes do job

renovar o token no início do job

<!-- Folded from consultation 20260907-... -->
<!-- Question: o refresh token expira antes do job noturno; renovar ou alongar? -->
<!-- Answered 2026-09-07T03:10:22 by equipe de plataforma: ... -->

Arquivo real gerado por deck ask fold --as rule num workspace sintético.

17.Onde o modelo entra, e onde não entra#

A pergunta mais comum sobre o deck é se ele conduz um agente. Não conduz, e a linha vale ser traçada com precisão, porque “uma ferramenta de IA” é exatamente a descrição que deixa as pessoas sem saber o que instalaram.

    o que um parser deriva              o que só julgamento produz
    ────────────────────────            ────────────────────────────
    quais repositórios existem          quais repositórios uma mudança
    o que um manifesto faz checkout       obriga você a tocar
    qual é o comando de um gate         como redigir uma decisão para que
    qual pack reivindica um nome          um colega consiga respondê-la
    quanto uma sessão custou            o que o código deve ser

    o deck computa isso.                Uma pessoa decide isso — ou, para
    Determinístico, auditável,          os dois primeiros apenas, pede um
    a mesma resposta duas vezes.        RASCUNHO a um modelo.
                                        O terceiro nunca é do deck.

O deck chama um modelo em exatamente um lugar no código-fonte, assist.py, alcançado por exatamente três comandos. Não existe um quarto. O deck nunca pede a um modelo que escreva o seu código, rode o seu build, edite o seu descriptor ou decida qualquer coisa.

ComandoRascunhaPor que um parser não consegue
deck propose impactsas arestas impacts e os pares couples:Um manifesto declara um checkout, nunca uma propagação. A dependência está em imports, código gerado e schemas publicados.
deck propose toggleuma entrada de catálogoRedigir uma decisão para que alguém a responda em dez segundos é escrita, não parsing.
deck propose packos gates, regras e toggles de um repositório, mais as perguntas que ele não soube responderQuais comandos um projeto já roda é descobrível; quais das suas convenções nenhum comando confere, e o que quebra quando uma delas é atravessada, é julgamento sobre um código.

As quatro restrições sobre essa única chamada

  1. Desligado por padrão. O toggle ai_assist vale off (recusa), ask (recusa sem --yes) ou allow. É um toggle, e não uma flag, deliberadamente: um comando dedicado a ele seria o caso especial que mina o mecanismo do qual as outras 26 decisões do catálogo dependem. Ele carrega askable: false — é política, e política não é algo que um agente apresenta a você no meio de uma tarefa.
  2. Somente leitura, imposto pelo runtime. A execução recebe Read, Grep e Glob, e nada mais. Sem Write, sem Edit, sem Bash. Um prompt é uma sugestão; isto não é.
  3. Com teto de custo. --budget, cujo padrão é US$ 1.50. Um laço descontrolado não pode faturar em cima de você.
  4. Escreve uma proposta, nunca uma edição. O resultado vai para .deck/proposals/, nunca para o descriptor. Uma ferramenta que reescreve em silêncio o arquivo que descreve como o seu sistema propaga mudança é uma ferramenta que ninguém deveria instalar.
Isto custa dinheiro de verdade

deck propose faz uma chamada paga a um modelo. Toda execução reporta quanto custou. --show-prompt mostra exatamente o que seria perguntado e não custa nada — use antes. Proponha dois ou três repositórios por vez: uma execução sobre uma dúzia é cara e mais difícil de revisar, e revisar é o ponto.

Um rascunho não pode transformar uma pergunta em decisão

deck propose pack classifica o que encontra em gates, regras e toggles. Existe um quarto desfecho, e deixá-lo de fora custou algo real: um rascunho encontrou dois caminhos de código devolvendo códigos de status diferentes para a mesma classe de recusa, escreveu nas próprias notas que não sabia dizer se aquilo era intencional ou deriva, e arquivou como toggle. Arquivado como toggle, aquilo se lê como “nós escolhemos”, e a dúvida desapareceu no momento em que ela valia mais.

Por isso um rascunho de pack tem uma lista questions ao lado de toggles, e deck propose apply registra cada entrada como uma consulta. O toggle de um rascunho carrega um bloco defends, uma linha por valor dizendo por que uma equipe escolheria aquele — e apply recusa o rascunho inteiro quando um toggle não defende todos os valores que nomeia, ou quando o mesmo achado aparece como toggle e como algo que o rascunho não soube explicar.

Os comandos da proposta

deck propose impacts [--repos [REPOS ...]] [--budget BUDGET] [--show-prompt] [--yes]
--repos [REPOS ...]Propor só para estes repositórios — mais barato, e mais fácil de revisar.
--budget BUDGETTeto rígido de custo em USD. Padrão: 1.50.
--show-promptImprime o que seria perguntado e para. Grátis.
--yesExecutar sem perguntar — o que ai_assist: ask exige.

O rascunho de impacts tem os dois tipos de aresta para escrever, e o que os separa não é gosto: um acoplamento custa uma citação por direção, em dois campos da proposta, porque ele não reivindica ordem e seria de outro modo a resposta cômoda para todo par que o rascunhista não conseguiu decidir. Evidência de um lado e palpite do outro é uma aresta comum mais uma nota unsure, e o palpite volta para você. Um rascunho que nomeia o mesmo par nas duas direções é aplicado como o acoplamento que é — enquanto as mesmas duas arestas impacts: escritas à mão continuam sendo um ciclo, porque alguém pode digitá-las e querer dizer aquilo.

deck propose toggle <decision> [--budget BUDGET] [--show-prompt] [--yes]
decisionA decisão, nas suas palavras.
--budget, --show-prompt, --yesIguais aos de propose impacts.
deck propose pack <repo> [--no-neighbours] [--budget BUDGET] [--yes] [--show-prompt]
repoO repositório a ser lido.
--no-neighboursLer só este repositório, e não os que o grafo conecta a ele. Por padrão os vizinhos são lidos, nas duas direções — o que este repositório alcança e o que alcança este, e também o outro lado de um par couples: —, porque metade do que se quer saber sobre um repositório está escrita no vizinho. Um vizinho é evidência para o rascunho, nunca um assunto para o qual rascunhar; e um repositório não é vizinho de si mesmo. Esta flag existe para quando ler os vizinhos é caro ou desnecessário.
--budget BUDGETTeto rígido em USD. Padrão: 1.50.
--yesPermitir a chamada quando ai_assist está em ask.
--show-promptImprime o que seria perguntado e para. Grátis.
deck propose apply <file> [--into INTO] [--confidence {high,medium,low}] [--yes]
fileUm arquivo sob .deck/proposals/.
--into INTOO diretório de pack em que uma proposta do tipo pack escreve.
--confidence {high,medium,low}A confiança mínima a aceitar. Padrão: medium. Existe porque a proposta rotula cada achado, e um piso de confiança é como você aceita a parte sólida sem aceitar a parte incerta.
--yesEscrever, em vez de só mostrar. Há uma inconsistência registrada aqui — issue #2: apply escreve um pack sem --yes e só escreve impacts com ele.

Aplicar é um comando separado, com piso de confiança, executado por uma pessoa que leu a proposta — inclusive a lista unsure, onde o modelo registra o que não conseguiu verificar.

18.Diagnóstico e superfícies#

deck doctor [--net]
--netTambém testa a alcançabilidade dos targets por SSH e lê cada quadro de rastreador. Separado porque toca a rede, e uma verificação de saúde que depende da rede não é a que você quer rodar cem vezes por dia.

A primeira coisa a chamar quando algo está estranho. Ele nunca conserta nada sozinho, e todo problema que ele reporta vem com o comando ou a edição que o resolve — uma mensagem que nomeia uma condição sem um próximo passo está inacabada.

$ deck doctor
workspace
  OK root ...  ($DECK_ROOT)
  OK descriptor present  4 repositories, 0 target(s)

impact graph
  OK references  every target exists in the descriptor
  OK acyclic  topological order computable

targets (allowlist)
  !! none declared  gate_level = deploy needs one — deployment and behaviour
                    gates are unavailable

toggles
  OK catalog  28 toggles, 5 profiles

5 warning(s):
  !! api-schema: no origin remote
  ...
  !! no target declared

Saída real de ./docs/tour.sh, recortada. “28 toggles” ali são as 27 do núcleo mais a que o pack do tour acrescenta.

doctor também reporta o caso de auto-hospedagem: quando o deck em execução resolve para dentro do workspace que ele está administrando. Um agente editando o motor muda o binário que está rodando, incluindo o que rodaria os gates que pegariam a quebra — e uma edição pela metade não falha alto, ela desabilita a coisa que teria avisado.

deck console [-c COMMAND]
-c, --command COMMANDRoda um comando e sai, em vez de abrir o REPL. É como um script usa o console sem uma sessão interativa.

Um REPL do plano de controle. Aceita os mesmos comandos sem o prefixo deck.

deck ui [--width WIDTH] [--popup] [--no-agent] [--agent-cmd AGENT_CMD] [--session SESSION] [--detach] [--dry-run]
--width WIDTHLargura do console, em %. Padrão: 40.
--popupUm popup sobreposto, que deixa o layout intacto. Para uma consulta rápida sem reorganizar os painéis.
--no-agentAbre só o console, sem o painel do agente.
--agent-cmd AGENT_CMDO comando do painel esquerdo, quando não é o padrão.
--session SESSIONO nome da sessão tmux.
--detachCria a sessão sem se anexar a ela.
--dry-runImprime os comandos tmux e sai. Útil quando o layout não é o que você esperava e você quer ver o que seria executado.

Precisa de tmux. É a única parte do deck que precisa.

deck statusline [--settings] [--demo] [--no-color]
--settingsImprime o trecho de configuração para colar no .claude/settings.json. Existe para que ligar isso não exija consultar documentação.
--demoRenderiza com dados de sessão de exemplo, para você ver como fica antes de ligar.
--no-colorSem sequências ANSI.

Duas ou três linhas dentro da própria janela do Claude: qual workspace, qual perfil, até onde esta entrega verifica, e o que ainda está esperando ser perguntado.

19.O que o deck impõe, e onde ficam suas fronteiras#

Uma regra chega ao agente como texto no contexto, e um agente pode ignorá-la. Isso vale para toda ferramenta que instrui um modelo, e não é o que separa uma da outra. O que separa é o que é imposto por código, e essa lista é curta e verificável:

ImpostoOnde
O toggle target só aceita um host declarado em targets:Recusado antes de o comando do gate ser construído, em deck gate run
Um gate com uma variável não resolvida não rodaReportado como could not run, com o nome da variável
Um gate que não rodou nunca vira “passou”Quatro desfechos distintos, e os dois negativos carregam o motivo
Nada é apagado que o deck não tenha colocadoConferência de hash no unmount — e o que foi editado é reportado, nunca deletado
Nada some sem ter sido levado de volta primeirodeck doctor reporta o que ainda não passou pelo deck save
Um pack não sobrescreve uma entrada do núcleo por acidenteColisão sem overrides: true é recusada
Uma tarefa já reivindicada por outra pessoa é recusadadeck board claim, com a escrita lida de volta
Um nome reivindicado por dois packs de uma coleção é recusadoEscolher um seria adivinhar a ordem que o filesystem devolveu

Registrar a arquitetura, e não calculá-la, é escolha

O deck registra como uma mudança se propaga — impacts:, couples:, role, downstream — e não a calcula. Não pode: o motor nunca ouviu falar de um import, de um alvo Bazel ou de uma receita, e dar-lhe esse conhecimento seria exatamente o que a separação motor/pack existe para manter de fora. Uma palavra de domínio no código do motor é bug.

Isso não deixa a imposição de fora — deixa-a no seu domínio. O comando de um gate resolve ${repo.impacts}, então um pack roda o que quer que calcule dependências de verdade no seu ecossistema e reprova quando a aresta declarada e a observada discordam:

gates:
  - id: arestas-reais
    title: o grafo declarado bate com o observado
    from_level: static
    per_repo: "import-linter --config .importlinter --target ${repo.impacts}"

go list, bitbake -g, madge, jdeps — o mecanismo é o mesmo. O deck não sabe qual é o seu; o seu pack sabe.

Critérios de aceite são texto livre

O deck confere que um critério foi marcado como aceito, comparando a string exata — não que ele foi cumprido. E uma tarefa vinda de um rastreador não carrega critério nenhum, então a guarda não tem o que segurar. O bundle diz isso em vez de silenciar: “the task declares no acceptance criteria, so nothing states what it was for”.

Onde o deck ainda não foi

Três coisas que nenhuma quantidade de teste substitui, e que dizem mais sobre a idade do projeto do que sobre o desenho:

OndeO que existe hoje
Execução autônoma com algo em jogoO workflow /deck:board rodou fim a fim num quadro-caixa-de-areia: onze agentes, quatro grupos, tudo comitado e verde. Nunca foi apontado para um workspace do qual alguém dependa.
Rastreadores além do GitHubO GitHub é exercitado contra o serviço real. Jira, GitLab e Gerrit apenas contra um dublê local — escrito a partir do que aquelas APIs documentam, não do que o deck envia.
Release e distribuiçãoVersionamento, empacotamento e publicação de artefato mal são modelados: push_policy e changelog são tudo.

O que é defeito ou lacuna acionável não mora nesta página — mora no issue tracker, onde pode ser discutido, priorizado e fechado. Uma página que lista pendências envelhece; um tracker é feito para isso.

Três coisas que são propriedade, não pendência

PropriedadePor que é escolha
Nenhum orçamento sobre uma tendênciaUma tendência que reprova uma entrega vira um limiar — e um que ninguém escolheu. A série é reportada com direção e mantida apartada do julgamento.
Nenhuma memória entre tarefasA única coisa que atravessa tarefas é a série de métricas, e ela é deliberadamente só números: nenhuma lição, nenhum contexto, nada que um agente pudesse confundir com conselho.
Gates provam o que afirmam, e nada maisUma execução longa pode passar em todo gate que existe e ainda assim derivar, porque nenhum laço vigia o vigia. A escada precisa ser estendida à medida que o trabalho ensina o que ela deixou passar; deck pack review reporta o gate que rodou e nunca pegou nada.

20.Estado do projeto#

A tabela abaixo separa o que foi construído e exercitado do que foi escrito e ainda não provado, e do que está desenhado e não construído. É a única distinção que importa para decidir se vale o seu tempo.

Quantas issues estão abertas, e de que tipo, está no tracker — que é onde isso vive e onde está sempre certo. Um número escrito aqui envelheceria sozinho, e um número errado numa página é pior que nenhum.

Construído e testadoEscrito, ainda não provadoDesenhado, não construído
Resolução de workspace · importadores de registry · grafo de impacto · scopes · toggles e perfis · criação, composição e vendorização de packs · mount · escada de gates · medições ao longo do tempo · planejamento de quadro · o bundle de prontidão para merge · relatório de custo · console, status line e superfície tmux O workflow /deck:board contra um workspace do qual alguém dependa — ele rodou fim a fim duas vezes, num quadro-caixa-de-areia. Rastreadores além do GitHub, exercitados só contra o dublê local. Packs dinâmicos: artefatos escopados por tarefa que um agente escreve e um humano promove. RAG/CAG: declarar qual fonte de conhecimento vale para qual repositório.

Como o projeto se verifica

O deck se verifica com o próprio mecanismo. São seis gates, em ordem de escada — commit-shape, lint, catalog, docs, smoke, tour — declarados em _workspaces/all/default/config/gates.yaml de deck-ai-packs:

./plugins/deck/bin/deck gate run --task <sua-branch>

A suíte constrói workspaces sintéticos em diretórios temporários, então roda em qualquer lugar e não toca em nada que seja seu:

$ ./ci/smoke.sh
-----------------------------------------------
711 checks, 0 failures

Número lido da execução, não de memória. É o total no commit em que esta página foi escrita.

Um dos seis gates é sobre esta documentação: ci/docs-cover.py reprova quando um documento nomeia um comando que a CLI não tem, quando a CLI tem um comando que documento nenhum nomeia, quando um documento aponta para um arquivo que não existe, ou quando um documento declara um total de checagens diferente do que a suíte tem. Foi escrito porque este projeto publicou um total errado quatro vezes num único dia de trabalho — é um número, é conferível, e pela regra do próprio projeto isso faz dele um gate e não um hábito.

Vale registrar o escopo: esse gate lê os seis documentos em inglês. Esta página em português não está sob ele — os comandos e as saídas aqui foram verificados executando cada um deles, o que é o mesmo padrão, mas aplicado à mão.

As regras que o deck impõe a si mesmo

Elas moram em _workspaces/all/default/rules/ de deck-ai-packs e são o melhor retrato do que a ferramenta acredita:

  • Nunca declare um número que você não mediu. Nada de “tipicamente três repositórios”, nada de porcentagem inventada. Se não foi contado, do código ou de uma execução, não entra.
  • Diga o que não aconteceu. Um gate que nunca rodou é reportado, não omitido. Um stub é rotulado como stub. Um resultado parcial é parcial na primeira frase, não numa ressalva no fim.
  • Comentários carregam a razão, não a repetição. Um comentário dizendo o que a próxima linha faz é ruído. Escreva o que um leitor não consegue recuperar: por que isto e não a alternativa óbvia, o que quebrou quando foi feito do outro jeito.
  • Um defeito corrigido vem com a checagem que o teria pego, no mesmo commit — e a checagem tem de ser mostrada falhando sem a correção.
  • Leia o código de saída, não o do pipe. cmd | tail -3; echo $? devolve o status do tail, que é sempre 0. Toda afirmação falsa de “sai com 0” na história deste repositório veio dessa linha.
  • Nada de um workspace que não é seu para publicar. O deck é desenvolvido contra workspaces reais de empregadores e clientes; nada disso entra numa issue pública — nem nomes de organização ou produto, nem hostnames internos, chaves de projeto, ids de ticket ou nomes de usuário. Até o idioma conta: uma mensagem de erro no idioma errado identifica uma instância tão bem quanto um hostname.

21.É para você?#

Provavelmente sim, se…Provavelmente não, se…
  • uma mudança sua toca dois ou mais repositórios com frequência, e esquecer um deles já custou uma noite;
  • revisar a saída de um agente cansa porque você refaz o raciocínio dele em vez de conferir fatos;
  • a mesma decisão volta em toda tarefa e a resposta depende de quem perguntou;
  • você quer que “verificado” seja um registro em disco, e não uma afirmação;
  • você já usa Claude Code e quer estender o que ele sabe, não substituí-lo.
  • você quer que a ferramenta calcule a sua arquitetura: ela registra as arestas e roda o que você declarar para conferi-las (§19), mas não lê o seu código para descobri-las;
  • você quer um orquestrador de agentes: isso é o Claude Code, e o deck deliberadamente não constrói um;
  • você quer conhecimento de domínio pronto de fábrica: o deck traz um motor e nenhum comando seu;
  • você precisa de um produto maduro: o deck é novo, e a página de releases diz quão novo melhor do que esta frase diria;
  • você trabalha num repositório só e a cadeia inteira já cabe numa cabeça.

O que fazer em seguida

  1. Rode o tour. Ele constrói um workspace de quatro repositórios e um pack do zero num diretório temporário, e caminha de deck pack new até uma entrega verificada com a evidência em disco. Não precisa de configuração e não toca em nada que é seu.
    git clone https://github.com/devfilipe/deck.git ~/tools/deck
    ~/tools/deck/docs/tour.sh
  2. Classifique o material que você já tem pelas quatro naturezas de §2. A maioria dos guias de estilo é três documentos em um: uma configuração de formatador que ninguém extraiu, um punhado de invariantes de verdade, e uma lista de decisões que nunca foram escritas como tal.
  3. Mova tudo que é mecânico para gates primeiro. É a vitória mais barata e faz você parar de pagar contexto por isso.
  4. Escreva as arestas. Sem elas o grafo não responde nada, e o grafo é o que um agente não consegue descobrir sozinho.
  5. Estenda a escada toda vez que algo passar por ela. Um defeito que um gate não pegou é um gate que você ainda não tem. Este é o passo que importa ao longo de um ano: uma escada que nunca cresce é uma escada que mede menos a cada mês.

22.Casos de uso, com os comandos de cada um#

Sete situações que aparecem de verdade. Cada uma traz a sequência exata, e o que muda em relação às outras — porque o que separa os casos não é o comando, é a decisão que vem antes dele. Comece pelo caso 0 se o seu projeto ainda não usa deck.

0 · Trazer um projeto que não usa deck

O caso mais importante, e aquele em que quase todo mundo erra pela mesma razão: tenta escrever o pack inteiro antes de rodar qualquer coisa. Não escreva. O laço do caso 5 preenche o pack sozinho, tarefa a tarefa. O que você tem que fazer no primeiro dia é bem menos que parece.

Passo 1 — deixe o deck ler o que já existe.

   mkdir ~/work/xyz-ai-packs && git -C ~/work/xyz-ai-packs init

   cd ~/work/xyz                 ◄── a raiz onde seus repositórios já estão
   deck setup --packs-root ~/work/xyz-ai-packs/packs --create-packs
1  What is in this workspace?
     3 git repositories found:  api · web · worker

2  Where will the knowledge live?
     Creating a pack collection at ~/work/xyz-ai-packs/packs.

3  Writing the descriptor
     .../packs/_workspaces/xyz/default/workspace.yaml   ◄── versionado, é do time
     ~/.deck/workspaces/xyz/machine.yaml                ◄── só seu, nunca versionado

4  Linking packs to repositories, by name
     linked   api      .../packs/_repos/api
     linked   web      .../packs/_repos/web
     linked   worker   .../packs/_repos/worker
     shared   (every repository)   .../packs/_workspaces/xyz/default

5  What only you can fill in
     1. The `impacts` edges. A manifest declares a checkout, never a propagation.
     2. The `targets` allowlist.

O registro o deck deriva; ele lê repo, .gitmodules ou o campo workspaces de um package.json, e cai em “diretórios que são repositórios git” quando nenhum deles serve.

Passo 2 — as arestas. É a única coisa que ninguém deriva por você.

   # no descriptor: packs/_workspaces/<nome>/default/workspace.yaml
   repos:
     api:    { path: api,    impacts: [web] }   ◄── mudar api obriga a revisitar web
     web:    { path: web,    impacts: [] }
     worker: { path: worker, impacts: [] }

   deck impact api        ◄── confira que a cadeia é a que você tem na cabeça

Um manifesto declara um checkout, nunca uma propagação. Se você não tem certeza, deck propose impacts --repos api web rascunha — mas custa dinheiro e produz proposta, não edição.

Passo 3 — um gate que você já tem. Um, não seis.

   # em ~/work/xyz-ai-packs/packs/_workspaces/all/default/config/gates.yaml
   gates:
     - id: lint
       title: o lint que você já roda
       from_level: static
       per_repo: "npm run lint"        ◄── o comando que você já digita hoje

   deck gate run --task PRIMEIRA --level static

Isto é o primeiro valor real, e chega antes de qualquer regra existir: o comando que você já rodava agora deixa evidência em disco, por repositório, com o degrau alcançado dito em voz alta.

Passo 4 — versione a coleção, e só então convide alguém.

   cd ~/work/xyz-ai-packs && git add -A && git commit && git push

   # cada colega, uma vez:
   git clone <xyz-ai-packs>
   deck init            ◄── semeia o .deck/ da máquina dele
   deck doctor          ◄── e diz o que ainda falta na máquina dele
O que NÃO fazer no primeiro dia

Não escreva regras. Não preencha os 27 toggles. Não crie um pack por repositório com conteúdo. Uma regra escrita antes de doer é um palpite sobre o que a IA vai errar — e você paga contexto por ela em toda leitura de arquivo que casar. Deixe a primeira regra nascer do caso 5: a IA erra, você corrige, o deck save leva a correção para a coleção, e aí ela existe porque foi necessária.

   dia 1     registro + arestas + 1 gate            ← o mínimo que dá valor
   dia 3     a IA errou algo duas vezes → 1ª regra
   semana 2  uma decisão que volta sempre → 1º toggle
   mês 2     um pack por repositório, com o que aquele repositório ensinou

   o pack cresce pelo uso, não pelo planejamento

1 · Corrigir um documento

O caso mais comum, e aquele em que a escada inteira é desperdício.

   deck mount --task DOC-3 --repos api --no-expand
        │      └─ --no-expand: um README não propaga; não arraste os vizinhos
        ▼
   (a sessão trabalha)
        ▼
   deck gate run --task DOC-3 --level static
        │      └─ lint e nada mais. O relatório DIZ que parou no static,
        │         então a decisão fica no registro
        ▼
   deck unmount --task DOC-3

Sem save: nada de conhecimento novo apareceu. Sem bundle: não há cadeia para um revisor reconstruir.

2 · Mudar um schema que três repositórios consomem

O caso para o qual o deck existe. A pergunta não é como mudar, é o que mais tem que mudar junto.

   deck impact api-schema        ◄── PRIMEIRO. Antes de tocar em qualquer coisa
   ┌────────────────────────────────────────────────────┐
   │ 1. api-schema   2. api-server   3. web-client       │
   │ 4. e2e-suite    (downstream — acompanha, não gera)  │
   └────────────────────────────────────────────────────┘
        ▼
   deck toggle ask-plan --stage plan
        │      └─ o que ainda precisa ser decidido, como perguntas prontas.
        │         Num contrato publicado, `api_compat` é uma delas
        ▼
   deck mount --task API-7 --repos api-schema --brief "campo `cursor` em /items"
        │      └─ SEM --no-expand: os quatro são montados, não um
        ▼
   (a sessão trabalha, na ordem que o impact deu)
        ▼
   deck gate run --task API-7 --level behavior
        │      └─ contrato publicado é o único caso em que "funciona"
        │         precisa ser medido contra o sistema rodando
        ▼
   deck save --task API-7   ·   deck bundle --task API-7   ·   deck unmount --task API-7

3 · Um hotfix, com a escada baixada de propósito

Produção caiu. Você vai cortar caminho — a questão é que o corte fique escrito.

   deck mount --task FIX-9 --repos api-server --brief "NPE em /items quando cursor é nulo"
        ▼
   deck gate run --task FIX-9 --level build
        │      └─ deliberadamente abaixo do padrão (deploy). O relatório
        │         registra o degrau alcançado; ninguém depois vai achar
        │         que estava verificado até o fim
        ▼
   deck bundle --task FIX-9
        │      └─ e o bundle DIZ o que não foi checado. É isso que
        │         transforma o atalho em decisão, e não em omissão
        ▼
   deck save --task FIX-9   ·   deck unmount --task FIX-9

4 · Entrar num time que já usa deck

Você clonou hoje. Não escreva nada — pergunte.

   git clone <os repos>   ·   git clone <o xyz-ai-packs>
        ▼
   deck init                     cria o .deck/ desta máquina, semeado do
        │                        template que a coleção traz
        ▼
   (preencher só três campos: packs_root · paths · targets)
        ▼
   deck doctor                   o que falta, e o comando que resolve cada coisa
   deck info                     o registry, os papéis, quem é downstream
   deck packs                    qual conhecimento se aplica, e em que ordem
   deck toggle list              o que já foi decidido, e de onde veio cada valor
   deck impact <qualquer repo>   o que uma mudança ali alcança

5 · A IA descobriu algo que o time deveria saber

O caso que faz a segunda tarefa custar menos que a primeira.

   (durante a sessão, a IA corrige uma regra errada, ou escreve uma nova)
        ▼
   deck doctor
   ┌──────────────────────────────────────────────────────────────┐
   │ !! API-7  unsaved: 1 edited, 1 written here —                │
   │           nothing in the collection holds them yet           │
   └──────────────────────────────────────────────────────────────┘
        ▼
   deck save --task API-7 --dry-run    ◄── SEMPRE isto antes, nas primeiras vezes:
        │                                  o save escreve no repositório do time
        ▼
   deck save --task API-7
   ┌──────────────────────────────────────────────────────────────┐
   │ saved  changed  <coll>/_workspaces/all/default/rules/estilo.md│
   │ saved  new      <coll>/_repos/api/rules/paginacao.md          │
   └──────────────────────────────────────────────────────────────┘
        ▼
   cd <xyz-ai-packs> && git diff        ◄── você revisa. É aqui que vira do time
   git commit

6 · Duas pessoas, ou dois agentes, ao mesmo tempo

O que impede duas pessoas de produzirem um merge que ninguém consegue revisar.

   deck board list               o que existe, e o que já tem dono
        ▼
   deck board claim T-14         ◄── a reivindicação vai para o RASTREADOR,
        │                            e é lida de volta. Já reivindicada
        │                            por outra pessoa, é recusada
        ▼
   deck board plan               o que pode rodar ao mesmo tempo sem colidir
   ┌──────────────────────────────────────────────────────────────┐
   │ grupo 1: T-14, T-19    (não se tocam)                        │
   │ grupo 2: T-16          (edita o mesmo repo que T-14)         │
   └──────────────────────────────────────────────────────────────┘
        ▼
   deck mount --task T-14 ...    cada tarefa tem o seu mount e o seu manifesto
        ▼
   deck board done T-14
Um mount é segurado, não possuído

Cada sessão Claude que abre sob a mesma tarefa toma um hold, pelo hook SessionStart — você nunca digita isso. Ao terminar, ela solta apenas o dela, e o mount só é retirado quando não sobra nenhum. Fechar um painel não arranca as regras do painel que ainda trabalha.

23.Índice de comandos#

Os 33 comandos de primeiro nível. Sete deles têm subcomandos, somando 63 comandos executáveis ao todo. Cada um está explicado, com todas as suas opções, na seção que a última coluna aponta.

ComandoRespondeSeção
deck rootqual é a raiz resolvida§7
deck inforesumo do workspace§7
deck reposos repositórios no descriptor§7
deck patho caminho absoluto de um repositório§7
deck getum campo do descriptor, por chave pontuada§7
deck packsquais packs estão em jogo, e quem sobrescreve quem§7
deck pathsdiretórios que o workspace usa e não muda§7
deck targetsa allowlist de implantação§7
deck scopesos subconjuntos nomeados do registry§7
deck scopeum scope: repositórios, quadro, postura§7
deck impacto que uma mudança alcança, em ordem§7
deck ordera ordem topológica de um conjunto§7
deck setupde um workspace despreparado a um utilizável§7
deck initcriar .deck/ a partir dos templates§7
deck importderivar o registry do layout da árvore§7
deck toggle 7 subcomandosler, explicar e registrar decisões§8
deck mountcolocar os packs de um pedaço de trabalho§9
deck unmountretirar o que foi colocado§9
deck holdregistrar esta sessão como seguradora do mount§9
deck mountso que está montado agora§9
deck pack 7 subcomandoscriar e conferir os packs de conhecimento§10
deck gate 3 subcomandosa escada de verificação§11
deck metrics 2 subcomandoso que os gates mediram, e para onde vai§12
deck board 10 subcomandosas tarefas, e o que pode rodar junto§13
deck bundleo que um revisor lê em vez do diff§14
deck costtokens e dólares estimados§15
deck ask 5 subcomandosa pergunta que o catálogo não tem§16
deck propose 4 subcomandospedir ao Claude o que um parser não deriva§17
deck doctordiagnosticar o workspace§18
deck consoleo REPL do plano de controle§18
deck uio plano de controle ao lado do agente§18
deck statuslineo plano de controle dentro da janela do agente§18
Os 38 subcomandos, em uma lista
deck togglelist · get · explain · set · profile · ask-plan · validate
deck packnew · review · list · sources · add · update · validate
deck boardlist · plan · show · claim · ask-plan · template · done · new · whoami · why
deck gatelist · run · report
deck metricslist · show
deck proposeimpacts · toggle · pack · apply
deck asknew · list · show · resolve · fold

24.Os números desta página, e onde foram medidos#

A regra do projeto — nunca declare um número que você não mediu — vale para esta página também. Todo número aqui foi lido de uma execução ou contado do código, no commit em que ela foi escrita.

NúmeroOnde foi medido
checagens na suíte./ci/smoke.sh, que imprime o próprio total. O número vive num lugar só — CONTRIBUTING.md — e o gate docs recusa uma segunda cópia. Ele já esteve em quatro documentos, e toda mudança que acrescentava uma checagem editava os quatro
33 comandos de primeiro níveldeck --help; python3 ci/docs-cover.py imprime 33 commands checked
7 comandos com subcomandos, 38 subcomandos, 63 executáveiscontados percorrendo --help de cada nível
27 decisões no catálogo do núcleo, 5 perfisdeck toggle validate --strict imprime 27 toggles, 5 profiles; o 28 visto em deck doctor no tour inclui a que o pack do tour acrescenta
4 degraus da escadadeck gate list imprime static -> build -> deploy -> behavior
4 desfechos de gatesaída real de deck gate run: ok, FAIL, ?? (could not run), -- (not applicable / not attempted)
7 camadas de precedêncialidas de plugins/deck/deck/toggles.py, função layers()
11 skills no plugino conteúdo de plugins/deck/skills/
6 gates no pack do próprio deck_workspaces/all/default/config/gates.yaml de deck-ai-packs
Versão 0.1.0deck --version
Teto padrão de US$ 1.50 em proposeDEFAULT_BUDGET em plugins/deck/deck/assist.py
2 execuções fim a fim de /deck:board, 5 tarefas, 11 agentes, 4 gruposrelatado nos documentos do projeto; não medido por esta página

Todos os exemplos de saída marcados como “saída real” foram produzidos executando o comando: no tour (./docs/tour.sh --fast) ou num workspace sintético de três repositórios construído num diretório temporário para esta finalidade. Nomes de repositório, de tarefa e de host nos exemplos são inventados; qualquer coisa parecida com um endereço usa example.com.