CMPUT-499 · Lesson 3 of 12 · 28 min

The project proposal: scope, risks and the client agreement

The proposal turns three weeks of discovery into a plan the client, the supervisor and the team all agree to. It is the most important document of the term because it fixes scope, and scope is what a student team controls least well. A good capstone proposal is short, usually eight to twelve pages, and answers six questions: what problem are we solving and for whom; what will we build, and what will we not build; how will we know it worked; how will we build it and when; what could go wrong; and who owns what at the end. It is written for a reader who is busy and not technical, which describes most clients and many supervisors.

CMPUT-401 covered MVPs, prioritization, roadmaps and client contracts in a product setting. Here the constraints are sharper. You have a fixed end date, about ten weeks of development, no budget, and a client who will be left with whatever you build. The proposal is where you protect both sides from over-promising. Clients rarely object to a small, well-defined scope if they understand why; they object strongly when a large promised scope quietly shrinks in week 11.

From problem to minimum viable product

The minimum viable product, or MVP, is the smallest version of the product that solves the core problem well enough for real users to use and for the team to learn from. It is not a prototype, which may be thrown away, and not a demo, which only has to look good. For Team Relay, the problem statement was about filling, swapping and confirming shifts and reducing coordinator effort. Features that serve that statement directly are candidates for the MVP; features that serve other themes from discovery, such as funder reports or allergen notes, are candidates for later.

To choose among candidates, the team scored each feature with RICE, a prioritization method covered in CMPUT-401: reach (how many people it affects in a period), impact (how much it helps each one), confidence (how sure the team is about the estimates) and effort (person-weeks to build). The score is reach times impact times confidence, divided by effort. The numbers are rough, and the method's value is that it forces the team to state its assumptions and argue about them, not that the score is precise. Team Relay then filled its development capacity in score order to see what the numbers suggested.

RICE scores for candidate features, filled in score order into the team's 12 person-weeks of feature capacity
# Scoping the MVP with RICE: reach x impact x confidence / effort.
# Reach = people affected per month; impact on a 0.25-3 scale; confidence 0-1;
# effort in person-weeks of the team's time.
features = [
    # (feature, reach, impact, confidence, effort)
    ("Driver sign-up for open shifts",        140, 2.0, 0.9, 3.0),
    ("Shift confirmation and reminders",      140, 3.0, 0.8, 2.5),
    ("Driver-to-driver shift swap",            90, 2.0, 0.7, 2.5),
    ("Coordinator dashboard of unfilled shifts", 2, 3.0, 0.9, 2.0),
    ("Text message to store: who is coming",   35, 1.0, 0.6, 1.5),
    ("Monthly report for funders",              2, 2.0, 0.8, 1.5),
    ("Route optimization across pickups",      140, 1.0, 0.3, 6.0),
    ("Allergen and contents notes",            25, 1.0, 0.5, 1.0),
    ("Native mobile apps (iOS and Android)",   140, 0.5, 0.5, 8.0),
]
scored = sorted(((r * i * c / e, f, e) for f, r, i, c, e in features), reverse=True)
capacity = 12.0   # person-weeks the team can spend on features after setup, testing and docs
used = 0.0
print(f"{'RICE':>7}  {'effort':>6}  feature")
for score, f, e in scored:
    fits = used + e <= capacity
    if fits:
        used += e
    print(f"{score:7.1f}  {e:6.1f}  {f}{'   <- fits by score' if fits else ''}")
print(f"effort chosen by score alone: {used} of {capacity} person-weeks")
Output
   RICE  effort  feature
  134.4     2.5  Shift confirmation and reminders   <- fits by score
   84.0     3.0  Driver sign-up for open shifts   <- fits by score
   50.4     2.5  Driver-to-driver shift swap   <- fits by score
   14.0     1.5  Text message to store: who is coming   <- fits by score
   12.5     1.0  Allergen and contents notes   <- fits by score
    7.0     6.0  Route optimization across pickups
    4.4     8.0  Native mobile apps (iOS and Android)
    2.7     2.0  Coordinator dashboard of unfilled shifts
    2.1     1.5  Monthly report for funders   <- fits by score
effort chosen by score alone: 12.0 of 12.0 person-weeks

The capacity figure deserves attention. Five students taking four other courses can typically give the capstone ten to twelve hours a week each, which is about 0.25 to 0.3 of a full-time week. Over ten weeks of development, that is roughly 13 to 15 person-weeks in total. A large share goes to work that is not features: setting up the repository, pipeline and environments, testing, documentation, client meetings, demos and the report. Team Relay estimated that only 12 person-weeks would be left for features, and planned the MVP against that, not against the optimistic total.

Three concentric rings. The innermost ring, labelled MVP, contains driver sign-up for shifts, confirmation and reminders, the coordinator dashboard of unfilled shifts and the funders report. The middle ring, labelled stretch goals if time allows, contains shift swaps and texts to stores. The outer ring, labelled not this term, contains route optimization, allergen notes and native mobile apps.
Team Relay's scope: the MVP, stretch goals if time allows, and what is explicitly out of scope this term

The output needs judgment, not obedience. Filling capacity strictly in score order puts shift swaps, texts to stores and allergen notes into the MVP and leaves out the coordinator dashboard, because RICE counts reach in people and only two people at the co-op coordinate. That is a known weakness of the method: it undervalues features used by a few people whose work the whole system depends on. The problem statement was explicitly about coordinator workload, so the team overrode the ranking. The final MVP was sign-up, confirmation and reminders, the coordinator dashboard and the funders' report; shift swaps and texts to stores became stretch goals, and allergen notes went to the later list. The team recorded the override and its reason in the proposal, which is exactly how a scoring method should be used.

Other results surprised the team too. Native mobile apps had looked essential, but their effort was large and their impact over a mobile-friendly web application was small, since drivers already used phone browsers. Route optimization had huge reach but low confidence, because nobody knew whether drivers wanted routes chosen for them. Writing down what is out of scope is as important as listing what is in: it gives the team a polite, pre-agreed answer when new ideas arrive mid-term.

Timeline and milestones

The proposal includes a timeline at the level of sprints, not days. For each sprint, name the goal and the features expected, and mark the fixed milestones: the design review in week 5, each sprint demo, the code freeze before the final week, and the final demonstration. Team Relay planned four sprints: sprint 1 for sign-up and the data model, sprint 2 for confirmation and reminders, sprint 3 for the coordinator dashboard and report, and sprint 4 for hardening, the pilot and stretch goals if time allowed. They put the riskiest work, reminders through an external messaging provider, in sprint 2 rather than at the end, so that a failure would leave time to switch to email.

Leave slack. A plan that uses every hour of every week will slip, because something always goes wrong: an illness, a library bug, a client who wants a change. Team Relay planned sprint 4 at half capacity on purpose. Their supervisor told them it was the best-calibrated plan she had seen that year, and in the event they used most of that slack on bugs found during the pilot. A capstone that finishes its MVP in sprint 3 and spends sprint 4 polishing and testing ends far better than one that finishes in a panic on the last day.

Risks

A risk register lists what could go wrong, how likely it is, how bad it would be and what you will do about it. Score each risk on likelihood and impact, typically on a scale of 1 to 5, and multiply for a priority. For the highest risks, write a mitigation: an action that makes the risk less likely or less damaging. Review the register at every sprint planning meeting, because risks change. Team Relay's top risk was not technical at all: it was that drivers would not adopt the tool. Their mitigation was to design mobile-first, involve drivers in prototype testing, and run a real pilot with Grace as the champion.

Team Relay's risk register ranked by likelihood times impact, with the top three mitigations
# Risk register: score = likelihood (1-5) x impact (1-5); review the top risks weekly.
risks = [
    ("Client contact unavailable for weeks", 2, 4, "Named backup contact; fortnightly fixed meeting"),
    ("Drivers do not adopt the tool",        3, 5, "Pilot with 30 drivers; mobile-first design; Grace champions it"),
    ("Hosting costs exceed co-op budget",    2, 4, "Estimate early; choose free or low-cost tier; document costs"),
    ("Team member leaves or falls ill",      2, 3, "Pairing, documented setup, no single owner of any module"),
    ("Scope creep from new client ideas",    4, 3, "Change process: new ideas go to backlog, trade against MVP"),
    ("Personal data of volunteers exposed",  2, 5, "Collect minimum data, access control, no PII in logs"),
    ("Integration with SMS provider slips",  3, 2, "Email reminders as fallback; SMS behind a feature flag"),
    ("Key library breaks on upgrade",        2, 2, "Pin versions; automated dependency checks"),
]
ranked = sorted(risks, key=lambda r: r[1] * r[2], reverse=True)
print(f"{'score':>5}  {'L':>1} {'I':>1}  risk")
for name, l, i, plan in ranked:
    band = "HIGH" if l * i >= 12 else "MED " if l * i >= 6 else "LOW "
    print(f"{l * i:5}  {l} {i}  {band} {name}")
print()
print("top three with mitigation:")
for name, l, i, plan in ranked[:3]:
    print(f"- {name}: {plan}")
Output
score  L I  risk
   15  3 5  HIGH Drivers do not adopt the tool
   12  4 3  HIGH Scope creep from new client ideas
   10  2 5  MED  Personal data of volunteers exposed
    8  2 4  MED  Client contact unavailable for weeks
    8  2 4  MED  Hosting costs exceed co-op budget
    6  2 3  MED  Team member leaves or falls ill
    6  3 2  MED  Integration with SMS provider slips
    4  2 2  LOW  Key library breaks on upgrade

top three with mitigation:
- Drivers do not adopt the tool: Pilot with 30 drivers; mobile-first design; Grace champions it
- Scope creep from new client ideas: Change process: new ideas go to backlog, trade against MVP
- Personal data of volunteers exposed: Collect minimum data, access control, no PII in logs

The statement of work and the client agreement

The proposal becomes a lightweight contract when the client signs it, or a separate statement of work that summarizes it. This is not a legal contract with payment terms, but it records what both sides have agreed. It should include the scope (in and out), the deliverables and when they arrive, the client's commitments (meeting time, response times, access to data and a test group of users), how changes to scope will be handled, what happens at the end of term, and who owns the code and the data. Have the supervisor review it before the client signs: they have seen many projects go wrong and know which clauses matter.

Changes to scope are inevitable and healthy, as long as they are visible. Team Relay's agreement said that new ideas go into the backlog, and that adding something to the current term's scope means removing something of similar effort. When Grace asked in week 7 for volunteers to be able to log hours for their own records, Priya added it to the backlog, estimated it, and asked Grace whether it was more important than the funders' report. Grace chose to keep the report. Nobody was upset, because the rule had been agreed in week 3.

Intellectual property, licensing and data

Two ownership questions must be settled in the proposal: who owns the code, and who owns the data. Universities have different policies on student intellectual property. At many institutions students own what they create in a course unless they sign an agreement saying otherwise, and some clients ask students to assign copyright to them. Never sign anything about IP without checking your institution's policy and talking to your supervisor. A common, simple arrangement for community projects is to release the code under an open-source licence, so the client can use, modify and hand it to future volunteers or contractors freely, and the students can show it in their portfolios.

Common open-source licence choices for a capstone (not legal advice; check with your institution)
LicenceMain conditionFits when
MITKeep the copyright and licence notice; no warrantyMaximum freedom for anyone to reuse, including commercially
Apache 2.0Like MIT, plus an explicit patent grant and notice of changesOrganizations that want clear patent terms
GPL 3.0Distributed modifications must be released under the same licenceYou want improvements to stay open
AGPL 3.0Like GPL, and also applies when the software is offered over a networkHosted web applications whose improvements should stay open
No licenceAll rights reserved by default: others may not legally reuse itRarely what a community client wants

Team Relay and the co-op chose the MIT licence after the director said she wanted any future volunteer or local company to be able to improve the system without asking permission. Data is different: the co-op owns all data about its volunteers, donors and pickups, and the team may use only synthetic or anonymized data outside the project. The agreement said that at the end of term the team would delete any copies of real data, hand over the production database and admin accounts, and keep only the code and documentation in their portfolios.

Privacy law applies to how the co-op and the team handle personal information about volunteers, such as names, phone numbers and availability. In Canada, the federal PIPEDA covers personal information collected in the course of commercial activities; many non-profits are not covered for their core non-commercial activities, but provincial laws (Alberta, British Columbia and Quebec have their own private-sector privacy acts) and good practice still apply. Manitoba has no general private-sector privacy statute, so for the co-op in Winnipeg the practical standard is to follow PIPEDA's fair information principles anyway: collect only what is needed, say why, protect it and let people see and correct their own information. Federal privacy reform was before Parliament again in 2026; check its status. Lesson 9 turns this into design decisions.

What a good proposal looks like

Supervisors see dozens of proposals and the good ones share features. They open with a one-paragraph summary a busy director can read in a minute. They state the problem with evidence from discovery and baseline numbers. They show scope as a clear in, stretch and out list rather than burying it in prose. They have a sprint-level timeline with slack, a risk register with mitigations, success metrics agreed with the client, and a section on what happens after the term. Weak proposals describe technology at length before the problem, promise everything the client mentioned, and say nothing about maintenance.

A typical capstone proposal outline
SectionLengthKey content
SummaryOne paragraphProblem, proposed solution, key metric, what the client gets at the end
Problem and evidence1 to 2 pagesProblem statement, discovery findings, baseline metrics
Scope1 pageMVP features, stretch goals, out of scope
Approach1 to 2 pagesUsers and main flows, technology outline (detail comes at the design review)
Plan1 pageSprint goals, milestones, team roles
RisksHalf a pageTop risks with likelihood, impact and mitigation
Success metricsHalf a pageMetrics, baselines, targets, pilot plan
Agreement1 pageClient commitments, change process, IP, licence, data handling, handover

Worked examples

Worked problem

Computing a RICE score

A feature reaches 90 people a month, has impact 2, confidence 0.7 and needs 2.5 person-weeks. What is its RICE score?

Show solution
  1. Multiply reach, impact and confidence: \(90 \times 2 \times 0.7 = 126\).
  2. Divide by effort: \(126 / 2.5 = 50.4\).

Answer: A RICE score of 50.4, which is the shift-swap feature in Team Relay's table.

Worked problem

Estimating capacity

Five students each give 10 hours a week for 10 weeks of development. A full-time week is 40 hours. How many person-weeks is that, and how many might be left for features if 20 per cent goes to setup and meetings and 15 per cent to testing and documentation?

Show solution
  1. Total hours: \(5 \times 10 \times 10 = 500\); in person-weeks, \(500 / 40 = 12.5\).
  2. Features get \(100 - 20 - 15 = 65\) per cent: \(0.65 \times 12.5 \approx 8.1\) person-weeks.

Answer: About 12.5 person-weeks in total and about 8 for features: much less than most teams assume.

Worked problem

Handling a new request

In week 8 the client asks for an SMS reminder to stores. It is about 1.5 person-weeks. The team is on schedule with no slack except sprint 4. What should the product lead do?

Show solution
  1. Add the request to the backlog and estimate it.
  2. Show the client the current MVP and stretch list with efforts.
  3. Ask the client to choose: replace an item of similar effort, use some of sprint 4's slack and accept more risk, or defer it.

Answer: Apply the agreed change process: trade it against existing scope rather than silently adding it.

Common mistakes

  • MistakePlan the MVP against the total hours the team has.

    InsteadSubtract setup, meetings, testing, docs and slack first; plan features against what is left.

  • MistakeLeave out-of-scope items unwritten to avoid upsetting the client.

    InsteadList them explicitly; it gives everyone an agreed answer when new ideas arrive.

  • MistakePut the riskiest integration at the end of the term.

    InsteadDo risky work early so there is time to recover or switch approach.

  • MistakePublish code with no licence to keep things simple.

    InsteadNo licence means no one else may legally reuse it; choose a licence with the client.

  • MistakeCopy real client data onto personal laptops for convenience.

    InsteadUse synthetic or anonymized data outside the client's systems and delete copies at the end.

Summary and key terms

  • The proposal fixes scope, metrics, plan, risks and ownership, written for busy non-technical readers.
  • The MVP is the smallest product that solves the core problem for real users.
  • RICE scoring makes assumptions explicit; fill realistic feature capacity in score order.
  • State what is out of scope and plan slack, especially in the last sprint.
  • A risk register ranks risks by likelihood times impact and records mitigations.
  • The agreement covers client commitments, a change process, IP, licence, data and handover.
  • Follow privacy principles for volunteer data even where no statute clearly applies.
Minimum viable product
The smallest version of a product that solves the core problem well enough for real use and learning.
RICE
A prioritization score: reach times impact times confidence, divided by effort.
Statement of work
A document recording agreed scope, deliverables, responsibilities and terms.
Scope creep
Uncontrolled growth in what a project is expected to deliver.
Risk register
A list of risks with likelihood, impact, priority and mitigation.
Open-source licence
Terms under which others may use, modify and share software.
Stretch goal
Work to do only if the core scope is finished with time to spare.
Person-week
The work one person does in a full-time week.

Practice problems

Work each problem on paper first, then reveal the answer to check.

  1. Score a feature with reach 35, impact 1, confidence 0.6 and effort 1.5 using RICE.

    Show answer

    \(35 \times 1 \times 0.6 / 1.5 = 14\).

  2. Name two things a client should commit to in the agreement.

    Show answer

    For example, a regular meeting time and response time, access to data, and a group of users for testing.

  3. Why might a community client prefer the MIT licence?

    Show answer

    Anyone, including future volunteers or local companies, can reuse and improve the code without asking permission.

  4. Write one mitigation for the risk "the client's contact goes on leave".

    Show answer

    Agree a named backup contact and a written list of decisions so work can continue.

  5. What should the team do with real volunteer data at the end of term?

    Show answer

    Hand over the production system, delete personal copies and keep only code and documentation.

Lesson quiz · 5 questions

Score 60% or more to complete this lesson.

Take the quiz