1 Commits

Author SHA1 Message Date
Manuel Emilio Urena 965cd09ab4 fix(tours): stop guided tours dying silently, and make the failures measurable (#4478)
A missing target, a rejected step hook, or a handle to a Joyride that had already
been replaced all ended a tour the same way: silently, and persisted as completed.
Each now degrades and records why.

- Missing targets and rejected hooks no longer read as a click on Next, and skip in
  the direction of travel so `Back` works behind a dead step.
- `gen:buzz` had pointed at `BuzzTransactionButton` since the generator stopped
  rendering one (8f220ff3c6), so the step resolved nowhere and the tour jumped past
  it. Moved to the generator footer's own cost button.
- Consumers get a Joyride handle that resolves at call time. A ref read during
  render left them holding null, or a dead store after a remount, and their
  `helpers.next()` did nothing at all.
- Both remix steps hide their footer so the tour cannot walk onto a menu nobody has
  opened; a refusal-only menu reports itself blocked to restore a way forward.
- The generator's step array is recomputed as its inputs move instead of frozen at
  step 0, so generating mid-tour restores the select/post handover.
- The discussion step spotlights the whole section, matching the gallery step.
- Faro `tour_start`/`tour_step`/`tour_end` events, so a broken tour is countable.
- `tourSettings` writes merge deeply, so out-of-order writes stop clobbering
  completion and progress.
2026-08-31 13:47:51 -04:00