FTM302 · The FTM Domain
Learning materials — teaching, weekly quizzes, weekly tests. Examination paper — timed paper with marking guide.
Credits 4 · Hours 40 · Prereqs FTM301 · Semester 3
Source
Section titled “Source”No external course exists. The primary sources are the code, the KB articles, and the prod data:
backend/booking/models.py— Enquiry, EnquiryBand, EnquiryBandMemberbackend/payments/— invoices, deposits, Wise, payoutsbackend/bands/search*.py— ranking and blendingbackend/geography/— regions, points, OSM import- KB: payments, messaging, state machines, venue intelligence
This module exists because engineering without it produces confidently wrong work.
Objectives
Section titled “Objectives”- Narrate a booking from first enquiry to band payout, naming the model and guard at every step.
- Apply the money rules: 18% booking fee, no VAT, FTM is agent not principal, the band sees only its band fee, owed = band net fee − band paid amount,
Invoice.band_paid_amountis the only ledger. - Say how a search result is ordered, and why.
- Name what is never shown to a band, and where that is enforced.
Weekly map
Section titled “Weekly map”| Wk | Topic |
|---|---|
| 1–2 | enquiry lifecycle; progressive (soft) auth for anonymous clients |
| 3 | quotes, client replies, the invoice coupling |
| 4 | BOOKED and its guards — every state transition and where it is enforced |
| 5–6 | money: fee arithmetic, deposits, Wise recipient accounts, payout batches, admin-only finality |
| 7–8 | search: FTS, embeddings, blended scoring, rank tiers, local-first, the single-booking inflation trap |
| 9–10 | geography: regions, OSM import, synthetic regions, place IDs, venue vs region classification |
| 11 | adjacent domains: forms/questionnaires, venue intelligence, reviews, channels |
| 12 | disclosure rules: is_direct, directly_enquired_at, budget fields, raw requirements |
FTM labs
Section titled “FTM labs”- L1 draw the enquiry state machine from the code; list every guard and its enforcement point.
- L2 account for every message in one real prod enquiry thread — sender, channel, which job processed it.
- L3 find a reachable state that violates a stated rule.
- L4 compute owed for five scenarios and reconcile against the ledger.
Project
Section titled “Project”The domain law tests — fee arithmetic, band-visible field set, payout owed — as executable specifications the team keeps.
Reading list
Section titled “Reading list”There is no textbook for FTM’s domain. These three are for the general shape of the problem, not the specifics.
| Book | Author, year | Use | Free |
|---|---|---|---|
| Designing Data-Intensive Applications, ch. 2–3 | Martin Kleppmann, 2017 | Data models and schema evolution; why the enquiry graph looks like this | No |
| Domain-Driven Design | Eric Evans, 2003 | Ubiquitous language, bounded contexts, invariants as first-class — read ch. 1–6 only | No |
| Implementing Domain-Driven Design | Vaughn Vernon, 2013 | Aggregates and consistency boundaries, if the DDD framing lands | No |
For the FTM-specific facts, the source of truth is the KB, not a book. Every claim
in this module must be verifiable against backend/ or a real message thread.
Assessment
Section titled “Assessment”Coursework 45% (L1–L4) · Project 35% · Check-off viva 10% · Exam 10%.
Deferred: induction and invariants (MIT 6.042J) — read after the first money defect, not before.