201 tasks · 21 phases · 9 findings · 3 decided · 2026-09-23

Mockup Lab journey: from a shelf of tools to a path through them

Implementation handoff for Registry and Storyboards: nine friction findings, the target journey and eight pathways, eight recommendations with requirements, and phased work that starts with bugs hiding the app's own answers.

201Tasks
21Phases
9Findings
8Recommendations
1Reading to confirm
The gist

The Registry and Storyboards are feature-complete against their plan and still hard to use: Sarah can't tell where to start or what comes next, so she can't evaluate anything past the first step. The tools exist, but nothing puts them in order. Twenty-odd actions sit as peers across three tabs, two overflow menus and five review sheets. The order they depend on lives in code comments, and several prerequisites fail silently.

This plan adds that order without adding a wizard:

Handoff notes for the implementing session

The problem

Every finding comes from reading the code on 2026-09-23 and gives its evidence. None has been observed in the running app, because the chrome is compile-verified only.

F1

No start point and no order.

Mockup Lab opens on the grid or restores the last session. No surface says to go to the Registry. The empty grid hides the Registry and Storyboards buttons. Inside a unit, "Fill from files", "Ask for the rest" and "Open as a board" are peers, and the intended order exists only in comments.

Evidence: MockupStudioContainerView.swift:22, 233-242, 474-499 · MockupLabGridView.swift:54-58 · RegistryFillPass.swift:5-9

F2

States gate everything and are stated once.

Matrix needs beats, beats need states, and states need a cr-frames block in the file. The chain appears in one sentence on the screen detail pane. The fix it names, /cr-frames, runs outside the app. FrameContract.retrofit exists, nothing calls it, and it writes the manifest without the message listener. Declared states are not adopted on scan, although cr-frames.md says they are. RegistryFillPass.gaps doesn't count "no states" as a gap. Matrix with no beats silently falls back.

Evidence: ScreenDetailPane.swift:222-237 · FrameContract.swift:150-175 · cr-frames.md:128-130 · RegistryFillPass.swift:27-36 · StoryboardDocumentBuilder.swift:48

F3

The app hides its own answers.

The fill pass drops its note when it returns no edits. That note is where it told Sarah to run /cr-frames. fillPass.lastError is never rendered. "Propose a registry" does nothing when nothing groups. Copying the canon packet and writing the frame contract give no confirmation.

Evidence: DesignRegistryView.swift:857, 1053 · RegistryFillPass.swift:20, 47 · DesignRegistryView.swift:1024-1046

F4

Two doors to boards.

"New Board" on the Boards tab makes hand-picked boards only. Every board that follows the registry is opened from four differently worded buttons inside the Registry. Derived boards list as "0 frames · 0 groups" because the counts read stored groups. The seed offer disappears once any board exists. A new hand-picked board has no group, so every add menu reads "Add a group first". "See it on a board" permanently switches the unit's board to Matrix.

Evidence: StoryboardListView.swift:28, 103, 252 · Storyboard.swift:289-293 · StoryboardArrangeSheet.swift:339-341 · MockupStudioContainerView.swift:430-434

F5

Five review sheets, five verbs.

"Add N screens", "Fill N fields", "Create N screens and M flows", "Link N screens", "Apply N", each with different rules for what starts ticked.

Evidence: RegistrySeedReviewSheet · RegistryFillSheet · FlowProposalSheet · ImplementationMatchSheet · ReviseBar.swift:152-275

F6

Consistency is checked where the right group isn't.

The review needs 2–16 frames, and the limit is found only on click. A unit (1–5 screens) is always in range, but it can only be reviewed after opening it as a board. runReview(scope:) has no UI. Amendments append to canonRelativePath ?? defaultPrinciplesPath while the review read the first existing candidate. Handled, applied and declined marks are view state and reset.

Evidence: StoryboardCohesionService.swift:35-41, 66-73 · StoryboardBoardView.swift:528 · CohesionReportTray.swift:23-25

F7

Another take on a screen is the longest route.

"Generate a mockup" appears only on screens with no file. A Lab session exports to one file per session, overwritten on every generation (MockupProjectExporter.export). Iterating on a Lab-made screen therefore replaces its current take instead of adding one. Forking an external file produces a new, unfiled file that has to be filed by hand.

Evidence: ScreenDetailPane.swift:289-337 · MockupProjectExporter.swift

F8

A new mockup from the browser can't be placed.

Filing works. After that: (a) splitting a multi-view file into screens needs a spec, or a Revise-bar reply that attaches the file only when every screen in the unit already shares it; (b) a split screen has no state of its own, so each renders the file's opening view; (c) the registry has no record of how you reach a screen, and flows belong to one unit, so "the case board leads here" can't be stored; (d) nothing checks whether the lobby, case board or training mockups already show the way in.

Evidence: RegistryConversationPrompt.swift:248-257 · DesignRegistryStore.swift:428-446 · DesignRegistry.swift:363-421 (intersections has no UI)

F9

Names drift.

Registry / Screen Registry / Design Registry. Boards / Storyboards. Mood / Mood Board. Mockups / Sessions. Takes / versions. The status dot and beat picker have no legend. The Revise bar's widened scope sticks.

Evidence: MockupLabNavBar.swift:17-20 · MockupLabHeader.swift · MockupEntryView.swift:54 · DesignRegistryView.swift:916

Flows

The target journey (per unit, re-entrant)

Step 0  On disk          mockups · specs · canon/kit · app source
Step 1  Structure        Propose a registry → review → file new arrivals (unfiled)
Step 2  Per unit         the readiness strip, in order, none of it blocking:
                           1 Filed  2 Read the files  3 Screens & flows from spec
                           4 States declared  5 Filled in (purpose, beats, loop)
                           6 Ways in (games)  7 Built links
Step 3  Close gaps       Generate · New take · Revise bar → one review sheet
Step 4  See it           one door to boards: registry · unit · flow · screen · files
Step 5  Check it         consistency on a unit or board row → amendments → canon

Pathways: today → after this plan

A · A pile of mockups

Today. Seed, then choose among peer buttons with no sign of what's next

After. Seed, then pick the least-ready unit in the rail and follow the strip

B · A spec, no mockups

Today. The empty state is a dead end. New Unit → Flows → spec (if the filename matches) → generate one screen at a time

After. "Start from a spec" in the empty state creates unit, screens and flows in one review; generate the planned screens in flow order

C · An idea, nothing on disk

Today. The empty grid offers only Lab starts

After. The empty grid offers "Sketch one screen" and "Plan the app first"

D · A mockup arrives from outside

Today. An unfiled pill visible only in the Registry; the take and variant menus vanish when no names overlap

After. A badge on the nav bar; "newer take" always available, with search

E · Another take on one screen

Today. ~8 steps across three surfaces; a Lab take is overwritten

After. "New take" on the screen; "Refine in Lab" updates this design's take; "Try a different design" makes a variant

F · "Do these agree?"

Today. Boards → hand-picked board → groups → review; 45 frames get refused

After. "Check consistency" on a unit; row-scoped review on boards

G · "What is built?"

Today. The answer appears in a sheet and closes with it

After. A status filter plus a legend; strip step 7

H · Place a browser mockup (Sarah's scenario)

Today. Filing, then improvised tools, one trip outside the app, and no ways in

After. "Place this mockup": screens + states, ways in from the lobby, case board and training, needed changes, a board

Approach and requirements

Each recommendation lists what it resolves, requirements the implementation must meet, and a done-when test. Requirements use MUST for the contract and SHOULD for strong defaults.

R1 · A readiness strip on every unit (resolves F1, part of F2, F3)

The strip shows the next step for a unit, and every step stays open. The parent plan rejected a linear wizard because the registry is re-entrant and never finished. The strip keeps that property: it never blocks, and every step stays clickable out of order.

  • MUST compute, per unit, from existing data only: Filed (the unit's files claimed), Read the files (Fill from files has nothing left to propose), Screens and flows from spec (a spec is linked and at least one flow exists, or the step was skipped), States declared (screens with ≥1 state / screens with a file), Filled in (no purpose, beat, loop or summary gaps), Ways in (units of kind Game only: ≥1 inbound link), Built links (screens matched or explicitly unbuilt).
  • MUST show each step's count ("3 of 5 screens have states") and a done, partial or next mark.
  • MUST make the first incomplete step the pane's single primary button. Completed steps stay visible as ticks and can be re-run.
  • MUST keep the spec step present when no spec matches, offering a picker over every *spec*.md in docs/ and a Skip that is remembered per unit.
  • MUST count "screens with no states" as a gap in RegistryFillPass.gaps.
  • SHOULD show "N of 7" in the unit rail and allow sorting the rail by it.
  • Done when: a unit fresh from seeding shows step 2 as next. Completing each step moves the primary button forward. Every step can still be invoked out of order.

R2 · Declare states inside the app (resolves F2) (D1: writing is allowed)

  • MUST offer "Declare states" on a screen and on a unit.
  • MUST derive states from the harness the way RegistryFillService does. SHOULD fall back to a model pass for a file with no harness.
  • MUST write the manifest and the crSetState message listener, extending FrameContract.retrofit, and MUST never overwrite an existing cr-frames block.
  • MUST adopt declared states on scan when a screen has none, and leave a screen's hand-set states alone otherwise.
  • MUST explain on the board when Matrix has no beats, with a link to Declare states.
  • Done when: a harnessed mockup with no contract becomes a matrix of its states without leaving the app, and cr-frames.md describes what the app actually does.

R3 · One door to boards (resolves F4)

  • MUST offer Whole registry, A unit, A flow, A screen with its ways in (after R8), Files I pick, and All files in the New Board sheet.
  • MUST show source and resolved counts on list cards, counting through StoryboardResolver.
  • MUST label every Registry board action "Show on a board".
  • MUST link every derived board back to its unit, flow or screen.
  • MUST start a new hand-picked board with one group.
  • MUST treat states-on as a view choice that doesn't rewrite the board's stored layout.
  • SHOULD let Arrange add registry screens as screen-backed slots (the model already supports screenId on a slot).
  • Done when: every board kind can be created from the Boards tab, and no card reads "0 frames" while its board renders frames.

R4 · Say what happened, and what it costs (resolves F3, F9)

  • MUST render the fill pass's note and lastError.
  • MUST explain an empty seed.
  • MUST confirm clipboard and file writes with what was copied or written.
  • MUST ask for a unit when the canon packet has none.
  • MUST label AI actions with approximate cost and time, taken from the parent plan's measured runs until a usage log exists: fill pass ≈ $0.33 · 1 min, conversation ≈ $0.30 · 1 min, spec reading ≈ $0.35 · 20 s.
  • MUST badge the unfiled count on the nav bar's Registry segment.
  • MUST use one name per place: Mockups, Registry, Boards, Mood Board, and "takes" in UI copy.
  • MUST give the status dot and the beat picker a legend drawn from the glossary.
  • MUST keep "As a newer take on" available with a searchable list when ranking finds nothing.

R5 · One review sheet (resolves F5)

  • MUST share one shell across the seed, fill, spec, match, edit and placement sheets:
    • the title shape "N proposed changes to {scope}";
    • a provenance tag per row (READ · DERIVED · AI with confidence);
    • destructive rows start unticked;
    • one verb, "Apply N".
  • MAY keep each sheet's body. The seed sheet's tree editing stays.

R6 · Check consistency where you work (resolves F6)

  • MUST add "Check consistency" to a unit in the Registry, and a row-scoped review on boards through runReview(scope:).
  • MUST show the 2–16 frame limit before the review runs.
  • MUST resolve the canon through StoryboardCanonResolver for the review, Append to canon and both canon panes.
  • MUST persist handled, applied and declined marks on the report.
  • SHOULD let a finding propose registry edits alongside amendments. This takes over the open Phase 10 task in the parent plan.

R7 · New take, new design, in place (resolves F7) (per D2, confirm the reading first)

  • MUST add "New take" to the Takes section. It generates from a change request plus the current take, canon and siblings, and lands as the new current version of the current variant with the old one kept.
  • MUST add "Refine in Lab", which opens a session bound to the screen's current variant. Its exports update that variant's current take, and the session's revisions hold the steps.
  • MUST add "Try a different design", which forks a session bound to a new, named variant of the screen. Its exports land there, so the two designs sit side by side under Takes.
  • Done when: a screen with a file gains a second take and a second variant without leaving the Registry. Refining a design in the Lab no longer produces an unfiled file.

R8 · Place a new mockup (resolves F8; Sarah's scenario)

Ways in to a game usually come from other units: the lobby, case board and training (Sarah, 2026-09-23). Links are therefore a registry-wide record. Flows stay what they are, one path through one unit.

Data (Phase 3).

  • MUST add ScreenLink { id, fromScreenId, toScreenId, control: String, shownInSource: Bool?, note: String?, createdAt } stored in a links array on DesignRegistry, allowed to cross units.
  • MUST add stateId: String? to ScreenVersion, so a screen that shares a file names its own state. StoryboardResolver MUST use it as the cell's state when no flow step pins one.
  • MUST add a "Ways in" section to the screen detail pane (add, edit, remove, and open the source screen).
  • MUST add a .screen(UUID) StoryboardSource. It renders ways in as a row, the screen and its sibling screens that share its file in state order as the next row, and ways out after that.
  • MUST add createLink and setScreenState to RegistryEdit, the conversation prompt's vocabulary and op list, and RegistryEditParser.

Reading (Phase 4).

  • MUST add "Place this mockup" to each unfiled item. It asks which unit the file belongs to, defaulting to the best-ranked unit, and which source screens to consider. The default is the screens of Meta and Shell units: in Peregrine, after the Phase 3 correction, the Lobby, Training and Case Board (D3). It MUST NOT match unit names to choose sources.
  • SHOULD also be offered on an already-filed screen whose file walks through several screens. That is how Training comes out of peregrine-v3-mockups-with-training-ground.html.
  • MUST send one prompt carrying the new file and the source screens' mockups, reduced by FrameReducer to the cohesion budget, plus the canon and the glossary.
  • MUST return, in one R5 sheet:
    • the screens the file walks through, each bound to the file with a stateId;
    • proposed links, each naming its control and whether the source mockup already shows it, with confidence;
    • for each link whose control is missing, the change the source screen needs.
  • MUST start weak shownInSource judgements unticked.
  • MUST, on apply, file the file, create the screens and links, and open the .screen board. Accepted changes become QuickTasks, or New take requests once R7 lands.
  • MUST write the frame contract for the split screens through the Phase 3 contract writer (D1), so each screen renders its own view on apply. When the file already declares states, it MUST map screens onto those states and write nothing.
  • MUST parse the CLI result subtype on a non-zero exit (error_max_turns) and show a readable error.
  • Done when: a new Peregrine game mockup saved from the browser becomes its screens, its ways in and a needed-changes list in one pass, measured for cost, time and accuracy.

Decisions: yours, and made for you

Decided by Sarah

D1 · The app may write the frame contract into mockup files it did not author.

This narrows the parent plan's "no writing into externally authored files" rule for this one block, which is inert JSON plus the crSetState listener, the same thing /cr-frames writes from outside the app. Everything else about that rule stands: layout, markup and styling are still changed only through a fork or a new take. R2 and the states half of R8 are unblocked, and the contract writer moves up to Phase 3 so both can use it.

Decided by Sarah

D2 · Different designs get different takes. Refining one design does not.

Sarah's answer was "unclear, but generally want different versions for different designs". The registry already has a word for a different design, a variant ("a real design choice rather than a later take"), so the plan reads the answer as three rules. Confirm this reading before Phase 9.

  • Refining a design in the Lab updates that design's current take. The session's own revisions hold the steps in between, as they do today.
  • Trying a different design creates a variant of the screen. "Try a different design" forks a Lab session bound to the new variant.
  • "New take" in the Registry freezes a deliberate new version of the current design, keeping the old one below it.
Decided by Sarah

D3 · Training is a screen alongside the Lobby, not a unit of its own.

The Lobby, Training and the Case Board are the places a game is entered from. The live registry doesn't reflect that:

  • The Lobby is its own unit, typed Game, because the seeder's Meta rule misses the leading "the" in the-lobby (ScreenRegistrySeeder.swift:394).
  • Case Board sits in a Game unit named "Peregrine", beside unrelated screens.
  • Training has no screen. It exists only inside peregrine-v3-mockups-with-training-ground.html.

R8 therefore chooses its default ways-in sources by the screens' unit, with one Meta unit holding the Lobby, Training and Case Board. Getting there is a registry correction proposed in Phase 3 for Sarah to accept. Splitting Training out of the v3 file is itself a placement (Pathway H), which makes it the natural first live run.

Judgment call

A new plan, not Phase 11 of the parent plan.

This work has its own requirements and decisions, and would double a 642-line plan. The parent plan gets a pointer. Reversible by moving the phases across.

Judgment call

Screen links are their own record, not extended flows.

Ways in cross units, flows belong to one unit, and a flow is one path while links describe every way in. DesignFlow.intersections stays unused.

Judgment call

A screen's state within a shared file lives on ScreenVersion, not Screen.

A later take of the same screen may be a different file with different state ids, so the pairing belongs to the file. This matches the board's existing unit, a frame = (file, state).

Judgment call

The strip never blocks.

It is an ordering, not a gate. That keeps what the parent plan valued when it rejected the wizard.

Judgment call

Order: bugs, feedback, strip, R8's data with the contract writer, Declare states, then placement.

The strip makes every later feature findable. Hand-added links answer "how do we get here" before any model call exists. States come before placement because placement writes them.

Judgment call

Training's first live run is a split, not a new file.

Training lives inside the v3 mockup, so splitting it out tests the placement reading on real data and fixes the registry D3 describes in the same pass.

Judgment call

"Fill from files" stays a review step.

The flow map floated auto-applying READ fields on first open. This plan keeps the review, as the strip's step 2, because a silent write on navigation is harder to trust than one click.

The work

Order after Sarah's decisions: the contract writer joins R8's data phase because both Declare states and placement use it. Declare states follows immediately, since states gate beats, the matrix and split screens.

Phase 0 — Fix what is broken now

11/11 done
  • Show the fill pass's note when it returns no edits instead of dropping it at DesignRegistryView.swift:857
  • Render RegistryFillPass.lastError under the screens footer
  • Append canon amendments to the path the review read, resolved through StoryboardCanonResolver
  • Open both canon panes on the resolved canon path
  • Persist handled findings and applied or declined amendments on StoryboardCohesionReport
  • Correct both copies of cr-frames.md so its report says states are adopted with "Read N from the file"
  • Say why when "Propose a registry" finds nothing to group
  • Strip a leading article before the seeder's Meta match so the-lobby files as Meta
  • Stop "See it on a board" from rewriting the unit board's stored layout and expandStates
  • Clear the Revise bar's scope override when the selection changes
  • Count a derived board's frames through StoryboardResolver on list cards and show its source

Phase 1 — Say what happened (R4)

8/8 done
  • Confirm "Copy canon packet" and "Write the frame contract" with what was copied or written
  • Ask which unit when "Copy canon packet" runs with none selected
  • Label each AI action with its approximate cost and time
  • Badge the unfiled count on the nav bar's Registry segment
  • Use one name per place across nav bar, headers, back buttons and titles
  • Add a legend to the screen status dot and a glossary tooltip to the beat picker
  • Keep "As a newer take on" available with a searchable screen list when no screen shares a name token
  • Name the path from files to Registry to Boards in the empty Mockups grid and the Registry empty state

Phase 2 — The readiness strip (R1)

7/7 done
  • Add UnitReadiness computing the seven steps per unit from existing registry data
  • Render the strip across the top of the screens pane with a count and a mark per step
  • Make the first incomplete step the pane's one primary button, keeping every step clickable
  • Keep the spec step present when no spec matches, with a spec picker and a remembered skip
  • Count screens with no states as a gap in RegistryFillPass.gaps
  • Show readiness in the unit rail and let the rail sort by it
  • Add a status filter to the screens list for Planned, Mocked not built, and Built

Phase 3 — Screen links, a state per screen, and the contract writer (R8 data, D1)

9/11 done
  • Add ScreenLink and a links array on DesignRegistry with defensive Codable
  • Add stateId to ScreenVersion with defensive Codable
  • Use a version's stateId as the cell state in StoryboardResolver when no flow step pins one
  • Retarget or remove links when a screen is merged or deleted
  • Add a Ways in section to the screen detail pane with add, edit, remove and open-source
  • Add a .screen board source showing ways in, the screen and its file-mates, and ways out
  • Add createLink and setScreenState to RegistryEdit, the conversation prompt and RegistryEditParser
  • Extend FrameContract.retrofit to write the crSetState message listener with the manifest
  • Propose one Meta unit holding Peregrine's Lobby and Case Board screens through the Revise bar
  • Accept or correct the proposed Meta unit for the Lobby, Training and Case BoardSarah
  • Verify the new decoding, resolver and contract-writer paths in a standalone harness against a copy of Peregrine's registry

Phase 4 — Declare states in the app (R2)

4/4 done
  • Add "Declare states" on a screen and a unit, from the harness or a model pass
  • Adopt declared states on scan when a screen has none
  • Explain on the board when Matrix has no beats, linking to Declare states
  • Update both copies of cr-frames.md to describe the in-app path

Phase 5 — Place a new mockup (R8 reading)

11/11 done
  • Add MockupPlacementService reading a new file beside reduced source-screen mockups, the canon and the glossary
  • Return the screens a file walks through, each bound to the file and to a state
  • Return proposed ways in, each naming its control and whether the source mockup already shows it
  • Return the change each source screen needs when its control is missing
  • Add "Place this mockup" to each unfiled item and to a filed screen whose file holds several screens
  • Default the source screens to Meta and Shell units, with a picker to change them
  • Apply a placement by filing the file, creating screens, writing their states, creating links, and opening the .screen board
  • Turn an accepted needed change into a QuickTask
  • Run placement live on peregrine-v3-mockups-with-training-ground.html to split out Training and record cost, time and accuracy
  • Run placement live on one new Peregrine game mockup and record cost, time and accuracy
  • Recognise data-attribute harnesses such as data-s buttons in the state reader and the listener, verified across Peregrine's mockups

Phase 11 — The Design Studio spine (supersedes Phases 6 to 9)

29/30 done
  • Sketch Mockup Lab on the spine with Peregrine's real data, as a clickable page Sarah can react to
  • React to the sketch and settle the shape before any codeSarah
  • Add ProjectExperience holding First Contact, the Core Loop, task flows, the screen registry and the navigation map in Design Studio's own types
  • Add ExperienceResolution as a sidecar recording each step's and beat's screen id, each flow's loop part, and each spine screen's Mockup Lab takes
  • Add ExperienceStore reading and writing <project>/.claude/experience/ one file per movement, defensively decoded
  • Add ExperienceImporter building a project's spine from its Design Studio session, matched by product name, with exact name matches and first-contact order pre-resolved
  • Stage navigationMap.json in the handoff beside the other four movements
  • Import Peregrine's spine and verify it in a harness against the session: 6 beats, 4 flows and 17 steps, 18 screens, 21 transitions
  • Add a resolution review for steps and beats whose screen name matches no registry entry, suggesting by name and marking weak matches
  • Add a reconciliation review placing each Mockup Lab screen onto a spine screen as a take, or keeping it as a new spine screen
  • Compute the spine's gaps: steps and beats with no screen, places the Map never reaches, flows with no loop part, unplaced mockups
  • Add a Spine segment to the Mockup Lab nav bar hosting the new surface
  • Add the pinned lens strip with who it's for, the loop, and a switch that highlights loop screens
  • Add First Contact, Map, Flows and Screens with a Board and List view each, opening on Board
  • Draw the Map board as a graph from where the app opens, and the Map list as a site-map outline
  • Add the screen panel with ways in and out, flow steps, takes and content
  • Add What next listing the gaps, each jumping to its fix
  • Add SpineReach computing what a beat, step, flow, screen or the Map touches at a chosen scope
  • Add the rework conversation returning a reviewable batch of spine edits across everything it touches
  • Snapshot the spine before a rework applies, with compare and restore
  • Add Discuss the map, opening on hubs, dead ends and places reached one way only
  • Add Redraw from the mockups, a whole-spine rework that reads every Mockup Lab screen's controls and links
  • Redraw Peregrine's spine from its current mockups in the app and review the batchSarah
  • Render the spine's boards through StoryboardDocumentBuilder with the live frames of each screen's current take
  • Run Check consistency on any board's screens through the existing cohesion review, sized to 2–16 frames
  • Add the new-app start listing the sources that exist: a Press Raven guide, a Design Studio session, specs, mockups, code, a paragraph
  • Draft each section from the chosen sources into a review before it is kept
  • Show a screen's and a flow's corpus family, entry count, mechanic and build status through CorpusIndexService
  • Add a pressraven:// link into a guide's family, in Press Raven
  • Send content a rework says needs rewriting to Press Raven as suggestions

Phase 12 — The Registry as a table of files

21/26 done
  • Replace the unit rail, readiness strip, Flows and Loop tabs and Revise bar with one table of mockup screens
  • Show each row's spine screen with the close match pre-filled, and link all close matches at once
  • Show versions, states (read or declared in the cell) and the built link on each row
  • File new files from a band at the top, grouped by the seeder and linked to their spine screens
  • Replace every system segmented control in Mockup Lab with a Code Raven one, and put the Spine's cards on white
  • Re-aim Place a mockup so its screens become takes and its ways in land on the Map
  • Move Generate a mockup to a spine screen that has no mockup
  • Ask newer version, another design or separate take when filing under a spine screen that has mockups
  • Mark custom art on a spine screen or a generator session, write its spec, and hand it to ChatGPT
  • Add a Board view to the Registry showing every filtered mockup screen live, grouped by spine screen
  • Archive screens and unfiled files from the Registry so they stop counting as unregistered, with an Archived filter to restore them
  • Stop live boards re-rendering in a loop by comparing what their groups show
  • Pick frames on the Registry board and delete, archive, merge as versions, add to a flow, or start a new flow from them
  • Restore the Shown at picker so a screen in a multi-screen file says which state it shows
  • Add a Shelf for screens kept to look at again, with a note, a filter and a board view
  • Read the app's screens and the ways between them from its SwiftUI code
  • List the app's screens that no mockup covers, and draw an As built mockup of any screen from its source
  • Start a new spine from the app as built
  • Open a frame in a new window or the browser from a right-click on any board
  • Start the spine over from inside the app, archiving the old one
  • Split a mockup screen whose file walks through several views into one screen per view or group of views
  • Split the Intake mockup into its screens in the appSarah
  • Draw one As built mockup in the app and compare it with its mockup on the boardSarah
  • Merge, flow and archive a few Peregrine mockups from the Registry board in the appSarah
  • Walk the new Registry and file the new mockup in the appSarah
  • Write one art spec in the app and make the art in ChatGPTSarah

Phase 13 — Edit the spine by hand, the same way in every view

12/13 done
  • Flag mockups whose file holds several screens, and split them from the Spine board with the grouping filled in
  • Ask which of the split screens each flow step shows after a split
  • Choose a beat's or step's screen by hand from any Spine view
  • Bring back the zoom slider on live boards
  • Caption live spine frames with what happens there, and fold the Spine header to one row
  • Add edit, remove and move operations for beats, move for steps, and remove for flows to the spine edit engine
  • Open a panel for a beat, step or flow with its fields editable, and make a screen's name, purpose and priority editable in its panel
  • Select a beat, step, flow or screen by clicking it in Board, List and Live frames
  • Give every item the same right-click actions: edit, change screen, insert before or after, move earlier or later, remove, rework
  • Add a beat, step, flow or screen from the end of each row and each section
  • Ask what steps and beats use instead before removing the screen they land on
  • Offer Undo after every hand edit, and save to History before a removal
  • Edit a beat, a step, a flow and a screen by hand in the app, then undo oneSarah

Phase 14 — The Map leads its screen

7/8 done
  • Move the Spine's actions onto the Mockup Lab tab row so the product name appears once and the Spine's own title row goes
  • Replace the four section cards with one stepper row with chevrons, the selected stage on white and the rest ghost, and the loop as a card beside it
  • Keep amber for warnings only, make What next the one solid button with a neutral count, and drop the duplicate count from Link up
  • Show a place's tier by its treatment (core solid with a dot, important outlined, secondary dashed) and put its in and out counts on the second line
  • Draw each kind of way with its own stroke, and highlight the selected place's ways while the rest recede
  • Let a way's kind be changed, and draw places reached by tab ways inside the place they leave
  • Move Not reached into a rail card with Add a way in, and list the selected place's ways out under it
  • Mark Phone's ways as tabs in the app and check its rooms draw inside itSarah

Phase 15 — Flows: one structure at two densities

7/8 done
  • Draw the Flows board as lanes, each with the flow's name, neutral tags, description and a pinned Rework, its frames left to right with chevrons and step captions
  • Caption each frame with its step and its screen and state, dropping the state tags, and offer Generate on a step with no frame
  • Light every step that uses the selected screen, across all flows, in both Board and List
  • Give the List a thumbnail per step and merge the screen chip and Change screen into one picker that shows the take's state
  • Fold the Flows toolbar to one row: steps without a frame as a filter, Check consistency, Board and List, zoom as minus and plus, and an overflow menu for live frames and Change screens
  • Replace the system checkbox and slider on the Spine with Code Raven controls
  • Put Generate from neighbours and From Registry at the top of a screen panel with no mockup, with how many flow steps wait on it, and move In flows above the ways
  • Walk Flows in Board and List in the app, select Night Desk, and generate one missing frameSarah

Phase 16 — Filling the spine

7/8 done
  • Offer Use a mockup on an empty frame, in its right-click menu and in the screen panel, including mockups drawing another screen
  • Make a split put every screen on the spine, link each to the next on the Map, and add them to a flow in order
  • Add Make a flow from the screens in one file, and a Registry card for split files not yet on the spine
  • Suggest the screen a beat or step happens on in every screen picker, and give empty First Contact frames their buttons
  • List the spine's screens that have no mockup in the Registry, read live from the spine
  • Show a generation's progress, success and failure on the board, in the screen panel and on the Workbench
  • Open the Spine at its screen from a Spine generation's Workbench row, and give As built and art specs Workbench cards
  • Generate one missing frame from the Spine and follow it from the Workbench row back to its screenSarah

Phase 17 — Built as designed, state by state

8/10 done
  • Record per-state implementation flags on a mockup screen: built as designed, built with differences and a note, with the version and file fingerprint they were set against
  • Badge every board frame with its state's flag, and show changed since built when the mockup moved on
  • Set a state's flag from a right-click on any board frame or Registry row, and every state's flag from the Registry detail
  • Summarise each screen's flags in the Registry's built column, with a filter for states that differ or changed
  • Compare a state with the app: read the screen's code against it, list the differences, and propose a flag to confirm
  • Revise a mockup from a brief as a new version, with the brief's images opened by the model and inlined in the file
  • Draft a flow per game in one reviewed rework, from each game's mechanic, mockups and app views, making no mockups
  • Make Generate and Revise answer without tools except the images a brief names, with room for those reads
  • Flag a few Peregrine states in the app and run one comparisonSarah
  • Draft flows for the games without one in the app and review the batchSarah

Phase 18 — Organize: Claude sorts the spine, and asks about the rest

11/12 done
  • Let a project choose where Mockup Lab opens, down to the Spine section and Board or List
  • Add a state to each flow step and opening beat, so a step shows its screen at a chosen state
  • Dock an Organize panel on the Spine and the Registry that keeps its conversation per project
  • Apply confident changes as one batch with one Undo and a History snapshot, listed in the chat
  • Ask about unclear matches as questions with quick-reply choices and free text, and turn answers into changes
  • Cover linking mockups to screens, steps and beats to screens and states, splitting and grouping files, and game flows
  • Scope a turn to part of the app, such as the phone or the games, when the whole spine is too much at once
  • Mark answered questions as answered, count the open ones, and let the panel resize with replies that wrap
  • Group views that open with the same words into one screen when splitting a file
  • Tell the consistency review to answer without tools, and have inspiration notes open their image with Read
  • React to the Organize sketch before it's builtSarah
  • Organize the games and the phone in the app and undo one batchSarah

Phase 19 — Streamline Mockup Lab around Organize

7/7 done
  • Move Organize onto the Mockup Lab tab row with a count of open questions, and drop its other entry points
  • Cut the Spine's tab-row actions to Rework and a ⋯ menu, and move What next beside the stepper
  • Give every live Spine section one toolbar row, remove the live board's own bar, and put section descriptions behind an info mark
  • Fold the Registry's attention cards into one row of chips, cut its filters to three plus More, and move Find built screens into its menu
  • Open Organize with where to start, counted from the spine's gaps, each filling in a request
  • Lead a Spine screen's panel with its mockup's picture, and title the Mockups tab to match Registry
  • Review the streamlined Mockup Lab and decide the held-back proposalsSarah

Phase 20 — The held-back proposals

7/8 done
  • Retire Change screens: the pickers on every frame and row, and Organize in bulk, cover it
  • Fold What next into Organize's Where to start, with each row's items and a Show link, plus flows not tied to the loop and custom art
  • Keep the stepper's What next chip as the way into Organize's What's missing list
  • Retire the Link up sheet and the gap list behind it
  • Move the Mood Board inside Mockups, so the tab row has three tabs
  • Split the Registry's detail panel into Versions, States & flags, and Placement tabs
  • Show each view's picture in the split sheet, so screens and states can be told apart by look
  • Try What next, Show links and the Registry tabs in the running appSarah

Phase 6 — One door to boards (R3)

0/5 done
  • Offer every board source in the New Board sheet
  • Start a new hand-picked board with one group
  • Relabel every Registry board action "Show on a board"
  • Link every derived board back to its unit, flow or screen in the Registry
  • Let Arrange add registry screens to a hand-picked board as screen-backed slots

Phase 7 — One review sheet (R5)

0/2 done
  • Extract a shared review shell with title, provenance tags, destructive-unticked rows and "Apply N"
  • Move the seed, fill, spec, match, edit and placement sheets onto the shell

Phase 8 — Consistency where you work (R6)

0/4 done
  • Add "Check consistency" to a unit in the Registry
  • Add a row-scoped review on boards through runReview(scope:)
  • Show the frame limit before a review runs
  • Let a cohesion finding propose registry edits alongside canon amendments

Phase 9 — New take, new design (R7)

1/5 done
  • Confirm the D2 reading that a different design is a variant and refining updates the current takeSarah
  • Add "New take" to the Takes section, generating from the current take, canon and siblings
  • Bind a Lab session to a screen variant so its exports update that variant's current take
  • Add "Refine in Lab" opening a session bound to the current variant
  • Add "Try a different design" forking a session bound to a new named variant

Phase 10 — In-app verification

0/3 done
  • Generate a /cr-testing checklist covering Phases 0 to 5
  • Place a new game mockup end to end in the appSarah
  • Walk one unit through the readiness strip in the appSarah

Risks & edge cases

Risk

The strip can become a checklist you feel obliged to finish.

Seven steps across 21 units is 147 marks. Mitigation: it is per unit, non-blocking, and the rail sort points at the unit you pick rather than demanding all of them.

Risk

"Shown in the source mockup?" is a judgement about markup.

A lobby card that opens a game through script may not show a visible control. Weak judgements start unticked. A wrong "missing" produces a needless task, which is cheap. A wrong "shown" hides real work, which is why weak judgements start unticked.

Risk

Placement prompt size.

The new file plus three reduced source mockups sits near the six-frame cohesion budget (~14K tokens). A game whose lobby entry spans more source screens may need a picker default of fewer sources.

Risk

Links rot like status does.

A link doesn't notice a screen being merged or deleted. mergeScreen and screen deletion MUST retarget or remove links, or the Ways in section shows dangling rows.

Risk

Writing into mockup files (D1).

The contract writer edits files Sarah or claude.ai wrote. It MUST insert only the manifest and listener, MUST refuse when a cr-frames block exists, and the change shows in git like any other edit. A file whose own script already listens for message events could conflict. The writer SHOULD detect an existing listener and report it instead of adding a second.

Risk

stateId without a declared state.

A write can fail, or a file can be edited back. The resolver MUST fall back to the file's default and caption the cell "state not declared in file", matching today's "single state" treatment.

Risk

The D2 reading may be wrong.

If "different versions for different designs" meant takes, not variants, Phase 9's two Lab buttons collapse into one. Phase 9 opens with the confirmation for that reason.

Risk

Cost labels drift

as prompts change. They are labelled approximate, and their source is noted in code so they can be replaced by usage-log figures.

Risk

Five sheets onto one shell (Phase 6) is the riskiest refactor here

, because it touches every accept path. It comes after the features that add a sixth sheet, so the shell is designed against all of them at once.

Risk

Everything in-app is compile-verified until Sarah runs Phase 10.

Out of scope

Final review

What it does well. It treats the complaint ("I can't tell where to start or how to progress") as a product defect with evidence, and most of the fix is ordering and feedback over machinery that already works. R1, R3 and R4 add almost no new capability and remove most of the friction. Phase 0 fixes bugs that are hiding answers the app already has; the dropped fill-pass note is the clearest case. R8 answers the scenario Sarah described with the smallest new nouns that can hold it: one link record and one state field. Both are useful by hand before any model call exists.

Where it is weakest. R8's reading is the one new AI surface, and its most valuable output (the change a lobby or case board needs) is also its least verifiable, because "does this mockup already show the way in" is inferred from markup. D1 is now a yes, so the plan writes into files the parent plan left alone. The writer is narrow, but it is the first time the app edits a mockup it didn't make. D2 rests on a reading of Sarah's answer that still needs confirming. Phase 7 is a broad refactor sequenced late on purpose, and it could be dropped if the shared title and verb can be applied without extracting a shell.

If pushed to adjust. Pull Phase 3 ahead of Phase 2. Hand-entered ways in answer Sarah's first question the day they land, while the strip's value compounds over time. The order here puts the strip first because it makes Phase 3's new section findable, and either order holds up. The D3 correction is the other lever: until the Lobby, Training and Case Board share a Meta unit, placement's default sources are wrong for Peregrine.

76/100

that this is the optimal and most elegant approach, up from 74 now that D1 and D3 are settled and no phase is blocked. The diagnosis is well evidenced, and most recommendations are low-risk reorderings of working parts. The score is held down by R8's reading, unproven until the Phase 5 live runs; by the unconfirmed D2 reading; and by the fact that every surface here, as in the parent plan, is compile-verified until Sarah uses it.