This page holds all six phase deliveries: the exact date each is due, its weight, what the delivery must contain, the rubric it is read against, and the templates it uses. This is the only page on the course site where delivery dates appear — every slide that mentions one points here.
The six phases
| Phase | Delivers | Weight | Week | Due |
|---|---|---|---|---|
| 1 | Team, environment, and an accepted proposal | 5% | Week 2 | Wed 23 Sep 2026 |
| 2 | Design sprint: stories, the schema, work split, token plan | 10% | Week 4 | Wed 7 Oct 2026 |
| 3 | Sprint 1: the first working increment | 15% | Week 6 | Wed 21 Oct 2026 |
| 4 | Sprint 2: the second working increment | 15% | Week 8 | Wed 4 Nov 2026 |
| 5 | Sprint 3: the third increment | 15% | Week 10 | Wed 18 Nov 2026 |
| 6 | Final sprint and the demo | 40% | Sprint week 13; demos week 14 | Sprint Wed 9 Dec 2026; demos Mon 14 Dec 2026 and Wed 16 Dec 2026 |
What each delivery contains
Phase 1 — team, environment, and an accepted proposal
- A formed team, with roles recorded on the roster workbook.
- A verified environment — the tools installed and signed in.
-
The team agreement,
docs/team-agreement.md, signed in class by every member twice — once by hand and once through Antigravity, each one a commit from that member's own account. -
A proposal the instructor accepts, in the required shape —
as
docs/proposal.md, and published as a page from the team's repository. - Rejected proposals come back within three calendar days.
- The first resubmission carries no penalty; a second caps that component at half.
No team proceeds past Wed 30 Sep 2026 (the end of week 3) without an accepted proposal. At that point the instructor assigns a project from a standing list, the proposal component scores zero, and the rest of Phase 1 is unaffected — the team is not sunk.
Phase 2 — design sprint: personas, stories, schema, work split, token plan
Due Wed 7 Oct 2026, before class. 10 marks. What is graded is your
repository at the tag phase-2. Delivered to the whole class, from the
repository, with questions from the room.
The order things are decided in, and the order they are read in: the personas; the stories and their acceptance criteria; the schema; then screens and code. A team that has an app and no personas has done the last step first.
Every deliverable, where it lives, who owns it, and what done means.
| Deliverable | Where | Owner | Done means |
|---|---|---|---|
| Personas | docs/personas.md |
Client Lead | Two to four named roles from the client, one paragraph each: who, what they are trying to do, what makes it hard today. The example persona is deleted. |
| Stories with acceptance criteria | The Issues tab, label story |
Client Lead | At or above the floor (below). Every story is one thing a user can do. Every criterion is something a teammate can check by doing it. No story outside proposal §6 unless §6 was changed in a reviewed pull request. |
| The split | The Assignee on every story issue | Client Lead | Every member is the assignee on at least two stories; nobody holds all of them. Set it with the Assignees control on the right of the issue — a name typed in the body is not a split. |
| Boundaries between members | Acceptance criteria on the stories that share data | The two builders | For every pair of stories where one saves what the other shows, a criterion names the schema columns that pass between them, and a criterion says what the user sees and what is not saved when a value is missing or wrong. There is no separate contract document. |
| Schema — the SQL | db/schema.sql (a new file; create the folder) |
Data Lead | Runs in the Supabase SQL editor on an empty project. Every table has a primary key and its foreign keys marked, enable row level security, and a policy naming who reads and who writes. No real data. |
| Schema — the document | docs/schema.md (a new file) |
Data Lead | Half a page that says what the SQL cannot: one line per table saying what a row means in the client's words; one line per relationship; one line per policy saying who may read and write and why. No column lists — the SQL has them. It agrees with the SQL at the tag. An ERD image may be linked; the image is not the deliverable. |
| Backlog copy | docs/backlog.md, the “Phase 2” section |
Client Lead | The open stories at the tag, one row each, with who is assigned. The example rows are deleted. |
| Token plan and first ledger entry | docs/finops-ledger.md |
FinOps Lead | The plan's five lines (below) answered specifically; at least one Phase 2 row per member who used an assistant; story numbers and dates agree with the git log; written by the team, not generated. Example rows deleted. |
| Environment | — | Build Lead | Every member has at least one commit in this phase that GitHub shows under their own account. |
| Delivery note | docs/delivery-notes/phase-2.md |
Phase Lead | Five headings filled (below); every link resolves; everybody appears. Written during the phase, not on the last night. |
| Tag | phase-2 |
Phase Lead | Exactly phase-2: lowercase, a hyphen, no space, on main, created after the last pull request of the phase is merged. Phase-2 is a different tag and is not graded. |
The backlog floor. Two stories per member per sprint, across four sprints.
| Team size | Backlog floor |
|---|---|
| Four | 32 stories |
| Five | 40 stories |
| Six | 48 stories |
It is a floor, not a scope target. Below it the individual mark has nothing to attach to.
The token plan. It says five things.
- Where each kind of work happens — planned in the browser, built on the machine.
- Which model for which task, and why that one.
- The tactics the team will use to keep a run narrow.
- What you will watch, and what you have no way of seeing.
- What you do when the quota runs out, decided before it does.
It lives in the first section of docs/finops-ledger.md, committed like
everything else. Short and specific beats long and general. The first ledger entry
follows it: one row per story that used an assistant in Phase 2.
The delivery note. docs/delivery-notes/phase-2.md, written by the Phase Lead during the phase. Five headings, in this order:
- What was decided — the design in plain language: who the users are, the handful of things they can do, the tables that hold it. Five to eight lines. (From Phase 3 this heading reads “what works now that did not work before”; the file in your repository carries that wording. Write the Phase 2 version under it.)
- Who did what — one line per member: name, the stories they wrote, the ones they are assigned to build. Everybody appears.
- Where everything is — a link for each deliverable in the checklist above.
- The tag —
phase-2, created after the last merge. - Not finished, and where it went — what was planned and is not there: moved to Phase 3, dropped, or replaced. Say which.
A worked example is below. On delivery day you present from the note; the session format is below as well.
How Phase 2 is read.
- The ledger is binary: present, current and plausible against the git log, or zero.
- Every other row of the checklist is read at one of three levels — not there, there with gaps, meets — and “meets” is the done column above. Nothing above it earns extra. The full rubric is below.
- Whoever approves a pull request merges it. The reviewer can be anyone on the team and is never the author.
- Workflow slips — approving without reading, merging your own work, signing for a teammate — are warnings, recorded privately. Repeats cost later.
- The cutoff is the tag. Work that arrives after it is recorded, not marked, and still required.
Your own part is read from two things: your named stories and their criteria, written and assigned under your own account; and Quiz 3 on Mon 5 Oct.
Phase 3 — sprint 1: the first working increment
The most guided sprint.
- A working increment off the backlog.
- Reviewed merges — no one merges their own work unread; the reviewer who approved is the one who merges.
- The board matching the git log.
- A current ledger.
- The phase tag in the repository.
Phase 4 — sprint 2: the second working increment
As Phase 3. Nothing new is introduced.
Phase 5 — sprint 3: the third increment
As Phase 3, plus the analytics feature specified in week 9, run on the team's own data.
Phase 6 — final sprint and the demo
Two parts, two dates.
- The final sprint, due Wed 9 Dec 2026: the frozen scope shipped, analytics included, delivered exactly like phases 3 to 5.
- The demo, Mon 14 and Wed 16 Dec 2026: the system shown working, with oral questions to individuals. It is scored by the instructor and by peer assessment, and the detailed rubric is issued before the demo.
The repository tag and the FinOps ledger
Two rules. They start at different phases.
-
Every phase is tagged in the repository at its due date, and the tag is
what gets graded. All six,
phase-1throughphase-6, from Phase 1 onward. Not a submitted document, not a slide deck — the repository at that tag. See the repository page for the tag names and the rest of the repository rules. - The FinOps ledger is part of every delivery from Phase 2 onward. It is graded binary: present, current, and plausible against the git log, or zero. There is no accuracy target and no arithmetic to do.
How a delivery session works
A delivery session is not a queue of private meetings. All teams are in the room. Each team presents, and the rest of the class is the audience and the question pool. Teams arrive with their own questions prepared — questions for the teams presenting, about what they decided and the choices behind it, never about marks. Arriving without them is itself a failure of the session. Every delivery is presented from the team's public repository at the phase tag, not from a slide deck and not from a laptop folder.
Phase 2, Wed 7 Oct 2026. 75 minutes: 15 for the merge-conflict clinic, then five teams, twelve minutes each: eight presenting, four of questions from the room. Order is team 1 to team 5 unless drawn at the start. The instructor keeps time; a team that runs over loses its question time, not the next team's. The delivery note is the script:
| Minute | On the screen | Who speaks |
|---|---|---|
| 0–1 | docs/delivery-notes/phase-2.md, heading 1: what was decided | Phase Lead |
| 1–3 | docs/personas.md, then the Issues tab: three stories with their criteria, including one pair that share data | Client Lead |
| 3–5 | docs/schema.md on screen, db/schema.sql open beside it; one policy explained in words | Data Lead |
| 5–6 | Heading 2 of the note: who wrote what, who builds what in Phase 3 | Phase Lead |
| 6–7 | docs/finops-ledger.md: the plan's five lines, one row of the Phase 2 entry | FinOps Lead (or Quality and FinOps Lead; at four, the Phase Lead) |
| 7–8 | Heading 5: not finished and where it went; the tag page | Phase Lead |
| 8–12 | Questions from the room | The member whose area the question is about; the Phase Lead chooses nobody twice in a row |
Every member speaks at least once; a team of four spreads the rows. Each team asks at least one question during the session; the instructor asks last. What is recorded for each team: presented from the note or not; every member spoke or not; asked a question or not. The same format, with “what works now” in place of “what was decided” and the running system on the screen, is used at every later delivery.
The Phase 2 delivery note — a worked example
Fictional team and system. Every line is a place or a name.
Basket Register — Phase 2 delivery note (a team of five)
1. What was decided. Volunteers at the Jahra branch register families,
record a monthly basket collection, and are stopped from recording a second collection
for the same family in the same month. Two personas: the counter volunteer and the
branch coordinator. Four tables: families, collections,
volunteers, areas. RLS: volunteers read and insert; only the
coordinator updates or deletes. The coordinator's monthly count is read-only in Phase 3.
2. Who did what.
| Name | Wrote | Assigned to build (Phase 3) |
|---|---|---|
| Dana (Client Lead, Phase 2 Lead) | #12 #13 #14 #19 #20 #21 #22 #23 | #12 #13 |
| Lulwa (Design Lead) | #15 #16 #17 #18 | #15 #16 |
| Shaikha (Data Lead) | #24 #25 #26 #27 #28 | #24 #25 |
| Noura (Build Lead) | #29 #30 #31 #32 #33 | #29 #30 |
| Ghalia (Quality and FinOps Lead) | #34 #35 #36 #37 #38 #39 #40 #41 | #34 #35 |
3. Where everything is. Personas — docs/personas.md.
Stories — the Issues tab, label story, 30 open; copy at the tag in
docs/backlog.md. Schema — db/schema.sql (four tables,
keys, RLS policies; runs on an empty project) and docs/schema.md (what each
table means, how they relate, who may read and write). Prototype —
prototype/ (six screens, index in prototype/README.md). Token
plan and first entry — docs/finops-ledger.md, “The plan”
and “Phase 2”.
4. The tag. phase-2, created by Dana after pull request #44 merged.
5. Not finished, and where it went. The floor for five is 40; we have 30 stories with criteria. Ten more are opened as #42–#51 without criteria and are the Client Lead's first job in Phase 3. The “export to spreadsheet” story (#38) was moved to Phase 5 because it depends on the monthly count. The proposal's SMS reminder is dropped — the branch has no sender; recorded in proposal §6.
Rubrics
One rubric for every team. Each row is read at one of three levels from the repository at the tag: not there, there with gaps, meets. “Meets” is written so that you can check it yourself before the tag. The ledger row is binary. Workflow slips are warnings, recorded privately, not deductions in this phase. Marks are private: a team channel gets the team's levels and its warnings count; your own rows reach you directly.
Phase 2 — the design sprint
| Row | Not there | There, with gaps | Meets |
|---|---|---|---|
| Personas | Template or example persona still present; or personas are demographics, not roles | Two to four personas, but one is not a role the client named, or a paragraph does not say what is hard today | Two to four named roles from the client, one paragraph each: who, what they are trying to do, what makes it hard; example deleted |
| Backlog and acceptance criteria | Fewer than half the floor; or stories without criteria; or stories outside proposal §6 | At or near the floor, but some criteria are uncheckable (“works well”) or some stories are two things | At or above the floor; every story one thing a user can do; every criterion checkable by a teammate doing it; no story outside proposal §6 unless §6 was changed in a reviewed pull request |
| Schema — the SQL | Missing; or a picture only; or a table with RLS off or no policy | Runs, keys marked, RLS on every table, but a policy is missing or every policy is “allow all” | Runs in the Supabase SQL editor on an empty project; every table has its primary key and foreign keys marked; RLS enabled on every table; a policy on every table naming who reads and who writes; no real data |
| Schema — the document | Missing; or a paste of the SQL or of column lists | Every table present, but a meaning line only restates the table name, or a policy has no “why”, or it disagrees with the SQL at the tag | One line per table saying what a row means in the client's words; one line per relationship; one line per policy saying who may read and write and why; agrees with the SQL at the tag; no column lists; half a page |
| The split and the boundaries | Stories unassigned or a builder left blank; or one member holds all; or no criterion names what passes between two members | Every member assigned, but one member has fewer than two or one has more than half; or boundary criteria do not use the schema's column names | Every member is assignee on at least two stories and nobody on more than half; for every pair of stories that share data, a criterion names the columns that pass and what happens when one is missing |
| Delivery note, backlog copy, tag, presentation | Note is the template; or no tag; or tag not lowercase; or backlog copy not saved | Note filled, but a link is dead, a member is missing from “who did what”, or the backlog copy differs from the issues at the tag | Five headings filled; every link resolves; everybody appears; docs/backlog.md matches the issues at the tag; phase-2 on main after the last merge; presented from the note in the format above, with questions taken |
| Token plan and first ledger entry — binary | Plan missing or an example row left; the Phase 2 section empty; rows naming stories that do not exist or dates after the tag; generated text | — | The plan's five lines answered specifically; at least one Phase 2 row per member who used an assistant; story numbers and dates agree with the git log; written by the team |
| Row | Not there | There, with gaps | Meets |
|---|---|---|---|
| Your stories and their criteria | No story written by you; or assigned to you but written by someone else with no edit of yours | Stories of yours exist, but the criteria are uncheckable or you are assigned fewer than two | At least two stories you opened or materially edited, assigned to you, with checkable criteria, under your own account |
| Quiz 3 (Mon 5 Oct) | Absent | — | Present and answered |
Phases 3, 4, 5 and the Phase 6 sprint — every coding sprint
The same rubric after every coding sprint: Wed 21 Oct, Wed 4 Nov, Wed 18 Nov and Wed 9 Dec 2026.
| Row | Not there | There, with gaps | Meets |
|---|---|---|---|
| A working increment at the public address | Nothing new runs at the address; or runs only on a laptop | Some accepted stories run; one fails its own criteria when a stranger tries it; or bad input crashes it | Every story marked done this sprint can be done by a stranger at the public address, and bad input gets a message, not a crash. Phase 5: includes the analytics feature on the team's own data |
| Reviewed merges | Own-merges; or approvals with no text on most pull requests; or one member did all the reviews | Reviews exist, but a sampled review says only “looks good”; or two members have no review activity; or merges by someone other than the approver | On a sample of pull requests, the review says what was run, read and clicked; the approving reviewer merged; every member has reviewed; nobody merged their own; every pull request carries the AI-Assisted line |
| The board is true | Board stale by more than a column on most stories; or note is the template; or no tag | Board matches except for a few cards; note filled but a link is dead or a member missing | Every card in the column that matches its pull request state at the tag; docs/backlog.md saved; the note's five headings filled, everybody appears; docs/schema.md and db/schema.sql still agree; tag lowercase on main after the last merge |
| The Client Lead accepted | No criteria ticked in any issue; builders closed their own stories | Criteria ticked, but nothing was ever sent back; or bug issues open with no disposition | Criteria ticked by the Client Lead in the issue before merge; at least one story sent back with the failing criterion named; every bug issue has a disposition (fixed, deferred, not a defect) |
| The ledger — binary | Section for this sprint empty; rows cite stories not in this sprint; dates after the tag; example rows present; generated text | — | A row per story that used an assistant; story numbers and dates agree with the git log; from Phase 4, the plan revisited and “did it hold” answered |
| Row | Not there | There, with gaps | Meets |
|---|---|---|---|
| Your delivered work | No story merged under your account this sprint | One story merged; or two merged but one not accepted by the Client Lead; or commits under a grey icon | At least two stories of yours merged this sprint, accepted, commits under your own account, each pull request with the AI-Assisted line; you can show them running |
| Comprehension | Absent from the in-class check, or unable to explain your own merged change when asked | A partial answer | Answers a short question in class on your own work, or explains your own merged change when asked |
Templates a delivery uses
- The project proposal — the required shape.
- Your repository — the rules and the layout.
- Publishing from your repository.
- Team roles.
- The team roster workbook (.xlsx).