Tartan Tickets
CMU 17-643 Quality Management · four-person team · 2026
A course ticketing platform with Scotty, an LLM assistant that looks up orders, buys tickets, and issues refunds through tool calls. I built the refund capability and the guards around it: the model can ask for a refund, but it cannot decide one.
Team coursework on a starter codebase from the course staff; the repository is private. Refunds, session middleware, metrics, and load tests are my work. Other guardrails are teammates'.
Private repositoryA local build of the frontend with no backend running, so the event list is empty. The Scotty panel shows its greeting and quick actions.
Ask Scotty
The assistant panel on the events page. Signed-out visitors can chat but cannot refund.
Order of checks in the refund tool. The model supplies none of the identity.
Seven checks before money moves
Every refund request passes these in order. Failing one stops the refund and reports why.
If the payment call fails
The order waits in refund-pending. A sweep asks the payment provider what happened, then finishes or undoes the refund.
Implementation notes
Start from a course codebase.
Tartan Tickets is the starter project for CMU's Quality Management course: a React frontend, Express services, PostgreSQL, and a Prometheus and Grafana stack. The course staff added Scotty, an assistant that calls tools through an OpenAI-compatible gateway.
Each teammate took one capability to make safe enough to launch. Mine was refunds.
The model proposes. The service decides.
A refund passes checks the model cannot skip: a signed-in user, an explicit confirmation, valid input, ownership of the order, no earlier refund, an event that has not ended, and an amount under the ceiling. The user's identity comes from the session token on the server, never from the model's tool arguments.
The order moves to refund-pending in a guarded transaction before the payment provider is called with an idempotency key. If that call fails, a sweep every five minutes asks the provider what happened to orders stuck for ten minutes, then completes or rolls back the refund.
What I built, and what I didn't.
Besides refunds I added the session middleware Scotty's tools rely on, Prometheus metrics, Grafana dashboards, alert rules, Playwright end-to-end tests, and k6 load tests. Teammates hardened purchasing, order lookup, and event discovery.
The platform and the first version of Scotty came from the course staff, and the repository is private.
