Roadmap · forward-lookingan architecture proposal — not what ships today← Trove
A working paper · Applied privacy architecture

The Blindfolded X-Ray

How two deterministic, privacy-first tools — a form-filler that never guesses and a bug-recorder that never sees — combine to let artificial intelligence into a regulated enterprise without ever touching its data.

Subject  Trove × StepStitch Author  Aaron Johnson Date  July 2026 Status  Architecture proposal
Abstract

Regulated enterprises have been told they must choose. They can have the fluency of modern artificial intelligence, or they can keep their customers' data off a vendor's servers — but not both. This paper argues the choice is false. Two existing tools, built independently and to the same unusual creed, already contain the resolution between them. Trove fills forms without ever guessing. StepStitch reproduces software failures without ever seeing the screen. Read together, they describe a single machine: one that lets an AI reason about the shape of a task while remaining permanently blind to its substance — an x-ray that sees the skeleton and never the flesh. What follows is the case for building it.

I
The problem

The wall that regulated work runs into

Ask anyone who has tried to bring automation into a bank, an insurer, or a hospital, and you hear the same sentence in different clothes: "We can't send that to a model." The value a person copies from a distribution statement is a real account number. The form they fill is a real customer. The bug they report happened on a real screen with a real balance on it. The instant any of that leaves the machine — to a cloud model, an analytics endpoint, a session recorder — it has, in the eyes of a compliance officer, already leaked.

So regulated teams do the safe thing, which is the slow thing. They type. They screenshot and redact by hand. They describe bugs in prose that engineering can't reproduce. The tools that would help them are precisely the tools they're forbidden to feed. Modern AI, for this audience, has been an aroma under glass.

The usual escape hatches don't hold. On-premise models are expensive and quickly stale. "We'll just anonymize it first" fails the moment a free-text field carries a name. And the fig leaf of a data-processing agreement doesn't change the physics: once content is on a wire, it can be logged, cached, and subpoenaed. The honest constraint is not "be careful with the data." It is the data must never leave, and the model must never see it.

That sounds like a prohibition on intelligence. This paper's claim is that it is only a prohibition on content — and that content is not where the intelligence needs to look.

A note on scope. Both systems described here exist and run today; the combination does not. This is a design argument backed by the real interfaces of two shipping tools, with proposed code clearly marked as such.
II
Prior art

Two instruments, one creed

They were built for different jobs. One is a Windows desktop tool that fills forms; the other is a web service that turns bug reports into tests. On the surface they share nothing. Underneath, they were designed by the same conscience.

Trove · the deterministic hand
Fills forms, never guesses
  • Reads a form's fields through Windows UI Automation and matches them to a copied document — by exact rule, not by model.
  • When it isn't certain, it abstains out loud: the field turns amber, "check & type," and is never written.
  • It never submits — a human clicks the button — and never touches the network. Everything happens on the machine.
  • Anything read from a scan is treated as a suggestion only, never a trusted value.
StepStitch · the blindfolded eye
Reproduces failures, never sees
  • Turns one bug report into a runnable test by capturing the structure of what happened — clicks, routes, selectors, error types.
  • It captures no screens, no text, no input values, no raw URLs. All text is masked by default; sensitive fields are hard-skipped.
  • It scores whether a bug can actually be reproduced, and drafts — but never acts. Autonomy stays in the customer's own stack.
  • Every capture ships with a scrub report: evidence, not a promise.

Look at what each instrument keeps and what it throws away, and the symmetry becomes hard to unsee. Trove holds a value it is sure of and asks a human before acting. StepStitch holds a structure it is blind through and asks a human before acting. Here is the shape StepStitch actually emits — a "footstep." Note what is present, and what is conspicuously absent.

Figure 1 — StepStitch footstep event shipping · contracts/stepstitch.md
{
  "timestamp": "2026-06-02T08:00:00.000Z",
  "type": "click",                        // navigation | click | input | api_error | exception
  "route": "/accounts/:id",             // templated — never the raw URL
  "target": "[data-testid=\"pay\"]",     // a stable, structural selector
  "label": "[masked]",                  // text is masked unless explicitly opted in
  "metadata": { "status": 500, "method": "POST", "error_type": "TypeError" }
}
The event is pure skeleton. It knows a payment button was clicked on an account route and the server answered 500. It does not know whose account, what amount, or what the page said. This is "x-ray vision" as a data structure.

And here is Trove's answering gate — the single line that enforces "never guess." A field is fillable only when the source value is exact and the label match is confident. Anything less routes to human review.

Figure 2 — Trove's two-gate fill rule shipping · ReviewRow.cs
// A field auto-fills only when BOTH gates pass: the value is exact (Ok, not an
// unverified scan) AND the label match is confident (not a weak guess).
public bool IsFillable =>
    SelectedField?.Status == FieldStatus.Ok && _selectionConfident;
Two independent locks, both required. It is the deterministic conscience of the tool expressed in one expression — and, as we'll see, the exact place an AI's proposal is allowed to knock but never to enter.
III
The idea

The convergent principle

Strip both tools to their creed and you get the same four vows, arrived at independently. This convergence is the intellectual core of the paper: it is not a coincidence that two privacy-first tools rhyme. It is that there is essentially one correct posture for software that must be trusted with regulated work, and both tools found it.

Vow 1
Act on structure, never on content

Trove matches on field labels and shapes; StepStitch records selectors and routes. Neither needs the values to do its job.

Trove: match by labelStepStitch: capture by selector
Vow 2
Draft and propose, never act autonomously

Trove proposes a fill and stops; StepStitch "perceives, scores, compiles, and drafts, but never plans or acts."

Trove: never submitsStepStitch: provider, not agent
Vow 3
The human is the gate

A person clicks Submit in Trove; a person approves the pull request in StepStitch. Oversight is structural, not optional.

Trove: review overlayStepStitch: PR review
Vow 4
Data stays home; the model gets nothing raw

Trove never opens a socket; StepStitch scrubs before storage and keeps "auth in your stack, not the model."

Trove: fully offlineStepStitch: scrub-before-store

Once you see the four vows as a shared foundation, the two tools stop looking like neighbors and start looking like two organs of one body. Trove is a hand that fills. StepStitch is an eye that sees structure while blind to content. The paper's proposal is simply to connect the eye to the hand — and to let a mind reason in between, on the one thing that is safe to show it.

IV
The mechanism

Blind but x-ray vision

Here is the crux. Trove today deliberately refuses artificial intelligence. It uses hand-written deterministic rules to match labels, and it rejected fuzzy matching precisely because a model that sees a value might confidently fill the wrong one. The refusal is correct — given the assumption that letting AI help means letting AI see the data.

StepStitch breaks that assumption. It has already solved, for a different domain, the problem of producing a rich, machine-readable description of a screen that contains no content at all — only structure. Its "x-ray" is exactly the kind of artifact a model can reason over safely, because there is nothing sensitive in it to leak.

So the fusion is this: let StepStitch's blinded x-ray be the only thing the AI ever sees. The model receives the skeleton of a form — its fields, roles, selectors, layout, route — with every value masked. It proposes how the pieces map. That proposal enters Trove not as an action but as a suggestion, landing in the same amber "check & type" review that a weak deterministic guess already lands in. The deterministic gate and the human still decide. The model has helped without ever holding a secret.

The AI sees the shape of the lock and suggests which key fits. It never sees what the box contains, and it never turns the key.

Concretely, this rides on infrastructure StepStitch already exposes: a Model Context Protocol server whose operations are read-only or draft, consumable by "any MCP client — Copilot, OpenAI, Vertex, Bedrock, Claude." The boundary is already drawn in the right place. Below is the proposed bridge — the one new contract — expressed against the two tools' real types.

Figure 3 — The proposed bridge: perceive → draft → gate proposed
// The model is handed ONLY a scrubbed structural x-ray of the form.
// No value, no page text, no raw URL is ever present in this payload.
interface FormXRay {
  route:   string;              // "/transfers/:id"  (templated)
  fields:  {
    selector:   string;         // "[data-testid=payee]" — structural
    role:       string;         // "textbox" | "combobox" | ...
    labelHash:  string;         // one-way hash of the caption, not the caption
    value:      "[masked]";      // ALWAYS masked — StepStitch's guarantee
    fragility:  number;         // 0..1 selector-stability risk (Fragility Radar)
  }[];
}

// The model returns a SUGGESTION CLASS, never a write.
interface MappingDraft {
  selector:   string;
  sourceKey:  string;           // which copied field it believes maps here
  confidence: "suggest";        // literally cannot be "fill" — type-enforced
  reason:     string;           // human-readable, auditable
}

// Trove's gate is unchanged. A draft can only ever become amber review:
row._selectionConfident = false;   // AI drafts are never "confident"
// => IsFillable stays false => the human checks & types. Vow 1–4 intact.
The single new idea is a type that cannot express "fill." The model's most confident possible output is still just a suggestion, and Trove's existing two-gate rule turns every suggestion into human-reviewed amber. The intelligence is additive; the safety is unchanged by construction.

The elegance is that nothing in Trove's guarantee has to be re-argued. Its conscience — Status == Ok && _selectionConfident — already treats un-confident input as review-only. The AI simply becomes a very good source of un-confident suggestions on forms Trove was never taught. It widens the funnel of "things worth showing the human," and touches nothing below the gate.

V
Capabilities

What the fusion can do

With the eye connected to the hand and a blind model reasoning between them, a set of capabilities opens that neither tool can reach alone — and that directly repair Trove's known weaknesses.

Understand forms it was never taught

Today Trove abstains on any form outside its vocabulary. Fed a scrubbed x-ray, a model proposes mappings for arbitrary forms — a benefits portal, a claims screen, a vendor onboarding page — that arrive as amber suggestions for the operator to confirm.

directly fixes Trove's "safe but thin on unseen forms" adoption risk

AI help with a provable blindfold

The compliance headline: the enterprise gets model-grade form comprehension while the model provably never receives one customer value — because StepStitch masks and scrubs before anything is assembled. "Never leaves the machine" becomes "content never leaves; only the skeleton is reasoned over."

turns Trove's hardest objection ("we can't use AI") into a selling point

A fillability grade before the first keystroke

StepStitch already computes a deterministic replayability score (0–1, graded A–F) from structural signals. Repurposed, it tells an operator "this form is a B — expect two fields to need typing" before Trove touches it. A number reviewers can trust, not a vibe.

reuses replayability.py as fill-confidence

Immunity to form drift

Trove's learned mappings break when a form's markup changes. StepStitch's Fragility Radar already ranks selectors by durability (a data-testid is stable; an nth-of-type path is brittle). Wire it in, and Trove learns durable anchors, warns when a known form has shifted, and asks to re-learn before it silently misfills.

borrows Fragility Radar to harden the mapping store

Fill recipes you can test in CI

StepStitch compiles a scrubbed, runnable Playwright reproduction. The same compiler turns a taught Trove form into a portable, versioned, replayable fill recipe — an artifact you can diff, test on every release, and distribute to the fleet, instead of an opaque learned blob.

reuses compiler.py to make mappings auditable assets

One evidence receipt for every action

Trove proves "false-confidence = 0" through its audit; StepStitch attaches a scrub report to every capture. Unify them and every fill and every capture ships with a signed, scrubbed evidence record — the single artifact an InfoSec reviewer actually wants.

merges Trove's audit with StepStitch's evidence-attestation

Desktop and web, one privacy model

Trove reaches native Windows apps and embedded browsers through UI Automation; StepStitch reaches any web app through the DOM. Together they cover the whole surface an operator faces in a day — legacy desktop, modern SPA — under one blindfold.

unites UIA reach with DOM reach

Trove becomes safely AI-consumable

StepStitch's "capability provider, not orchestrator" pattern is exactly how to expose Trove to an agent: an AI can ask Trove to perceive a form, grade it, and draft a plan — but Trove still never submits, and the human still gates. The safe boundary is copied, not reinvented.

applies the MCP provider boundary to Trove itself

Six of these eight are not new engineering so much as re-pointing a StepStitch component at a Trove problem. That is the tell of a real fit: the parts already have the right shape.

VI
The system

An architecture of restraint

The whole design can be drawn as one rule: the model lives outside the value plane. Content — the real names, numbers, and balances — flows only along the bottom track, on the operator's machine, and never crosses up. Structure — the blinded x-ray — is the only thing that ever rises to where a model can reason.

Figure 4 — Two planes, one crossing that is guarded proposed topology
┌─ THE MODEL PLANE ── (may be cloud; sees structure only) ───────────────┐
     AI via MCP  ◀── FormXRay (masked) ──┐        proposes MappingDraft
        │  reasons over skeleton        │              │ (class: "suggest")
        ▼                               │              ▼
   "payee ← Reissue Payee?"              │        amber review only
└───────────────────────────────────────┼──────────────┼─────────────────┘
                                        │  scrub &     │  never a write
                                        │  mask        │
┌─ THE VALUE PLANE ── (the operator's machine; never leaves) ────────────┐
   copied document ─▶ StepStitch capture ─▶ x-ray ──┘              │
                                                                         ▼
   real values ───────────────────────▶ Trove fill ─▶ two-gate ─▶ human clicks Submit
└────────────────────────────────────────────────────────────────────────┘

  Rule of the crossing:  UP may carry only  [structure, masked]
                         DOWN may carry only [a suggestion, never an action]
Everything sensitive stays on the lower plane, on-device. The only thing that ascends to the model is a masked skeleton; the only thing that descends is an un-actionable suggestion. Remove the AI entirely and the value plane still works exactly as Trove does today — the intelligence is a strictly optional upper story.

This is why the design is conservative rather than reckless. It does not make Trove trust a model. It makes a model useful to Trove under Trove's existing distrust. The safety properties are not weakened and then patched back; they are never weakened at all, because the model is architecturally denied both the data and the trigger.

Figure 5 — The adapter-safe projection StepStitch already enforces shipping · TraceSummary
// StepStitch's core never lets a downstream consumer see raw content.
// The SAME discipline governs what an AI may receive in the fusion.
TraceSummary = flat_scalars_only(trace)          # projection, not the trace
FORBIDDEN = { "footsteps", "explanation_raw", "user_id",
              "request_body", "response_body", "target",
              "selectors", "raw_url" }        # dropped, always
assert FORBIDDEN.isdisjoint(TraceSummary.keys())   # enforced, not hoped
The precedent matters: StepStitch already ships the habit of proving, by assertion, that forbidden content cannot reach a consumer. The fusion inherits that habit rather than inventing a new promise.
VII
Honest limits

Where this can still go wrong

A design that only lists its strengths is marketing. The fusion has real hazards, and naming them is part of the argument that it can be built responsibly.

The blindfold is only as good as the scrubbing

The entire safety case rests on one claim: that the x-ray truly contains no content. A single un-masked label, a value that leaks through a selector, an opt-in unmask left on by accident — and a real datum reaches the model. This must be defended the way Trove defends "false-confidence = 0": by adversarial tests and a scrub report checked on every payload, not by trust. It is the first thing an InfoSec reviewer should try to break.

A structure can still be sensitive

Rarely, shape itself is content — a route like /oncology/:patient reveals a diagnosis by its path. Route templating helps, but the fusion must treat structural metadata as capable of leaking, and let the strictest deployment profile drop it.

Adding AI re-opens the exact risk Trove was built to close

Trove's discipline is a feature. The moment a model proposes mappings, there is pressure to "just auto-fill the high-confidence ones." That pressure must be refused at the type level, as in Figure 3 — a draft that cannot be a fill — or the whole guarantee erodes one convenience at a time.

Two codebases, two languages, one license to check

Trove is .NET on Windows; StepStitch is Python and TypeScript, Apache-2.0. The bridge is real integration work, and the licensing boundary — what may be combined, and how it is distributed to a client — is a question for counsel before it is a question for engineering.

Both are early, and unproven together

Neither tool has met a broad user base; the combination has met none. This paper describes a credible machine, not a shipped one. The correct next step is a single narrow pilot on one real form, not a platform launch.

VIII
The living picture

What this could be

Judged alone, Trove is a tool of unusual discipline that has not yet met a real form. StepStitch is a second instance of the same rare instinct, aimed at a different wound. The interesting question is not what each is, but what they become together — and that is easier to run than to assert. The fusion resolves a contradiction the whole industry treats as a law — AI fluency versus data sovereignty — not with a compromise but with a boundary that was already, independently, drawn twice. Here is that boundary, live. Press run. Then try to break it.

Figure 6 — The crossing, live · run the loop, click any node, then try to break itproposed · interactive
THE MODEL PLANE may be cloud · sees structure only THE VALUE PLANE the operator's machine · never leaves UP may carry only [structure, masked] DOWN may carry only [a suggestion, never an action] SCRUB & MASK NEVER A WRITE AI VIA MCP reasons over the skeleton COPIED DOCUMENT parsed on-device STEPSTITCH X-RAY route · selector · [masked] TROVE REVIEW amber · check & type THE HUMAN ✓ clicks Submit — always 17 values · stay home FormXRay · value:"[masked]" MappingDraft · confidence:"suggest" checked & typed "5,316.49" · raw value
the loop, completed — no value ever crossed the line
The whole thesis as a machine you can poke. Values stay on the lower plane; only a masked skeleton ascends; only an un-actionable suggestion descends; the one Submit belongs to a person. Click any node or gate for its receipts — then try to smuggle a value past the crossing. It will refuse. The refusal is the feature.

The deeper point is that this was never two products. It is one idea — see the structure, stay blind to the substance, propose but never act, keep the data home — that happened to be discovered twice, in two languages, for two jobs. Naming that idea, and building the bridge that lets a model stand safely inside it, is the work. For the audience that has spent a decade being told they must choose between intelligence and integrity, it is also the pitch: you were never actually asked to choose.


Recommended next step

One form. One operator. Trove fills it deterministically as it does today; StepStitch captures its x-ray; a blinded model proposes the two mappings Trove couldn't. Measure whether the suggestions help, and whether the scrub report survives a hostile read. That single loop is the whole thesis, testable in a week.