Cada ambiguidade na sua especificação
é um token que seu agente queima.

Depois uma pergunta no meio da implementação. Depois uma correção após o lançamento. Depois o contexto que você explica de novo e de novo.

O SpecScore é um formato de arquivo aberto e lintável para especificações — assim como o JSON é para dados. Com uma CLI que seus agentes chamam para consultar e editar — como jq para JSON.

Um formato para as especificações que você já escreve.

SpecScore é um formato em Markdown + YAML para features, requisitos e critérios de aceitação. Ele define uma estrutura que tanto seu time quanto seus agentes de IA entendem — e são só arquivos no seu repositório.

Um projeto SpecScore tem três tipos de artefato ao longo de um ciclo de vida: uma Ideia captura uma direção ainda em formação; uma especificação de Feature congela o comportamento acordado; um Plano decompõe a feature em tarefas ordenadas, cada uma citando os critérios de aceitação que satisfaz.

Por que seu agente se importa. Como a estrutura é legível por máquina, agentes de IA podem consultar a especificação através da CLI em vez de ler cada arquivo. Pergunte “no que eu deveria trabalhar agora?” e a CLI devolve as features em aberto e as perguntas sem resposta. A mesma forma que seu time revisa; muito menos contexto que o agente precisa carregar.

Feature → Requirements → Acceptance Criteria → Scenarios.
EXEMPLOideas/apply-discount.md
# Idea: Discount codes at checkout

**Status:** Approved
**Date:** 2026-05-19
**Owner:** cart-team
**Promotes To:** features/apply-discount

## Problem Statement

How might we let returning customers redeem a
single promo code at checkout without breaking
the existing cart math or the site-wide promotion
engine?

## Recommended Direction

A registered user can apply **one** valid code per cart.
Codes are time-bounded and replaceable. Stacking
with site-wide promotions follows a deterministic
tiebreak rule (higher discount wins; site-wide
wins on tie).
EXEMPLOfeatures/checkout/apply-discount.md
---
status: approved
owners: [cart-team]
---

# Feature: Apply Discount

A registered user can apply one valid discount code to their cart at checkout.

## Requirements

### R1 — Single-code limit

- **AC-1** The cart accepts at most one discount code at a time.
- **AC-2** Applying a second code replaces the first, with a visible confirmation.
- **AC-3** Removing the code restores the original cart total.

### R2 — Code validity

- **AC-1** A code is valid only if `valid_from` ≤ now ≤ `valid_until`.
- **AC-2** Invalid codes show a specific error message.

### R3 — Discount application

- **AC-1** Percentage discounts apply to subtotal, not shipping.
- **AC-2** Discount totals round down to the nearest cent.
- **AC-3** Stacking with site-wide promotions follows the higher-of rule.

## Scenario: Apply a valid percent-off code

**GIVEN** a cart with subtotal $50.00 and shipping $10.00
**WHEN** the user applies code `SAVE20` (20% off)
**THEN** the cart shows subtotal $40.00, shipping $10.00, total $50.00
EXEMPLOplans/apply-discount/README.md
# Plan: Apply Discount

**Status:** approved
**Features:**
  - [apply-discount](../../features/apply-discount.md)
**Author:** cart-team
**Effort:** M
**Impact:** high

## Context

The apply-discount Feature is Approved. This plan
breaks it into ordered tasks; each task cites the
acceptance criteria it satisfies.

## Tasks

### T1 — Accept a `code` field on the cart
Cites: R1.AC-1, R1.AC-2, R1.AC-3

### T2 — Validate code time-window
Cites: R2.AC-1, R2.AC-2

### T3 — Apply percentage to subtotal, round down
Cites: R3.AC-1, R3.AC-2

### T4 — Higher-of tiebreak vs site-wide promo
Cites: R3.AC-3

### T5 — Confirmation toast on apply / replace
Cites: R1.AC-2

Especificações são hierárquicas. Sua árvore de especificações também.

Lista plana com cinquenta Features vira um depósito. SpecScore mantém a árvore navegável: os pais cuidam do escopo, os filhos cuidam do detalhe, e o formato dos diretórios espelha o formato do produto sobre o qual seu time já raciocina.

Perguntas em aberto sobem. Perguntas não resolvidas em qualquer profundidade aparecem no índice de cada pai. Você vê o que está bloqueando uma release a partir do topo da árvore, sem precisar garimpar para achar.

A maioria das ferramentas de especificações parte do princípio que uma lista plana funciona. E funciona — até que para de funcionar. SpecScore foi feito justamente para o momento em que «onde mora essa Feature?» começa a importar.

Veja ao vivo em specscore-cli →

DEspecscore-cli/spec/features/cli/
spec/features/cli/
├── agent/
│   └── setup/
├── feature/
│   ├── change-status/
│   ├── deps/
│   ├── info/
│   ├── list/
│   ├── new/
│   ├── refs/
│   └── tree/
├── idea/
│   ├── change-status/
│   ├── new/
│   └── relocate/
├── spec/
│   └── lint/
│       ├── issue-rules/     ← sub-sub-Feature
│       └── plan-rules/
├── task/
│   ├── info/
│   ├── list/
│   └── new/
└── … mais 10 Features de nível superior

O que dá errado sem ele.

  • As especificações divergem.

    A especificação no documento, a thread no Slack e o código no PR discordam silenciosamente por semanas. Ninguém consegue achar qual versão da conversa é a canônica.

    A solução

    Uma especificação canônica, no repositório, versionada com o código.specscore lint roda no CI a cada push; o histórico do git é a trilha de auditoria. A especificação, a thread e o PR não podem mais discordar em silêncio — eles compartilham o mesmo arquivo em revisão.

  • Os critérios ficam vagos.

    "Lida com erros graciosamente" era para significar"mostrar um toast e fazer rollback." Ou era"logar e tentar de novo?" O agente tem que adivinhar.

    A solução

    O linter pega critérios ambíguos antes de qualquer linha de código ser escrita. O verbo falha no lint porque não tem objeto ou condição concretos. Corrigir o aviso obriga você a escrever o que "lida" realmente significa.

  • Agentes entregam a coisa errada.

    Humanos interpolam, perguntam, esclarecem. Agentes de IA não — eles implementam o padrão mais comum nos dados de treinamento. O código passa no review porque fazalguma coisa sensata. Só não é o que você queria dizer.

    A solução

    Entrada estruturada. Agentes de IA parseiam REQ IDs, AC IDs e cenáriosGIVEN / WHEN / THENde forma determinística — não há nada para interpolar. Planos precisam citar os AC IDs que cada tarefa satisfaz, então o que foi construído é sempre verificável contra o que foi especificado.

  • Você paga em dobro por uma especificação vaga.

    O agente constrói algo a partir de um brief ambíguo, você percebe que está errado e pede de novo — de quatro formas diferentes. Cada funcionalidade pela metade e cada nova tentativa são cobradas em tokens. Quanto mais vaga a especificação, mais rodadas até acertar.

    A solução

    Faça lint da especificação antes de o agente rodar.specscore lint rejeita verbos vagos e critérios de aceitação ausentes logo de início, então o agente implementa um brief concreto de uma vez em vez de adivinhar entre tentativas. A execução mais barata é a que você não precisa repetir.

  • Agentes pagam para reler suas especificações.

    Um agente de IA respondendo "o que depende dessa feature?"lê o README inteiro da feature. Depois cada índice pai. Depois features irmãs por garantia. Toda consulta é um re-parse. Tokens evaporam; a latência sobe; a conta sobe junto.

    A solução

    Consultas estruturadas em vez de leituras de arquivo.specscore feature tree devolve a hierarquia em YAML; feature deps percorre a cadeia transitiva de dependências; feature info expõe status, dono e perguntas em aberto — cada uma em uma única chamada. O agente navega o grafo, não a prosa.

  • O código esquece sua especificação.

    Seis meses depois, você está debugando uma função e ninguém lembra qual feature ela implementa. A ligação entre código e especificação vivia na cabeça de alguém, e essa pessoa saiu. O PR que a introduziu está no arquivo morto.

    A solução

    Anotações no código-fonte. Comentários como// specscore: features/checkout/apply-discount/R1.AC-2tornam a ligação legível por máquinas e sobrevivem a qualquer refatoração.specscore code deps responde"qual especificação este arquivo implementa?" em uma única chamada; o linter sinaliza referências que apontam para especificações deletadas.

  • Mudanças de status vazam.

    Você move uma feature de Draft para Approvedno README dela, mas o features-index pai ainda a lista como Draft. Três semanas depois, um agente lendo o índice acha que ela ainda está em definição. O status agora vive em dois lugares, e eles discordam.

    A solução

    specscore feature change-status reescreve o campo Status da feature e ressincroniza a linha no features-index num único passo atômico — se o lint falhar, a reescrita é revertida. O status existe em um único lugar canônico; o índice é uma visão gerada dele.

  • As especificações esquecem o que não sabem.

    Uma especificação parece acabada — até você lembrar que a pergunta"e quanto aos fusos horários?" se perdeu numa thread do Slack há dois meses e nunca chegou ao documento. Agora vocês estão na implementação, e ninguém sabe dizer qual era a resposta.

    A solução

    Toda feature SpecScore tem uma seçãoOutstanding Questions obrigatória. O linter rejeita features que a omitem — vazio tudo bem ("None at this time."), mas faltar não pode. Perguntas em aberto ficam visíveis no documento, consultáveis pela CLI, e impossíveis de esquecer.

O jeito mais fácil de começar: SpecStudio Skills para agentes de IA.

SpecStudio Skillsé um plugin do Claude Code que transforma o ciclo de vida do SpecScore em quatro slash commands. Instale uma vez e rode em ordem — da ideia crua ao plano executável.

$ /plugin marketplace add specscore/ai-marketplace
$ /plugin install specstudio@specscore
Claude Codeautocompletar
> /specstudio:
   /specstudio:ideate     Refinar uma ideia crua em uma SpecScore Idea
   /specstudio:specify    Transformar uma Idea aprovada em uma especificação de Feature
   /specstudio:plan       Decompor uma Feature num Plano de tarefas
   /specstudio:implement  Executar a próxima tarefa de um Plano
Claude Code/ideate
> /ideate Vamos pensar em como a tela do carrinho deve ficar no fluxo de checkout.
Claude Code/specify
> /specify Vamos definir spec/ideas/checkout-basket.md
Claude Code/plan
> /plan Implementar spec/features/checkout/basket/README.md
Claude Code/implement
> /implement Executar spec/plans/checkout-basket/README.md

Grátis para repositórios públicos e open-source. O código do plugin está emspecscore/specstudio-skills — licença MIT.

Verifique sua especificação em duas passagens.

Um linter determinístico rápido, depois uma revisão mais profunda por IA — rodando contra a especificação que você acabou de ver. Duas passagens, dois tipos de certeza.

Rode o linter.

determinístico

Mesmo resultado a cada execução. Gratuito, rápido, roda em todo commit.

Revise e pontue com IA.

não determinístico

Lê em busca de significado, como um revisor humano.

Veja o que ele não vai pegar.

Um linter que diz pegar tudo está mentindo. O SpecScore é um sistema em camadas — um linter determinístico, um revisor de IA e o seu próprio julgamento — e cada camada tem um limite real. Escrevemos todos eles: o que o lint pega, o que a IA pega e o que ainda fica por sua conta porque nenhuma ferramenta consegue fazer isso ainda.

O que o linter não vai pegar →

O que vem na caixa.

O formato

Markdown + YAML. Funciona em qualquer editor que abra texto. Nenhuma ferramenta nova para começar a escrever.

O linter

CLI em Go. Valida estrutura, referências e completude. Sai com código não-zero em caso de falha — funciona no seu terminal e no seu CI.

Use o que você já tem.

SpecScore é só arquivos no seu repositório. Nenhum SaaS para se cadastrar. Nenhum orquestrador obrigatório. Use com Linear, Jira, GitHub Projects, Markdown puro numa pasta, ou sem nenhum gestor de tarefas. Para o formato e o linter, tanto faz onde seus tickets vivem.

Prefere a CLI?

Não usa agentes de IA, ou precisa de validação de especificações no seu pipeline de CI? Tem uma CLI para isso. Instala em 60 segundos — sem conta, sem telemetria, funciona em qualquer pasta com especificações em Markdown.

$ curl -fsSL https://specscore.md/install/get-cli | sh

Rode o linter na especificação de exemplo que vem com o binário:

$ specscore lint examples/checkout/apply-discount.md

Veja a saída:

  examples/checkout/apply-discount.md
    ✓ R1  has acceptance criteria
    ✓ R2  has acceptance criteria
    ✗ R3  no acceptance criteria
    ✗ link     "Related Feature: discount-tiers" not found
    ✗ section  "Open Questions" missing

  3 problems   exit 1

Leia a documentação completaContribua no GitHub

Feito sobre SpecScore.

  • Codegrapher

    Motor de grafo de código para exploração rápida do código e vínculo bidirecional entre especificações e código.

    codegrapher.dev
  • DALgo

    Camada de acesso a dados em Go, especificada com SpecScore.

    dal-go.github.io
  • inGitDB

    Banco de dados versionado baseado em Git, especificado com SpecScore.

    ingitdb.com
  • Rehearse

    Camada de evidência de aceitação: executa de verdade os critérios de aceitação de uma especificação, com verificações reutilizáveis e sem código de cola.

    rehearse.ink
  • SpecScore Studio

    Interface web para visualizar e editar especificações SpecScore.

    specscore.studio

Tem perguntas?

Estas são as perguntas que as pessoas continuam fazendo. Cada uma leva à resposta completa na página de FAQ.

Qual a diferença entre SpecScore e spec-kit?

spec-kit é uma metodologia; SpecScore é um formato de armazenamento para as especificações que você escreve, mais uma CLI. Eles se compõem — uma extensão de spec-kit que escreve SpecScore já está em desenvolvimento.

Resposta completa →
Qual a diferença entre SpecStudio Skills e Superpowers / agent-skills?

Semelhantes em espírito — os três guiam agentes de IA pelo ciclo ideate → specify → plan → implement. SpecStudio Skills escreve artefatos no formato SpecScore e usa o CLIspecscore para consultas e mudanças de status; os outros leem e escrevem arquivos diretamente. Escolha SpecStudio quando o consumo de tokens importa.

Resposta completa →
Por que um CLI — não basta instalar skills?

Skills não conseguem, de forma confiável, garantir integridade referencial, retornar consultas filtradas sem ler cada arquivo, ou alterar o campo de status correto no momento certo. O CLI faz cada uma dessas coisas numa única chamada. Skills leem todos os arquivos para fazer o mesmo.

Resposta completa →
Por que «SpecScore» — o que ele pontua?

Duas leituras, ambas intencionais. Partitura — um score estruturado de requisitos. E uma nota literal de qualidade — o linter do CLI é o score determinístico, e a skill/score é a nota de prontidão de A a F julgada por IA.

Resposta completa →
Onde estão os números de economia de tokens?

Uma comparação lado a lado medida está em andamento antes do post no Habr. Estruturalmente: o CLI devolve uma pequena lista estruturada; um agente sem CLI lê N documentos no lugar.

Resposta completa →

Specs que passam.

ou leia a documentação

★ Dê uma estrela no GitHub — ajuda outras pessoas a encontrar o projeto.GitHub stars

Encontrou um erro na tradução ou tem uma ideia para melhorar esta página? Nos avise.