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

The six phases, what each delivers, its weight, the teaching week, and the date it is due.
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

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.

The Phase 2 checklist. The same table is on the week 4 slides.
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.

The backlog floor by team size.
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.

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:

  1. 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.)
  2. Who did what — one line per member: name, the stories they wrote, the ones they are assigned to build. Everybody appears.
  3. Where everything is — a link for each deliverable in the checklist above.
  4. The tag — phase-2, created after the last merge.
  5. 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.

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.

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 repository tag and the FinOps ledger

Two rules. They start at different phases.

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:

The twelve minutes, from the delivery note.
Minute On the screen Who speaks
0–1docs/delivery-notes/phase-2.md, heading 1: what was decidedPhase Lead
1–3docs/personas.md, then the Issues tab: three stories with their criteria, including one pair that share dataClient Lead
3–5docs/schema.md on screen, db/schema.sql open beside it; one policy explained in wordsData Lead
5–6Heading 2 of the note: who wrote what, who builds what in Phase 3Phase Lead
6–7docs/finops-ledger.md: the plan's five lines, one row of the Phase 2 entryFinOps Lead (or Quality and FinOps Lead; at four, the Phase Lead)
7–8Heading 5: not finished and where it went; the tag pagePhase Lead
8–12Questions from the roomThe 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.

NameWroteAssigned 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

Phase 2, the group part.
RowNot thereThere, with gapsMeets
PersonasTemplate or example persona still present; or personas are demographics, not rolesTwo to four personas, but one is not a role the client named, or a paragraph does not say what is hard todayTwo 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 criteriaFewer than half the floor; or stories without criteria; or stories outside proposal §6At or near the floor, but some criteria are uncheckable (“works well”) or some stories are two thingsAt 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 SQLMissing; or a picture only; or a table with RLS off or no policyRuns, 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 documentMissing; or a paste of the SQL or of column listsEvery 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 tagOne 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 boundariesStories unassigned or a builder left blank; or one member holds all; or no criterion names what passes between two membersEvery 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 namesEvery 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, presentationNote is the template; or no tag; or tag not lowercase; or backlog copy not savedNote filled, but a link is dead, a member is missing from “who did what”, or the backlog copy differs from the issues at the tagFive 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 — binaryPlan 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
Phase 2, your own part.
RowNot thereThere, with gapsMeets
Your stories and their criteriaNo story written by you; or assigned to you but written by someone else with no edit of yoursStories of yours exist, but the criteria are uncheckable or you are assigned fewer than twoAt 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.

A coding sprint, the group part.
RowNot thereThere, with gapsMeets
A working increment at the public addressNothing new runs at the address; or runs only on a laptopSome accepted stories run; one fails its own criteria when a stranger tries it; or bad input crashes itEvery 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 mergesOwn-merges; or approvals with no text on most pull requests; or one member did all the reviewsReviews exist, but a sampled review says only “looks good”; or two members have no review activity; or merges by someone other than the approverOn 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 trueBoard stale by more than a column on most stories; or note is the template; or no tagBoard matches except for a few cards; note filled but a link is dead or a member missingEvery 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 acceptedNo criteria ticked in any issue; builders closed their own storiesCriteria ticked, but nothing was ever sent back; or bug issues open with no dispositionCriteria 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 — binarySection 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
A coding sprint, your own part.
RowNot thereThere, with gapsMeets
Your delivered workNo story merged under your account this sprintOne story merged; or two merged but one not accepted by the Client Lead; or commits under a grey iconAt 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
ComprehensionAbsent from the in-class check, or unable to explain your own merged change when askedA partial answerAnswers a short question in class on your own work, or explains your own merged change when asked

Templates a delivery uses