co2-lab/anchors:面向 AI 辅助开发的 spec-first 连续性框架
co2-lab/anchors
co2-lab 发布 Anchors,一个 spec-first 的 AI 辅助开发连续性框架,用 spec、计划、feature 等文档作为"锚点"在 AI 会话之间保持项目方向一致。
Um framework spec-first de continuidade para desenvolvimento assistido por IA.
Mantém um projeto coerente ao longo do tempo — através de âncoras: documentos que guiam o trabalho na ida e o confrontam na volta, e não podem mentir sobre o código.
A spec vem antes do código, e continua sendo a verdade depois dele — não é documentação escrita a posteriori. Tudo mais (plano, mapa, testes, gates) deriva dela e é confrontado contra ela.
O problema
Uma sessão de IA é sem memória entre invocações. A sessão acaba, o contexto some, e a próxima — outro agente, outro dia, outro humano — recomeça sem as regras, sem saber o que já foi decidido, sem saber onde o trabalho parou. O projeto cresce em código, mas a direção não persiste. E os testes ficam verdes enquanto requisitos inteiros seguem sem prova.
O Anchors ataca isso projetando os artefatos certos no repositório — as âncoras — e dando a uma IA uma ferramenta para operá-las: manter o mapa de dependências, propagar mudanças, medir a qualidade, e registrar o que diverge.
O nome vem da escalada: para subir uma parede você crava âncoras, pontos fixos que dizem para onde ir, seguram a corda para você não cair e demarcam por onde passou. No Anchors, âncoras são os documentos que nos acompanham na escalada do projeto — specs, planos, features, guides, docs.
Duas partes
| A doutrina | o conceito, agnóstico de ferramenta — os 6 pilares e o mecanismo comum | os *.md desta raiz |
| O CLI | a ferramenta em Go que uma IA opera para exercitar o ciclo | cmd/ · CLI.md |
A IA não precisa saber o Anchors de cor — ela pergunta ao binário (anchors guide),
aprende o fluxo, e opera com os comandos. O Anchors não embute IA: ele é a
ferramenta que a IA usa, em qualquer cliente (Claude Code, GPT, Gemini…).
Instalação
Homebrew (macOS e Linux) — o caminho recomendado:
brew install --cask co2-lab/tap/anchors anchors --version
Binário da release, para quem não usa Homebrew. Há build para macOS e Linux, amd64 e
arm64, além de .deb, .rpm e .apk:
# escolha o pacote do seu sistema em: # https://github.com/co2-lab/anchors/releases/latest gh release download --repo co2-lab/anchors \ --pattern 'anchors_*_darwin_arm64.tar.gz' --output anchors.tar.gz tar -xzf anchors.tar.gz anchors sudo install anchors /usr/local/bin/anchors
go install, se você já tem Go:
go install github.com/co2-lab/anchors/cmd/anchors@latest anchors --version
Do fonte, se você vai mexer no Anchors:
git clone https://github.com/co2-lab/anchors && cd anchors go install ./cmd/anchors
O
go installnão funcionava antes da v0.1.78: ogo.modvivia emcli/e declarava o módulo como se estivesse na raiz, então o Go baixava o módulo e não achava pacote nenhum — nem pelo caminho declarado, nem com ocli/. Se você bateu nesse erro, atualize:@latestjá resolve.
Começando
Num projeto qualquer:
anchors init # configura o anchors.yaml (por P&R; lê as pastas do projeto como camadas) anchors map build # constrói o mapa de dependências a partir dos arquivos anchors doctor # saúde do ecossistema: órfãos, colisões, buracos de cobertura anchors check --all # roda os gates de qualidade; abre issues; carimba o mapa anchors report all # gera os relatórios em docs/anchors/
O CLI só lê texto — nunca parseia código. As anotações que ele entende
(identidade, @noPropagation…) vivem em comentários; os marcadores por linguagem são
configuráveis. Assim ele é agnóstico de stack.
O fluxo, dirigido pela IA
A IA lê anchors guide e opera este ciclo — o watcher enfileira o trabalho, a IA
puxa da fila (a conversa nunca fica presa):
planejar ──▶ especificar ──▶ mapear ──▶ implementar ──▶ testar ──▶ confrontar
│ │ │ │ │ │
guia de plano .spec.md map build código+feature testes check / doctor
│
issue ◀── divergência que a IA não resolve
Cada arquivo salvo faz o watcher enfileirar a próxima task (spec→implementar, feature→testar…). A IA não precisa lembrar o que vem depois; a fila diz.
O que o CLI faz hoje
| área | comandos | o que entrega |
|---|---|---|
| Estrutura | init |
configura o anchors.yaml a partir das pastas e da linguagem do projeto, sem propor estrutura; semeia o CONTRIBUTING.md |
| Mapa | map build, map show, governs |
o grafo de dependências; quem rege quem |
| Propagação | impact, stale |
a onda de uma mudança; o que ficou desatualizado |
| Fila | watch, queue, next, done, drop, reclaim |
o watcher em background enfileira; a IA puxa |
| Qualidade | check, judge, doctor |
gates determinísticos e de julgamento por IA; saúde sistêmica |
| Identidade | code |
gera/valida um código de cenário único (evita colisões) |
| Confiança | ingest, coverage |
ingere JUnit/lcov do runner; cobertura por cenário, do diff, e delta |
| Relatórios | report |
6 perspectivas em docs/: tests, quality, structure, config, issues, inconsistencies |
| A ponte IA | guide (+ guide plan/spec/code/feature/test/guide) |
o playbook e as réguas embutidas que a IA lê para operar |
Detalhes e decisões de arquitetura em CLI.md e
DECISIONS.md.
O que dá confiança no entregável
O melhor indicador de um ciclo bem-sucedido é não ter bugs no final. Além de exigir testes, o Anchors mede a qualidade deles a partir do artefato que o runner já gera:
- por cenário — cada requisito da spec (
SPCRX-V01…) tem um teste que passou? (semântico, não cobertura de linha) - do diff — as linhas que você mudou estão cobertas? (pega o bug na linha nova)
- delta — a cobertura caiu desde a última medição? (pega regressão)
E gates que um script não computa ("esta tela respeita a arquitetura?") viram gates de julgamento por IA: a IA lê os pontos de conformidade do guide, confronta o alvo item a item, e o veredito entra na mesma mecânica (carimbo + issue) — envelhecendo se o alvo mudar.
Os pilares
Na ordem da rota — da origem ao acabamento. Cada um responde a uma pergunta que uma sessão futura faz ao chegar no projeto.
| # | Pilar | Pergunta que responde | Documento |
|---|---|---|---|
| 1 | Estrutura de Projeto | quais camadas existem e como se organizam? | STRUCTURE.md |
| 2 | Planejamento | para onde vamos, em que ordem, onde paramos? | PLANNING.md |
| 3 | Spec | o que esta coisa deve ser? | SPEC.md |
| 4 | Rastreabilidade | como as peças se conectam? | TRACEABILITY.md |
| 5 | Propagação | quando algo muda, como a mudança percorre tudo até fechar? | PROPAGATION.md |
| 6 | Qualidade | isto está bom o suficiente? | QUALITY.md |
O fluxo de trabalho que os interliga não é um pilar — é um desenho, que pode mudar ou ter várias perspectivas. Os componentes que operam dentro dele é que são os pilares.
O pilar Spec é o que faz o Anchors ser spec-first: nada se implementa sem uma spec que diga o que construir primeiro, e ela continua sendo a verdade contra a qual o código é confrontado — nunca documentação escrita depois do fato.
As duas ideias que sustentam tudo
- Maturidade é o topo. Um projeto é maduro quando tem todos os seus pilares implementados e vigorosos — não é um número num artefato, é a presença e o vigor dos pilares no todo.
- Âncoras não podem mentir. Cada âncora é confrontada contra a realidade. Quando diverge, ou o trabalho está errado (corrige) ou a âncora ficou para trás (atualiza). O framework detecta e apresenta a divergência — nunca arbitra sozinho. Vale a cada mudança, de forma incremental: só se reconfere o mínimo que a mudança tocou.
O mecanismo comum
Todos os pilares compartilham um mecanismo, definido em CONCEPT.md:
- Âncora — documento que aponta, segura a corda e/ou demarca. As estruturais regem para dentro; as de consumo (como docs) são geradas para fora — âncoras, mas não pilares.
- Grafo — as âncoras e suas dependências formam um grafo material, versionado, de
arestas tipadas (muitos-para-muitos). É o
anchors.graph.yaml. - Sincronia — cada aresta sabe se está em dia (carimbo por relação); a Propagação usa isso para espalhar a invalidação de forma incremental.
- Issue — quando um confronto falha e o Anchors não pode resolver sozinho, registra
uma issue: arquivo em pasta-estado (
todo/doing/done), imutável, aberta só por confronto, que nunca reabre (recorrência é issue nova). - Opt-out honesto — dispensar uma exigência de forma explícita, registrada e datada
(
@no-test,--no-block, maturação). Dispensa a exigência, nunca o registro. - Dois planos — o vivo (âncoras + grafo, a verdade atual) e o histórico (issues resolvidas, laudos, datados e imutáveis). Nunca se contradizem.
Por onde começar a ler
Vai USAR o Anchors num projeto? Comece por USING.md — que arquivos o
projeto precisa ter, como escrever uma spec, o que cada gate cobra e o que fazer quando
algo não bate. Os documentos abaixo explicam o CONCEITO; o USING.md explica a prática.
CONCEPT.md— a fundação: a âncora, a maturidade, o grafo, a sincronia, as issues. Todos os pilares o pressupõem.- Os pilares, na ordem da rota:
STRUCTURE→PLANNING→SPEC→TRACEABILITY→PROPAGATION→QUALITY. - O CLI —
CLI.mdpara o estado da ferramenta, comando a comando, com o que já foi validado contra um projeto real.
Cada pilar é auto-contido, mas aponta para os outros onde se tocam.
Estado do projeto
Em construção, e honesto sobre isso. A doutrina dos 6 pilares está escrita e
revisada; o CLI exercita o ciclo inteiro e foi validado contra uma prova de
conceito real, não-trivial — um app mobile + backend serverless com um grafo de
dependências de porte substancial. Os comandos acima existem e rodam; o roadmap
e os furos conhecidos estão em CLI.md.
O Anchors é o conceito — independente de qualquer ferramenta. Duas instâncias reais o exercitam: uma ferramenta/IDE que o aplica e o workspace de prova de conceito real (incompleto e imaturo de propósito — prova o mecanismo, não a completude). Elas ilustram o conceito; não o definem.
Nada aqui está cravado na pedra. Estes documentos são o conceito saindo da cabeça e encontrando seu lugar — refinados conforme o framework amadurece.
O idioma do projeto
Tudo neste repositório é escrito em INGLÊS — identificadores, comentários, specs,
features, testes, documentos de doutrina. A única exceção é o CATÁLOGO DE TRADUÇÃO
(internal/i18n/locales/*.json), que existe justamente para guardar todos os idiomas
que o produto fala.
Quem lê o produto lê no idioma que o projeto declarar: o lang: do anchors.yaml
governa as mensagens do CLI, os guides embutidos e as seções do template de spec — em
pt-BR, en e es. O que o USUÁRIO lê é traduzido; o que se ESCREVE no repositório
é inglês.
A regra é uma só porque a mistura não fica onde nasce. A doutrina no topo de cada gate é a matéria-prima da spec dele; a spec vira feature, a feature vira título de teste. Um idioma no começo dessa cadeia se propaga por ela inteira — medido aqui: as specs saíram em português porque a doutrina estava, as features saíram em inglês, e a mesma unidade acabou partida em dois idiomas.
O code-language (bloqueante) defende a parte que o compilador enxerga: os
IDENTIFICADORES. Comentário e texto ao usuário ele não lê — o primeiro porque inferir
idioma de prosa é chute, o segundo porque o catálogo já o resolve. Estarem fora do
alcance do GATE não os põe fora da POLÍTICA: ali a régua é a revisão.
Licença
Elastic License 2.0 — o código é aberto para ler, usar, modificar e distribuir, inclusive comercialmente. A única restrição relevante: não oferecer o Anchors a terceiros como serviço hospedado ou gerenciado.
O conceito é independente de qualquer ferramenta. Ele permanece verdadeiro sem elas.
来源:GitHub · github.com