Purpose: Prevent implementation chaos through disciplined, spec-driven quality gates.
Philosophy: Specifications first, tests second, implementation last.
Result: Measurable progress, guaranteed quality, maintainable codebase.
Key Principle: Tests fail FIRST (red), then code makes them pass (green).
Detailed Flow:
Diagram Source of Truth: docs/diagrams/workflow-diagram.mermaid
To regenerate this diagram after editing the source:
pnpm run diagrams:fixThis will regenerate all .svg files from their corresponding .mermaid sources. See CONTRIBUTING.md#diagrams for details.
Software projects tend toward implementation chaos:
- Features built without clear requirements
- Tests written as afterthoughts (or not at all)
- Technical debt accumulates silently
- Regressions sneak in unnoticed
- Architecture drifts from original intent
Force structured gates at every milestone:
- SDD — Define what we're building (specifications + decisions)
- BDD — Define expected behavior (integration tests that FAIL)
- TDD — Define contracts (unit tests that FAIL)
- DDD — Implement until tests PASS
Gate: Cannot proceed to next phase until previous phase is complete and peer-reviewed.
Goal: Document architectural decisions and component contracts BEFORE writing tests or code.
Sovereign Interoperability Gates:
- WASM Components: Define capabilities in WIT (Wasm Interface Type).
- Sovereign Graph: Define JSON-LD structures for semantic data portability.
- Contract Interface: Define the TypeScript interface and conforming capability (e.g.,
storage:v1).
Artifacts:
- ADRs (Architecture Decision Records) — Major technical choices
- Specs — Component interfaces, data schemas, API contracts
- Diagrams — Data flow, sequence diagrams, architecture overviews
Deliverables:
specs/
├── ADRs/
│ └── ADR-001-monorepo-structure.md
├── features/
│ └── storage-interface.md
└── diagrams/
└── data-flow.mermaid
Quality Gate:
- All architectural questions answered
- Public interfaces documented
- Data schemas defined (JSON-LD, WIT, TypeScript types)
- At least 1 peer review on each ADR/spec
- No "TODO" or "TBD" in critical sections
When to Skip: Never. Every milestone starts with SDD.
Goal: Define expected behavior via integration tests and conformance suites before implementation.
Core Mechanics:
- Conformance Suites: Use
run[Contract]Conformance()helpers to validate interface compliance. - Integration Specs: Describe user scenarios (e.g.,
vitestunit tests acting as behavior specs).
Characteristic: Tests MUST FAIL initially (red phase).
Artifacts:
- Integration test suites (e2e, component integration)
- Acceptance criteria as executable tests
- User scenario tests
Example:
// tests/integration/storage.spec.ts
describe("Offline-first storage", () => {
it("persists data when offline", async () => {
const storage = await createStorage({ offline: true });
await storage.set("key", { value: "data" });
// Simulate app restart
await storage.close();
const newStorage = await createStorage({ offline: true });
const result = await newStorage.get("key");
expect(result).toEqual({ value: "data" });
});
it("syncs data between 2 clients", async () => {
const client1 = await createClient();
const client2 = await createClient();
await client1.set("key", "value1");
await waitForSync();
const result = await client2.get("key");
expect(result).toBe("value1");
});
});Quality Gate:
- All user-facing behaviors have tests
- Tests are readable (describe user scenarios, not implementation)
- Tests FAIL (red) because implementation doesn't exist yet
- Coverage target defined (e.g., "all happy paths + 3 error cases")
- Peer reviewed for completeness
When to Skip:
- Small utility functions (use TDD only)
- Internal refactors that don't change behavior
- Documentation-only changes
Goal: Write unit tests that define contracts for individual functions/classes.
Characteristic: Tests MUST FAIL initially (red phase).
Artifacts:
- Unit test suites
- Contract tests (interfaces, types)
- Edge case coverage
Example:
// packages/storage-sqlite/src/crud.test.ts
describe("CRUD operations", () => {
let db: Database;
beforeEach(() => {
db = createInMemoryDB();
});
describe("insert", () => {
it("returns inserted ID", async () => {
const id = await db.insert("users", { name: "Alice" });
expect(id).toBeGreaterThan(0);
});
it("throws on duplicate primary key", async () => {
await db.insert("users", { id: 1, name: "Alice" });
await expect(
db.insert("users", { id: 1, name: "Bob" })
).rejects.toThrow("UNIQUE constraint failed");
});
});
describe("CRDT merge", () => {
it("resolves conflicts with LWW", () => {
const state1 = { value: "A", timestamp: 100 };
const state2 = { value: "B", timestamp: 200 };
const result = merge(state1, state2);
expect(result.value).toBe("B"); // Last-Write-Wins
expect(result.timestamp).toBe(200);
});
});
});Quality Gate:
- All public functions have unit tests
- Edge cases covered (null, empty, boundary conditions)
- Tests FAIL (red) because implementation is stub/missing
- Coverage ≥80% for core logic
- Fast execution (<1s for entire unit suite)
When to Skip:
- Pure integration components (web servers, routers)
- Thin wrappers around third-party libraries
- UI components (use BDD with component tests instead)
Goal: Write the minimal code necessary to make ALL tests pass while cultivating the "Solo Fértil".
Domain Layers:
- Sovereign Nodes: Map concepts (Identity, Note) to the JSON-LD graph.
- Tractor Policies: Orchestrate plugin interaction with user data.
- Plugin Ingestion: Normalize external data into sovereign formats.
Characteristic: Tests transition from RED → GREEN.
Artifacts:
- Production code
- Domain models, services, repositories
- Infrastructure adapters
Implementation Rules:
- Start with simplest failing test
- Write minimal code to make it pass
- Refactor only when green
- Repeat until all tests pass
Domain Organization:
packages/storage-sqlite/
├── src/
│ ├── domain/ # Core business logic
│ │ ├── storage.ts # Storage interface (spec)
│ │ └── crud.ts # CRUD operations
│ ├── infra/ # Infrastructure adapters
│ │ ├── sqlite-adapter.ts
│ │ └── opfs-adapter.ts
│ └── index.ts # Public API
└── tests/
├── unit/
└── integration/
Quality Gate:
- All BDD tests pass (green)
- All TDD tests pass (green)
- No skipped/pending tests
- Code coverage meets target (≥80%)
- No linting errors
- Peer reviewed (code + architecture alignment with specs)
- Changeset created (
pnpm run changeset)
When to Skip: Never. DDD is the final step where code is written.
| Phase | Entry Criteria | Exit Criteria | Can Skip? |
|---|---|---|---|
| SDD | Milestone defined | ADRs + specs complete, peer reviewed | ❌ Never |
| BDD | SDD complete | Integration tests written (RED), peer reviewed | |
| TDD | BDD complete | Unit tests written (RED), peer reviewed | |
| DDD | TDD complete | All tests GREEN, coverage met, changeset created | ❌ Never |
Deliverable: specs/features/storage-interface.md
# Storage Interface Specification
## Purpose
Provide offline-first persistence via SQLite/OPFS.
## Public API
```typescript
interface Storage {
get(key: string): Promise<unknown>;
set(key: string, value: unknown): Promise<void>;
delete(key: string): Promise<void>;
close(): Promise<void>;
}- ADR-002: Use SQLite WASM + OPFS for browser persistence
- ADR-003: Virtual file system via sql.js VFS
**Gate**: ✅ Peer reviewed, no open questions.
---
### 2. BDD Phase
**Deliverable**: `packages/storage-sqlite/tests/integration/storage.spec.ts`
```typescript
describe("Storage", () => {
it("persists data across restarts", async () => {
const storage = await createStorage();
await storage.set("key", "value");
await storage.close();
const newStorage = await createStorage();
expect(await newStorage.get("key")).toBe("value");
});
});
Status: 🔴 FAILING (storage not implemented yet)
Gate: ✅ Test is clear, peer reviewed.
Deliverable: packages/storage-sqlite/src/crud.test.ts
describe("CRUD", () => {
it("insert returns ID", async () => {
const id = await db.insert("table", { data: "value" });
expect(id).toBeGreaterThan(0);
});
});Status: 🔴 FAILING (db.insert is a stub)
Gate: ✅ Contract tests complete, peer reviewed.
Deliverable: packages/storage-sqlite/src/crud.ts
export async function insert(
db: Database,
table: string,
data: Record<string, unknown>
): Promise<number> {
const keys = Object.keys(data);
const values = Object.values(data);
const placeholders = keys.map(() => "?").join(",");
const sql = `INSERT INTO ${table} (${keys.join(",")}) VALUES (${placeholders})`;
const result = await db.run(sql, values);
return result.lastInsertRowid;
}Status: 🟢 PASSING (all tests green)
Gate: ✅ Tests pass, coverage 85%, changeset created.
Use this loop at the start and end of each slice to keep execution aligned with current runtime state.
# start of slice
refarm resume --json
refarm check --next-action --json
# after source edits
refarm agent finish --lane after-edit --run --json
# after commit
refarm agent finish --lane after-commit --run --jsonActionability rule: every feature/ADR should provide at least one explicit BDD red command, one TDD red command, and one full green verification command.
Optional drift check for active docs/specs in your current diff:
pnpm run docs:actionability:checkThis command is advisory by default (does not fail your lane).
Full repository scan (heavier, use before large docs sweeps):
pnpm run docs:actionability:check:allIf you want a blocking gate, use strict mode explicitly:
pnpm run docs:actionability:check:strict
pnpm run docs:actionability:check:all:strict# 1. Start a new task using the Developer Toolbox
pnpm run task:start
# > Select "Feature / Issue Mode"
# > Enter GitHub Issue ID: 42
# > Linked to: "identity provider implementation"
# > Do you want to initialize an SDD Spec? (Y) -> vim specs/features/identity-provider.md
# > Does this feature require an ADR? (Y) -> vim specs/ADRs/ADR-004-identity-provider.md
# 2. Write integration tests (BDD)
vim packages/identity-nostr/tests/integration/identity.spec.ts
# 3. Verify Quality Gates (should FAIL / RED)
pnpm run task:verify
# 4. Write unit tests & Implement (TDD & DDD)
vim packages/identity-nostr/src/keypair.test.ts
vim packages/identity-nostr/src/keypair.ts
# 5. Verify Quality Gates (should PASS / GREEN)
pnpm run task:verify
# 6. Finish Task
# This automates running `task:verify`, changeset generation, commits, and pushes
pnpm run task:finish
# 7. Open PR
# The finish script suggests: gh pr create --title "finish: work on #42" --fill --body "Fixes #42"pnpm run task:start(Inicia uma branch BDD guiada)pnpm run task:verify(Roda os Lint/Tests/Crates Checks)pnpm run task:finish(Gera changesets e abre o Pull Request orgânico)pnpm run task:rebrand(Renomeia a marca e domínios em caso de necessidade extrema)
name: Quality Gates
on: [pull_request]
jobs:
sdd-gate:
if: contains(github.event.pull_request.labels.*.name, 'phase:sdd')
steps:
- name: Check ADRs exist
run: |
test -f specs/ADRs/ADR-*.md || exit 1
- name: Check TODOs in specs
run: |
! grep -r "TODO\|TBD" specs/ || exit 1
bdd-gate:
if: contains(github.event.pull_request.labels.*.name, 'phase:bdd')
steps:
- name: Run integration tests
run: pnpm run test:integration
- name: Ensure tests fail (red phase)
run: |
pnpm run test:integration && exit 1 || exit 0
tdd-gate:
if: contains(github.event.pull_request.labels.*.name, 'phase:tdd')
steps:
- name: Run unit tests
run: pnpm test
- name: Check coverage ≥80%
run: pnpm run test:coverage -- --min-coverage=80
ddd-gate:
if: contains(github.event.pull_request.labels.*.name, 'phase:ddd')
steps:
- name: Run all tests
run: pnpm test
- name: Ensure tests pass (green phase)
run: pnpm test
- name: Check changeset exists
run: |
test -n "$(ls .changeset/*.md 2>/dev/null | grep -v README)" || exit 1
- name: Lint
run: pnpm run lint
- name: Build
run: pnpm run build// ❌ BAD: Started implementing without spec
class Storage {
// ... 300 lines of code ...
// Wait, what was the interface supposed to be?
}// ❌ BAD: Tests written to match existing code (not behavior)
it("returns undefined when key not found", () => {
// This is testing implementation detail, not requirement
expect(storage.get("missing")).toBe(undefined);
});// ❌ BAD: "This function is too simple to test"
function merge(a, b) {
return { ...a, ...b }; // Actually has subtle bugs with nested objects
}// ❌ BAD: "I'll fix the tests later"
describe.skip("Sync tests", () => {
// Tests that don't pass yet
});SDD isn't "set and forget." Return to SDD when:
- Architecture assumptions are wrong (PoC reveals blocker)
- Requirements change (new user needs discovered)
- Technology choice fails (performance, compatibility issues)
- Scope expands (new features need new decisions)
Process: Create amendment ADR, update specs, propagate changes to BDD/TDD.
Example:
specs/ADRs/
├── ADR-002-storage-strategy.md # Original
└── ADR-002-storage-strategy-AMENDED.md # Revised after PoC
| Phase | Purpose | Deliverable | Test Status |
|---|---|---|---|
| SDD | What to build | ADRs + Specs | N/A |
| BDD | Expected behavior | Integration tests | 🔴 RED |
| TDD | Component contracts | Unit tests | 🔴 RED |
| DDD | Implementation | Production code | 🟢 GREEN |
Key Insight: Tests fail FIRST (red), then code makes them pass (green). This prevents:
- Implementing wrong features
- Skipping edge cases
- Accumulating technical debt
- Regressions going unnoticed
Result: Predictable, measurable progress toward high-quality software.
feature/xyz ──┐
feature/abc ──┤──► develop ──► main ──► (packages published)
fix/yyy ───────┘ ▲ │
│ │
└──── auto-rebase ◄────┘
main— produção, protegido. Nunca recebe push direto.develop— integração contínua. Base para todas as feature branches.feature/*,fix/*,docs/*— ramificam dedevelop, voltam paradevelopvia PR.
# 1. Criar branch a partir de develop
git checkout develop && git pull origin develop
git checkout -b feature/minha-feature
# 2. Trabalhar, commitar, push
git push origin feature/minha-feature
# 3. Abrir PR → develop (CI: testes, lint, type-check, changeset)
# 4. Merge em develop (qualquer estratégia funciona)
# 5. Quando develop estiver pronto para release:
# Abrir PR: develop → main
# 6. Aprovar e mergear usando uma estratégia permitida pelo repositório.
# Preferir histórico linear quando disponível; squash release também é suportado.
# 7. ✅ O workflow sync-develop.yml alinha develop ao baseline de main.
# Não é necessário nenhuma ação manual quando não há divergência real de conteúdo.- Em
develop: qualquer estratégia funciona (squash, rebase, ou merge commit) para integrar branches curtas. - Em
main: usar a estratégia permitida pela proteção do repositório. Quandodevelop → mainfor squashado,mainterá um commit novo com a mesma árvore dedevelop. - O workflow
sync-develop.ymlnão rebaseia nem reescrevedevelopautomaticamente. Após qualquer push emmain, ele:- não faz nada se
developjá aponta paramain; - faz fast-forward se
developé ancestral demain; - abre issue quando
developemaintêm a mesma árvore, mas histórico diferente (caso típico de squash/rebase release); - abre issue e falha quando há divergência real de conteúdo.
- não faz nada se
Quando a proteção do repositório exigir squash ou rebase no PR develop → main,
trate o alinhamento posterior de develop como uma decisão manual. Isso preserva
a história atômica de develop até alguém optar conscientemente por reset, rebase
ou outro alinhamento com backup.
- Changesets acumulam em
developdurante o sprint (arquivo em.changeset/). - Após o merge
develop → main, o workflowrelease-changesets.ymlcria automaticamente um PR de versão (chore(release): version packages) nomain. - Após esse PR ser aprovado, mergear com rebase também para manter linear.
- Os pacotes são publicados no npm/crates.io.
- O
sync-develop.ymlalinhadevelopnovamente ao baseline demainusando fast-forward ou equivalência de árvore.
Após git push origin develop em lote relevante, acompanhar CI com:
gh run list --branch develop --limit 5
gh run watch --exit-statusSe gh não estiver disponível no ambiente, registrar no handoff:
- hash pushado,
- checks esperados,
- owner humano que ficará observando o CI.
O workflow só deve falhar quando develop e main divergem por conteúdo. Isso geralmente significa que houve trabalho simultâneo em main e develop que precisa de decisão humana. Fix manual:
git fetch origin
git checkout develop
git diff --stat origin/main..origin/develop
git log --oneline --left-right origin/main...origin/developDepois escolha conscientemente entre merge, rebase ou reset, conforme a intenção da divergência. Não use force-push apenas para silenciar o workflow; force-push só é seguro quando a equivalência de árvore foi confirmada ou quando o owner decidiu descartar explicitamente a divergência.
Antes de qualquer lote paralelo (colônia, swarm ou macro-refactor), execute:
node scripts/reso.mjs status
pnpm run project:validate
pnpm run factory:preflightcd packages/tractor
cargo check --quiet
cargo test --lib agent_tools_bridge --quiet
cargo test --lib plugin_host --quiet
cargo test --lib wasi_bridge --quiet
pnpm run test:smoke:ws- GO: todos os checks do preflight rápido verdes; se houver mudança de boundary runtime, preflight completo verde.
- NO-GO: qualquer falha em toolchain/targets/permissão/reso status → corrigir ambiente antes de abrir lote.
Use esta regra de passagem quando a equipe estiver em ciclo de ajustes de pipeline/processo:
-
Condição de estabilidade (últimos 3 lotes):
- Nenhum timeout de pre-push local crítico em
lint/type-check/test(warnings locais aceitáveis, desde que documentados); - Sem falha bloqueante repetida de
prepushapós ajuste de mesma categoria; refarm check --next-action --jsonsem bloqueios funcionais;pre-pushpassou sem novos arquivos/patches com impacto direto sobre o fluxo básico (testes de regressão,preflighte CI alinhados).
- Nenhum timeout de pre-push local crítico em
-
Condição de transição de trabalho:
- Abra explicitamente um novo ticket/objetivo funcional;
- Mantenha o estado atual de validação como baseline (
git log+ evidência de checks); - A próxima entrega começa com um requisito/escopo de produto por vez (1 feature, 1 PR).
-
Regra de segurança: se após 1 ciclo funcional surgir novamente pressão de recursos (zumbi, travamentos, timeouts), retorne para o bloco de estabilização com objetivo único e timeout de execução explícito.
Para evitar ambiguidade operacional, use confirmação textual explícita antes de ações de escrita em lote:
- Formato recomendado:
AUTORIZO: executar lote <escopo> com commits. - Sem autorização explícita, limitar execução a leitura/diagnóstico.
Objetivo: feedback rápido por mudança atômica.
- Rodar apenas o subconjunto afetado (ex.: boundary package + testes diretos).
- Exigir evidência objetiva no PR/handoff (comando + resultado).
Objetivo: garantir que o conjunto integrado não regrediu.
- Rodar pipeline completo de qualidade definido no repositório (local e/ou CI).
- Consolidar evidências em
.project/verification.json.
Regra prática:
- Task PR: smoke obrigatório.
- Merge de lote / boundary sensível: smoke + full obrigatórios.
Campos obrigatórios por entrada de verificação:
idtargettarget_typestatusmethodtimestampevidencecriteria_results[]
Exemplo mínimo:
{
"id": "VER-EXAMPLE-001",
"target": "T-PIPE-02",
"target_type": "task",
"status": "passed",
"method": "test",
"timestamp": "2026-04-24T12:00:00.000Z",
"evidence": "Comandos smoke executados com resultado verde.",
"criteria_results": [
{
"criterion": "Type-check passa nos pacotes Foundation",
"status": "passed",
"evidence": "gate:smoke:foundation verde"
}
]
}To avoid repository bloating and ensure reproducibility:
- Track Only Source:
.ts,.wit,.ld.json,.md. - Ignore Derivatives:
.js,.d.ts, binary.wasm(managed by CI/build). - Cleanup: Run
pnpm run clean:derivativesto purge ignored artifacts.
The project supports a dynamic resolution switcher to balance speed and rigor:
- Source Mode (
node scripts/reso.mjs src): Instant DX with directsrc/imports. - Dist Mode (
node scripts/reso.mjs dist): CI/Release verification against build artifacts.
- Durante iteração diária, operar em
reso src. - Antes de merge em branch protegida, validar em
reso dist. node scripts/reso.mjs statusé obrigatório no início da task e antes de finalizar PR.
Fluxo mínimo recomendado:
# início da task
node scripts/reso.mjs status
node scripts/reso.mjs src
# validação final
node scripts/reso.mjs dist
pnpm run type-check
pnpm run test:unit
node scripts/reso.mjs status| Domínio | Ownership sugerido | Pacotes/arquivos principais | Regra de concorrência |
|---|---|---|---|
| Runtime Core | worker-runtime | packages/tractor/**, packages/tractor-ts/** |
serializar por boundary |
| Contracts & Storage/Sync | worker-contracts | packages/*-contract-v1/**, packages/storage-*/**, packages/sync-*/** |
até 2 workers em pacotes distintos |
| Plugin Platform | worker-plugin | packages/plugin-manifest/**, packages/barn/** |
serializar mudanças no contrato |
| Governance & CI | worker-governance | .project/**, .github/workflows/**, docs/** |
1 worker por vez em .project e workflows |
- Meta de diff por task: até 300 linhas adicionadas/modificadas (quando possível).
- Meta de arquivos por task: até 8 arquivos (exceto mudanças de teste/documentação associadas).
- Cada task deve incluir:
- objetivo único,
- critérios de aceite objetivos,
- comando de validação smoke.
Template mínimo de acceptance criteria:
- Comportamento X validado
- Regressão Y coberta em teste
- Evidência registrada em verificationSemana 1 (estabilização de fluxo):
T-ENV-03preflight de ambienteT-ENV-04política src/distT-PIPE-01baseline de type-checkT-PLAN-01macro-domínios e ownershipT-PLAN-02granularidade padrão
Semana 2 (execução paralela governada):
T-PLAN-03fila de execução inicialT-PLAN-04anti-colisão/locksT-PLAN-05branch naming + commits atômicosT-PLAN-06limite de concorrência e escalaT-PLAN-07prompt padrão para workers
Pacotes/áreas serializadas:
packages/tractor/**packages/tractor-ts/**packages/plugin-manifest/**.project/**.github/workflows/**
Regra de lock operacional:
- antes de iniciar task em área serializada, anunciar claim no handoff;
- somente 1 task ativa por área serializada;
- handoff de lock obrigatório ao trocar responsável.
Template canônico: docs/superpowers/COLONY_WORKER_INPUT_TEMPLATE.md.
Templates complementares:
- saída do worker:
docs/superpowers/COLONY_WORKER_OUTPUT_TEMPLATE.md - pacote de templates para operação/review:
docs/templates/COLONY_*_TEMPLATE.md
Prompt obrigatório deve conter:
- objetivo,
- escopo (arquivos permitidos),
- restrições (source sovereignty, sem artefatos),
- validação mínima (smoke/full),
- critério de escalonamento (quando parar e pedir humano).
Cadência: 1x por semana (segunda-feira, 30min).
Roteiro:
- listar tasks
planned/in_progresscom dependências quebradas; - classificar bloqueio: ambiente, dependência técnica, decisão pendente;
- definir ação: desbloquear, reatribuir, escalonar para humano, ou cancelar;
- atualizar
.project/tasks.json+.project/handoff.json.
Critérios de desbloqueio:
- dependência concluída e validada;
- ambiente reproduzível no preflight;
- decisão arquitetural registrada em
.project/decisions.json.
Fluxo de reassign:
- marcar owner atual no handoff,
- reatribuir task no board,
- anexar comando de retomada e último estado de validação.
Use esta matriz rápida:
| Situação | Modo recomendado | Motivo |
|---|---|---|
| Implementação diária / iteração curta | reso src |
DX e navegação direta ao código-fonte |
| Pré-merge em branch protegida | reso dist |
valida superfície distribuível |
| Diagnóstico de ambiente | reso status |
calibra estado real antes de agir |
| Mudança de topology alias | reso sync-tsconfig |
mantém paths consistentes |
Exemplo operacional:
node scripts/reso.mjs status
node scripts/reso.mjs src
# ...trabalho local...
node scripts/reso.mjs dist
pnpm run gate:smoke:foundation
node scripts/reso.mjs statusQuando escalar para humano:
- conflito de decisão arquitetural sem ADR/DEC resolvida;
- falha persistente de preflight após tentativa reprodutível;
- colisão recorrente em área serializada.
Quando abrir/atualizar issue:
- bloqueio reproduzível,
- afeta múltiplas tasks,
- não cabe no slice atual sem desvio de escopo.
Quando cancelar task:
- requisito invalidado por decisão posterior,
- caminho alternativo já aprovado,
- custo/risco não justifica execução no ciclo atual.
See Also:
- docs/COLONY_PLAYBOOK.md — Operação ponta-a-ponta (preflight, execução, consolidação)
- docs/DEVELOPMENT_RESOLUTION.md — Estratégia detalhada src/dist
- roadmaps/MAIN.md — How this workflow applies to releases
- CONTRIBUTING.md — Developer workflow
- specs/ADRs/ — Architecture decisions
Last Updated: April 2026