9 User Stories — M2 (App MVP)
Delivered and Alpha stories, keyed to PRD Appendix A and grouped by capability
Milestone M2 — App MVP (Mar 2026) made the assistant’s answers structured — a dataset list is a list, an image answer is a gallery — and gave the operator a way to hand work out of the platform. These stories were written after delivery on 2026-09-10. The two structured-response stories are the ones the engine certification matrix already measures (dataset-discovery, image-browsing, TEST-CERT-01), so their criteria are the rows’ assertions in the persona’s words. Status labels mirror PRD Appendix A.
10 Application Surface
10.0.1 US-M2-01 — Ask for datasets and get a list, whichever engine answers
FR-AI-06 (Delivered; certified on every registered engine — TEST-CERT-01 dataset-discovery)
As a Data Explorer, I want an answer about which datasets exist to arrive as dataset cards I can open, so that the assistant’s first answer is a starting point and not a paragraph to read names out of.
- Given a question that asks for a collection of datasets, when any certified engine answers, then the stream carries exactly one structured dataset list on a clean run — started, the list, finished — and the interface renders it as cards.
- Given a dataset card, when I select it, then I land in that dataset’s workspace.
- Given an engine that answers such a question in prose only, when it is certified, then it fails the row — the product commits to the surface, not to any one engine’s habit.
10.0.2 US-M2-02 — Ask for images and get a gallery I can click through
FR-AI-07 (Delivered; certified on every registered engine — TEST-CERT-01 image-browsing)
As an Integrity Engineer, I want an answer that shows images to arrive as a gallery whose every image opens in the viewer, so that “show me ten images from the unit audit” ends with me looking at the tenth image, not at a list of file names.
- Given an image-browsing question, when any certified engine answers, then the answer carries each image’s identity — id, dataset slug, filename, type — and the interface resolves thumbnails and opens the viewer from it.
- Given the identities in the answer, when the interface renders them, then every image has its dataset slug and no answer carries a signed storage URL — the presentation is the interface’s, the identity is the engine’s.
- Given an image the user’s organisation cannot see, when an answer would include it, then it is absent — the gallery is filtered by the same row-level security as every other read.
11 Operator Handoff
11.0.1 US-M2-03 — Hand the recommendations to the people who do the work
FR-OPS-01 (Alpha (prototype) — on the alpha lineage only; downgraded from Delivered by the 2026-09-01 audit)
As an Operations Supervisor, I want a campaign’s work orders and recommendations exported as a markdown packet and a CSV, so that the maintenance planner can take them into their own system without re-typing.
- Given a campaign with recommendations, when I export, then I receive a markdown packet listing each recommendation with its asset, priority and evidence reference, and a CSV with one row per recommendation and the same fields.
- Given the CSV, when it is opened in a spreadsheet, then every column is labelled and every row resolves to a recommendation in the platform by its id.
- Given a campaign with nothing to recommend, when I export, then I get an empty packet that says so — not an error, not a packet from another campaign.