The machine writes it. Nobody reads where the data goes.

Assistants produce working, plausible, idiomatic code faster than any team can review it properly. The risk isn’t a bug. A bug gets caught. It’s a destination: one more log line, one more payload field, one more vendor call. The code is correct. The data path is new, and nobody decided on it.

01 · Why review misses it

Review asks whether it works. Not where the data went.

THE DIFF IS THE WRONG UNIT

A reviewer sees twelve changed lines, not the path those lines opened. A new sink looks like one added argument.

IT LOOKS RIGHT BECAUSE IT IS TYPICAL

An assistant reproduces the habits of the code it learned from, including logging an identifier for debuggability. It is idiomatic, and that is the problem.

VOLUME OUTRAN THE CHECK

Generation got faster. Review capacity did not, and it was never looking for data paths to begin with.

02 · What it looks likea public banking platform

One line. Written by a person, in a good codebase.

This is not AI-generated. It is human-written code in a mature, well-run open-source project, which is exactly why it matters: it is the pattern assistants learned from, and the pattern they reproduce.

…/useradministration/service/ForgotPasswordServiceImpl.javaa public banking platform
49 if (user == null) {
50 log.debug("Password reset requested for non-existent or inactive email: {}", email);
51 return;

A reviewer reads this and sees a debug log on a null branch. It is reasonable. It also writes an email address, in the clear, to wherever your logs go: a destination nobody chose, on a path nobody drew.

03 · The answerEVERY COMMIT

Diff the map, not just the code.

A data map is a comparable artefact. Scrutora rebuilds it on every commit, so the question at review time stops being “does this code look right” and becomes something a person can actually answer:

Did this change send personal data somewhere new?

A new edge is a review item. An unchanged map is a merge. That check does not get slower when your team writes more code, however it is written.

data map · email+1 destination since last release
UNCHANGED
Primary datastore
AppUserRepository.java:48parameterised
UNCHANGED
AppUser record · at rest
ForgotPasswordServiceImpl.java:64no encryption asserted
UNCHANGED
Email provider
PlatformEmailService.java:69leaves your estate
NEW THIS RELEASE
Application log
ForgotPasswordServiceImpl.java:50unmasked
04 · In the pipeline

A build failure instead of a breach notification.

The scan runs on your runner and returns SARIF, so a new unprotected destination shows up as an annotation on the pull request that introduced it, next to the diff, while the author still has the context.

scrutora
The data-flow canvas: data elements on the left traced to processing services, storage, and external recipients.
The full map behind the check: every element, every hop, and the outbound calls the engine could not resolve, which it says plainly rather than hiding.
05 · Try it

Run it on the repo your assistant has been writing in.

Nothing leaves your machine. See how the scan works →