mcpField
M
metric-validation-harness

metric-validation-harness

github.com/pproencaTesting & quality218117 installsUpdated 11w ago
Repository

About metric-validation-harness

A read-only skill that tests candidate metrics against a corpus, attempting to falsify properties such as determinism, invariance, and validity. It is for developers designing, reviewing, or optimizing metrics, and reports results by property.

Key features

  1. 01Check determinism, invariance, and monotonicity
  2. 02Test edge inputs and runtime cost
  3. 03Assess correlation with labels and outcomes
  4. 04Report pass or fail for each property
  5. 05Configure a metric command and corpus

Use cases

  1. 01Test whether a code metric resists formatting changes
  2. 02Check consistency across repeated metric runs
  3. 03Compare predictive performance of candidate metrics
  4. 04Check whether an Agent can game a metric before optimization

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/pproenca/dot-skills --skill metric-validation-harness

After installing, type/metric-validation-harnessin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

.gitignore
config.json
gotchas.md
metadata.json
references/
workflow.md
scripts/
check-determinism.sh
check-invariance.sh
check-monotonicity.sh
check-robustness.sh
check-tractability.py
check-validity.py
run-metric.sh
selftest.sh
verify.sh
scripts/examples/
metric_ast_nodes.py
metric_loc.py
scripts/fixtures/
corpus.csv
scripts/fixtures/corpus/
f1_dense.py
f2_commented.py
f3_medium.py
f4_loops.py
f5_class.py
f6_tiny.py
scripts/lib/
harness.py
load-config.sh
transforms.py

Details

From the project README

Metric Validation Harness

Point this harness at a candidate metric and a corpus, and it runs experiments that try to falsify each property a trustworthy, optimizable metric must have. It is the empirical companion to deterministic-metric-design: that skill tells you to prove monotonicity, invariance, determinism, and construct validity; this skill runs the experiment and reports PASS/FAIL, each result mapped to the design-skill category it checks.

Read-only. It computes and reports; it never modifies your metric, the corpus, or any external state. Safe to run unsupervised.

When to Apply

  • Someone proposes, reviews, tunes, or ships a metric / score / index and you need evidence it is sound
  • A score "feels off" — you suspect it tracks LOC, jumps between runs, or saturates
  • You are about to let an agent optimize a metric and need to know it can't be gamed by cosmetic edits
  • You built a candidate per deterministic-metric-design and want to empirically confirm the properties you argued for
  • You are choosing between two metrics and need to know which actually predicts the outcome (and beats a trivial baseline)

Workflow Overview

config.json / env  →  resolve metric_cmd, corpus, thresholds (env > config > bundled default)
        │
        ▼
   verify.sh ──► determinism ─ invariance ─ monotonicity ─ robustness ─ tractability ─ validity
        │            (each property check maps to a deterministic-metric-design category)
        ▼
   PASS / FAIL per property  →  exit 0 (all pass) or 1 (any group failed)

The Adapter Contract

Your metric is any command that takes a path as its last argument and prints exactly one number to stdout:

$ python3 mymetric.py path/to/file.py
42

Language-agnostic — Python, a shell one-liner, a compiled binary, anything. Diagnostics go to stderr; stdout is the number only. A bundled example metric (scripts/examples/metric_ast_nodes.py, AST-node count) ships so the harness runs out of the box.

How to Run

# 1. Validate the bundled example metric (works with zero setup):
bash scripts/verify.sh

# 2. Validate YOUR metric — set metric_cmd in config.json, or override per-run:
METRIC_CMD="python3 /abs/path/mymetric.py" bash scripts/verify.sh

# 3. Prove the harness itself works (positive + negative cases):
bash scripts/selftest.sh

# 4. Sanity-check your adapter prints one number:
bash scripts/run-metric.sh path/to/file.py

verify.sh runs every check and prints a final PASS/FAIL. Each check is also runnable on its own (e.g. bash scripts/check-determinism.sh).

What It Checks

CheckMaps to (design skill)What it doesPASS condition
check-determinism.shdet-Runs the metric twice + under PYTHONHASHSEED 0/1identical number every time
check-invariance.shprop- / game-Adds comments/blank lines/whitespace (cosmetic)score unchanged (else it's gameable)
check-monotonicity.shprop-Appends a code block (construct-increasing) + checks spreadscore non-decreasing; not saturated
check-robustness.shprop-Empty + single-statement edge inputsfinite, in declared range, no crash
check-tractability.pycomp-Times the metric on growing inputswithin budget, sub-quadratic growth
check-validity.pyvalid-Spearman vs accepted, vs LOC; AUC vs outcomeconvergent high, discriminant not ~LOC, predictive beats baseline

Statistics (Spearman, AUC/Mann–Whitney) are pure Python stdlib — no numpy/scipy.

Setup & Configuration

The harness runs with zero config against the bundled example. To validate your own metric, set fields in config.json (or override any of them with the matching UPPER_CASE environment variable per run):

config.jsonEnv overrideMeaning
metric_cmdMETRIC_CMDyour metric command (path-printing → number)
baseline_cmdBASELINE_CMDtrivial baseline (default: bundled LOC)
corpus_dirCORPUS_DIRartifacts the property checks iterate over
labels_csvLABELS_CSVpath[,outcome][,accepted] for validity
declared_min / declared_maxDECLARED_MIN / DECLARED_MAXrange the robustness check enforces

Validity thresholds are env-tunable: CONVERGENT_MIN, DISCRIMINANT_MAX, PREDICTIVE_MIN (defaults are lenient — tighten for a real run; see gotchas.md).

Empty config fields fall back to the bundled demo, so the skill never crashes on missing setup — it runs the example instead.

Tool Requirements

  • python3 (3.8+) — runs the metric, the transforms, and the stats
  • bash and awk — the orchestrator and numeric comparisons (scripts are macOS bash 3.2-safe)

No network, no external packages.

Interpreting Results

A FAIL names the property and the design-skill rule to consult. Examples:

  • cosmetic noise moved the score → the metric reads surface text; see prop-prove-invariance-under-irrelevant-transforms and game-make-cheapest-improvement-the-right-one.
  • score DROPPED after adding code → non-monotonic; optimizing it can reward worse code (prop-prove-monotonicity).
  • |Spearman(metric, LOC)| too high → it's LOC relabeled (valid-discriminant-not-just-loc).

Related Skills

  • deterministic-metric-design — the design half. Use it to construct the metric (define the construct, choose a computable proxy, pick the scale, argue the properties); use this harness to empirically verify what you argued.
  • same-results-less-code, complexity-optimizer, knip-deadcode — prescriptive code-reduction skills; validate any reduction metric you build to drive them with this harness before letting an agent optimize against it.

See references/workflow.md for per-check details, how to wire up your own metric and corpus, and troubleshooting.

Comments

Markdown supported