A journey's criticality derives its test's host tier; a lint holds the local-coverage floor.

Journey-criticality → test-tier placement (which host a test runs on, derived)

Intent — Make a journey's criticality the single input that derives which environment tier its tests run in, and hold a coverage floor over the derivation: every high-criticality journey-part carries a test in the fast local tier, so a green local run means the major paths work. Placement is derived from a typed trait, never hand-drawn (our instance: a typed journey-criticality model whose MAJOR/MINOR axis derives each journey-part's local vs staging tier, guarded by a coverage-floor lint).

SummaryA journey's criticality derives its test's host tier; a lint holds the local-coverage floor.
TargetBridge · System models
Formvalidation
EnforcementSoft·Hard — the typed model aims placement (soft: it computes the tier, a human still authors the test); a coverage-floor lint holds the invariant (hard: a major part with no local test fails)

Motivation — the failure it kills

A test suite runs across environments of different cost. A fast local tier gates every commit; a heavier staging tier runs the full matrix. Which test runs where is usually a hand-drawn line — "keep the important journeys local, push the heavy remainder to staging" — and a hand-drawn line drifts from what actually matters. So a major user path ends up staging-only: the local gate passes, a reviewer merges, and the broken revenue-core flow surfaces only later on staging. Call it the local-green / staging-red surprise. It has two causes, and both come from the line being drawn by hand:

The failure is a fast gate that is trusted to mean more than it covers: local passes, the majors look green, and one of them is broken.

Why it's not just "risk-based testing" (or a test pyramid, or CUJ monitoring)

The idea that important flows deserve stronger verification is old. What is new is deriving the host tier from a typed criticality trait and enforcing a coverage floor on that derivation. Each adjacent practice wires criticality to a different output:

The distinct move: criticality → host-tier derivation + a lint-held local-coverage floor. It is the derive-a-tier-from-a-model-trait reflex and the audit-becomes-a-lint reflex, applied to test selection.

Mechanism

Three parts sit on the typed model.

A selector closes the loop: a pure function from a deploy context to the concrete test roster, reading the model and the derivation. It emits the local set (the major-part floor), the staging set (the full matrix), or a lighter production smoke. The deploy path calls the selector and gates each phase on membership in the returned roster — the selector is the roster the deploy path runs, in place of the per-environment conditional guards that used to decide, in control flow, which phases a host runs. A phase runs exactly when the selector's context set contains it. Each selectable test carries the derived set of contexts it runs in, not a single ordinal threshold, because the host order is a semilattice, not a chain. Staging is the top that runs a superset of both the others; local and production are incomparable, each a different reduction of the staging superset with neither containing the other. The derivation always puts staging in a test's context set, so "staging covers everything local covers," and everything production covers, is a containment you check by calling the function on each pair rather than by auditing a deploy matrix. That algebraic shape is enforced by both a property test over any spec universe and a lint that recomputes containment against the live model.

Prerequisites

Consequences & costs

Known uses

Related mechanisms