Does my measurement reflect the truth, or what I want to see? Verify that in both directions (false positive and false negative) β before believing either a positive or a negative result.
This is the methodology of the Mirror Stack: how to think when you measure. The tools are how to prove you thought it. The two are married below β each principle names the probe that seals it. A compact form of this is injected automatically by the unified MCP server when an agent connects.
Most measurement failures come from a narrative ("X is special") contaminating the measurement so it reflects hope. The discipline blocks that. But the discipline's own catches are your judgment, guided by a checklist β and judgment can itself be a false positive or negative. So the most important rule is honest attribution:
- "the tool flagged X" β only when an
mm_*probe returned a Finding you can quote. - "applying the discipline, I suspect X" β when it is your reasoning.
Both are valid. Never borrow the tool's deterministic credibility for a judgment call. A catch with no Finding and no ledger entry is reasoning, not measurement.
| # | Principle | What it blocks | Prove it with |
|---|---|---|---|
| 1 | Preregistration | post-hoc metric swap; moving the goalposts | mm_preregister (sealed, chained) |
| 2 | Fair baseline | a positive that is a "free pass" β crippled/weak baseline | mm_baseline_fairness |
| 3 | Gaming line | rewarding the eval metric directly = self-fulfilling. Only removal/swap is honest; adding reward is an artifact. | mm_verify(reward_terms=β¦) (gaming) |
| 4 | Both directions | false positive (illusory win) and false negative (unfair null, wrong framing, testing a stand-in not the real target) | mm_negative_audit |
| 5 | Multi-seed + independent reproduction | lucky seed; signal/noise confusion. Agreement without reproduction is void. | mm_multiseed_check; cross-witness from another agent (am_witness) |
| 6 | Scope honesty | over- and under-claiming β state what you closed and did not close | mm_verify(claimed_scope, tested_scope) |
| 7 | Self-catch | "too good to be true" β suspect your own result first | mm_too_good_check |
The 7 are the mental anchors. The stack adds five checks the original checklist did not name:
- A. Falsifiability (kill-condition). Strengthens #1: don't just seal the bar β seal what
would kill the claim. A claim with no kill-condition is unfalsifiable. β
mm_falsifiability_check(the kill_threshold registered withmm_preregister). - B. Power (quantified false-negative). Strengthens #4: is n big enough to detect the
effect? Design-time, before spending compute. β
mm_power_check. - C. Statistical hygiene. Two cheap, decisive checks the checklist omitted: multiple
comparisons (k experiments on one ledger β Bonferroni) and GRIM (reported acc Γ n must be
an achievable integer β catches fabricated/typo'd numbers). β
mm_verify(multiplicity, grim). - D. Judge reliability (conditional β only when an LLM judge is used). Is the judge itself
trustworthy? Consistency, position bias, ABβBA swap, A>B>C>A transitivity, degenerate scores.
β
mm_judge_*/mm_inter_rater_agreement/mm_ranking_stability_check. - E. Seal quality (pre-compute lint). Strengthens #1 and A from the other side: a
kill-condition that exists but can't be parsed (leaked into the wrong field by a malformed
call), or a bar at/below declared chance, silently defeats every downstream check. Lint the seal right
after sealing, before spending compute; the compute gate BLOCKs on a lint FAIL. Declare the
cheap machine-checks you ran (
pre_seal_checks=: reachability-smoke, mass-balance-audit, neutral-control, manipulation-check, positive-control). βmm_prereg_lint(auto insidemm_register).
The discipline says "think honestly." The stack adds "+ your record proves you did, and cannot be faked after the fact":
- Seal claims and actions; tie each action to its claim (
am_record target=<claim_id>). - Anchor externally at milestones (
mm_anchor) β detects whole-file replacement. - Witness across agents (
am_witness) β what hash chains alone cannot catch. - Retract in the open (
mm_retract) β negatives and withdrawals are sealed too; dependents go STALE. A missing ledger is itself a signal. (tombstone.pysurfaces the sealed graveyard β visible proof a failure can't be quietly deleted.) - Enforce, don't just suggest (
mirror-stack-gateexits non-zero on BLOCK β wire it into a compute launcher or a pre-commit hook so an unsealed claim can't proceed). - Run
stack_verify_allbefore declaring a verdict β or, for an outsider with no MCP client, the one-commandmirror-stack-verify(chain linkage + Bitcoin cross-check on a public explorer).
The four guarantees these add up to β integrity, non-erasure, falsifiability, verifiability β and the one no tool can give (independence) are mapped in PILLARS.md.
- The tool cannot do most of the catching. Crippled baseline, a wrong stand-in model, gaming β these are design flaws found by reasoning, not arithmetic. The probes flag suspicion (e.g. "baseline suspiciously close"); the insight is judgment. Keep methodology primary; tools are proof where proof is possible, not a replacement for thinking.
- This is guidance, not enforcement. Nothing here forces honesty β an agent can simply not record. The guarantee is asymmetric by design: sealed preregistrations and time-pinned witnesses cannot be fabricated retroactively, so the absence of a record becomes the signal. Process can be enforced at the harness (hooks) or CI (a gate) layer β never at the "make the agent honest" level.
- Independent reproduction means independent. Witnesses operated by one family are not third parties (see the stack's honesty box).
Lineage: this discipline was forged while killing our own projects β every closure in that work is honest because the mirror caught the illusions (false positives) and guarded the premature closures (false negatives). See the case study.