8  User Stories — M1 (AI Foundation)

Delivered stories, keyed to PRD Appendix A and grouped by capability

Published

September 10, 2026

Milestone M1 — AI Foundation (Dec 2025) put the first assistant in front of users, the orchestration that routes its work, the first non-RGB evidence through the pipeline, and gas readings onto the scene. As with M0, these stories were written after delivery on 2026-09-10; where a requirement was shipped as a prototype the story says so, and its criteria are the ones that prototype actually met. Status labels mirror PRD Appendix A.

9 Evidence Intake

9.0.1 US-M1-01 — Bring thermal, OGI and gas evidence into the same campaign

FR-EVI-02 (Delivered — as a prototype; calibrated thermal and field-survey readings are M4 requirements of their own)

As a Data Explorer, I want thermal images, OGI clips and gas readings ingested into the same campaign as the RGB imagery, each carrying its modality, so that an engineer can see a location’s evidence across sensors instead of across folders.

  • Given thermal images alongside RGB in a campaign, when they are ingested, then each carries its modality and — where the capture pairs them — a link to its RGB counterpart, so the pair can be viewed together.
  • Given gas readings for a campaign, when they are ingested, then each reading keeps its concentration, unit, timestamp and position, and can be listed for the campaign.
  • Given a modality the pipeline does not recognise, when ingestion runs, then the files are reported as unhandled with their names — not ingested as RGB, not lost.

10 Application Surface

10.0.1 US-M1-02 — Ask the data a question in plain language

FR-AI-05 (Delivered — an early prototype; the reliable single-turn query is M3’s contextual-chat requirement)

As an Integrity Engineer, I want to ask a question about my inspection data in plain language and get an answer drawn from it, so that finding “how many anomalies in this campaign” does not require knowing where that number lives.

  • Given a question about a campaign’s images or anomalies, when I ask it, then the assistant answers from that campaign’s data and shows what it looked at.
  • Given a question the assistant cannot ground in data, when it answers, then it says so rather than producing a number with nothing behind it.
  • Given the prototype’s known limits, when an answer is wrong, then I can see the query it ran — the criterion this prototype met was inspectable, not reliable; reliability is the bar of M3’s single-turn query and its evaluation gate.

10.0.2 US-M1-03 — Let the assistant plan the work, not just answer

FR-APP-10 (Delivered)

As an Integrity Engineer, I want a question that needs several steps — find the dataset, pull its images, run an analysis, write it up — carried out by the assistant as a sequence, so that I ask once and get a result rather than driving each tool by hand.

  • Given a request that needs more than one tool, when the assistant handles it, then a planner chooses the steps and an executor runs them in order, and the answer reflects every step’s output.
  • Given a step that fails, when the sequence runs, then the assistant reports which step failed and what it had so far, rather than presenting a partial result as complete.
  • Given a request outside the tools’ reach, when the planner considers it, then it says what it cannot do instead of routing to the nearest tool anyway.

10.0.3 US-M1-04 — See gas readings on the scene

FR-APP-12 (Delivered)

As an On-call Integrity Engineer, I want a campaign’s gas readings drawn on the 3D scene as a colour-mapped heatmap, so that a high reading is a place on the plant, not a row in a table.

  • Given a campaign with positioned gas readings, when I enable the gas overlay, then a heatmap renders on the scene with concentration mapped to colour and a legend stating the scale and unit.
  • Given the overlay, when I select a hot spot, then I see the readings behind it with their values, units and times.
  • Given a campaign with no gas readings, when I enable the overlay, then the scene says there is nothing to draw rather than rendering an empty layer.