- Automated Analysis Followed by Manual Triage of Every Result
Every automated result was reviewed by hand rather than passed through to the report. The largest block of flagged items concerned dynamically constructed database queries; each one was traced to its source and confirmed to use safe parameter binding with server-side allow-lists, and therefore reported as not exploitable. The same discipline applied to the dependency findings: a long list of critical and high advisories in the frontend tree resolved, on inspection, to build and test tooling that is never shipped to users. Reporting those at face value would have been easier and far less useful.
- Reachability-Based Severity, Not Scanner Severity
Rather than inheriting whatever rating an advisory database assigned, each dependency finding was rated by what it actually meant for this application: is the vulnerable function reachable, does this code path exist in production, what compensating controls are already in place. Some advisories were downgraded because the affected APIs are never called. One was rated higher than its surface description suggested, because it sat in an authentication-critical library with no upstream fix available. The result is a severity ranking the client's team can act on in order.
- Manual Review of the Security-Critical Paths
Authentication, session handling, authorisation on every API route, object-level access, delegated administration, the AI integration, data exports, configuration and CI were reviewed by hand. This is where the access model was either confirmed or broken — and confirming it is a result in its own right, since it is the control that keeps one brand's customer data away from another's staff.
- Findings Framed in Business and Compliance Terms
Each finding carries its technical impact, but also what it means commercially and for the regulators: which personal data is exposed, which OWASP category and verification standard it maps to, and which obligation under the applicable data protection law it touches. A development team gets a fix; a decision-maker gets a reason to prioritise it.
- A Roadmap Sorted by When to Act, Not Just How Bad It Is
The findings were consolidated into a single remediation table split into three tiers: items to resolve before the next production release, items for the following development cycle, and items for routine maintenance. Every entry names a target version or a specific code change, so the roadmap is a work queue rather than a reading exercise.