Skip to content

指标与代码参考

harness-score 报告内容的速查表:分数、scope、等级、维度、check ID、配置键、CLI 标志、Action 输入与 JSON 字段。修复方案见 第 8 章 — 测量与改进

分数:maturity vs effective

代码包含内容用途
maturity仅仓库文件(scopes: repo默认 CI gate、badge、--min-level、团队官方成熟度
effective仓库 ∪ 已配置的全局/额外 scope本地查看「此机器上 agent 实际可见内容」(启用 user/system harness 时)

未配置额外 scope 时,effective 等于 maturity(相同等级、分数与 checks)。报告始终包含两个块以保持 JSON 稳定。

通过配置中的 gate--gate 或 Action 的 gate 输入(默认 maturity)设置 CI 以哪个分数 gate。

范围

Scope含义扫描内容
repo始终开启传给 harness-score 的目录(默认 .
user可选allowlisted 用户级路径映射为 repo-relative 形状:~/.cursor/*~/.claude/*~/.codeium/windsurf/*(Windsurf 别名)、~/Documents/Cline/Rules.clinerules/~/.continue/{rules,prompts}~/.agents/*~/.zed/commands~/.config/opencode/agents 等。见 多 harness — 各工具 user scope不含: Copilot 全局(仅 repo)、Continue 在 config.yaml 中的内联 rules、仅 UI 的 Cursor User Rules。
system可选保留给已验证的系统级安装(v1 中极少)
extraRoots可选额外目录(相对或绝对),其目录树镜像 harness 布局 — 例如共享团队 harness checkout

冲突时(相同相对路径),项目文件优先于 overlay 路径。

不扫描: 仅存在于 IDE UI 的 Cursor User Rules(不在磁盘上)、任意 home 目录遍历,或 evidence 字符串中的 secrets 内容。

等级(L0–L4)

官方等级名称适用于 maturity,除非你设置 gate: effective

等级名称要求(含所有更低等级 +)
L0Unharnessed
L1Documentedcontext ≥ 40%
L2Guidedcontext ≥ 60%;skills ≥ 30% hooks ≥ 30%;hygiene ≥ 50%
L3Sensingsensors ≥ 60%;ci ≥ 50%
L4Self-correctinghooks ≥ 70%;total ≥ 80%

完整说明:成熟度模型

维度

ID标题最高分衡量内容
contextContext & Guides20AGENTS.md、scoped rules、README
skillsSkills & Commands17Skills、commands/workflows、subagents
hooksHooks & Guardrails14hooks.json / Claude settings hooks
sensorsSensors & Feedback20测试、linter、类型、formatter
ciCI Feedback14Pipeline、pre-commit
hygieneHygiene & Safety23.gitignore、secrets、lockfile、license、MCP 卫生

总计: 108 分。

Check 目录

稳定 ID — 链接至 测量与改进 中的修复方案。

Context & Guides

ID精确分析修复
CTX-014根目录存在 AGENTS.mdCLAUDE.mdGEMINI.mdctx-01
CTX-023上下文文件 ≥20 行有意义内容且 ≥2 个 headingctx-02
CTX-034至少一个 scoped rule 文件(任意支持工具)或嵌套上下文文件ctx-03
CTX-043每条 rule 在 frontmatter 中声明激活元数据ctx-04
CTX-052并非所有 rule 都是 blanket always-onctx-05
CTX-062无单个 rule 文件超过 500 行ctx-06
CTX-071仓库根目录有 README.mdctx-07
CTX-081无遗留 .cursorrules 且缺少现代 scoped rulesctx-08

Skills & Commands

ID精确分析修复
SKL-014在 recognized skills 目录下至少一个 SKILL.mdskl-01
SKL-023每个 skill 的 frontmatter 含 name:description:skl-02
SKL-033任意支持工具存在 command/workflow 文件skl-03
SKL-042Skill 描述 ≥40 字符skl-04
AGT-013至少一个 subagent markdown 文件agt-01
AGT-022每个 subagent 有 name:description: frontmatteragt-02

Hooks & Guardrails

ID精确分析修复
HKS-014Hooks 配置存在且可解析为 JSONhks-01
HKS-022Hooks 声明 version/metadata 与已知 event 名称hks-02
HKS-034注册了 gate 类 hook(shell/MCP/read/tool gate)hks-03
HKS-042注册了 feedback 类 hook(post-edit/tool)hks-04
HKS-052配置中引用的每个 hook 脚本路径在 repo 中存在hks-05

Sensors & Feedback

ID精确分析修复
SNS-016配置了 test runner(package.json script、pytest、go test 等)sns-01
SNS-025配置了 linter(eslint、biome、ruff、golangci-lint 等)sns-02
SNS-034配置了 type checking(tsconfig、mypy、pyright 等)sns-03
SNS-043配置了 formatter(prettier、black、gofmt 等)sns-04
SNS-052目录树中至少存在一个测试文件sns-05

CI Feedback

ID精确分析修复
CI-014存在 CI pipeline 文件(GitHub Actions、GitLab CI 等)ci-01
CI-024CI 运行测试套件ci-02
CI-034CI 运行 lint 或 typecheckci-03
CI-042安装了 pre-commit 或 git hook 工具ci-04

Hygiene & Safety

ID精确分析修复
HYG-014存在 .gitignorehyg-01
HYG-023.gitignore 覆盖环境文件hyg-02
HYG-034无未保护的 .env 文件(无 .env.example 模式)hyg-03
HYG-044MCP JSON 配置无 inline 凭证模式hyg-04
HYG-052存在 LICENSE 文件hyg-05
HYG-063harness markdown/JSON 中无类凭证签名hyg-06
HYG-073已提交依赖 lockfilehyg-07
HYG-084MCP 配置对 secrets 使用 env 插值hyg-08

配置文件(.harness-score.json

扫描根目录的可选 JSON(严格 schema — 未知键报错):

json
{
  "scopes": {
    "user": false,
    "system": false
  },
  "extraRoots": [
    { "id": "team-shared", "path": "../shared-harness" }
  ],
  "gate": "maturity",
  "extends": ["no-hooks"],
  "rules": {
    "HYG-05": "off"
  }
}
类型默认含义
scopes.userbooleanfalse包含用户级 harness overlay
scopes.systembooleanfalse包含系统级 overlay
extraRoots{ id, path }[][]合并到 effective 的额外 harness 树
gate"maturity" | "effective""maturity"--min-level 使用的分数
extendsstring[][]要应用的具名 preset(见下文)
rulesRecord<checkId, severity>{}按 check 的 severity override,应用于 extends 中每个 preset 之后

优先级:CLI 标志 → Action 输入 → 配置文件 → 默认值extends/rules 在本版本中仅限配置文件使用 — 目前没有对应的 --extends/--rule CLI 标志或 Action 输入;可用 --config <path> 指向一个定义了它们的 .harness-score.json

团队定制:extendsrules

这套词汇直接借用自 ESLint,因为大多数团队已经熟悉它:

  • rules 按 check ID 覆盖单个 check 的 severity:"HYG-05": "off"。本版本 severity 只接受 "off""error""error" 是每个 check 的隐式默认值,"off" 会把该 check 同时从其 dimension 分数的分子和分母中移除(结构性排除,永不计为 fail)。"warn" 是一个被识别但目前故意拒绝的值,会给出清晰的「尚未支持」错误 — 预留给未来的 advisory、non-blocking 模式。
  • extends 应用一个由 maintainer 精心维护的具名 preset — 是经过版本管理、PR review 的一组 rules overrides,而不是自由裁量的 per-repo 例外。这保持了与保护 checks 目录相同的治理方式:提出新 preset 需要走 review(见 CONTRIBUTING.md),而不是静默的本地 opt-out。extends 中的 preset 按数组顺序应用,rules 中任何显式条目始终优先于 preset。

任何被 extends/rules 排除的 check 都始终会被披露 — 在终端输出中(Preset: ... 行)、Markdown 报告中(**Preset:** 行以及 checks 表格中的 状态)、以及 --jsonpreset 字段中 — 绝不会被静默隐藏在某个 flag 后面。

有一个例外,是刻意为之的:HYG-03HYG-04HYG-06 — 这些检测「实际泄露或暴露的凭证」的 checks — 无论通过 rules 还是 preset,都永远不能设为 "off"。这套配置格式里的其他一切都依赖披露与 PR review 来维护 integrity;这三个是唯一不可协商的例外。

内置 preset

Preset效果原因
no-hooksHKS-01HKS-05(整个 Hooks & Guardrails dimension,占 108 分中的 14 分)设为 "off"用于本地 hook 脚本执行被 policy 禁止的环境 — 被锁定的 dev container、受监管的组织、没有权限安装 hooks 的共享 runner。这类场景下 guardrail 只能在 CI 中生效。

排除整个 dimension 有一个值得提前知道的、诚实的后果:由于 L4 · Self-correcting 就是由 runtime guardrail hooks 定义的(见成熟度模型),采用 no-hooks preset 的仓库永远无法达到 L4 — 该 level 会变成 capped,而不是「未通过」。report.level.cappedtruereport.level.capReason 解释原因;其他所有 dimension 的分数完全不受影响。这是 scanner 在「self-correcting」这个词的含义上保持诚实,而不是对排除 hooks 的惩罚。

优先级:CLI 标志 → Action 输入 → 配置文件 → 默认值

CLI 标志(扫描配置)

标志含义
--config <file>从指定路径加载配置
--scope user启用 user scope(逗号分隔:usersystem
--gate maturity|effective--min-level 使用的分数
--min-level <0-4>gated 分数低于等级时 exit 1
--json完整报告,含 scopesgateeffective

GitHub Action 输入

输入默认含义
include-user-harnessfalse传递 --scope user
include-system-harnessfalse传递 --scope system
gatematurity传递 --gate
config''设置时传递 --config
min-level0gated 分数低于等级时失败

Outputs:levellevel-namepercent(maturity);effective-leveleffective-percent

报告 JSON 字段(稳定)

字段描述
root绝对扫描根
scopes.maturity始终 ["repo"]
scopes.effective["repo"]["repo","user"]
gate"maturity""effective"
resolvedRootsoverlay 的可选 { scope, absPath } 列表
levelscoredimensionschecksmaturity 快照
preset{ extends, rules, resolved } — 本次 scan 实际应用的团队定制;resolved 只列出 severity 不同于默认值的 checks
level.cappedlevel.capReason当下一 level 的某个 blocking requirement 在当前配置下永远无法满足时(例如其 dimension 被 preset 排除),cappedtruecapReason 说明原因
dimensions[].applicable仅当该 dimension 中所有 check 都解析为 "off" 时为 false
checks[].severity"off" | "warn" | "error" — 本次 scan 对该 check 使用的最终 severity
effective相同结构:{ level, score, dimensions, checks, detectedHarnesses }
detectedHarnessesrepo 中看到的工具(仅供参考)
truncated遍历达到文件上限

--diff 默认比较 maturity 字段(顶层 level / score / checks)。