Three questions I could settle from the data, the category framing as a decision, and what I'd build in what order.
Found and fixed. The document was a plain VStack, so opening a guide built every entry view before anything appeared — 430 of them for Stellar, each walking a 75-field schema. Now a LazyVStack: rows build as they scroll into view. This is original code, not something I introduced.
Also made the mini-game roster tally counts in one pass instead of one filter per game.
It has two contradictory definitions in the system. The app calls it "Things that make the world more legible — across all guides." The exporter's header says "List Two is the reject pile and never ships," and holds those entries back from every game build.
The data follows the exporter. All eight members are things set aside:
| Guide | On List Two |
|---|---|
| washington-dc | Carmine's · National Museum of Natural History · CityCenterDC · Blagden Alley · HipCityVeg |
| drive-corps | a held-back question |
| game-themes | Natural Disaster (unused theme) |
| things-with-a-cost | one seed |
The Natural History Museum makes sense the moment you read it as cut from the DC trip. The "makes the world more legible" copy is leftover from the Things With a Cost concept and has been describing the wrong thing ever since.
| Catalog guide | entries | body filled |
|---|---|---|
| acrylics-field-guide | 144 | 144 / 144 |
| sat-traps | 81 | 0 / 81 |
| game-themes | 57 | 0 / 57 |
| game-mechanics | 42 | 0 / 42 |
| game-registers | 13 | 0 / 13 |
One of these is not like the others, and it's the one you flagged. The four real catalogs never write prose — they carry structured fields consumed by other guides. Acrylics writes prose on every single entry, because a person reads it.
entries(for:) is a dictionary lookup and resolvedSchema is stored, so neither was the cost. It was the document building everything at once. Fixed above. Seed entries felt slow for the same reason — they're inside the same eager stack.
Your instinct is right, and the body data gives it a hard edge. The question that separates them cleanly is:
Is this guide read by a person, or consumed by another guide?
| Category | Definition | Test | Holds |
|---|---|---|---|
| Catalog | Reference data other guides point at. Never read start to finish; looked up by id. | Something else names its entries. | mechanics, themes, registers, sat-traps |
| Field Guide | Informational prose, read by lookup. Grouped by surface. | A person reads an entry and is done. | things-with-a-cost, + acrylics |
| Manual | Informational prose, read in order. Authored chapters. | Entry 12 assumes you read entry 11. | the-field-manual |
| Itinerary | Time and place. Days are authored objects. | It has dates. | asheville, washington-dc |
| Game | Content projected into a running app. Internal, functional. | It has a machine_target. | stellar, drive-corps, peregrine |
On Manual vs Field Guide — you were torn, but the templates already encode a real difference, and it isn't "more personal" or "more how-to." Manual groups by authored chapters[] and reads sequentially; Field Guide groups by surface and reads by lookup. Sequential vs referential is testable, and the two templates that exist already implement it.
On Game not needing style variation — I agree, and it's worth saying what it costs. The design tier (tokens → layout tokens → templates) is real machinery: a design sheet, a Design Packet export, a whole session type. For a guide whose output is Data/*.json, none of it does anything. Stellar currently declares outputs: ["print", "machine"], and print for a game may be vestigial — worth checking whether you have ever wanted it.
Everything in your CodeRaven screenshot is reachable from data already on disk:
CorpusGit already attributes every changed path to a guide — the commit sheet groups by it. The sidebar can show the same badge, so the orange flag says which.git add -A unconditionally; scoping it to selected guides is a small change and also fixes the indiscriminate-commit risk I flagged earlier.That is the one thing not derivable from the corpus. Entries carry updated, but only to the day, and it records when content changed, not when you last looked. The app deliberately keeps no such state — window restoration is explicitly disabled with the comment "the corpus is the state."
My read: that principle is about content, and last-opened is about your session, not the guide. Keeping it in UserDefaults doesn't violate the Prime Directive — deleting the app still loses nothing. That also unlocks opening on the last guide you worked on, which is the right answer to "what should we open on."
You read them correctly, and one of them is misnamed rather than redundant:
There are currently four export types scattered across three places — Session Packet (wand menu, File menu, guide context menu), Print HTML (⌘E), Mobile Guide (itinerary-only), and Export to App. Your proposal is right; it just needs a fifth row.
Each segment is one beat — a prose, list, or object field on that entry — filled or hollow. A column scan down the navigator is meant to be the completeness report. The number on the right is the confidence score. Neither is labelled anywhere.
Cheapest and least contentious first. Nothing here is started.
git add to selected guides. Fixes a real risk as well as your request.Items 1–5 are mechanical and I can take them straight through. Item 6 needs your answers. Item 7 I would want to scope properly before touching.