Peregrine · Plan for review

The Thread as Container and the Prime Suspect Inference Pass: Follow-Through

This plan finishes the work from the 20 September design night: The Thread as a container, the verb-registry amendment, and the four ecosystems, together with the rest of the Prime Suspect inference pass. It continues prime-suspect-inference-pass.md.

24 September 2026 · Source: .claude/plans/thread-container-followthrough.md · CR-NOTE B7EE1005 · Baseline checked against git, roster-status.json, guide.json, verb-registry.md and the exported cases

76 / 100
Confidence (74 at writing)
3
Entry steps already done
10
Recommendations (R1–R10)
23
Clues whose correct choice names suspects

1Where things stand

Three of the recovery entry's next steps were already done. Two others turned out larger than the entry described. This table sets the baseline so no phase redoes finished work.

Item from the entryStateEvidence
Re-render the container spec review pageDone8bb4e79; the page carries §9 to §11
Status for The Rookie, Undercover Gauntlet, The ShredderDoneShelved 2026-09-21, review cards 27 to 29
Decouple the charge gate; flat quarter-clock chain bonusShippede0e98f0, ea3ecdb, 7c619b1
Hide category until pulled; ask for the chain at the chargeShippedc805cd0
Cases 003 and 006 turn on a crossingShippedBlind solvers found both crossings
Retire reading-gameDecidedThe Dossier is the reading game. The slot is still in guide.json and has to be removed in-app
Verb-registry §7.6 amendmentNot doneLives only in the-thread.md §2; registry line 62 still reserves locate for The Frisk
The Frisk in or outOpenunlisted; Sarah on 2026-09-21: "Unclear"
Names in the answer choices of E01 to E03Larger23 clues across all 8 cases have a correct choice naming suspects (27 counting wrong choices)
No-scoring unit test for the containerNot yet possibleNo container type exists; scoring writes are inline across the app

Two stale records contradict the settled calls:

2Dependencies

Phase 0 · Records→No blockers. Can start today
Phase 2 · Registry→Unblocked today if R1 is adopted; otherwise waits on the Frisk call
Phase 3 · Guard→Lands in the same commit as the first shell code, never before
Phase 4a · Choice leak→Scope call, then a two-clue pilot (R3)
Phase 4b / 4c · Rewires→Teen feel pass on 003 and 006 (V1)
Phase 5 · Phone case→Cast, Voicemail and Red String calls; the prototype also waits on V2

Case content changes go to the corpus (guides/peregrine/entries/ps-case*.json) and are re-exported with PressRaven/tools/export-machine.py --write. The exported case files are exporter-owned and are never hand-edited.

3Recommendations summary

Each recommendation is repeated with its reasoning inside the phase it changes. The phase sections below mark them in red callouts.

R1Phase 2
Reserve notice now and leave The Frisk's roster status open.
The registry fix no longer waits on a roster decision.
R2Phase 4a
Scope the leak fix to the 23 correct choices, then make the warning an error.
Fixes what reveals survivors and keeps cases 101 and 102 clean.
R3Phase 4a
Pilot the rewrite on two clues before touching 23.
Tests whether the rewrite changes the SAT skill before the cost is spent.
R4Phase 4b
Check the coin-flip pricing per real case, not only for one parametric shape.
Every rewire gets an automatic pricing check.
R5Phase 2
Add a script that fails on duplicate verb claims in the registry.
§7.6 gains enforcement the way code rules have it.
R6Phase 3
Make a source scan the primary container guard, with a pure navigator type in Core.
Matches how scores are actually written today.
R7Phases 1, 4c
Treat case 101 as a Client case hosting one season trace.
Follows the 13 September rule that the arc rides in on an item.
R8Phase 0
Batch every guide.json edit into one in-app Press Raven session.
The app can't silently restore a hand edit.
R9Phase 5
Set the phone case's size target before authoring it.
The recorded cost becomes comparable to the thirty-case contract.
R10Process
File Peregrine design sessions from the Peregrine checkout.
Prevents a repeat of the 20 September record gap.

P0Phase 0 · Reconcile the records

Success: every record matches the settled calls, and nothing in the corpus still says the container hosts an ecosystem.

R8 · Batch the guide.json edits

Two edits touch guide.json: removing reading-game and rewriting the the-thread row. Press Raven rewrites the file from memory, so a hand edit made while it is running gets restored silently. Do both edits in one in-app session, then confirm with git diff in the corpus that both survived.

P1Phase 1 · Decisions that block later phases (Sarah)

Claude does not make any of these calls. Where a recommendation exists, its reason is stated alongside it.

DecisionBlocksRecommendation
The Frisk: in or outNothing, if R1 is adoptedKeep it open until the V2 mockup pass. The registry fix lands either way (R1)
First thread's castPhase 5None. This is a story call
Voicemail transcript: authored or derivedPhase 5 schemaLeaning authored for the first case. Deriving it needs a punctuation-stripping pipeline that nothing else uses, and one case does not justify building one
Red String: Client Cases or Season PlotClient contract costingNone. It depends on whether the bank is replayable, and that has not been measured
Case 101 (Halloran's Books): which ecosystemPhase 4cA Client case hosting one season trace (R7). The 13 September architecture has the arc ride in on "a fifth [clue] that's a memo that shouldn't exist". A Prime Suspect case with Halloran in one clue follows that pattern. The case follows the Client pair rule, and the one Halloran clue also follows the trace locks
Answer-choice leak: scopePhase 4aThe 23 correct choices (R2). A wrong choice that names suspects reveals nothing the finding won't name once the clue is read
Has a teen feel pass on 003/006 happened?Phase 4bThe inference plan records blind solvers but no teen pass. The answer decides whether 4b can start

P2Phase 2 · Amend the verb registry

Depends on: nothing, if R1 is adopted.  Success: verb-registry.md states the station/container rule itself, and no verb is claimed twice.

R1 · Decouple the registry from the roster call

The recovery entry treats the notice/locate split as conditional on The Frisk shipping. The split describes two different acts: salience with no criterion, and search against a stated claim. It holds whether or not either game is ever built. Recording notice as a reserved verb costs one table row and ends the three-way deadlock now. If The Frisk is cut later, the row is struck like any other reservation.

R5 · Enforce the registry

§7.6 is the registry's binding rule, and today the only check is someone reading the tables. The tables are regular enough to parse. A duplicate-claim check would have caught the three-way locate claim when it was introduced.

P3Phase 3 · The container may not score, enforced

Depends on: the first shell code. This phase lands in the same commit as the first container type. A test written before a container exists passes without checking anything.

What the 24 September check found Scoring is written inline, with no seam to test through. NightTake is inserted in NightDebrief.swift:240 and :291 and in CaseSession.swift:187. DrillResult is constructed inside at least four game views (ForensicsView, TheMakeView, ShakedownGameView, KingpinShowdownView). PersonalBests computes from stored drills and writes nothing, so the first draft's plan to spy on it was wrong.
R6 · Make the source scan the primary guard

A behavioral test with spy sinks needs a scoring seam the app does not have. Building one only to test this rule is a larger refactor than the rule warrants. A scan of the shell's source for the symbols that write scores fails on exactly the "reasonable-looking later change" that the-thread.md §2.2 warns about. Pairing it with a pure navigator type in Core keeps the shell's logic testable without a view.

P4Phase 4 · Prime Suspect content

4a · Stop answer choices from naming survivors

The pattern is the same in every flagged clue. The question asks which suspects fit, so the correct choice is the survivor list, and the clue does the elimination for the player. For example, case 004 E01 asks "which suspects' vehicle-speed estimates fit the collar data?" and the correct answer is "Jon, Ryan, and Amir".

CaseClues with a correct choice naming suspectsCount
001 Calder CipherE02, E03, E043
002 Ivory GateE02, E03, E043
003 Glass That Never BrokeE011
004 Vanishing of ScoutE01, E02, E03, E074
005 Last ToastE02, E032
006 Dead CircuitE01, E02, E03, E104
007 11:47 MessageE01, E02, E033
008 Four SecondsE01, E02, E033
R3 · Pilot before rewriting 23 clues

The proposed rewrite asks for the quantity (a speed, a time, a count) and moves the names into the finding. That can change which SAT skill the item tests. "Which rows satisfy a condition" is data reading, while "what is the average speed" is computation. Pilot it on two clues, one math and one reading-flavored, and check each against its knowledge_grain. A second pattern may fit the data-reading items better: the choices name rows or exhibits, and never people.

R2 · Scope, then lock

Fix only the 23 correct choices. Once the validator reports zero, promote the warning to an error so cases 101 and 102 can't reintroduce the leak.

4b · Rewire the remaining cases to the pair rule

Depends on: V1. The inference plan puts this rewire after the teen feel pass, and the recovery entry dropped that gate. This plan keeps the gate, because five rewires are the expensive half and the feel pass is what justifies them.

R4 · Check the pricing per case

testProvingItBeatsTheCoinFlipFromEveryOrdering checks one parametric shape: a 120-minute clock, 20-minute pulls, and a proof costing one or two extra pulls. The rewired cases differ in clock, clue count and pair position. The claim that careful play beats a coin flip is therefore verified for the shape and not for each case. A test that iterates every exported case, computes its minimum covering set with and without the pair, and applies the same inequality would turn each rewire into an automatic check.

4c · Cases 9 and 10

P5Phase 5 · One Client case for a phone

Depends on: the cast, Voicemail and Red String calls.  Success: one complete phone case exists as data, with its cost recorded, before any shell prototype is built.

A phone case has a different shape from a board case. It is told in the first person from one person's messages and logs, and it asks what that person was doing. It cannot be a port of ps-case002 (the-thread.md §11.2).

R9 · Size before authoring

"Most expensive by unit" is a measured claim only if the unit is fixed before the case is written. Setting the target first also gives the shell its first answer to the 13 September rubric question on unit size and word ceiling.

P6Process

R10 · Keep the record in the right project

Nothing from 20 September reached Peregrine's Chronicle, because the design session ran from the PressRaven checkout. When a Peregrine design session starts from PressRaven, run /cr-entry from the Peregrine checkout at the end.

VVerification (Sarah)

CConfidence and how to raise it

74→76
The score is my confidence that this plan is the best route to finishing the continuation. It was 74 when first written. The 24 September checks corrected Phase 3's design, and that moves it to 76.

Why 74

The score is a weighted view of the plan's parts. Each row's bar shows the score at writing. A green bar shows where the checks changed it.

PartWeightScoreReason
Baseline20%92
Every claim was checked against git, roster-status.json, guide.json and the registry. The margin covers records outside those sources
Sequencing20%85
Follows the inference plan's own gate. Unknown: whether a teen pass already happened
Phase 2 · Registry10%85
Mechanical once R1 is accepted
Phase 3 · Guard15%60 → 75
The sink list was assumed, and the check found it partly wrong, which led to R6. Remaining gap: no shell code exists to test the design against
Phase 4a · Leak15%55
The rewrite pattern is my proposal. It hasn't been tried on a single clue, and it may change what an item tests
Phase 4b/4c · Rewires10%75
The method is proven on 003 and 006. Case 007's triple and case 002's double-conclusive halves are unresolved
Phase 5 · Phone case10%55
No content model yet; size and cost unknown

What would raise it

ActionWhoMovesEffect
Pilot the 4a rewrite on two clues and check knowledge_grainClaude4a: 55 → 75+3
Say whether a teen feel pass on 003/006 has happenedSarahSequencing: 85 → 92+1.5
Draft the phone-case content model and size target (R9)Claude, after the cast callPhase 5: 55 → 70+1.5
Write the R4 per-case pricing testClaude4b/4c: 75 → 85+1
Answer the Phase 1 callsSarahRemoves branches in Phases 2 and 5+1
Settle 007's triple and 002's pair shape on paperClaude4b/4c+0.5
Ceiling: about 85 from planning alone. The largest open question is whether crossing two findings feels like deduction to a sixteen-year-old, and only V1 can answer it. If V1 comes back negative, stop 4b and switch to the reserved "offer one of two each pull" lever from the inference plan.

RFinal review

Pros

The plan starts from the repo's actual state. It drops three finished items and flags two stale corpus lines. It keeps the inference plan's gate on the expensive rewire, and it designs the container guard around how scores are actually written.

Cons

Most phases wait on decisions. With R1 adopted, Phase 0, Phase 2, the 4a warning and pilot, and the R4 test can start today. Phases 4b, 4c and 5 cannot. The 4a fix touches 23 clues across every case.

Edge cases

Rewriting a question toward a quantity can change the skill it tests, which is why R3 pilots first. Case 101's Halloran clue has to satisfy both the pair rule and the season's trace locks. The source guard has to strip comments, or a doc comment could trip it.