Skip to content

Roasty has eight states; the design has nine — the points wink is undrawn #518

Description

@maximsan

Found while porting the faces' missing marks (#506). The design's mascot has nine states; RoastyState had eight. The missing one is points — a wink, listed in 03-design-system.md as "wink + points rise, 2150ms" and drawn in prototype/roasty.jsx as face-points: one open eye with its catchlight, one arched-up eye, cheeks at 0.5, and a mouth that rises to the winking side.

Nothing in the app could reach it, so it was absent rather than unused — the whole pose was undrawn.

The part that is settled, and the part that is not

The face is a drawing like the other eight. The points burst beside it is not: roasty.jsx renders +{pointsAmount} PTS, and #16 ruled a hardcoded amount out of the mascot — the guard in companion_no_payout_literal_test.dart keeps it out. So a points state may draw the wink, and the amount has to be passed in by whoever knows it, exactly as the design passes pointsAmount.

Whether the app has a moment that should use it is the open question: nothing today awards points with a mascot beat, and CompanionReaction has no member for one. That is a product call, not a porting one.

Reconciling #212

#212 deleted this pose rather than fix the number baked into it, and rejected parameterizing at triage. Half of that ruling is reversed here and half stands, and #212 now says so:

  • Reversed — the pose is drawn, and the amount is the caller's. Roasty asserts the pairing both ways, so the pose cannot reach a screen without an amount and no other state can be handed one.
  • Stands — no v1 moment that already celebrates gets a second celebration wired into it. That is why nothing calls the pose.

Acceptance criteria

  • RoastyState carries the design's ninth state, drawing face-points as roasty.jsx draws it — roasty_faces_test.dart reads the design's own markup for the wink's cheek pair, its single eye white and both of its strokes
  • Either a caller shows it at a real points moment, or the ticket records why the app has no such moment and the state stays for the next one — no caller. The design's only one is Coffee Duel's round-complete beat, and the v1 readiness audit holds Duel to v2; every v1 moment that pays already opens on a larger celebration and states its real amount on the screen behind it. Registered under Coffee Duel in docs/design/09-deferred-v2.md, so the next reader finds it where the work is
  • The mascot still states no amount of its own — companion_no_payout_literal_test.dart passes unchanged
  • flutter analyze, metrics gate, tests clean — 2592 tests

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    backlogReal and agreed, but not scheduled — do not pick this up as ready workbugSomething isn't workingdesign-parityCloses a finding in the app-vs-prototype divergence register

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions