Skip to the content.

Generation-Specific Witness Ladders

Issue: #1659. Parent: #1625. Stream: gen/second-next. Milestone: Generation G2 - Second Next Gen. Status: design memo / compatibility policy — a witness-ladder taxonomy a later gen/next or gen/now stream can enforce with a lint or fak hygiene gate, not yet a runtime gate. Architectural option: expose only through this doc; never a default gate.

This memo is the handoff a future agent can use without rereading the whole generation epic. It answers one question that #1625 raised but did not resolve: future research and now bug fixes need different proof bars, but both need witnesses — so what is the minimum evidence that promotes a claim within each generation, per claim type? The canonical stream taxonomy and the flat promotion/demotion evidence list live in docs/generation.md; this memo is the ladder refinement of that list: it turns “code work needs a focused test” into a per-generation rung with an explicit floor.

Why a ladder and not one bar

The generation contract already says what kind of evidence each surface owes (a code claim owes a test; an operator claim owes a before/after readout). It does not say how much. That gap is the contention #1625 exists to kill:

A ladder fixes both: the witness type is constant across generations (a claim always names its evidence), but the rung — the minimum strength of that evidence — rises as work climbs from future toward now. Same truth standard; different proof cost, matched to horizon.

The load-bearing invariant: no rung is ever “no witness.” The lowest rung is still a checkable artifact (a named assumption, a simulation input, a committed note). A generation label lowers the cost of the witness, never removes it.

The four claim types

Every generation issue makes at least one of these claims. The ladder is defined per claim type because their cheapest honest witness differs:

The ladders

Read a column as: to make this claim at this generation, the minimum witness is X. A claim may always over-witness (ship a gen/future idea with a real test); it may never under-witness (ship a gen/now benchmark claim on a simulation).

Planning claim ladder

Generation Minimum witness (the floor)
gen/future A committed memo naming the decision it could influence and at least one invalidating assumption. No integration surface required.
gen/second-next The gen/future floor plus a named cross-generation dependency edge or compatibility policy, plus a stated demotion/retirement criterion.
gen/next The gen/second-next floor plus a named integration surface (the exact file/verb/schema it will touch) and a dogfood or gate plan.
gen/now A committed note, issue update, project-field change, or saved view a later agent can act on today, bound to a milestone, with the witness path already runnable.

Code / CLI claim ladder

Generation Minimum witness (the floor)
gen/future A prototype or spec behind an explicit gate (default-off, or doc-only), with the assumption it would test named. Inert-by-design is fine.
gen/second-next A compatibility test or simulation showing the new behavior does not break an existing reader/caller across generations — proof-of-safety, not yet proof-of-value.
gen/next A focused test that fails before, passes after, covering the generation-specific claim, plus one captured live run — behind a default-off gate until dogfood clears.
gen/now A focused test (fail→pass) landed in the same commit, plus a witnessed commit ((fak <leaf>) stamp, dos verify). Default exposure allowed.

Benchmark claim ladder

Generation Minimum witness (the floor)
gen/future A modeled estimate with its inputs stated and labeled MODELED / projected — never “measured.” The simulator (docs/generation-future-proof-of-value-simulator.md) output counts here.
gen/second-next A simulation or micro-measurement on a fixture, with the counterfactual named and the extrapolation-to-real-workload assumption stated. Still labeled projected.
gen/next A captured measurement on a real (if small) workload, reproducible from a named command, labeled MEASURED, with the baseline it beats named.
gen/now A captured, reproducible measurement with baseline, N, and command, provenance-labeled WITNESSED (fak authored) vs OBSERVED (relayed), passing the provenance guard. Regression-gated if it claims a default.

The benchmark ladder is why this issue routed to the bench lane: it is the column where the “measured vs modeled” provenance discipline (tools/check_provenance_labels.py) does the enforcing, and where internal/bench fan-run output is the gen/now-rung artifact. A benchmark claim that labels a MODELED number “measured” is not a low rung — it is a broken witness and fails CI at every generation.

Operator / loop claim ladder

Generation Minimum witness (the floor)
gen/future A described mechanism and the ambiguity/contention it would reduce, with the metric that would show it named — no live readout required.
gen/second-next A simulated or single-instance before/after (one dispatch trace, one lease decision) showing the mechanism changes the readout in the expected direction.
gen/next A real before/after readout from a dogfood run showing less ambiguity, contention, or stale assumption, behind an operator-only gate.
gen/now A captured before/after operator readout from the live loop, default-on, showing the specific ambiguity/contention/stale-assumption it retired.

Orthogonality (the generation invariants this artifact must restate)

The ladders are metadata and a proof-cost policy — not a branch, a priority, or a runtime switch.

Promotion evidence (future → second-next → next → now)

This memo promotes when a later stream can enforce the ladder, not just state it:

Demotion / retirement evidence

Invalidating assumptions (kill criteria)

State them so a later agent can check them cheaply:

  1. Four claim types are enough. This memo assumes planning / code / benchmark / operator partition every generation claim. If a fifth honest claim class appears whose cheapest witness fits none of these columns (a security-posture claim, a cost-of-ownership claim), the ladder must gain a column, not stretch an existing one by analogy. This is the assumption most likely to fail — the benchmark column is already doing double duty for “cost” claims that may deserve their own ladder.
  2. The floor is honestly cheaper, not just cheaper. The whole design rests on a lower rung being a real witness (a checkable assumption, a labeled model) rather than a dressed-up “no witness.” If in practice the gen/future rungs get filled with unfalsifiable assumptions that no recheck ever fires, the ladder has laundered “no proof” into “low rung” and must add a falsifiability check to each lowest rung.
  3. The rung floors are enforceable from cheap signals. Promotion assumes a gate can read generation label + claim type + attached witness class at commit time. Today only the benchmark column has a wired enforcer (the provenance guard); the other three floors are asserted, not checked. Until the second-next → next gate exists, a commit can sit below its floor and nothing refuses it.

Handoff (continue from here without the epic)

A future agent picking this up should: (a) pick one real open issue per generation stream and tag which rung its witness currently clears — that is the future → second-next promotion witness and it also stress-tests assumption 1; (b) wire the second-next → next gate benchmark-column-first, since the provenance guard already exists and only needs the generation-label + claim-type read bolted on; (c) if a claim type is found that fits no column, cut a new column rather than overloading the benchmark one. The hub (docs/generation.md) stays the front door; this memo is the minimum-evidence refinement of its Evidence section.