This was generated by AI during triage.
Half of this is superseded by #518. The pose is drawn again, on the terms this ticket rejected: the amount is passed in, required with the state and rejected without it, so the mascot still names no payout of its own. What stands is the rest — no v1 moment that already celebrates gets a second one wired into it, so nothing calls the pose. It waits for Coffee Duel's round-complete beat, where the design puts it.
Follow-up owed by #160. A disposition of #16 that #160 was built to implement, and missed.
What #16 ruled
roasty_particles.dart:171 hardcodes a '+15 XP' particle matching no rule in the app — not perStep, not the module bonus. It goes with the toast.
and, in the same comment's disposition table:
|
|
|
'+15 XP' in roasty_particles.dart:171 |
Dropped |
Matches no rule in the app; a hardcoded string |
What #160 did instead
Renumbered it. The vocabulary sweep rewrote the literal to '+10 PTS' and named it a placeholder constant, which fixed the word and left the defect — a payout hardcoded into painted art. Ten is no more read from a rule than fifteen was.
It is invisible to tooling: the particles file is excluded from no-magic-number, and that exclusion is justified for coordinates, not for payouts.
Why deleting is the answer, not parameterizing
The pose has never rendered. CompanionReaction.xpGained is fired by nothing; RoastyState.xp is reachable only through it. So no learner has seen the wrong number, and nothing would have caught it.
The alternative — keep the pose and pass the real payout in, as the design does (roasty.jsx:575 renders +{pointsAmount} PTS) — was considered and rejected at triage. The lesson result screen already plays CompanionReaction.lessonComplete, and §5.1 puts points on that same screen. Wiring a second celebration into one moment is a design decision about what happens to the first, which is scope this ticket has no business carrying.
This ticket therefore deletes. If a points-earned moment is ever wanted, it is authored deliberately against a screen that has room for it — not inherited from an unreferenced pose carrying a stale number.
Related
The unwired-pose gap is broader than this ticket and is split out to #219: correct, wrong and cardEarned are also fired from nowhere, and §5.1 asks for the first two by name.
Half of this is superseded by #518. The pose is drawn again, on the terms this ticket rejected: the amount is passed in, required with the state and rejected without it, so the mascot still names no payout of its own. What stands is the rest — no v1 moment that already celebrates gets a second one wired into it, so nothing calls the pose. It waits for Coffee Duel's round-complete beat, where the design puts it.
Follow-up owed by #160. A disposition of #16 that #160 was built to implement, and missed.
What #16 ruled
and, in the same comment's disposition table:
'+15 XP'inroasty_particles.dart:171What #160 did instead
Renumbered it. The vocabulary sweep rewrote the literal to
'+10 PTS'and named it a placeholder constant, which fixed the word and left the defect — a payout hardcoded into painted art. Ten is no more read from a rule than fifteen was.It is invisible to tooling: the particles file is excluded from
no-magic-number, and that exclusion is justified for coordinates, not for payouts.Why deleting is the answer, not parameterizing
The pose has never rendered.
CompanionReaction.xpGainedis fired by nothing;RoastyState.xpis reachable only through it. So no learner has seen the wrong number, and nothing would have caught it.The alternative — keep the pose and pass the real payout in, as the design does (
roasty.jsx:575renders+{pointsAmount} PTS) — was considered and rejected at triage. The lesson result screen already playsCompanionReaction.lessonComplete, and §5.1 puts points on that same screen. Wiring a second celebration into one moment is a design decision about what happens to the first, which is scope this ticket has no business carrying.This ticket therefore deletes. If a points-earned moment is ever wanted, it is authored deliberately against a screen that has room for it — not inherited from an unreferenced pose carrying a stale number.
Related
The unwired-pose gap is broader than this ticket and is split out to #219:
correct,wrongandcardEarnedare also fired from nowhere, and §5.1 asks for the first two by name.