AI feature PRD
Builds on Topic 8.
What you'll produce
An AI feature PRD — the spec engineering builds from — for the FjordPay Support Copilot, written for the one thing that makes AI products different: the output is probabilistic, not guaranteed (Topic 8). A normal PRD can say "the button saves the form." An AI PRD can't say "the Copilot always drafts a correct reply" — because it won't. So this document does what a regular PRD does (problem, user, stories, acceptance criteria) plus the four things an AI PM is uniquely responsible for: a quality bar that defines "good enough" in measurable terms tied to your eval (Deliverable 2), design-for-failure fallbacks for when the model is wrong or unsure, the human-in-the-loop control that keeps a person between the AI and the customer (Deliverable 3), and a feedback mechanism that makes the feature improve over time. It matters because this is the literal artifact an AI PM ships on the job — and the one that separates "I added an AI wrapper" from "I shipped a responsible AI feature with a defined failure mode." It's also the deliverable that proves you can hold the Topic 8 mindset: quality is a range, you design for uncertainty, and you decide where AI must not act alone.
Instructions
- Anchor the one-liner. In one sentence, state what the Copilot does and — critically — what it does not do. The right shape is "drafts replies for a human agent to review and send," never "answers customers." This single boundary decision is the spine of the whole spec; get it explicit before anything else.
- Write problem / goal / user / success metric. State the support pain in numbers (ticket volume, reply time), the goal, the primary user (the support agent, not the end customer — the agent is who touches the AI), and a success metric that is a business outcome (e.g. median first-reply time), not "the AI is accurate."
- Define the quality bar — the heart of an AI PRD. Convert your Deliverable 2 eval rubric into a release gate: pick the dimensions that block launch (accuracy/factuality, safety) versus the ones that are nice-to-have (tone), set a numeric threshold on a held-out test set, and name the non-negotiables that must never happen even once (e.g. inventing a fee amount). "Good enough" must be a number a team can re-test, not a vibe. Inherit the factuality gate verbatim — don't re-pick it. The factuality threshold here must be the exact number D2's verdict set and D3's mitigation enforces (in this scenario, ≥ 95%); if your three documents show three different figures, an evaluator can't tell which gate is real and neither can engineering. Cite the source ("inherited from D2's verdict") so the chain is visible.
- Design for failure. For each failure mode (model unsure, no knowledge-base match, low-confidence draft, safety trip), specify the fallback behavior — what the system does instead of guessing. The default fallback is almost always "produce no draft and route to a human," not "produce a worse draft."
- Specify the human-in-the-loop control. State exactly where the human sits, what they can do (review / edit / reject / send), and the one rule that can't be bypassed: no Copilot text reaches a customer without an agent pressing send. Cite the disclosure/verification policy from Deliverable 3.
- Specify the feedback mechanism. Define how agents signal good/bad output (thumbs, edit-distance capture, a "this draft was wrong" flag) and — in one line — how that data feeds improvement. An AI product that can't learn from its own misses is half-built.
- Write 4–6 user stories in "As a [user], I want to [action], so that [benefit]" form, centered on the agent (and one on the support lead who owns quality).
- Write acceptance criteria for the most important story, as a checkable list, and include the mandatory "AI is wrong or unsure" edge case — what the user sees and what the system does when confidence is low or the answer isn't in the knowledge base.
- Name the thin first slice. One narrow, end-to-end, genuinely shippable cut (e.g. one ticket category, draft-only, internal agents) — not "build the whole model first."
- Stay out of the how, except where the how is the product. Don't pick the vendor or vector database. Do specify behavioral constraints that are product decisions: grounding on the knowledge base only, the confidence-to-fallback rule, and the human gate.
Worked example
(Feature: FjordPay Support Copilot — drafts replies to common billing/account tickets for human agents to review and send. Builds on the prompt spec (D1), eval (D2), and risk register (D3).)
One-liner The Support Copilot drafts a suggested reply to a common billing or account-access ticket, grounded only on FjordPay's approved help content, for a human support agent to review, edit, and send. It never sends a reply to a customer on its own, and it never answers questions outside billing/account-access.
Problem / Goal / User / Success metric
- Problem: After the March product launch, support ticket volume doubled (from ~1,900 to ~3,800/week) and median first-reply time blew out from ~3 hours to 14 hours. Agents re-type the same billing and account-access answers dozens of times a day. Leadership wants AI to help but is (correctly) nervous about wrong answers to customers about money.
- Goal: Cut median first-reply time for common billing/account tickets to under 4 hours without lowering answer accuracy or putting an unreviewed AI message in front of a customer.
- Primary user: The support agent (the human who reads the draft, edits it, and sends it). Secondary user: the support lead who owns reply quality and approves the launch.
- Success metric: Median first-reply time on the covered ticket categories, measured 4 weeks post-launch vs. the pre-launch baseline of 14 hours. Guardrail metric: customer-reported "wrong answer" rate must not rise above the pre-Copilot baseline of 1.8%. (Speed that costs accuracy is a failure, not a win.)
Where the 1.8% comes from — flagged as a net-new PRD assumption, not inherited from D1–D3. This number appears nowhere in the prompt spec, the eval, or the risk register, and it isn't the ≥ 95% factuality gate wearing a disguise: that gate scores drafts on the frozen eval set, whereas 1.8% is the fielded, customer-reported human error rate on replies actually sent. The two measure different things at different points in the pipeline, so neither can be derived from the other. The 1.8% is sourced here from the support team's existing QA sample (the manual quality review that already re-checks a slice of sent replies each week) — operational data this PRD pulls in for the first time. Naming it is the whole point of the guardrail: the Copilot-assisted workflow must not do worse than the humans it assists, which is only meaningful against a real, measured human baseline. A learner reusing this structure should swap in their own org's measured human error rate; if none exists yet, write "baseline TBD — instrument the QA sample before launch" rather than inventing a figure.
Quality bar — what "good enough" means (thresholds inherited from the D2 verdict; eval set expanded from D2's) Measured on the frozen 40-ticket eval set, scored 1–3 per dimension. The gating thresholds are not invented here — they are inherited verbatim from D2's verdict, so the same figure appears in the eval (D2), the risk register's hallucination mitigation and stop line (D3), and this table. The single factuality gate is ≥ 95%. The Copilot may launch only if:
How the eval set grew from 7 to 40 — derived from D2, expansion explained. D2 scored the Copilot on a 7-ticket set: enough to find failure modes by hand, far too small to gate a release on (a single bad draft moves a 7-item pass rate by 14 points, so "≥ 95%" isn't even expressible on 7 tickets). For the launch gate this PRD therefore expands that set to 40 tickets, holding the same dimensions and 1–3 rubric from D2, by: (1) keeping all 7 original D2 tickets verbatim as regression anchors; (2) adding ~25 real billing/account-access tickets sampled from the post-launch queue, stratified to mirror live category mix; and (3) adding ~8 deliberately hard cases — the exact failure modes D2 surfaced (invented fees, out-of-scope questions, stale-snippet traps) — so the gate is measured against the situations most likely to break it. The set is then frozen before launch: no edits, no swaps, so the ≥ 95% means the same thing every time it's re-run. The 40 here is the eval-set size, not the same as the "~40 tickets/day" of live volume in the First slice below — different forties, on purpose; don't conflate them. A learner reusing this should pick a launch-gate size that makes their threshold expressible (you cannot enforce ≥ 95% on fewer than ~20 items) and state the 7→N expansion the same way.
| Dimension | Release gate | Why this threshold |
|---|---|---|
| Accuracy / factuality | ≥ 95% of drafts score 3 (no invented facts, fees, timelines, or policy); zero drafts that state a wrong number. This is the money-claim factuality gate inherited from D2's verdict — the same ≥ 95% the D3 risk register enforces as its mitigation and stop line. | Customers are being told things about their money — a confident wrong fee is the worst outcome, so this is the gate the whole project agrees on |
| Safety | Zero drafts that promise a refund, waive a fee, confirm a chargeback, or give financial/legal advice | These are actions only a human + policy can authorize; the model must never imply them |
| Instruction-following | ≥ 90% include the required AI-assist disclosure and stay within billing/account scope | The disclosure and scope limit are policy, not style |
| Completeness | ≥ 85% score ≥ 2 (answers the actual question, names the next step) | A draft that's safe but useless still wastes the agent's time |
| Tone | ≥ 80% score ≥ 2 (calm, plain, on-brand) | Nice-to-have; an agent can fix tone in seconds, so it doesn't block launch |
Two inherited launch gates (both from D2's verdict, kept distinct): (1) the money-claim factuality gate — ≥ 95% of drafts score 3 on accuracy/factuality (the row above); (2) the overall pass rate — ≥ 90% of drafts pass the full rubric (every dimension ≥ 2, Safety = 3, Factuality = 3), with zero Safety/Factuality = 1. These are two different numbers measuring two different things — the 95% is the high-harm money slice, the 90% is the broad pass rate — and the ≥ 90% in the instruction-following row above is a third, dimension-specific threshold; don't collapse them into one figure.
Non-negotiables (a single violation blocks release, regardless of averages): inventing a fee or dollar amount; stating a refund/chargeback timeline not in the knowledge base; confirming an action ("your refund is processed") the system can't verify; answering a non-billing question (fraud, legal, closing an account) instead of escalating.
Design for failure — what happens when the AI is wrong or unsure
| Failure mode | What the system does instead |
|---|---|
| No good match in the knowledge base (question isn't covered) | Produce no draft. Show the agent: "No grounded answer found — handle manually." Never guess from the model's general knowledge. |
| Low model confidence (Copilot's self-reported uncertainty above threshold, or the draft contradicts the retrieved snippet) | Surface the draft flagged "Low confidence — verify before sending" and collapse it by default, so the agent opts in to even reading it. |
| Safety trip (draft would promise a refund/fee waiver, or drifts off billing) | Suppress the draft entirely, show "Needs a human — out of Copilot scope," and tag the ticket for a senior agent. |
| Retrieval returns a stale/contradictory snippet | Draft is withheld and the snippet is flagged to the support lead for knowledge-base cleanup. |
| Model/API is down or times out | Feature degrades silently to the normal manual workflow — the agent never sees an error wall, just no draft. |
The default fallback is always "no draft + route to human," never "a lower-quality draft." A missing draft costs a few minutes; a confident wrong draft about money costs a customer.
Human-in-the-loop control
- The agent sees the draft in an editable box. They can edit, accept, or reject it. No Copilot text reaches a customer until the agent presses Send — there is no auto-send, no "approve all," and no path that skips the human. This is the hard line from the Deliverable 3 risk register and is not configurable.
- Every customer-facing reply that used the Copilot carries the agreed AI-assist disclosure and is logged with which knowledge-base snippets grounded it (verification policy, D3), so quality issues are auditable.
Feedback mechanism
- One-click 👍 / 👎 on each draft, plus an automatic capture of edit distance (how much the agent rewrote the draft before sending) as a passive quality signal, plus a "this draft was wrong" flag that routes the ticket + snippet to the support lead.
- Thumbs-down and "wrong" flags feed a weekly review that updates the prompt spec (D1) and the knowledge base, and refreshes the D2 eval set — closing the human-in-the-loop improvement cycle (Topic 6). A Copilot that can't learn from its own misses is half-built.
User stories
- As a support agent, I want a grounded draft reply waiting on common billing tickets, so that I can review and send in seconds instead of writing from scratch.
- As a support agent, I want low-confidence or out-of-scope tickets to clearly show "no draft / needs a human," so that I'm never nudged to send a guess about a customer's money.
- As a support agent, I want to edit any draft before sending, so that I stay in control of what the customer actually receives.
- As a support agent, I want to flag a wrong draft in one click, so that the system gets better and a human reviews the miss.
- As a support lead, I want every Copilot-assisted reply logged with its sources and disclosure, so that I can audit quality and prove we never sent an unreviewed AI answer.
- As a support lead, I want a weekly view of thumbs-down and edit-distance, so that I know whether the Copilot is meeting the quality bar before I widen its scope.
Acceptance criteria (Story 1 — the grounded draft)
- A draft appears only for tickets the classifier maps to a covered billing/account category; all others show the normal manual flow.
- The draft is generated only from retrieved approved knowledge-base content; if retrieval returns nothing relevant, no draft is shown (the "AI is wrong/unsure" edge case).
- Edge case — low confidence / not in knowledge base: when confidence is below threshold or there's no good source match, the agent sees an explicit "Low confidence — verify" flag or "No grounded answer — handle manually," never a silently-presented draft. The system must fail toward no answer, not a guessed one.
- Every draft carries the AI-assist disclosure text and the list of source snippets used.
- The draft is fully editable; the customer receives text only after the agent presses Send.
- A draft that would promise a refund, waive a fee, or leave billing scope is suppressed and the ticket is tagged for a senior agent.
- 👍/👎 and the "this draft was wrong" flag are available on every draft and recorded.
First slice (thin, end-to-end, shippable) One ticket category — "Why was I charged this fee?" — draft-only, internal agents, behind a flag, for two senior agents on ~40 tickets/day (this 40 is daily live volume, not the 40-ticket frozen eval set from the Quality bar — they're unrelated numbers that happen to coincide). Grounded on a 10-entry fee-policy snippet, with the human gate, the no-draft fallback, and 👍/👎 live. No multi-category routing, no edit-distance dashboard yet. It proves the riskiest thing end-to-end — can the Copilot draft a money answer an agent trusts enough to send, and does it safely produce nothing when it shouldn't? — before any scope expansion.
Rubric
The app's AI scores the learner's submission against these criteria and gives feedback. Levels: Needs work (1) / Solid (2) / Excellent (3). Passing = every criterion at Solid or above.
- Problem / goal / user / success metric — 1: missing parts, or success = "AI is accurate" · 2: all present, with a business-outcome success metric · 3: crisp, names the agent (not the customer) as user and includes a guardrail metric so speed can't be bought with accuracy.
- Quality bar tied to the eval — 1: vague ("should be good"), not measurable, or invents a factuality threshold that differs from the D2 verdict / D3 mitigation · 2: numeric thresholds on named dimensions, with the factuality gate matching the number inherited from D2 · 3: distinguishes release-blocking dimensions from nice-to-haves, ties to a held-out test set, lists explicit zero-tolerance non-negotiables, and states the factuality gate as the same figure D2 and D3 use, cited as inherited from D2's verdict.
- Design-for-failure fallbacks — 1: none, or "the AI tries harder" · 2: a fallback for the main failure modes · 3: covers unsure / no-match / safety-trip / outage, and the default is "no draft + route to human," never a worse guess.
- Human-in-the-loop control — 1: AI can send to customers, or it's unspecified · 2: a human reviews before send · 3: an unbypassable gate (no auto-send) plus logging/disclosure that makes it auditable, traced to the risk register.
- Feedback mechanism — 1: absent · 2: a way to flag good/bad output · 3: signal capture (thumbs + edit-distance/flag) and a stated loop that feeds the prompt, knowledge base, and eval set.
- User stories & acceptance criteria with the "AI is wrong/unsure" edge case — 1: tasks not stories, or no edge case · 2: valid stories and checkable criteria including the edge case · 3: agent-and-benefit-centered stories, and the wrong/unsure case explicitly fails toward no answer rather than a guess.
- What-not-how discipline (AI-aware) — 1: dictates vendor/model/DB, or omits the behavioral constraints · 2: mostly requirements · 3: leaves implementation open but specifies the product-defining behaviors (grounding-only, confidence-to-fallback rule, human gate).
- Coherence with prior deliverables — 1: disconnected; the factuality gate contradicts the number in D2 / D3; or a load-bearing number (eval-set size, any baseline) is asserted as "inherited"/"coherent" with no source · 2: references the prompt spec / eval / risk register, the factuality gate matches across deliverables, and the eval-set size is reconciled with D2's set (not silently a different size) · 3: the quality bar derives from the D2 rubric (same factuality number, cited as inherited from D2's verdict, identical to D3's mitigation and stop line) and the human-gate/disclosure derive from D3; and every load-bearing number is explicitly tagged as either carried-through (eval-set size shown as D2's 7 expanded to N, with the expansion method stated) or net-new (e.g. the 1.8% human-error baseline named as a PRD assumption with its source), so a reader can tell at a glance which figures must trace to earlier work and which the PRD is introducing — one coherent story with no untraced numbers and no threshold drift.