Skip to content

5. Reward care and write two endings

This lesson upgrades the complete 0.3 draft to 0.4. Changing protocol_version alone is insufficient: add progression, and review assets and their access rules. The worked pack adds a seedling keepsake image marked reward_only, rather than making locked reward art part of normal story discovery.

Add public booleans left and kept_seed, defaulting to false. Extend observation action with leave and accept_seed. The rule record_departure sets left after an actual departure. accept_seed sets kept_seed only when trust is already 2 and the reader accepts. A pre-turn guidance rule offers the seed; the reader can decline.

This single-choice observation gives priority to departure, then seed acceptance, then care if several actions occur together. For the seed ending, accept the gift in one turn and depart in the next. If your story needs multiple simultaneous actions, redesign the observations and test their interaction rather than silently assuming a choice records them all.

The greenhouse_friend achievement unlocks at trust 2. Its seedling_pin collectible uses storyorbit.pin-badge/1, model round-pin/1, a full-image square crop, and finish holo/1. A Pin is a collectible presentation of an earned outcome; it is not a public-state counter.

Path Authored observation sequence Expected result
A short visit leave quiet_goodbye
Shared care tend, tend Achievement; story remains open
A seed to take home tend, tend, accept_seed, leave seed_home

Both endings match after the gift path. seed_home has priority 20 and quiet_goodbye priority 10, so the more specific ending wins. An ending closes the journey; an achievement does not. The tests rehearse these authored observation sequences, including a declined/too-early gift and care capped at 2.

guidance.requirements[].condition_ref points inside that outcome’s when tree. An empty string refers to its root; /conditions/0 and /conditions/1 identify the seed ending’s leaves. The label and hint should describe a useful action without promising success before the condition is met. They are not pointers into the pack root.

Set revision to 6; validate against the bundled 0.4 schema. In a private trial, check achievement timing, reward visibility, both endings and hint wording. Preserve outcome and badge IDs for copy-only edits. Changing earning conditions, ending priority, reward artwork, badge linkage or the collectible recipe changes identity: create new IDs and update references. The host rejects changed reward semantics under a reused ID (PROGRESSION_ID_REUSED), protecting existing collections. Optional reusable characters are covered in character casting.

The original teaching artwork

Static previews of the actual downloaded images. The sprite frames are shown separately for comparison; this is not a live player.

Original geometric teaching image: greenhouse glass, sunset and a seedling.
greenhouse_art
Original geometric Rowan teaching portrait on a transparent canvas.
rowan_neutral
Original geometric seedling keepsake teaching art.
seedling_reward

Check your work locally

From the extracted bundle folder, create the environment and install the pinned dependencies once. Then check both files, and repeat the start check after your edits. The same commands work for every lesson.

macOS / Linux

python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python check.py start/pack.json
.venv/bin/python check.py finished/pack.json

Windows PowerShell

py -3 -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe check.py start/pack.json
.venv\Scripts\python.exe check.py finished/pack.json

Expected for the finished pack: Structural check passed: Creator Pack 0.4 followed by the exact Schema SHA-256. This is a structural check, not host admission or a live playtest.

Working excerpt from the finished pack

This excerpt is generated from the tested download. It is not a complete pack; edit the named fields inside start/pack.json or compare finished/pack.json.

{
  "achievement": {
    "id": "greenhouse_friend",
    "title": "A little shared care",
    "description": "Tend the seedling with Rowan twice.",
    "when": {
      "op": "gte",
      "path": "/trust",
      "value": 2
    },
    "artwork_asset_id": "seedling_reward",
    "badge_id": "seedling_pin",
    "guidance": {
      "summary": "Share two small moments of care.",
      "next_step": "Complete two separate care actions with Rowan.",
      "requirements": [
        {
          "id": "care_twice",
          "condition_ref": "",
          "label": "Complete two separate care actions with Rowan.",
          "hint": "Complete two separate care actions with Rowan."
        }
      ]
    }
  },
  "ending_conditions": [
    {
      "id": "quiet_goodbye",
      "priority": 10,
      "when": {
        "op": "eq",
        "path": "/left",
        "value": true
      }
    },
    {
      "id": "seed_home",
      "priority": 20,
      "when": {
        "op": "all",
        "conditions": [
          {
            "op": "eq",
            "path": "/left",
            "value": true
          },
          {
            "op": "eq",
            "path": "/kept_seed",
            "value": true
          }
        ]
      }
    }
  ],
  "pin": {
    "id": "seedling_pin",
    "title": "Greenhouse keepsake",
    "description": "A memento of a quiet afternoon.",
    "collectible": {
      "protocol": "storyorbit.pin-badge/1",
      "model": "round-pin/1",
      "front_asset_id": "seedling_reward",
      "crop": {
        "x": 0,
        "y": 0,
        "width": 1,
        "height": 1
      },
      "finish": "holo/1"
    }
  }
}

Look up the fields: progression

Next lesson