Skip to content

Referencia de métricas y códigos

Hoja de referencia densa para todo lo que reporta harness-score: puntajes, scopes, niveles, dimensiones, IDs de check, claves de configuración, flags de CLI, inputs de Action y campos JSON. Las recetas de remediación están en capítulo 8 — Medir y mejorar.

Puntajes: maturity vs effective

CódigoQué incluyeSe usa para
maturitySolo archivos del repositorio (scopes: repo)Gate de CI por defecto, badge, --min-level, madurez oficial del equipo
effectiveRepo ∪ scopes globales/extras configuradosLocal: “lo que el agente ve en esta máquina” cuando el harness user/system está habilitado

Sin scopes extra configurados, effective iguala maturity (mismo nivel, puntaje y checks). El reporte siempre incluye ambos bloques para JSON estable.

Define qué puntaje hace gate en CI con gate en config, --gate o el input gate de la Action (maturity por defecto).

Scopes

ScopeSignificadoQué se escanea
repoSiempre activoEl directorio que pasas a harness-score (default .)
userOpt-inRutas allowlisted mapeadas a 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 herramienta. No incluye: Copilot global (solo repo), reglas inline de Continue en config.yaml, User Rules de Cursor solo en UI.
systemOpt-inReservado para instalaciones validadas a nivel sistema (mínimo en v1)
extraRootsOpt-inDirectorios adicionales (relativos o absolutos) cuyo árbol refleja el layout del harness — ej.: checkout compartido de harness del equipo

Los archivos del proyecto ganan sobre rutas de overlay en conflicto (misma ruta relativa).

No escaneado: Cursor User Rules guardadas solo en la UI del IDE (no en disco), recorridos arbitrarios del home directory, o contenido de secretos en strings de evidencia.

Niveles (L0–L4)

Los nombres oficiales de nivel aplican a maturity, salvo que definas gate: effective.

NivelNombreRequisitos (todos los niveles anteriores +)
L0Unharnessed
L1Documentedcontext ≥ 40%
L2Guidedcontext ≥ 60%; skills ≥ 30% o hooks ≥ 30%; hygiene ≥ 50%
L3Sensingsensors ≥ 60%; ci ≥ 50%
L4Self-correctinghooks ≥ 70%; total ≥ 80%

Narrativa completa: El modelo de madurez.

Dimensiones

IDTítuloPts máxMide
contextContext & Guides20AGENTS.md, rules con scope, README
skillsSkills & Commands17Skills, commands/workflows, subagents
hooksHooks & Guardrails14hooks.json / hooks en settings de Claude
sensorsSensors & Feedback20Tests, linter, tipos, formatter
ciCI Feedback14Pipeline, pre-commit
hygieneHygiene & Safety23.gitignore, secretos, lockfile, licencia, higiene MCP

Total: 108 puntos.

Catálogo de checks

IDs estables — vinculados a remediación en Medir y mejorar.

Context & Guides

IDPtsAnaliza exactamenteRemediación
CTX-014Existe AGENTS.md, CLAUDE.md o GEMINI.md en la raízctx-01
CTX-023El archivo de contexto tiene ≥20 líneas significativas y ≥2 headingsctx-02
CTX-034Al menos un archivo de rule con scope (cualquier herramienta soportada) o archivo de contexto anidadoctx-03
CTX-043Toda rule declara metadatos de activación en frontmatterctx-04
CTX-052No toda rule es always-on genéricactx-05
CTX-062Ningún archivo de rule único supera 500 líneasctx-06
CTX-071README.md en la raíz del repositorioctx-07
CTX-081Sin .cursorrules legacy sin rules modernas con scopectx-08

Skills & Commands

IDPtsAnaliza exactamenteRemediación
SKL-014Al menos un SKILL.md bajo directorio de skills reconocidoskl-01
SKL-023Toda skill tiene name: y description: en frontmatterskl-02
SKL-033Existen archivos command/workflow para cualquier herramienta soportadaskl-03
SKL-042Las descripciones de skill tienen ≥40 caracteresskl-04
AGT-013Al menos un archivo markdown de subagentagt-01
AGT-022Todo subagent tiene frontmatter name: y description:agt-02

Hooks & Guardrails

IDPtsAnaliza exactamenteRemediación
HKS-014La config de hooks existe y parsea como JSONhks-01
HKS-022Los hooks declaran version/metadata y nombres de evento conocidoshks-02
HKS-034Hook clase gate registrado (shell/MCP/read/tool gate)hks-03
HKS-042Hook clase feedback registrado (post-edit/tool)hks-04
HKS-052Toda ruta de script de hook referenciada en config existe en el repohks-05

Sensors & Feedback

IDPtsAnaliza exactamenteRemediación
SNS-016Test runner configurado (script en 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-052Al menos un archivo de test existe en el árbolsns-05

CI Feedback

IDPtsAnaliza exactamenteRemediación
CI-014Archivo de pipeline CI presente (GitHub Actions, GitLab CI, …)ci-01
CI-024CI ejecuta la suite de testsci-02
CI-034CI ejecuta lint o typecheckci-03
CI-042Herramienta pre-commit o git hook instaladaci-04

Hygiene & Safety

IDPtsAnaliza exactamenteRemediación
HYG-014.gitignore presentehyg-01
HYG-023.gitignore cubre archivos de entornohyg-02
HYG-034Sin archivos .env desprotegidos (sin patrón .env.example)hyg-03
HYG-044Configs JSON de MCP sin patrones inline de credencialhyg-04
HYG-052Archivo LICENSE presentehyg-05
HYG-063Sin firmas tipo credencial en markdown/JSON de harnesshyg-06
HYG-073Lockfile de dependencias commiteadohyg-07
HYG-084Configs MCP usan interpolación de env para secretoshyg-08

Archivo de configuración (.harness-score.json)

JSON opcional en la raíz del scan (schema estricto — claves desconocidas generan error):

json
{
  "scopes": {
    "user": false,
    "system": false
  },
  "extraRoots": [
    { "id": "team-shared", "path": "../shared-harness" }
  ],
  "gate": "maturity",
  "extends": ["no-hooks"],
  "rules": {
    "HYG-05": "off"
  }
}
ClaveTipoDefaultSignificado
scopes.userbooleanfalseIncluir overlay de harness a nivel usuario
scopes.systembooleanfalseIncluir overlay a nivel sistema
extraRoots{ id, path }[][]Árboles extra de harness fusionados en effective
gate"maturity" | "effective""maturity"Qué puntaje usa --min-level
extendsstring[][]Presets con nombre a aplicar (ver abajo)
rulesRecord<checkId, severity>{}Override de severidad por check, aplicado después de cada preset en extends

Precedencia: flags de CLI → inputs de Action → archivo de config → defaults. extends/rules son exclusivos del archivo de config en esta versión — todavía no hay flag --extends/--rule en la CLI ni input equivalente en la Action; usa --config <path> apuntando a un .harness-score.json que los defina.

Personalización por equipo: extends y rules

El vocabulario está tomado directamente de ESLint, porque es un vocabulario que la mayoría de equipos ya conoce:

  • rules sobrescribe la severidad de un check específico por ID: "HYG-05": "off". La severidad es "off" o "error" en esta versión — "error" es el default implícito de todo check, y "off" remueve el check del numerador y del denominador de la puntuación de su dimensión (se excluye estructuralmente, nunca cuenta como fallo). "warn" es un valor reconocido pero rechazado deliberadamente hoy con un error claro de "aún no soportado" — reservado para un modo futuro, consultivo y no bloqueante.
  • extends aplica un preset con nombre, curado por los maintainers — un paquete versionado y revisado vía PR de overrides de rules, no una excepción libre por repositorio. Esto preserva la misma gobernanza que ya protege el catálogo de checks: proponer un preset nuevo pasa por revisión (ver CONTRIBUTING.md), no es un opt-out local silencioso. Los presets en extends se aplican en el orden del array, y cualquier entrada explícita en rules siempre prevalece sobre un preset.

Todo check excluido por extends/rules siempre se divulga — en la salida de terminal (línea Preset: ...), en el reporte Markdown (línea **Preset:** y estado en la tabla de checks) y en el campo preset del --json — nunca escondido silenciosamente detrás de un flag.

Una excepción, a propósito: HYG-03, HYG-04 y HYG-06 — los checks que detectan credenciales activamente filtradas o expuestas — nunca pueden ponerse en "off", ni vía rules ni vía preset. Todo lo demás en este formato de config se apoya en divulgación y revisión de PR para mantener la integridad; estos tres son el único punto que no es negociable.

Presets nativos

PresetEfectoPor qué
no-hooksPone HKS-01HKS-05 (toda la dimensión Hooks & Guardrails, 14 de 108 puntos) en "off"Para entornos donde ejecutar scripts de hook local está prohibido por política — dev containers bloqueados, orgs reguladas, runners compartidos sin permiso de instalar hooks. El guardrail en esos casos se aplica solo vía CI.

Excluir una dimensión entera tiene una consecuencia honesta que vale la pena saber de antemano: como L4 · Self-correcting está definido por hooks de guardrail en runtime (ver el Modelo de madurez), un repositorio bajo no-hooks nunca alcanza L4 — el nivel queda capped (limitado), no "reprobado". report.level.capped es true y report.level.capReason explica el motivo; el resto de dimensiones mantiene su puntuación intacta. Esto es el escáner siendo honesto sobre lo que "self-correcting" significa, no una penalización por excluir hooks.

Flags de CLI (configuración del scan)

FlagSignificado
--config <file>Cargar config desde ruta específica
--scope userHabilitar scope user (separados por coma: user, system)
--gate maturity|effectivePuntaje usado para --min-level
--min-level <0-4>Exit 1 cuando el puntaje gated está bajo el nivel
--jsonReporte completo incluyendo scopes, gate, effective

Inputs de GitHub Action

InputDefaultSignificado
include-user-harnessfalsePasa --scope user
include-system-harnessfalsePasa --scope system
gatematurityPasa --gate
config''Pasa --config cuando está definido
min-level0Falla cuando el puntaje gated está bajo el nivel

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

Campos JSON del reporte (estables)

CampoDescripción
rootRaíz absoluta del scan
scopes.maturitySiempre ["repo"]
scopes.effectiveej.: ["repo"], ["repo","user"]
gate"maturity" o "effective"
resolvedRootsLista opcional de { scope, absPath } para overlays
level, score, dimensions, checksSnapshot de maturity
effectiveMisma forma: { level, score, dimensions, checks, detectedHarnesses }
detectedHarnessesHerramientas vistas en el repo (informativo)
truncatedEl walk alcanzó límite de archivos
preset{ extends, rules, resolved } — personalización de equipo efectivamente aplicada; resolved solo lista checks cuya severidad difiere del default
level.capped, level.capReasoncapped es true cuando un requisito bloqueante del siguiente nivel nunca puede cumplirse bajo la config actual (ej.: dimensión excluida por preset); capReason explica el motivo
dimensions[].applicablefalse solo cuando todo check de esa dimensión resolvió a "off"
checks[].severity"off" | "warn" | "error" — la severidad resuelta que este scan usó para ese check

--diff compara campos de maturity por defecto (top-level level / score / checks).