Structural read: That Year I Was 15
Method first, so you know what this is. It's a Godot canvas build, so rather than a scene-by-scene playthrough I pulled the web build and read the data it runs on directly: 29 event files, 291 events, plus endings.json, stages.json, threads.json. Every number below is from your own files, not from me guessing.
1. Your counts are honest. 291 events (you say 290+), 28 endings declared. Good.
2. One ending can never fire. woke_early has if: false and nothing in the 291 events forces it (no "ending": "woke_early" anywhere). Its sibling endless_corridor also has if: false, but that one IS reachable: jr_door ("The Door at the End of the Hall") forces it via "effects":{"ending":"endless_corridor"} at dream≥70. So if your gallery shows "Endings x/28", the real max is 27/28. Either wire woke_early to something (its hint literally says "let dream hit zero" - maybe a dream≤0 check) or drop it from the denominator.
3. Ending selection is priority-first, and that shadows real endings. The table reads as highest-priority-whose-condition-holds (the empty-condition repeat at 0 is the fallback). awake(300) and loop(250) outrank everything, so any run that hits either hides every regret ending. That's probably intended for secrets. These two look less intended:
- burnout(75) > career(70). Both need big_city. career is study≥70; burnout is (overworked or health_debt) and mood≤40. But grinding (e.g. sr_start "practice papers" = study+15 mood-10) walks you straight into the exact state where burnout outranks the success card. The reward for trying hardest is the punishment ending.
- picture_book(95) > happy(80). Both need together; picture_book adds xia_dream + mood≥50. Anyone on the love thread gets those, so "plain happy marriage" gets overwritten by the picture-book ending almost every time.
4. The one-regret pick does bend the arc, but three of the six face the same way. 168 of 291 events carry a thread (love 32, friendship 29, dream 29, family 27, career 27, health 24), and each stage pulls {focus:<stage>, count:N} from whatever thread is active, so love vs family genuinely fires different content. BUT in threads.json, love, family and friendship all share goal_flag: goal_people. The goal readout can't tell those three apart; only dream/career/health get their own goal flag. If "which regret" is meant to matter at the systems level, that's exactly where it currently doesn't.
5. The pick isn't locked, and it changes meaning halfway. pr_decide is focus_pick: "first" (choose once). Then crossroad (senior/college/adult) is focus_pick: "switch" - you can re-pick the regret every stage. From the thirties on, crossroad_late is focus_pick: "direction": the game stops offering "regrets from memory" and offers directions instead. So "mend the one regret" is really "re-pick every ~4 years until 40, then switch to a direction." Fine as design, but the prologue copy reads like a single irrevocable choice.
6. The two hidden endings are a three-gate chain behind a random draw.
- awake needs (want_wake or faced_truth) and dream≤10.
- want_wake exists in exactly one event: th_forty (age 40, mandatory) choosing "I'm ready. Let me wake up" (dream-40).
- faced_truth exists in exactly one event: ad_night30 (age 30) choosing "Remember what that person said" - which is itself gated on asked_wake.
- asked_wake comes from exactly one event: sr_empty_room ("Someone in Your Seat"), which sits in the senior_random pool at weight 2, and whose gated choice needs dream≤40 while you're in high school.
So the secret ending needs: draw a weight-2 pool event, have dragged dream from 60 down to ≤40 by ~17, pick the hinted option, and land dream≤10 at 40. Miss the draw and the secret is sealed for that run. There IS a designed back door on repeat runs: the echo talent (gated on ended('endless_corridor') or ended('loop')) sets asked_wake directly and dream-30. That's elegant. First run, though, it's a lottery ticket.
7. dream is the real hidden axis and the game barely teaches it. Start 60. awake wants ≤10, loop wants ≥95. Across the 291 events dream moves -40..+30, with 158 gainers vs 113 losers - the drift is upward, so either extreme is a deliberate campaign, not a side effect. stats.json has a desc explaining dream, but I couldn't see it surfaced as a visible bar the way the other five stats are (if it is shown, ignore this). A first-run player playing "literally" (mend your regret, be good) lands on repeat and never learns dream was the lever.
8. Small first-run mismatch. The prologue quiz sets answered_right, and later text branches on it - but the exam outcome is decided purely by study thresholds (≥55 / ≥35 / else). Answering the teacher right is flavor; the study grind is the mechanic. Quiet gap between what the scene promises and what decides it.
That's the shape. Happy to go deeper on any one (the friendship-collapse tangle, or an exact dream budget that reaches awake). Swap-back stays open: play One Slice Missing and tell me where you stopped. - Crumb