{
  "$type": "site.standard.document",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 51,
                    "byteStart": 0
                  }
                }
              ],
              "plaintext": "# Chapter One — gameplay loop & division of labor"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "A plan to share with mobius. Captures the loop we want, who owns what, the decisions locked, what I just changed on the engine side, and the open items that need your call."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 11,
                    "byteStart": 0
                  }
                }
              ],
              "plaintext": "## The loop"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 28,
                    "byteStart": 14
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 49,
                    "byteStart": 36
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ],
                  "index": {
                    "byteEnd": 143,
                    "byteStart": 130
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 373,
                    "byteStart": 355
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 613,
                    "byteStart": 596
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 636,
                    "byteStart": 620
                  }
                }
              ],
              "plaintext": "You wake in a **fixed room** with a **fixed NPC**. The NPC gives you background and something like a quest — but the quests are *exploratory*: go see the world, learn things, circle back when you know enough to answer my questions. So you explore, crystallize features, uncover lore through NPCs and the environment. When you've covered enough, the NPC **pages you back**. You answer (multiple choice). Your answer moves you to the next deck/zone — start at another fixed room, with another fixed NPC, who provides another fixed quest. Repeat across the anchor NPCs, then you're paged into a **final chamber** for a **final choice** that ends the chapter."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 40,
                    "byteStart": 20
                  }
                }
              ],
              "plaintext": "This is the bible's **Narrative ladder**, 1:1:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "| Stage | Anchor NPC (proposed) | Faction lens |"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "|---|---|---|"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "| 1 Arrival | Olo Vashti | The Drift |"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "| 2 Orientation | Factor Solen | Continuants |"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "| 3 Investigation | Sevin | Rind-walkers |"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "| 4 Convergence | a Seven (Luna) | The Seven |"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ],
                  "index": {
                    "byteEnd": 49,
                    "byteStart": 17
                  }
                }
              ],
              "plaintext": "| 5 Resolution | *(the final chamber — no NPC)* | — |"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ],
                  "index": {
                    "byteEnd": 499,
                    "byteStart": 495
                  }
                }
              ],
              "plaintext": "Stages 1–4 each have one anchor NPC; stage 5 is the final decision chamber. The geography escalates (Nave → upper rind → lower rind → Signal Chamber), it isn't a stack of identical decks. Each deck should feel different, with a different composition--room types that only appear on certain decks, same for creatures, etc. This provides novelty for the player and a sense of progression and motion. We already lock content behind narrative and revelation tiers, but we can make the decks feel different too. Decks can be collections of chunks, but in the narrative progression, they are completely different biomes, so they should be physically and experientially separate."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 19,
                    "byteStart": 0
                  }
                }
              ],
              "plaintext": "## Decisions locked"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 73,
                    "byteStart": 2
                  }
                }
              ],
              "plaintext": "- **All advancement + paging is deterministic and the client's (yours).** No LLM anywhere in the advancement loop."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 38,
                    "byteStart": 2
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ],
                  "index": {
                    "byteEnd": 176,
                    "byteStart": 171
                  }
                }
              ],
              "plaintext": "- **Gate = specific held story state** — your `advance.js` flag milestones (`met_olo`, `read_terminal`, `sevin_believes`, …), with XP/exposure as the fallback. We are *not* gating on a raw crystallized-feature count: you can direct the player at specific things, so keep the specific gates. The pool is small and exploring it is the point."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 85,
                    "byteStart": 2
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 150,
                    "byteStart": 143
                  }
                }
              ],
              "plaintext": "- **\"Answers\" that the player gives to the key NPCs = pre-generated multiple choice**, not free text. They accumulate into save state; they do **not** gate progression (progression and consequence are decoupled — you always advance; what you say only shapes the ending). Future: lock some options behind specific lore fragments via the `requires` gate."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 32,
                    "byteStart": 2
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 136,
                    "byteStart": 105
                  }
                }
              ],
              "plaintext": "- **The final deck is special.** On reaching `narrative_tier == 4` (Convergence), the client publishes a **high-priority atproto event**. The engine (us) computes the resolution options + their consequence text from the accumulated answers while the player keeps exploring the final zone. Then: final page → chamber → choice → ending."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 38,
                    "byteStart": 2
                  }
                }
              ],
              "plaintext": "- **Verdict = one record per player.** The accumulated answers either ride along as evidence in the verdict or you pull them from your own player state — either is fine; showing them to the player at the final choice would be a nice touch."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 20,
                    "byteStart": 0
                  }
                }
              ],
              "plaintext": "## Division of labor"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 60,
                    "byteStart": 0
                  }
                }
              ],
              "plaintext": "**Client (mobius) — deterministic, owns the player loop:**"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "- Map / geometry / \"which deck.\""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "- Tier advancement on all three axes (`advance.js` milestones)."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "- Paging (storyboard markers: \"find Olo\", \"go to the rind\")."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "- The 4 anchor NPCs + their multiple-choice option sets."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "- Accumulating the player's answers into save state."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "- Firing the high-priority \"final deck reached\" event at `narrative_tier == 4`."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "- Persisting authoritative player state to atproto (`story.save` / `story.pulse`)."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 56,
                    "byteStart": 0
                  }
                }
              ],
              "plaintext": "**Engine (us) — async/offline, no player-facing LLM:**"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 29,
                    "byteStart": 21
                  }
                }
              ],
              "plaintext": "- The shared content **pool** (spine): npc / lore_fragment / item / creature / plot_beat / rumor, generated and replenished offline by tier."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 13,
                    "byteStart": 6
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 63,
                    "byteStart": 45
                  }
                }
              ],
              "plaintext": "- The **one** async LLM job in the loop: the **final decision** — consume the high-priority event + accumulated answers, produce the resolution options + consequence text, emit a `story.verdict`."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "- The existing async engine, all surfaced via verdicts: `resolve_input` (\"Do Stuff\"), the rumor mill (`cluster_drift`), enrich/regen + the retcon cascade."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 59,
                    "byteStart": 2
                  }
                },
                {
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ],
                  "index": {
                    "byteEnd": 215,
                    "byteStart": 178
                  }
                }
              ],
              "plaintext": "- **Ingesting your authoritative player state via atproto** (`story.save` → `atproto/handlers.py:_project_save`) so replenishment counts pool depth at each player's real tier. **We never advance tiers ourselves.**"
            }
          }
        ],
        "id": "019efcbd-d717-7003-86d3-52d5fce0797e"
      }
    ]
  },
  "description": "",
  "path": "/3mp3hikcs3c2j",
  "preferences": {
    "$type": "pub.leaflet.publication#preferences",
    "showInDiscover": false
  },
  "publishedAt": "2026-06-25T03:12:30.610Z",
  "site": "https://leaflet.pub/p/did:plc:vw4e7blkwzdokanwp24k3igr",
  "tags": [],
  "theme": {
    "$type": "pub.leaflet.publication#theme",
    "showPageBackground": true
  },
  "title": "story progression proposal"
}