kaintuck: fold a rumor's payoff into the tip it resolves

kaintuck: fold a rumor's payoff into the tip it resolves

#59 in Riparion/riparion-retro — merged 2026-06-16

What

A dockside rumor tip and its later affirm/disprove payoff (held/wind) used to log to the notification center as two separate market reports. Now the payoff is appended onto the tip it resolves, so the assertion and its verdict read as one entry.

How

  • Notification gains a #[serde(default)] key: Option<String> (old saves still load).
  • The tip is logged with a stable key rumor:{town}:{good} (Rumor::report_key()); the payoff at the next landing is folded onto it via a new Game::report_verdict, which re-flags the report unread so the badge surfaces the update.
  • Game::report() is split into report / report_keyed / report_verdict over a shared push_report sink — the 40-entry cap trim is unchanged.
  • The notification sheet splits a report on newlines and renders each on its own line (avoids a whitespace-pre-line utility not in the committed Tailwind).

Safety

  • Golden trace re-pinned — narrative-routing only, RNG-neutral. Verified by diffing print_golden_trace: every changed line is the r{..} report line (tip gains its key, payoff folds in, standalone payoff Notification disappears); no numeric/RNG state moves.
  • New unit test a_verdict_appends_onto_the_assertion_it_resolves covers the fold, the unread re-flag, and the orphan-key fallback.
  • cargo test -p kaintuck-engine: 79 passed. cargo check -p kaintuck: clean.
  • Patch-bumped kaintuck-engine 0.1.8→0.1.9 and kaintuck 0.1.31→0.1.32.

🤖 Generated with Claude Code

Last updated 2026-06-17