Solutions

Give the agent a copy, never the original.

The only control in the doctrine that reduces what leaves your device is narrowing what an agent can read in the first place. The data layer is how that narrowing is built, generated and checked.

The copy, not the original The live store and a narrowed read-only projection side by side. The agent is given the projection; the path to the original is refused. ORIGINAL the live store PROJECTION narrowed, read-only THE AGENT gets the copy a request that names the original is held, and you are asked

Originals are not an agent’s to open

Nothing an agent needs is in the live stores, so a request that names one is held and you are asked — below the permission list that let it through. The scan notices when the files move.

The projection is generated

A read-only copy, built by a script that reads the capture schema in front of it rather than a list of table names that goes stale.

Three scopes, because it depends

Frames only; text from an allow list of apps; or text from everything except an exclusion list. What the copy carries is a setting, not a default.

The tiers

TierContentsAgent accessMay leave the machine
Originalthe live storesnamed in a command, you are askedno
Replicatedserver-side servicesread; sending asks firstalready has
Projectionreal rows, narrowed, read-onlyreadno
Syntheticfabricated rows, real structureread and writeyes
Scratchagent output, version-controlledread and writeby promotion only

Why the narrowing is a script

Capture schemas move. The doctrine was written against tables a current screen recorder no longer has, and a list of SQL statements aimed at tables that are gone either fails or narrows nothing. The generated script reads the schema in front of it and:

  • drops every full-text index first — a full-text index keeps its own copy of what it indexes, so narrowing the base tables and leaving those behind would ship the text twice;
  • applies one policy per table — keep the row, keep it but blank the text, filter by app, drop it;
  • clears browser URLs in every scope, because a URL carries paths, query strings and tokens;
  • refuses to build when it meets a text column it has no rule for, naming the table — so an upgrade to the recorder cannot widen the projection silently.

Two things are dropped in every scope

Audio. Transcriptions, meetings, speakers and diarization never reach a projection at any setting, because what was said near this machine includes people who never agreed to be recorded. Secrets and plugin output go the same way.

An allow-list beats a deny-list, and by more than it looks. A deny-list only covers the apps you thought of, and browser-based banking and password pages are captured under the browser's own name — so an app-name deny-list never sees them.

The synthetic tier

A corpus that preserves the shape of the capture and message stores without carrying their values. Its defining property is not that it is safer to read — the projection is already safe to read — but that it is the only tier allowed to appear in a screenshot, a bug report, a demo or a public page.

It buys two things the projection cannot. The injection route collapses, because a synthetic corpus contains no text an adversary wrote. And the canary drill becomes valid: an agent can spot a planted instruction when it is the only thing in an otherwise empty folder, which tests noticing rather than resisting.

Status: the fixture, generation on a clone and the declassification gate are built and tested. Per-column treatment, profile rewiring and the coverage metric are not. Synthetic data does not replace the projection, does not answer the questions you actually ask a capture store, and is not a privacy guarantee.