Peregrine · Snap Call · shape recovered

The four you demoed

27 August 2026 · from Peregrine/DemoData.swift into sc-01 … sc-04

They were in DemoData.swift, seeded only when the app launches with -demoData and wrapped in #if DEBUG, so they never reach a release build. Four questions: two Systems, one Transitions, one Inference. They are the only Snap Call items that have ever existed, and they answer the question I was about to ask you.

What a Snap Call item is

The app states its own contract, and it is stricter than the corpus schema was:

public var isDrillable: Bool { readable && !snapStem.isEmpty && typeOptions.count == 4 && !correctType.isEmpty && moveOptions.count == 4 && !correctMove.isEmpty }

Exactly four each, or the item is never offered. The view shuffles both slates and scores the call as typePick == correctType && movePick == correctMove, with a separate line for right move, wrong name. Nothing in the app checks that the correct value is a member of the slate it shuffles, so an item that fails that is unwinnable and fails silently.

The four, as the corpus now holds them

sc-01 Solve the system for y math · algebra · 95s
Name the type
  • Systems
  • Exponent rules
  • Circle geometry
  • Probability
Call the first move
  • Stack and eliminate
  • Plug in answer choices
  • Graph both lines
  • Factor first
sc-02 Tickets sold at two prices — how many adult tickets? math · algebra · 95s
Name the type
  • Systems
  • Percent change
  • Unit conversion
  • Median and mode
Call the first move
  • Define variables, write two equations
  • Average the prices
  • Divide total by price
  • Guess and check
sc-03 Pick the word connecting the two research findings writing · expression-of-ideas · 45s
Name the type
  • Transitions
  • Verb tense
  • Comma splices
  • Modifier placement
Call the first move
  • Label the relationship first
  • Read the answer choices first
  • Pick the fanciest word
  • Reread the whole passage
sc-04 Which choice most logically completes the fossil argument? reading · info-and-ideas · 90s
Name the type
  • Inference
  • Main idea
  • Author's tone
  • Vocabulary in context
Call the first move
  • Summarize the argument first
  • Eliminate the shortest answer
  • Match keywords only
  • Skip and come back

What the demo corrected

The schema saidThe demo shows
type_options — “The classification taxonomy, shared across the bank.” Four different slates across four items. It is a per-item four-way choice: the right name plus three plausible neighbours. There is no shared list, so there was no single taxonomy for you to hand me.
Nothing about counts. Exactly four, both slates, hard-gated by isDrillable.
Nothing about membership. correct_type and correct_move have to be in their slates. The app does not check it, so the validator now does.
Nothing about the clock. 45s for the transitions round, 90–95s for math. A per-item judgement about how long naming a pattern should take.

The five snap-call field prompts now say all of that, and validate-peregrine.py enforces the counts and the membership. I proved both rules fire against a deliberately broken copy before removing it.

What the app carries that the corpus does not model

A Question also holds tell, firstMove, walk, trapAnswer, trapWhy and the full answer set with answerWhy. The corpus declares none of them for snap-call, so they were dropped rather than written into undeclared fields. Worth noting that firstMove and correct_move are different things: the demo's first move is a sentence (“Stack the equations and pick elimination.”) and the Snap Call option is a label (“Stack and eliminate”).

Three calls

  1. These four scored 70, below everything else in the corpus. They were written to exercise the UI, not to teach: two of them are one line long and their walk-throughs are literally “Step one, Step two, Step three”. They are in the bank as the shape, and each note says so. If you would rather they stay out of the bank entirely and live only as a reference, they come back out cleanly.
  2. Snap Call's bank_target is now unset, not 0. The recorded 0 was correct about the code and is stale about the plan. Unset reads as “has items, nobody has sized it”, which is true. It needs a number from you before authoring starts.
  3. Whether the corpus should model the rest of a Question. Snap Call needs five fields. Beat the Budget and The Make read the answer set and the trap off the same object. Declaring those now, or declaring them when the game that needs them gets its schema block, is the same decision that is open for The Make and Forensics.