Skip to content

Referência de métricas e códigos

Folha de consulta densa para tudo que o harness-score reporta: pontuações, escopos, níveis, dimensões, IDs de check, chaves de configuração, flags da CLI, inputs da Action e campos JSON. Receitas de remediação estão no capítulo 8 — Medir e melhorar.

Pontuações: maturity vs effective

CódigoO que incluiUsado para
maturitySomente arquivos do repositório (scopes: repo)Gate padrão de CI, badge, --min-level, maturidade oficial do time
effectiveRepo ∪ escopos globais/extras configuradosLocalmente: “o que o agente vê nesta máquina” quando harness user/system está habilitado

Quando nenhum escopo extra está configurado, effective iguala maturity (mesmo nível, pontuação e checks). O relatório sempre inclui ambos os blocos para JSON estável.

Defina qual pontuação faz gate no CI com gate na config, --gate ou o input gate da Action (maturity por padrão).

Escopos

EscopoSignificadoO que é escaneado
repoSempre ativoO diretório passado ao harness-score (padrão .)
userOpt-inCaminhos allowlisted mapeados para formas repo-relative: ~/.cursor/*, ~/.claude/*, ~/.codeium/windsurf/* (alias Windsurf), ~/Documents/Cline/Rules.clinerules/, ~/.continue/{rules,prompts}, ~/.agents/*, ~/.zed/commands, ~/.config/opencode/agents, etc. Ver multi-harness — user scope por ferramenta. Não inclui: Copilot global (só repo), regras inline do Continue em config.yaml, User Rules do Cursor só na UI.
systemOpt-inReservado para instalações validadas em nível de sistema (mínimo na v1)
extraRootsOpt-inDiretórios adicionais (relativos ou absolutos) cuja árvore espelha o layout do harness — ex.: checkout compartilhado de harness do time

Arquivos do projeto vencem caminhos de overlay em conflito (mesmo caminho relativo).

Não escaneado: Cursor User Rules armazenadas só na UI do IDE (não em disco), varreduras arbitrárias do home directory, ou conteúdo de segredos em strings de evidência.

Níveis (L0–L4)

Nomes oficiais de nível aplicam-se à maturity, salvo se você definir gate: effective.

NívelNomeRequisitos (todos os níveis anteriores +)
L0Unharnessed
L1Documentedcontext ≥ 40%
L2Guidedcontext ≥ 60%; skills ≥ 30% ou hooks ≥ 30%; hygiene ≥ 50%
L3Sensingsensors ≥ 60%; ci ≥ 50%
L4Self-correctinghooks ≥ 70%; total ≥ 80%

Narrativa completa: O modelo de maturidade.

Dimensões

IDTítuloPts máxMede
contextContext & Guides20AGENTS.md, rules com escopo, README
skillsSkills & Commands17Skills, commands/workflows, subagents
hooksHooks & Guardrails14hooks.json / hooks em settings do Claude
sensorsSensors & Feedback20Testes, linter, tipos, formatter
ciCI Feedback14Pipeline, pre-commit
hygieneHygiene & Safety23.gitignore, segredos, lockfile, licença, higiene MCP

Total: 108 pontos.

Catálogo de checks

IDs estáveis — vinculados à remediação em Medir e melhorar.

Context & Guides

IDPtsAnalisa exatamenteRemediação
CTX-014AGENTS.md, CLAUDE.md ou GEMINI.md na raiz existectx-01
CTX-023Arquivo de contexto tem ≥20 linhas significativas e ≥2 headingsctx-02
CTX-034Pelo menos um arquivo de rule com escopo (qualquer ferramenta suportada) ou arquivo de contexto aninhadoctx-03
CTX-043Toda rule declara metadados de ativação no frontmatterctx-04
CTX-052Nem toda rule é always-on genéricactx-05
CTX-062Nenhum arquivo de rule único excede 500 linhasctx-06
CTX-071README.md na raiz do repositórioctx-07
CTX-081Sem .cursorrules legado sem rules modernas com escopoctx-08

Skills & Commands

IDPtsAnalisa exatamenteRemediação
SKL-014Pelo menos um SKILL.md em diretório de skills reconhecidoskl-01
SKL-023Toda skill tem name: e description: no frontmatterskl-02
SKL-033Arquivos command/workflow existem para qualquer ferramenta suportadaskl-03
SKL-042Descrições de skill têm ≥40 caracteresskl-04
AGT-013Pelo menos um arquivo markdown de subagentagt-01
AGT-022Todo subagent tem frontmatter name: e description:agt-02

Hooks & Guardrails

IDPtsAnalisa exatamenteRemediação
HKS-014Config de hooks existe e parseia como JSONhks-01
HKS-022Hooks declaram version/metadata e nomes de evento conhecidoshks-02
HKS-034Hook classe gate registrado (shell/MCP/read/tool gate)hks-03
HKS-042Hook classe feedback registrado (post-edit/tool)hks-04
HKS-052Todo caminho de script de hook referenciado na config existe no repohks-05

Sensors & Feedback

IDPtsAnalisa exatamenteRemediação
SNS-016Test runner configurado (script em package.json, pytest, go test, etc.)sns-01
SNS-025Linter configurado (eslint, biome, ruff, golangci-lint, …)sns-02
SNS-034Type checking configurado (tsconfig, mypy, pyright, …)sns-03
SNS-043Formatter configurado (prettier, black, gofmt, …)sns-04
SNS-052Pelo menos um arquivo de teste existe na árvoresns-05

CI Feedback

IDPtsAnalisa exatamenteRemediação
CI-014Arquivo de pipeline CI presente (GitHub Actions, GitLab CI, …)ci-01
CI-024CI executa a suíte de testesci-02
CI-034CI executa lint ou typecheckci-03
CI-042Ferramenta pre-commit ou git hook instaladaci-04

Hygiene & Safety

IDPtsAnalisa exatamenteRemediação
HYG-014.gitignore presentehyg-01
HYG-023.gitignore cobre arquivos de ambientehyg-02
HYG-034Sem arquivos .env desprotegidos (sem padrão .env.example)hyg-03
HYG-044Configs JSON de MCP sem padrões inline de credencialhyg-04
HYG-052Arquivo LICENSE presentehyg-05
HYG-063Sem assinaturas tipo credencial em markdown/JSON de harnesshyg-06
HYG-073Lockfile de dependências commitadohyg-07
HYG-084Configs MCP usam interpolação de env para segredoshyg-08

Arquivo de configuração (.harness-score.json)

JSON opcional na raiz do scan (schema estrito — chaves desconhecidas geram erro):

json
{
  "scopes": {
    "user": false,
    "system": false
  },
  "extraRoots": [
    { "id": "team-shared", "path": "../shared-harness" }
  ],
  "gate": "maturity",
  "extends": ["no-hooks"],
  "rules": {
    "HYG-05": "off"
  }
}
ChaveTipoPadrãoSignificado
scopes.userbooleanfalseIncluir overlay de harness em nível de usuário
scopes.systembooleanfalseIncluir overlay em nível de sistema
extraRoots{ id, path }[][]Árvores extras de harness mescladas no effective
gate"maturity" | "effective""maturity"Qual pontuação o --min-level usa
extendsstring[][]Presets nomeados a aplicar (veja abaixo)
rulesRecord<checkId, severity>{}Override de severidade por check, aplicado depois de cada preset em extends

Precedência: flags da CLI → inputs da Action → arquivo de config → padrões. extends/rules são exclusivos do arquivo de config nesta versão — ainda não existe flag --extends/--rule na CLI nem input equivalente na Action; use --config <path> apontando para um .harness-score.json que os defina.

Personalização por equipe: extends e rules

O vocabulário é emprestado diretamente do ESLint, porque é um vocabulário que a maioria das equipes já conhece:

  • rules sobrescreve a severidade de um check específico por ID: "HYG-05": "off". A severidade é "off" ou "error" nesta versão — "error" é o padrão implícito de todo check, e "off" remove o check do numerador e do denominador da pontuação da sua dimensão (é excluído estruturalmente, nunca contado como falha). "warn" é um valor reconhecido mas deliberadamente rejeitado hoje com um erro claro de "ainda não suportado" — reservado para um modo futuro, consultivo e não-bloqueante.
  • extends aplica um preset nomeado e curado pelos mantenedores — um pacote versionado e revisado via PR de overrides de rules, não uma isenção livre por repositório. Isso preserva a mesma governança que já protege o catálogo de checks: propor um preset novo passa por revisão (veja CONTRIBUTING.md), não é um opt-out local silencioso. Presets em extends são aplicados na ordem do array, e qualquer entrada explícita em rules sempre prevalece sobre um preset.

Todo check excluído por extends/rules é sempre divulgado — na saída do terminal (linha Preset: ...), no relatório Markdown (linha **Preset:** e status na tabela de checks) e no campo preset do --json — nunca escondido silenciosamente atrás de uma flag.

Uma exceção, proposital: HYG-03, HYG-04 e HYG-06 — os checks que detectam credenciais efetivamente vazadas ou expostas — nunca podem ser definidos como "off", nem via rules nem via preset. Todo o resto nesse formato de config se apoia em divulgação e revisão de PR pra manter a integridade; esses três são o único ponto que não é negociável.

Presets nativos

PresetEfeitoPor quê
no-hooksDefine HKS-01HKS-05 (toda a dimensão Hooks & Guardrails, 14 dos 108 pontos) como "off"Para ambientes onde a execução de scripts de hook local é vedada por política — dev containers travados, orgs reguladas, runners compartilhados sem permissão de instalar hooks. O guardrail nesses casos é aplicado só via CI.

Excluir uma dimensão inteira tem uma consequência honesta que vale saber de antemão: como L4 · Self-correcting é definido por hooks de guardrail em runtime (veja o Modelo de Maturidade), um repositório sob no-hooks nunca alcança L4 — o nível fica capped (limitado), não "reprovado". report.level.capped é true e report.level.capReason explica o motivo; toda outra dimensão continua com a pontuação intacta. Isso é o scanner sendo honesto sobre o que "self-correcting" significa, não uma penalidade por excluir hooks.

Flags da CLI (configuração do scan)

FlagSignificado
--config <file>Carregar config de caminho específico
--scope userHabilitar escopo user (separados por vírgula: user, system)
--gate maturity|effectivePontuação usada para --min-level
--min-level <0-4>Exit 1 quando pontuação gated está abaixo do nível
--jsonRelatório completo incluindo scopes, gate, effective

Inputs da GitHub Action

InputPadrãoSignificado
include-user-harnessfalsePassa --scope user
include-system-harnessfalsePassa --scope system
gatematurityPassa --gate
config''Passa --config quando definido
min-level0Falha quando pontuação gated está abaixo do nível

Outputs: level, level-name, percent (maturity); effective-level, effective-percent.

Campos JSON do relatório (estáveis)

CampoDescrição
rootRaiz absoluta do scan
scopes.maturitySempre ["repo"]
scopes.effectiveex.: ["repo"], ["repo","user"]
gate"maturity" ou "effective"
resolvedRootsLista opcional de { scope, absPath } para overlays
level, score, dimensions, checksSnapshot de maturity
effectiveMesma forma: { level, score, dimensions, checks, detectedHarnesses }
detectedHarnessesFerramentas vistas no repo (informativo)
truncatedWalk atingiu limite de arquivos
preset{ extends, rules, resolved } — personalização de equipe efetivamente aplicada; resolved só lista checks cuja severidade difere do padrão
level.capped, level.capReasoncapped é true quando um requisito bloqueante do próximo nível nunca pode ser satisfeito sob a config atual (ex.: dimensão excluída por preset); capReason explica o motivo
dimensions[].applicablefalse só quando todo check daquela dimensão resolveu para "off"
checks[].severity"off" | "warn" | "error" — a severidade resolvida usada por este scan para aquele check

--diff compara campos de maturity por padrão (top-level level / score / checks).