- One intake route for every vulnerability report, with an owner and a record
- Duplicate and low-quality reports filtered before engineers spent time on them
- Any component answerable with which releases and which customers are affected
- A written rule for when a vulnerability counts as actively exploited, so the reporting clock starts consistently
- Fixes shipped as signed releases with advisories customers could act on
Anonymised composite. Client names, identifying details and confidential figures are withheld; public facts are cited in the references.
The situation
A German software company sold machine-monitoring software to manufacturers across Europe. Its product had two parts: an edge gateway installed on factory networks that collected data from machines, and a cloud application where customers viewed dashboards and alerts. Both were built on many open-source components. Security reports came in through a shared email address, were picked up by whichever engineer had time, and were tracked in the general bug tracker. Nobody could quickly say which customers ran which gateway release, or which releases contained a given library.
The product counted as a product with digital elements under the EU Cyber Resilience Act. From 11 September 2026, manufacturers must report actively exploited vulnerabilities and severe incidents, once, through ENISA's Single Reporting Platform, which passes them to the relevant national CSIRT and ENISA12. The first step is an early warning within 24 hours of becoming aware of active exploitation, followed by a fuller notification and a final report2. An email inbox and goodwill could not meet those deadlines reliably.
Why now. Vulnerability reports were getting more numerous and harder to judge. On 5 November 2026 OpenAI released GPT-6 Cyber, a model for authorised vulnerability research that it rates at its highest cybersecurity risk level3. OpenAI's own security leadership has said AI-generated reports are overwhelming some open-source maintainers4, and projects such as Debian have begun experimenting with AI-assisted triage to cope5. The company was seeing the same pattern at its own scale: more reports, some excellent, many duplicated or unreproducible.
What had to be true
- One way in: every report, from researchers, customers, suppliers or internal scanners, reaches one queue with an owner.
- Noise filtered cheaply, without letting a real vulnerability sit unread.
- Exposure answerable fast: for any component, which releases contain it and which customers run them.
- A consistent start to the clock: a written rule for when the company is "aware" of active exploitation.
- Fixes customers can trust: signed releases and advisories that say what to do.
- Evidence kept: who knew what, when, and what was reported.
Architecture
The core was a security case record, separate from the general bug tracker, with restricted access. Every report became a case with an owner, a status and a timeline. The build pipeline produced a CycloneDX SBOM for every gateway and cloud release, and the licensing system already knew which customer ran which gateway release, so joining the two gave a direct answer to "who is exposed?". When a vulnerable library was present but its vulnerable code was not reachable, the team published a VEX statement saying so, which cut down repeated questions from customers' scanners.
The data flow, end to end
- ReceiveA report arrives through the form, security.txt address or a scanner, and opens a case
- SortAn AI model groups duplicates, summarises the claim and flags missing details
- ReproduceAn engineer tests credible reports on isolated gateway and cloud rigs
- ScopeThe SBOM and customer inventory show affected releases and customers
- DecideThe on-call lead applies the exploitation rule and severity; reporting starts if needed
- Fix and tellA signed release ships with an advisory; the case closes with a final report
The hard part: AI triage and the start of the clock
Treating reports as untrusted input. Using a language model to read incoming reports helped with volume, but reports are written by strangers, and some could contain instructions aimed at the model. The triage model therefore had no tools, no access to code or customer data, and only produced a structured summary: claimed component, claimed impact, duplicate candidates and missing information. It could not close a case. Anything it marked as low quality still had a person glance at it before closing. See prompt injection defence for agents.
Defining "aware". The 24-hour early warning runs from when the manufacturer becomes aware of active exploitation1. A report that a flaw exists is not the same as evidence that someone is exploiting it. With the company's lawyers, we wrote a short rule: credible evidence of exploitation, such as a customer incident, a national CERT notice, a public exploit used in attacks or an entry in an exploited-vulnerability catalogue, starts the clock, and the on-call lead records the time and the evidence. Borderline cases went to a named second person within working hours, with a bias toward reporting early.

Shipping fixes to factories. Gateways sat on factory networks where customers controlled update timing. Signed releases, verifiable before installation, meant customers' operations teams could accept updates without a call to the vendor6. Advisories listed affected versions, the fixed version and a workaround for sites that could not update immediately.
Regulation sets the deadline; your inventory decides whether you can meet it. If you cannot say who runs which release, no process can report on time.
How it ran
- Own every case
- Apply the exploitation rule
- Submit reports
- Reproduce and fix
- SBOM and signing in the pipeline
- Signed releases
- Agree "aware" rule
- Advisories
- Tell affected customers
- SBOM per release
- Customer release map
- Disclosure policy live
- One case queue
- On-call rota
- AI-assisted sorting
- Exploitation rule
- Reporting runbook
- Platform access tested
- Signed releases
- Advisory template
- Tabletop exercises
A tabletop exercise, run before any real case, walked through a mock exploited vulnerability from report to final submission. It found gaps that documents had hidden: who held access to the reporting platform at weekends, and which customer contacts were out of date.
Key decisions and trade-offs
| Decision | Alternative | Why |
|---|---|---|
| Separate security case record | General bug tracker | Restricted access and a clean timeline for reporting |
| AI sorts, people decide | AI closes low-quality reports | A missed real vulnerability costs far more than review time |
| Triage model with no tools or data access | Agent that inspects code | Reports are untrusted input |
| Written exploitation rule agreed with legal | Judgement case by case | The clock starts consistently and defensibly |
| SBOM joined to customer inventory | SBOM files on their own | Answers "who is exposed?", not just "what is inside?" |
| Signed releases with advisories | Release notes only | Factory teams can verify and act without a call |
What I'd do again, and differently
Again: build the release-to-customer map before anything else. It turned every later question from an investigation into a lookup. Differently: run the tabletop exercise in the first weeks, not after the process was written; it would have shaped the runbook rather than corrected it. Related: defender-first AI models and vulnerability management, AI model supply chain security, the 6 November tech news and the Europe page.
If you sell software or connected products in the EU and need to be ready for Cyber Resilience Act reporting, see my fractional CTO work, or analyse your challenge and bring the result to a call.
- 1Cyber Resilience Act: reporting obligationsEuropean Commission · 2026
- 2
- 3GPT-6 Cyber: Advancing the frontier of aligned cybersecurity agentsOpenAI · 5 Nov 2026
- 4Before you file that AI bug report, OpenAI has some adviceCyberScoop · 2026
- 5
- 6Verifying Container Image Signatures Within CRI RuntimesKubernetes blog · 29 Jun 2023