Peregrine · difficulty · draft for approval

What makes a round hard

27 August 2026 · 0 of 135 items carry difficulty · nothing is applied until you approve this

Two different things are called difficulty

Peregrine already ships one. VigilanceTuning.nearPresets is easy 0 / fair 2 / brutal 3, and LineupPicker uses it to choose how many of the three fillers come from the con's own family. That is a dial applied at play time to any item, and it makes a round harder without touching the question. The corpus field is a property of the question itself. They need different names in conversation or this will be re-litigated every few weeks — round difficulty for the dial and item difficulty for the field.

One piece of the answer already exists. difficulty_basis is declared in the Peregrine schema: "Where the difficulty read came from, so a proxy is never mistaken for observed data." Whoever wrote that anticipated exactly this problem. The rubric below fills it in rather than adding a field beside it.

What I found trying to compute it

I tested four candidate signals against all 135 items before proposing anything. Every signal I can compute tracks which family authored the item rather than how hard the question is.

Candidate signalFires onWhat it actually separates
Reading load over the section's 75th percentile
math 26 words, reading 64, writing 35
30 / 135 All 30 are Wager or Lineup items. Go Undercover claims and Snap Call stems are short by construction, so they can never fire.
More than one distractor carrying a trap mechanism34 / 135 All 34 are Wager items. The Lineup authors a mechanism on the pick only, on purpose — "tagging the other two would invent cognition the round never dramatises."
A near-miss wrong answer (plausible_clean)14 / 135 Target Practice only. The field does not exist elsewhere.
A long reasoning chain breaking late0 / 135 Nothing at all. The 17 con rounds have a median chain of 5 lines breaking at index 3, so any threshold above the median empties the set.

A short Go Undercover claim and a long Wager passage are not two points on one difficulty scale. They are different content shapes. A single field ranking all 135 against each other would encode the authoring convention and read as if it encoded difficulty, which is worse than leaving the field empty — and leaving it empty is the current state.

The proposal

Item difficulty is scoped to its own bank. hard means hard for a round of this mini game, judged against its siblings. Two values, standard and hard, which is the vocabulary your own plan task already used. Every hard names the criterion that earned it in difficulty_basis, so a proxy is never mistaken for an observed read and the whole set is auditable later against play data.

AStep after the answer

Reaching the correct value takes work past the first number or the first true statement that looks like an answer. The intermediate is on the sheet.

Measurable everywhere a mechanism or counter is written — 43 items name a con or a fault today.

BA wrong answer that survives the check

At least one distractor is still standing after the move that eliminates the others, so elimination alone does not finish the round.

Already recorded as plausible_clean on 14 Target Practice items. Judged elsewhere.

CLoad, against its own bank

Stem and passage together sit above the 75th percentile for this mini game, not for the corpus. The thresholds are recomputed as a bank grows.

Computable for every family, and meaningful only within one.

DA trap practice will not have supplied

The trap code sits in the bottom quartile of the spine's observed frequency, so a student drilling common patterns has not met it.

Available on the 43 items naming a con or fault, from the spine's observed_n.

An item is hard when at least one criterion holds and difficulty_basis names which. One rather than two, because on most families only one or two criteria are even measurable, and a two-of rule would silently make short-form banks incapable of holding a hard item.

How we would know it worked

Backfill, then look at the split per bank. If hard lands on everything or on almost nothing within a family, the criteria are wrong for that family and the thresholds move. The validator can print the split the same way it prints the bank reconciliation, so the calibration stays visible instead of being asserted once and forgotten.

Two calls

  1. Two values or three. standard and hard is what your plan task says and what I have drafted. A third value for genuinely foundational items would let a session open with something gettable, which matters more for a student on a first run than the top of the scale does. Adding it later means revisiting every item once.
  2. The calibration target. I have deliberately not proposed a number. The pipeline carries frequency for all 924 calibration questions and no difficulty data at all, so any "about a third should be hard" I offered would be invented. Either you set it from teaching judgement, or we backfill first and read the split we get.