Swarm Cleanroom Protocol v1
Protocolo operacional para usar colônias/swarms com segurança, evitar drift entre sessões e impedir que candidate-only fique ocioso.
Ponto de entrada único para operações de swarm. Para critérios de priorização e limites de autonomia, ver
agent-driver-charter.md. Para governança de budget, verbudget-governance.md.
Objetivo
- manter o branch principal sempre auditável;
- evitar perda de trabalho entre worktrees/stash/recovery;
- garantir continuidade quando delivery for
patch-artifactoureport-only.
Estado versionado vs estado efêmero
Antes de operar qualquer swarm, entenda os dois planos de estado:
| Plano | Onde vive | Persiste no git? | Fonte de verdade |
|---|---|---|---|
| Versionado | .project/tasks.json, .project/requirements.json, .project/decisions.json |
Sim | Sim — board oficial |
| Efêmero | Sinais COLONY_SIGNAL:* em memória, PilotState no runtime, sessões JSONL em ~/.pi/agent/sessions/, estado de monitors |
Não | Não — auxílio operacional |
Regra prática: uma colônia pode emitir COLONY_SIGNAL:COMPLETE (efêmero) sem que nada tenha sido commitado. Isso não conta como entrega. Só conta quando:
- o artefato está no branch alvo (git commit ou patch aplicado), e
- o
.project/tasks.jsonfoi atualizado com evidência, e - a task foi submetida para revisão do operador (status
in-progresscomo candidato, nãocompleted).
A causa raiz dos “candidates órfãos” (como c1–c4 nesta sessão) é tratar o sinal efêmero como conclusão. O board versionado é o único árbitro.
Invariantes (não negociar)
- No auto-close: tasks estratégicas só fecham com revisão do operador.
- Evidência obrigatória: sem inventário + validação, sem promoção para done.
- Board canônico:
.project/tasksé o relógio macro oficial. - Mudança reversível: toda alteração crítica deve ter caminho de rollback.
- Intenção híbrida: distribuir
soft intentem skills/prompts da pi-stack e reservarhard intentpara tools/policies/gates determinísticos.
Fase A — Pre-run cleanroom (obrigatória)
Antes de lançar swarm:
git status --shortdeve estar limpo.- Se houver WIP local:
- preferir commit em branch WIP (
wip/...) ou - branch de backup (evitar stash anônimo de longa duração).
- preferir commit em branch WIP (
- Confirmar policy ativa:
/colony-pilot status- validar
budgetPolicy,deliveryPolicy,projectTaskSync.
- (Opcional para runs de alto risco) Salvar snapshot de settings antes de qualquer mudança de perfil:
/safe-boot snapshot— cria.pi/snapshots/<stamp>-manual.json- Restaurar depois com:
/safe-boot restore
- Definir modo de entrega da execução:
apply-to-branchpara materialização direta;patch-artifactpara execução exploratória/controlada.
Fase A.1 — Handoff/Resume loop (control plane portátil)
Quando houver troca de instância/terminal, rodar este loop antes e depois da retomada:
scheduler_governance_status→ confirmar lease owner ativo,activeForeignOwner=false.colony_pilot_preflight→ok=truesem missing capabilities.context_watch_status→ nívelok|warn(evitar retomar emcompactsem checkpoint).quota_alerts+provider_readiness_matrix→ semBLOCKno provider ativo.subagent_readiness_status(strict=true)→ registrar bloqueios explícitos antes de delegar swarm.
Resultado do loop
- GO: checks operacionais OK + readiness strict sem bloqueios.
- GO condicional: runtime estável, mas readiness strict bloqueado (ex.:
minCompleteSignals=0); seguir em supervisão manual. - NO-GO: preflight/lease/quota em falha.
Leitura em duas pistas (recomendado)
- Pista operacional (isolated/warm): decide continuidade do loop atual com baixo atrito.
- Pista strict (global/history): decide promoção de autonomia/execução mais agressiva.
Exemplo rápido:
node scripts/subagent-readiness-gate.mjs --source isolated --min-user-turns 2 --days 1 --limit 1
node scripts/subagent-readiness-gate.mjs --strict --source global --days 7 --limit 20
Caminho de desbloqueio do strict
Se subagent_readiness_status(strict=true) bloquear por atividade recente:
- atingir
minUserTurnsno recorte atual da sessão; - executar ciclo controlado que gere
COLONY_SIGNAL:COMPLETEcom evidência; - reexecutar readiness strict e anexar resultado no board.
Compatibilidade multi-backend (control plane)
O protocolo deve funcionar além de ant_colony.
| Backend/runner | Como executa | Sinal mínimo para o board canônico |
|---|---|---|
ant_colony (local) |
colony-pilot + sinais de sessão |
start/progress/end + evidência de materialização |
| scheduler prompt (soft patrol) | loop recorrente em sessão ativa | classificação GO/condicional/NO-GO + deltas de risco |
| CI runner (GitHub/Gitea/local CI) | job não interativo | evento review/done/recovery + inventário + validação |
| fluxo manual (sem swarm) | operação assistida pelo operador | atualização direta em .project/tasks com evidência |
Invariantes de compatibilidade:
no-auto-closecontinua valendo para tasks estratégicas;- decisão de bloqueio/promoção vem de gates hard (não da superfície de disparo);
- qualquer backend deve produzir trilha auditável em
.project.
Fase B — Execução swarm
Durante a execução:
- Não editar
mainem paralelo. - Monitorar sinais
COLONY_SIGNAL:*. - Tratar falhas de scout/drone como evento de execução (não “fim de run”).
- Para throughput de swarm, manter monitores de sessão no perfil operacional decidido (
/monitors offquando aplicável).
Fase B.1 — Controle de contexto (quando houver planejamento amplo)
Se a execução entrar em planejamento muito grande, aplicar o protocolo anti-estouro:
- Quebrar a análise em lotes de 3-5 decisões.
- Ao fim de cada lote, registrar mini-handoff (usar
mini-handoff-template.md) com:- resumo do que foi decidido;
- pendências imediatas;
- próximos 3 passos.
- Delegar por trilhas independentes (policy, budget, docs, research) e consolidar só o necessário.
- Se houver risco de saturação de contexto, parar antes, consolidar e só então continuar.
- gatilhos mínimos: 2 ciclos sem decisão, >3 trilhas simultâneas sem checkpoint, ou planejamento excessivamente longo sem mini-handoff.
Ritual rápido de checkpoint (90 segundos)
Aplicar ao fim de cada micro-lote:
- Criar/atualizar checkpoint em
docs/research/context-checkpoint-YYYY-MM-DD.md(ou...-lote-N.md). - Preencher com o template:
mini-handoff-template.md. - Registrar no
.project/tasks.json(notes da task ativa) um resumo de 1 linha + link do artefato. - Só abrir novo lote após definir os próximos 3 passos.
Fase C — Pós-run imediato
Ao receber COLONY_SIGNAL:COMPLETE:
- Verificar se houve materialização no branch alvo.
- Registrar inventário:
- arquivos alterados;
- comandos de validação executados;
- riscos residuais.
- Atualizar
.project/taskscom estado candidato e notas de evidência.
Fase D — Promoção obrigatória (anti-ociosidade)
Se delivery não materializou (patch-artifact / report-only / evidence gap):
- Abrir (ou reutilizar) task de promoção/recovery (
*-promotion). - Incluir checklist mínimo:
- recuperar/aplicar patch no branch alvo;
- rodar smoke/regressão;
- anexar evidência;
- encaminhar para revisão do operador.
- Nunca deixar
candidate-onlysem task filha de promoção.
Fase E — Reconciliação de conflitos
Quando houver drift entre WIP local e entrega de swarm:
- reconciliar em branch dedicada (
reconcile/...), não direto nomain; - aplicar integração por diffs pequenos e testados;
- preservar trilha de auditoria (commit + notas no board).
Comandos canônicos (quick reference)
# hygiene
git status --short
# visibilidade de políticas/estado
/colony-pilot status
/monitors status
/doctor
# controle de execução
/colony-stop all
/reload
Critério de saída de uma run
Uma run só é considerada operacionalmente concluída quando:
- existe estado claro no
.project/tasks; - existe evidência verificável de entrega/validação;
- não existem candidates órfãos sem plano de promoção.