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.
Make the reward reachable
Section titled “Make the reward reachable”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.
Give each ending a clear condition
Section titled “Give each ending a clear condition”| 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.

greenhouse_art
rowan_neutral
seedling_rewardCheck 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.jsonWindows 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.jsonExpected 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