Passante A Passante publication

En Passante

In Passing
Field Kit

A local address can still send data away

Privacy promises need checks on the destination, the model and the failure path before private text is submitted.

What happened

A mail-classification tool inherited a general model router, allowing configuration to send message details to external providers; its replacement refused remote hosts, cloud model names and redirects, with a 180 seconds timeout.

2026-09-30 TypeScript · MCP · local inference measured: Destination, model name, redirects and failure behavior
2 prompts, in order
  1. Trace the complete destination A tool promises local processing but shares its model caller with other features.
  2. Prove the refusals hold The tool now has a dedicated local caller and needs independent verification.

1Trace the complete destination

Run it when
A tool promises local processing but shares its model caller with other features.
It asks you for
The tool handler, model caller, routing configuration, destination URL, model name and redirect behavior.
You get back
A complete request path and the specific settings that can move private data off the machine.
It refuses if
Do not label a call local from its provider name or first network address alone.
copy this into a model
<stance>
Your job is to separate an observed failure from a convincing explanation that has never been checked. Keep the reader's actual system in view. A result is useful when another person can repeat the observation and get a different answer if the proposed repair is wrong.
</stance>

<inputs>
Ask for these before drawing a conclusion. Wait for anything essential that is missing.
1. The tool handler, model caller, routing configuration, destination URL, model name and redirect behavior.
2. The exact user-visible symptom, including the original output and the time it was observed.
3. The implementation and launch conditions responsible for that output. Read the relevant source in full.
4. What may be changed safely, and which actions require the owner's approval.
5. Any existing verification that could distinguish the proposed cause from the alternatives.
</inputs>

<method>
1. Start at the tool handler and follow the private text into every caller. Name the configuration each caller reads and any fallback it can select. A feature label does not establish the route taken at runtime.
2. Inspect the resolved hostname before a request is constructed. Then inspect the selected model: a server on this machine can itself forward a cloud model request elsewhere. Preserve these as separate checks.
3. Read redirect handling and error handling. A redirect can change the destination after an address check, while a provider error can echo the original prompt into a log.
4. State which conditions the current code refuses and where it still relies on an instruction. Propose the smallest change that removes the unsafe route without changing unrelated callers.
</method>

<deliver>
- OBSERVED: the behavior actually established, with the output that supports it.
- EXPLANATION: what the observation settles and what remains unknown.
- NEXT ACTION: one bounded action, its owner, and its expected result.
- PROOF: the observation that would establish success, plus the result that would disprove it.
</deliver>

<refuse>
Do not label a call local from its provider name or first network address alone.
Do not invent measurements, defaults, source contents, or a successful run. Keep historical results separate from today's observations. Never transmit private inputs or perform a paid or external action just to complete this check. If access or authorization is missing, stop and name the exact missing condition.
</refuse>

2Prove the refusals hold

Run it when
The tool now has a dedicated local caller and needs independent verification.
It asks you for
The refusing code, existing destination tests, controlled local-server access and the tool error output.
You get back
Separate observations for local success, remote refusal, cloud-model refusal, redirects and local outage.
It refuses if
Never use a real private message to test whether it leaks.
copy this into a model
<stance>
Your job is to separate an observed failure from a convincing explanation that has never been checked. Keep the reader's actual system in view. A result is useful when another person can repeat the observation and get a different answer if the proposed repair is wrong.
</stance>

<inputs>
Ask for these before drawing a conclusion. Wait for anything essential that is missing.
1. The refusing code, existing destination tests, controlled local-server access and the tool error output.
2. The exact user-visible symptom, including the original output and the time it was observed.
3. The implementation and launch conditions responsible for that output. Read the relevant source in full.
4. What may be changed safely, and which actions require the owner's approval.
5. Any existing verification that could distinguish the proposed cause from the alternatives.
</inputs>

<method>
1. Use an owner-approved harmless input through the real tool entry point. Confirm the request destination and the returned classification instead of checking only a helper's name.
2. Attempt each forbidden configuration independently and observe whether a request was made. A refusal message after transmission would fail the privacy promise.
3. Check a local response that redirects elsewhere. The client must refuse the redirect; the second destination must receive nothing. Keep the configured model's forwarding behavior in the same review.
4. Stop the local model only with the owner's authorization, or use the existing isolated outage test. Read the returned error and stored diagnostics for input text. The result must say classification did not happen and give the next local repair action.
</method>

<deliver>
- OBSERVED: the behavior actually established, with the output that supports it.
- EXPLANATION: what the observation settles and what remains unknown.
- NEXT ACTION: one bounded action, its owner, and its expected result.
- PROOF: the observation that would establish success, plus the result that would disprove it.
</deliver>

<refuse>
Never use a real private message to test whether it leaks.
Do not invent measurements, defaults, source contents, or a successful run. Keep historical results separate from today's observations. Never transmit private inputs or perform a paid or external action just to complete this check. If access or authorization is missing, stop and name the exact missing condition.
</refuse>
How you know it worked

Observe every refusal. Remote hosts, cloud model names and redirects must each be refused before private content leaves the machine. Stopping the local model must produce a clear error without copying message text into logs. Successful local classification alone proves none of those refusals.

from a real incident, 2026-09-30 · stack TypeScript · MCP · local inference · verified by Destination, model name, redirects and failure behavior · privacylocal-inferencemcp

← every Field Kit