Each member of a team holds one standing role for the whole semester and owns exactly one artifact. On top of that, one member leads each phase. This page says what each role owns, what it produces, how it uses the two AI tools, and what it is expected to catch in other people's work.

Owning an area does not mean doing all the work in it. It means being the person the instructor asks when it is wrong, and the person whose artifact is opened first.

Teams choose their own roles at the setup session and record them on the roster workbook. See Setup for how that session runs, and Deliverables for what is due and when.

The standing roles, the artifact each one owns, and where that artifact lives.
Role Artifact Where it lives
Client Lead The backlog: user stories with acceptance criteria Issues on the team repository board
Design Lead The HTML prototype and the screen list prototype/
Data Lead The schema and seed data Supabase, plus db/schema.sql and docs/schema.md in the repository, changed only in a reviewed pull request
Build Lead The deployed system, plus release notes each sprint The public address, and the repository
FinOps Lead The Sprint FinOps Ledger docs/finops-ledger.md
Quality Lead Bug issues with steps to reproduce, tracked to a disposition Issues on the team repository board
Phase Lead (rotates) The phase delivery note docs/delivery-notes/phase-1.md … phase-6.md

Two tools, two jobs. Gemini Enterprise runs in the browser, works by copy and paste, and cannot touch your files — use it for planning, wording and prototypes. Antigravity runs on your machine, reads and writes files, and drives the repository and the database without asking first inside your project folder, prompting you when an action crosses outside it — use it for building, and read what it did.

Client Lead

What you own

The client relationship and what the system must do.

Your artifact, and where it lives

The backlog: user stories, each with acceptance criteria, kept as issues on the team repository board. The requirements section of docs/proposal.md is where the first version of it is written — see the proposal template.

Your rhythm through a sprint

Done means four things, all of them.

  1. Built, so it runs.
  2. Reviewed by a teammate who says what they checked.
  3. Accepted by you.
  4. Visible working, not on somebody's laptop.

Miss any one and the story is not done. There is no partial done.

Using AI for this role

This is planning and wording, so it is Gemini Enterprise work. Paste in your raw notes from the client meeting, the stories already in the backlog, and the wording of criteria the team accepted last sprint, so the new ones come out in the same shape.

Ask for stories drawn from what the client actually said, and for each criterion to name a screen, an action and a result someone else can observe. Before you trust a criterion, read it as if you were the person who has to check it at the delivery and did not write it. If you cannot say what you would open and what you would look at, it is not a criterion yet.

Here are my notes from the client meeting, unedited.
Turn each request into a user story with acceptance criteria.
Every criterion must name a screen, an action, and a result I can
observe without reading the code. If a request is too vague to write
a checkable criterion, list it as an open question instead of
guessing what the client meant.

Three things the agent reliably gets wrong here

  1. Criteria nobody can check. "The system is easy to use." "The page loads quickly." "Data is handled securely." These read like requirements and settle nothing at the delivery. Rewrite until the criterion names what you open and what you see.
  2. Requirements the client never asked for. Asked to write a backlog, the model fills the gaps with features that sound reasonable for that kind of system. Anything you cannot trace back to something the client said is an open question, not a story.
  3. Criteria that restate the story. Story: a manager can export the roster. Criterion: the manager can export the roster. That is the same sentence twice and it tells you nothing about how you would know.

What you check on teammates' pull requests

That the merge names the story it belongs to, and that it does what that story says — not a nearby thing that was easier. Watch for work that quietly grows past its story, and for a pull request that closes a story whose criteria are not all met.

What you are not responsible for

How it looks or how the screens flow — that is the Design Lead. Or whether it is deployed — that is the Build Lead. You decide whether it is the right thing, not whether it is the right build.

Design Lead

What you own

What it looks like and how it flows.

Your artifact, and where it lives

The HTML prototype and the screen list, in prototype/. It is built in Gemini Enterprise, committed to the repository, and opened in a browser. A prototype nobody can open is a description of a prototype.

Your rhythm through a sprint

Where your work meets someone else's

Where your screens meet someone else's data, the shape of what passes between you is already written in two places, and there is no third document to produce. The schema says what the data is — the table, its columns, which of them may not be empty. The acceptance criteria on the story say what your half is handed and what it does when something is missing. Agree both with the Data Lead before either of you starts, and change the schema only in a pull request you have both read.

Using AI for this role

Gemini Enterprise builds prototypes well and cannot touch your files, so you paste the result in yourself and see exactly what you committed. Paste in an existing page as the pattern to copy, the story and its acceptance criteria, and the list of fields that actually exist. Ask for one more page in the same markup and the same class names.

Before you trust a screen, check every field on it against the schema with the Data Lead. A field the prototype shows and nothing stores is a promise the team has to keep later.

Below is an existing page from our prototype. Follow it exactly:
same markup, same class names, same spacing. Here is the next story
and its acceptance criteria, and here is the full list of fields
that exist. Produce one page. Use only fields from that list — if
the screen needs something that is not on it, stop and name it
rather than adding it. Include the empty state and the error state.

Three things the agent reliably gets wrong here

  1. A prototype that assumes data which does not exist. It adds an average rating, a "last active" time, a member count — fields nothing in your system records. The screen looks finished and is unbuildable.
  2. It restyles whatever it touches. New class names, a second button style, its own spacing. Each page is fine on its own and the set stops looking like one system.
  3. Only the state where everything went right. A full list, a valid form, a short name. No empty state, no error, no long value that breaks the layout, no view for someone who is not allowed to see it.

What you check on teammates' pull requests

Whether this merge invents a second way to do something the prototype already solved, and whether the screens still match each other after it lands. You are also the one likely to catch a field shown on a screen that nothing stores, and a stored field no screen ever shows.

What you are not responsible for

Whether the data behind a screen is stored correctly or protected — that is the Data Lead. Or whether the system is deployed — that is the Build Lead.

Data Lead

What you own

The data and its structure: what the app records, and who may see what.

Your artifact, and where it lives

The schema and seed data in Supabase, and two files in the repository that must always agree: db/schema.sql (the tables, keys, row level security and policies, runnable on an empty project) and docs/schema.md (what a row in each table means, how the tables relate, who may read and write and why — no column lists). Every change to a table arrives as a reviewed pull request that edits both, so the team can see what changed and when. A change made by clicking in the Supabase console and never committed did not happen as far as the rest of the team is concerned.

Seed data goes in the repository, and the repository is public. So seed data is invented — never a real extract from the client. Check teammates' pull requests for real records and for keys before you approve them. The full rule is on the repository page.

Your rhythm through a sprint

Using AI for this role

This is file and schema work, so it is Antigravity. It reads db/schema.sql and proposes changes to it, and it will act on the database without asking inside your project folder, prompting you only when an action crosses outside it. Tell it to read the current schema before proposing anything, read the SQL it produces before you run it, and update docs/schema.md yourself.

Verify three things every time: that every column it names exists and is spelled the way your schema spells it, that the constraints you meant are present, and that the new tables have policies saying who may read and who may write.

Read the current schema before proposing anything.
Write the change to db/schema.sql for the story below. For every new table
include the not-null and foreign-key constraints, a uniqueness
constraint where duplicates would be wrong, and row-level security
policies. In a comment, list which role may read and which may
write each table. Do not use a column name that is not already in
the schema — if you need a new one, add it in db/schema.sql and tell
me, so docs/schema.md is updated in the same pull request.

Three things the agent reliably gets wrong here

  1. Invented column names. It writes code against user_id when your table says member_id. Sometimes that fails loudly. Sometimes a join just returns nothing and the screen shows an empty list that looks like a screen with no data yet.
  2. Missing constraints. Columns nullable that must never be null, no foreign key, nothing stopping two rows for the same person. It works on the day you test it and the data is wrong three sprints later.
  3. Forgotten row-level security. The agent writes a working table and does not mention that anyone can read it. It is not wrong — it answered the question that was asked. Checking it is your job. "It worked when we tested it" is exactly what an unprotected table looks like.

What you check on teammates' pull requests

Any query that touches a table you changed, any new table that arrives without a policy, and seed data committed with something in it that should not be in a repository. You are the one likely to catch that a feature reads a table it should not be able to see at all.

What you are not responsible for

What a screen shows or how it flows — that is the Design Lead. Or whether a story counts as done — that is the Client Lead.

Build Lead

What you own

That it actually runs.

Your artifact, and where it lives

The deployed system at its public address, plus release notes committed to the repository, one short entry per sprint: what went out, and anything known to be broken. How to publish and where the address comes from is in the publishing guide.

Your rhythm through a sprint

Using AI for this role

Antigravity, because this is files, configuration and commands. Paste in the full build log when something fails — unedited, including the lines you think are noise. Ask which line first shows the failure, and ask for one change at a time with a way to tell whether it worked.

Verify by running it. The only evidence that the system runs is the system running at its public address, opened by you. Also read every configuration file the agent edited, line by line: this is where keys and addresses get written into places that are committed.

The deploy failed. Here is the complete build log, unedited.
Tell me which line first shows the failure and what caused it.
Do not change any file yet. Propose one change, and tell me exactly
what I should see if it worked.

Three things the agent reliably gets wrong here

  1. Claiming something works without having run it. "The build now passes." "Deployed successfully." Written from what the change was supposed to do, not from output. Treat every such sentence as a claim until you have opened the address yourself.
  2. Environment and secrets. It writes a key straight into a file that gets committed, or invents the name of an environment variable nothing sets — so it runs on the machine where it was written and fails everywhere else.
  3. Fixing the symptom, in the wrong place. It silences the error, deletes the failing check, or pins a version at random. The build goes green and the defect is still there, now harder to find.

What you check on teammates' pull requests

Anything that changes how the system starts, builds or deploys. A credential or key that should never be committed. A new dependency added to solve one small thing. You are the one likely to catch that a merge runs on the author's machine and nowhere else.

What you are not responsible for

Whether a feature is the right feature or meets its criteria — that is the Client Lead. Or finding the defects in it — that is the Quality Lead.

FinOps Lead

What you own

What the AI work costs, and what the team changed as a result.

Your artifact, and where it lives

The Sprint FinOps Ledger, at docs/finops-ledger.md, one section per sprint. It lives in the repository and is committed. It is never kept in a spreadsheet somewhere else and copied in later.

The columns of the Sprint FinOps Ledger. One section per sprint, one row per story.
Column What goes in it
Story number The story this work belongs to
Model chosen Which model was actually used
Why that model The reason at the time, not a reason invented afterwards
Observed cost signal What you could actually see — usage shown, time taken, how many attempts it took
Context tactics used What was pasted in, what was deliberately left out, what was summarised first
What we would do differently One concrete change for next sprint

How the ledger is graded: present, current, and plausible against the git log, or nothing. There is no accuracy target and no variance arithmetic to do. A ledger written the night before, describing work the commit history does not show, fails on all three.

Your rhythm through a sprint

Using AI for this role

There is nothing to generate here. This role observes. Every other role asks a model to produce something; you read what actually happened and write it down. The ledger's value is that it is a record, and a record that was generated is not one.

What you may use a tool for: asking Antigravity to list the commits in a sprint so you can see which stories the work landed under, or asking Gemini Enterprise to tighten the wording of a row you wrote. What you may not do is ask either tool what a story cost, which model was used, or what the team should say it would do differently.

The one thing the agent gets wrong here, and it is fatal

Asked for a ledger entry, a model will write you a complete, confident, well-formatted one. It has no access to what your team spent, which model anyone chose, or why. Every number in it will be invented and most of them will look reasonable. A ledger that does not match the git log is worth nothing, and this is the fastest way to produce one.

Read what happened. Write that.

What you check on teammates' pull requests

That AI use is declared, and that the declaration matches the change. You are also the one likely to notice the expensive habits: the whole codebase pasted in to answer a one-file question, the same failed attempt repeated six times with no change of approach, the largest model reached for by reflex.

What you are not responsible for

Making the technical choice — that belongs to whoever is building, and to the Build Lead. You record the choice, the reason, and what it cost.

Quality Lead

What you own

Finding defects in the running application.

Your artifact, and where it lives

Bug issues in the team repository — issues on the board, not files in a folder. Each one carries steps to reproduce and is tracked to a disposition: fixed, deferred, or not a defect. All three are acceptable endings. None of them is leaving it open. A list of open bugs nobody closed is not quality work.

Your rhythm through a sprint

Using AI for this role

Antigravity writes tests against real files. Gemini Enterprise turns a rough note into a report someone else can follow. Paste in the acceptance criterion in the client's words, then the code — in that order, and say the tests come from the criterion.

Before you trust a test, ask what would have to break for it to fail. If nothing would, it is not a test. Before you trust a bug report, follow your own steps on a fresh start and see the defect again.

Here is the acceptance criterion, in the client's words.
Here is the function that is supposed to satisfy it.
Write the tests from the criterion, not from the code. Include the
empty case, the duplicate case, and the case where the user is not
allowed. If the code does something the criterion does not require,
do not assert it — list it separately as a question for me.

Three things the agent reliably gets wrong here

  1. Tests that assert what the code does, not what it should do. Given the implementation, the model reads the current output and writes it in as the expected value. The bug becomes the specification and the test passes forever.
  2. The happy path only. Valid input, one record, the right permissions. No empty list, no duplicate, no missing field, no user who should be refused — which is where the defects live.
  3. Tests that pass without testing anything. The thing under test is replaced by a stand-in and the stand-in is what gets checked; or the test has no assertion in it at all. Green, and meaningless.

What you check on teammates' pull requests

Whether this merge breaks something that already worked, and whether a pull request that closes a bug issue says how you would see it fixed. You are the one likely to catch tests added alongside a feature that assert nothing, and a fix that was never reproduced in the first place.

What you are not responsible for

Fixing what you find. Whoever owns the story fixes it, and the Client Lead decides whether it is worth fixing now or goes back to the backlog.

How the roles fit a team of four, five or six

How the standing roles are held at each team size.
Team size Standing roles held
Four Client Lead · Design Lead · Data Lead · Build Lead
Five The four, plus a combined Quality and FinOps Lead
Six The four, plus a FinOps Lead and a Quality Lead

In a team of four there is no dedicated FinOps or Quality Lead. Whoever is Phase Lead that phase also keeps that phase's ledger entry and files that phase's bug tickets. Both duties rotate with the lead, so neither artifact goes missing and neither lands on one person for the whole semester.

Phase Lead — the rotating role

What you own

The phase. You run it: keep the board current, make sure the delivery lands on time, and act as the instructor's point of contact for that phase. You hold this on top of your standing role, which does not pause while you lead.

Your artifact, and where it lives

The phase delivery note, at docs/delivery-notes/phase-1.md through phase-6.md, one file per phase. It says what was delivered, who did what, and links to the stories. Written by the lead of that phase, committed in that phase — not reconstructed later by somebody else.

You also cut that phase's tag. At the due date the repository is tagged phase-1 through phase-6, and the tag is what is graded — so work pushed after you cut it is not in it. The repository page has the wording.

The rotation

There are six phases. A team of six has everyone lead once. A team of five means one member leads twice. A team of four means two members do. Decide the whole rotation at the setup session, not one phase at a time — the roster workbook asks for all six.

Teams choose their own roles and their own rotation and record both on the team roster workbook (.xlsx). The Phase 1 Lead emails the completed workbook to the instructor at mo.almarzouq@ku.edu.kw. The instructor then creates the team's repository and invites every member to it. Nothing else starts until that happens, so it is the Phase 1 Lead's first job.

Using AI for this role

The delivery note is a record of what happened, like the ledger, so the same rule holds: read the repository, then write. Antigravity can list the commits and the closed stories in the phase, which is a faster way to see what landed than asking teammates to remember. What it cannot tell you is who did what and whether the delivery was actually on time. Do not ask a model to write the note; ask it to show you the phase.

What you are not responsible for

Doing the phase's work. You are not the manager of your teammates and you do not own their artifacts. You own that the phase is delivered and that the note says truthfully what happened in it.

What holds for everyone

Whatever role you hold, these apply. They are the reason a role is a lens and not a job description.