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.
The app states its own contract, and it is stricter than the corpus schema was:
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 schema said | The 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.
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”).
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.