CMPUT-401 · Lesson 12 of 12 · 34 min
Capstone: delivering a responsible product increment
This final lesson brings the course together in a capstone: Team Lumen delivers one product increment for Driftwood Ferries, from discovery to operation, and checks it against the responsibilities that a product team carries to users and society as well as to the client. The increment is capacity alerts with an optional paid commuter pass. Each stage reuses tools from earlier lessons, so the first half of the lesson is a guided walkthrough of the whole life cycle. The second half covers responsible product practice: dark patterns and consumer protection, accessibility, privacy by design, AI governance, and finally careers in product management. Laws are summarized as of October 2026; they change often, so verify before relying on them.
The capstone brief
Your capstone team acts as Team Lumen. The client is Driftwood Ferries, an invented family-owned operator of three small car ferries. The outcome the client has agreed to is to reduce missed sailings due to full decks by 30 per cent over the summer while keeping phone calls about delays falling. You have six two-week sprints, a capped per-sprint contract, and a client owner available for a weekly check-in. Your deliverable is a working, released increment plus a short portfolio that shows the decisions behind it.
The portfolio matters as much as the code. Product managers are judged on decisions under uncertainty, so the portfolio should show the evidence you had, the options you considered, what you chose and why, and what happened. Honest reporting of a hypothesis that failed, and how the team pivoted, is a strength, not a weakness.
Dark patterns and consumer protection
Dark patterns, also called deceptive design patterns, are interface designs that trick or pressure people into choices they would not otherwise make. Harry Brignull coined the term in 2010. Common types include obstruction (making cancellation much harder than sign-up), sneaking (adding items or consent the user did not choose, such as pre-checked boxes), drip pricing (revealing mandatory fees late in a purchase), confirmshaming (guilt-laden decline buttons), false urgency (fake countdown timers or low-stock claims) and nagging. They often raise short-term metrics, which is exactly why Goodhart's law (lesson 10) makes them tempting to teams chasing targets.
In Canada, the Competition Bureau enforces the Competition Act's deceptive marketing provisions. Since June 2022, the Act expressly treats drip pricing, advertising a price that is not attainable because mandatory fees are added later, as deceptive. In the Cineplex case, the Competition Tribunal found in September 2024 that Cineplex's online booking fee was drip pricing; the Federal Court of Appeal dismissed Cineplex's appeal in January 2026, upholding the finding and the substantial administrative monetary penalty the Tribunal imposed (reported at about $39 million; confirm the final amount in current Bureau publications). Quebec's Consumer Protection Act also restricts certain advertising and contract practices. Federal and provincial privacy regulators have, separately, criticized deceptive consent designs.
The safest approach is simple: make cancelling as easy as signing up, show the total price up front, never pre-check consent, avoid guilt-laden wording, and remind users before a free trial converts to paid. The code audits an early draft of Driftwood's commuter-pass flow, written by a teammate in a hurry, against these rules.
# Audit a subscription flow for common dark patterns (invented flow description).
flow = {
"signup_steps": 2,
"cancel_steps": 6,
"cancel_online": False, # must phone the office to cancel
"prechecked_marketing": True,
"total_price_shown_first": False, # booking fee added at the last step
"confirmshaming_text": "No thanks, I like missing my ferry",
"trial_reminder_before_charge": False,
}
findings = []
if flow["cancel_steps"] > flow["signup_steps"] or not flow["cancel_online"]:
findings.append("obstruction: cancellation is harder than sign-up")
if flow["prechecked_marketing"]:
findings.append("sneaking consent: marketing box is pre-checked")
if not flow["total_price_shown_first"]:
findings.append("drip pricing: mandatory fee revealed late")
if flow["confirmshaming_text"]:
findings.append("confirmshaming: guilt-laden decline wording")
if not flow["trial_reminder_before_charge"]:
findings.append("no reminder before a free trial converts to paid")
for f in findings:
print("-", f)
print(f"{len(findings)} issues to fix before launch")- obstruction: cancellation is harder than sign-up - sneaking consent: marketing box is pre-checked - drip pricing: mandatory fee revealed late - confirmshaming: guilt-laden decline wording - no reminder before a free trial converts to paid 5 issues to fix before launch
Accessibility
Accessible products can be used by people with disabilities, including people who are blind or have low vision, are Deaf or hard of hearing, have motor impairments, or have cognitive disabilities. The Web Content Accessibility Guidelines (WCAG), published by the W3C, are the international reference; version 2.2 (October 2023) is current, organized under four principles: perceivable, operable, understandable and robust. Level AA is the common legal and contractual target. Accessibility is also good product practice: captions help people in noisy terminals, high contrast helps everyone on a sunny car deck, and clear language helps tourists reading in a second language.
In Canada, the Accessible Canada Act applies to federally regulated organizations, which include interprovincial transportation and federal ferry services, and the Canadian Transportation Agency sets accessibility regulations for federal transportation providers. Provinces have their own laws; Ontario's Accessibility for Ontarians with Disabilities Act (AODA) requires many organizations' websites to meet WCAG 2.0 AA, and Manitoba, Nova Scotia and British Columbia have accessibility legislation of their own. Human rights law across Canada also prohibits discrimination in services. Whether a given ferry operator is federally or provincially regulated depends on its routes, so Driftwood should get advice, but meeting WCAG 2.2 AA is a sensible target either way.
Automated tools catch only a share of accessibility problems; manual testing with keyboards and screen readers, and testing with disabled users, catches the rest. One check is easy to automate: colour contrast. WCAG 2.2 AA requires a contrast ratio of at least 4.5 to 1 for normal text and 3 to 1 for large text. The code computes ratios for Driftwood's draft palette.
# WCAG contrast ratio check for text and background pairs.
def channel(c):
c = c / 255
return c / 12.92 if c <= 0.04045 else ((c + 0.055) / 1.055) ** 2.4
def luminance(hex_rgb):
r, g, b = (int(hex_rgb[i:i + 2], 16) for i in (1, 3, 5))
return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b)
def ratio(fg, bg):
hi, lo = sorted((luminance(fg), luminance(bg)), reverse=True)
return (hi + 0.05) / (lo + 0.05)
pairs = {
"body text on white": ("#1f2933", "#ffffff"),
"delay banner text": ("#ffffff", "#d64545"),
"muted timestamp": ("#9aa5b1", "#ffffff"),
"link on pale blue": ("#1d5fa8", "#e8f1fb"),
}
for name, (fg, bg) in pairs.items():
r = ratio(fg, bg)
verdict = "AA pass" if r >= 4.5 else "AA large-text only" if r >= 3 else "FAIL"
print(f"{name:22s} {r:5.2f}:1 {verdict}")body text on white 14.76:1 AA pass delay banner text 4.38:1 AA large-text only muted timestamp 2.50:1 FAIL link on pale blue 5.66:1 AA pass
The muted timestamp fails and the delay banner only passes for large text. The banner carries safety information, so the team darkens the red and makes the text larger and bold. Accessibility belongs in the definition of done (lesson 6), in exploratory charters (lesson 8) and in triage priorities, not in a final audit.
Privacy by design
Privacy by design, a framework developed by Ann Cavoukian when she was Ontario's Information and Privacy Commissioner, asks teams to build privacy into products from the start: proactive not reactive, privacy as the default setting, privacy embedded into design, full functionality without false trade-offs, end-to-end security, visibility and transparency, and respect for user privacy. In product terms this means collecting only the data needed for a stated purpose (data minimization), setting retention limits, defaulting to the most private option, explaining clearly what is collected and why, and securing what is kept.
In Canada, the Personal Information Protection and Electronic Documents Act (PIPEDA) governs personal information in private-sector commercial activity in most provinces; it is built on ten fair information principles, including accountability, identifying purposes, consent, limiting collection and limiting retention. Proposed replacements have stalled: Bill C-27 died when Parliament was prorogued in January 2025, and a new privacy bill tabled in June 2026 had not passed as of October 2026. Alberta, British Columbia and Quebec have their own private-sector laws. Quebec's Law 25, fully in force since September 2024, is the most demanding: it requires a person in charge of protecting personal information, privacy impact assessments for certain projects, confidentiality by default for technological products, consent that is specific and separate from other terms, and disclosure of automated decisions. The commuter pass's phone numbers and trip history are personal information under all of these laws.
# Privacy by design: check a tracking plan for unnecessary personal data and retention.
plan = [
# event, fields, retention days, needed for stated purpose?
("sailing_viewed", ["route", "sailing_time", "device_type"], 395, True),
("alert_subscribed", ["phone_number", "route"], None, True),
("location_ping", ["lat", "lon", "user_id"], 730, False),
("search", ["query_text", "user_id"], 365, True),
]
PERSONAL = {"phone_number", "lat", "lon", "user_id", "query_text"}
for event, fields, days, needed in plan:
issues = []
personal = PERSONAL.intersection(fields)
if personal and not needed:
issues.append("collects " + ", ".join(sorted(personal)) + " without a stated need: drop it")
if personal and days is None:
issues.append("no retention limit for personal data")
elif personal and days > 365:
issues.append(f"keeps personal data {days} days: justify or shorten")
print(f"{event:17s} " + ("ok" if not issues else "; ".join(issues)))sailing_viewed ok alert_subscribed no retention limit for personal data location_ping collects lat, lon, user_id without a stated need: drop it; keeps personal data 730 days: justify or shorten search ok
The location ping is the clearest problem: precise location collected continuously without a stated need is both a privacy risk and a liability if breached. Removing it costs nothing, since the capacity alert uses the chosen route, not GPS. The alert subscription needs a phone number, but must have a retention rule, for example deletion 30 days after unsubscribing. For sensitive features, a privacy impact assessment documents the data flows, risks and mitigations before building.
AI features and governance
Driftwood's owner asked whether the app could predict which sailings will fill, using past counts and weather, and whether a chatbot could answer traveller questions. Both are reasonable, and both raise new responsibilities. Predictions can be wrong in ways that strand people, so they need visible uncertainty and a fallback. Chatbots built on large language models can produce confident but false answers, so they need limits on what they answer, clear disclosure that the user is talking to an automated system, and an easy route to a person. Frameworks such as the NIST AI Risk Management Framework help teams govern, map, measure and manage AI risks.
The European Union's AI Act, which entered into force in August 2024, is the most comprehensive AI law. It bans certain practices, such as manipulative techniques that cause significant harm, since February 2025; imposes obligations on general-purpose AI model providers since August 2025; and sets strict requirements for high-risk systems listed in its Annex III, such as some uses in employment, education and access to essential services. Under the 2026 Digital Omnibus amendments, Annex III high-risk obligations are now scheduled to apply from 2 December 2027. Transparency duties, such as telling people they are interacting with a chatbot, also apply. The Act matters to Canadian and US teams whose products are offered to people in the EU.
Canada has no AI-specific federal law in force: the proposed Artificial Intelligence and Data Act died with Bill C-27 in January 2025. Existing law still applies to AI features, including privacy law, human rights law, and Quebec's Law 25 rule requiring organizations to inform people when a decision about them is made exclusively by automated processing. The federal government's voluntary code of conduct on generative AI offers further guidance.
Responsible product decisions
Laws set minimums. Responsible product management goes further by asking, at each stage, who could be harmed, who is excluded, what happens when the product is wrong, and whether the business would be comfortable if its design decisions were published. Practical habits include adding an ethical assumptions row to the opportunity solution tree (lesson 3), including counter-metrics for harm (lesson 10), inviting affected communities into discovery, and keeping a decision log. The capstone review below pulls the course's checks into one scorecard.
# Capstone increment review: pull the course's checks into one scorecard (invented values).
checks = {
"Outcome metric moved (missed sailings, -30% target)": (-0.24 / -0.30, 0.7),
"Release readiness hard gates": (1.0, 1.0),
"SLO compliance this month (99.9% target)": (0.9993 >= 0.999, 1.0),
"Accessibility: open WCAG AA issues == 0": (2 == 0, 1.0),
"Dark-pattern audit issues == 0": (0 == 0, 1.0),
"Change requests decided in writing": (11 / 12, 1.0),
}
for name, (value, threshold) in checks.items():
v = float(value)
print(f"{'PASS' if v >= threshold else 'FAIL'} {v:4.2f} {name}")PASS 0.80 Outcome metric moved (missed sailings, -30% target) PASS 1.00 Release readiness hard gates PASS 1.00 SLO compliance this month (99.9% target) FAIL 0.00 Accessibility: open WCAG AA issues == 0 PASS 1.00 Dark-pattern audit issues == 0 FAIL 0.92 Change requests decided in writing
Two items fail. The outcome reached 80 per cent of the target, which passes the agreed threshold, but two WCAG AA issues remain open, and one change request was agreed verbally and never written up. The team fixes the accessibility issues before widening the rollout and writes up the change with the client. A scorecard like this is not a grade; it is a prompt for the final client review.
Careers in product management
Product management is a common destination for computing graduates who enjoy working across technology, design and business. Typical titles run from associate product manager (APM), through product manager and senior product manager, to group product manager, director and vice-president of product, with a parallel individual-contributor track at some companies (principal or staff PM). Adjacent roles include product owner, technical program manager, product designer, product analyst, and engagement or delivery manager in consulting firms that build software for clients.
Hiring for PM roles emphasizes product sense (judging what to build and why), execution (planning, prioritization and delivery), analytical skill (metrics and experiments), communication and stakeholder management, and technical fluency, which computing graduates bring naturally. Certifications such as Scrum.org's Professional Scrum Product Owner (PSPO) or Scrum Alliance's Certified Scrum Product Owner (CSPO) show familiarity with agile product roles but matter less than evidence of real product decisions, which is why the capstone portfolio is valuable. For project management credentials and leadership skills, see PMP-120 and PMP-121; for building a robotics or hardware product, see ROB-499; and for web delivery, see CMPUT-404.
Worked examples
Worked problem
Fixing a dark pattern
The draft cancellation flow needs six steps and a phone call. Redesign it.
Show solution
- Add a Cancel pass link in account settings, reachable in two taps.
- Show one confirmation screen with neutral wording: Cancel pass or Keep pass.
- Send a confirmation email or SMS with the end date of access.
Answer: Cancellation becomes as easy as sign-up, online, with neutral wording and confirmation.
Worked problem
Checking contrast
The muted timestamp (#9aa5b1 on white) scored about 2.5 to 1. What should the team do?
Show solution
- Normal text needs at least 4.5 to 1 for AA.
- Darken the grey (for example to about #616e7c) and re-run the check.
- Add contrast checks to the definition of done.
Answer: Darken the text until it reaches at least 4.5 to 1, and prevent regressions with automated checks.
Worked problem
Minimizing data
A teammate wants to store every search query with user IDs forever to improve the app. Respond.
Show solution
- State the purpose: improving search results.
- Pseudonymize or aggregate queries; drop user IDs if not needed.
- Set a retention limit such as 90 days and document it in the privacy notice.
Answer: Collect only what the purpose needs, keep it for a limited time, and be transparent.
Common mistakes
MistakeDark patterns are fine if they raise conversion.
InsteadThey deceive users, invite enforcement and destroy trust; design honest flows.
MistakeAccessibility can be audited at the end.
InsteadBuild it into the definition of done, testing and triage from the start.
MistakeCollect all available data in case it is useful later.
InsteadPrivacy by design requires minimization, retention limits and stated purposes.
MistakeAI laws only matter in Europe.
InsteadThe EU AI Act reaches products offered in the EU, and existing privacy, consumer and human rights laws apply to AI everywhere.
MistakeA PM portfolio should show only successes.
InsteadShow decisions, evidence and pivots, including failed hypotheses.
Summary and key terms
- The capstone runs one increment through discovery, definition, prioritization, validation, delivery, operation and measurement.
- Dark patterns such as obstruction, sneaking and drip pricing face active enforcement.
- WCAG 2.2 AA is the practical accessibility target; build it in from the start.
- Privacy by design means minimization, retention limits, private defaults and transparency.
- AI features need uncertainty, disclosure, human fallback and governance; the EU AI Act sets the strictest rules.
- Responsible product practice goes beyond legal minimums.
- PM careers value product sense, execution, analytics, communication and technical fluency.
- Dark pattern
- An interface design that tricks or pressures users into unintended choices.
- Drip pricing
- Advertising a price and adding mandatory fees later in the purchase.
- Obstruction
- Making an action such as cancellation deliberately difficult.
- Confirmshaming
- Using guilt-laden wording to discourage declining an offer.
- WCAG
- The Web Content Accessibility Guidelines published by the W3C.
- Contrast ratio
- The relative luminance ratio between text and background.
- Privacy by design
- Building privacy into products proactively and by default.
- Data minimization
- Collecting only the personal data needed for a stated purpose.
- Privacy impact assessment
- A documented analysis of data flows, privacy risks and mitigations.
- EU AI Act
- The European Union's risk-based regulation of artificial intelligence.
Practice problems
Work each problem on paper first, then reveal the answer to check.
What outcome did Driftwood agree for the capstone increment?
Show answer
Reduce missed sailings due to full decks by 30 per cent over the summer.
Name four types of dark pattern.
Show answer
Any four of obstruction, sneaking, drip pricing, confirmshaming, false urgency, nagging.
What did the Federal Court of Appeal decide in the Cineplex case in January 2026?
Show answer
It dismissed Cineplex's appeal, upholding the finding that its booking fee was drip pricing.
How many issues did the dark-pattern audit find?
Show answer
Five.
What contrast ratio does WCAG 2.2 AA require for normal text?
Show answer
At least 4.5 to 1.
Which colour pair failed in the contrast code?
Show answer
The muted timestamp on white.
Which Canadian privacy law requires confidentiality by default for technological products?
Show answer
Quebec's Law 25.
Why should the location ping be dropped?
Show answer
It collects precise location without a stated need, creating risk for no benefit.
When do EU AI Act Annex III high-risk obligations apply under the 2026 amendments?
Show answer
From 2 December 2027.
Name three skills emphasized in PM hiring.
Show answer
Any three of product sense, execution, analytics, communication and stakeholder management, technical fluency.
Lesson quiz · 5 questions
Score 60% or more to complete this lesson.
Create a free account to save your progress, take quizzes and earn a certificate.