Skip to content

Meta and Confluence

M rules take other rules' findings as their input. Every other series reads the recipe; this one reads the finding set.

An M finding never lowers a score and never duplicates a line: its input is the finding multiset after the ownership resolver, so two rules that matched the same line have already collapsed to one owner by the time M runs. Its value is the relationship - a practice the recipe claims and a finding that contradicts it, or several weak signals whose combination is the story.

This is a reference page. For how weight and scope work, see Rule System.

Reading an M finding

  • It reads the profile, not the diff: the evidence names the findings that composed, and the recipe text they came from.
  • M001 scores (HIGH); M002 and M003 are weight-0 but escalate the band one step (never add points), gated on the benign-corpus cap M escalation stays below the benign cap.
  • It fires at the layer of its inputs, so it has no static layer.

Rules on this page

Rule Name Severity
M001 Claim Contradicted By Structure HIGH
M002 Weak Signal Across Layers MEDIUM
M003 Composition Not Owned Elsewhere MEDIUM

M001: Claim Contradicted By Structure

  • Target: programmatic (finding set)
  • Severity: HIGH (weight 25)
  • Category: meta
  • Condition: The recipe's declared practice contradicts a structural finding in the same run.

It joins the real claims ledger - the P-series ids the run's declared facts imply (trustsight.scoring.declared_claims) - against the structural findings: checksums declared (P001) while H091 reports the arrays do not cover every source, GPG verification declared (P002) while H024 reports it removed, a source pinned (P005) while H101 reports the pinning lost, a trusted forge declared (P007) while H099 reports the host swapped.

Only M can see this. The declared-practice ledger is weight 0 and the structural finding is its own claim; "the recipe says one thing and structurally does another" is a relationship between two findings that no single rule reads.

A fourth M family is a tool-health check, never a package finding: cofire_absence reports when a construct that historically co-fires with a rule appears without that rule - a sign the rule broke or was evaded in a known shape. It is consumed by the harness/calibration, not the report, because a hit is about the tool, not the package.

M002: Weak Signal Across Layers

  • Target: programmatic (finding set)
  • Severity: MEDIUM, weight 0 (annotation)
  • Category: meta
  • Condition: Three or more distinct assurance layers fired, none above the alert bar ([thresholds] m002.min_layers, default 3).

An attacker who spreads weak signals across layers stays under any single threshold; the span is only visible from the whole profile. It adds no points but raises the reported band one step: a spread across layers is exactly the case a single-signal threshold cannot see. Measured on the locked benign corpus: 112/3,739 (3.0%).

M003: Composition Not Owned Elsewhere

  • Target: programmatic (finding set)
  • Severity: MEDIUM, weight 0 (annotation)
  • Category: meta
  • Condition: Two or more distinct capability families co-occur while none of the cluster owners (H027, H098, X007) recorded the composition - typically because the owner is disabled.

The composition is never lost. It adds no points but raises the reported band one step. Measured on the locked benign corpus: 316/3,739 (8.5%).

Standing gate: the escalation passes the benign-corpus cap (M escalation stays below the benign cap, MAX_BENIGN_FIRE_RATE) before it ships, the cluster-rate gate the M constitution requires.