Typed native tin choices
Dave's later-campaign tin uses the same native actions whether the player clicks or types. The host advertises classic-tin-choice-v1; older clients and hosts keep their existing conversation and buttons.
- Offered: buy for the existing price, refuse, or ask Dave to open his own modern tin for free. A purchase preserves the existing defense reserve. Legacy 25-sun saves cannot gain the new demonstration.
- Carried: open with no further charge, or keep it sealed. Explicit refusal must never open an owned object.
- One clarification is allowed. The account-owned choice receipt then requires a legal decision. Without a clear purchase request, the prompt directs Dave to a free demonstration or refusal, never a charge for unrelated banter.
- Price, contents, wave, stage and all currency changes belong to the native game. Replies bind to the requested run/epoch/wave/stage/price and are revalidated against the current lawn. No new reward, refund, reroll or executable AI output.
- The client keeps one paused, readable reply. Opening replaces pre-action speech with the actual revealed result; an outcome receipt records it without another model call. Failed or stale replies preserve the input and native controls.
Host validation: native-state and decision constraints, reserve boundaries, legacy saves, one-clarification receipts, no mixed effects, account model settings, and stale-state rejection before provider resolution. These are deterministic protocol checks, not proof that every provider interprets every phrase correctly. The separate game repository owns client dispatch and compiled-browser checks. No database migration or account-setting change is needed.
