Gym Vending

Drinks included with a membership plan. A member scans the code on the machine, and the machine pours only if their plan entitles them to it today.

Two capabilities are composed here, and neither knows the other exists. The machine side speaks only about dispensers and sessions; the benefit side speaks only about plans and allowances. Everything that crosses between them — a vendor SKU becoming an item code, a denial code becoming something a member can read — is translated in this application root and nowhere else.

Anti-fraud is only partly wired: device binding records enrolments but does not yet verify them, and the turnstile presence gate needs the Membership capability. Not a production configuration.