Skip to content

Philosophy

As confidential as possible by default, with an opening that is configurable intelligently, progressively and interactively.

That sentence is not a slogan: it is the criterion that settles arbitrations, and it has four operational consequences.

1. Closed by default, always

Everything detected is substituted. No default opens anything — not a threshold, not a heuristic, not a model, not an outage. When in doubt, close.

An outage closes too: if the detector is unreachable, the proxy returns 503 rather than forward text it could not examine.

2. Only the operator opens

Never the model, never an AI, never a shape rule left to itself. An AI may propose — route a doubt, suggest an inventory entry — it does not decide.

This is not caution for its own sake. It follows from an asymmetry:

"Anonymise" "Reveal"
cost free, reversible lets a value out, permanently
error is visible — the agent stumbles, you see it silent — nothing looks wrong
revoking it restores the previous state does not recall what has gone

So revealing is written down, traced, and never inherited from a default.

3. Opening is progressive

Two axes, from narrowest to widest:

flowchart LR
    subgraph granularity
        v[value] --> t[type] --> c[class]
    end
    subgraph scope
        s[session] --> p[project] --> g[global]
    end

The narrowest and the nearest win. This is what makes the system usable: one decision at class level turns thirty questions into one. In a measured session, grouping the queue by type took 462 pending values down to 14 gestures.

4. Opening is interactive, and never blocking

The system anonymises, records the question, and carries on. The operator answers when they want; the answer persists and applies going forward only.

They may also reveal nothing and instead tell the model how to proceed without the value — that is a legitimate answer, and often the right one.

Modes are this philosophy applied

A mode is a named set of settings, never opaque behaviour: it prints, it can be overridden one setting at a time, and it resolves through the same scope hierarchy as the rules.

Mode What it changes
auto substitutes everything without asking; the agent solicits if it gets stuck
consciencieux the request waits for arbitration, with a deadline that anonymises — a lapsed timer never counts as consent
ferme the model is told nothing

No mode can open anything. They choose when the operator is asked, not whether protection applies.

Two corollaries that decide code

An arbitration that pits two principles against each other becomes a setting, not a constant. The textbook case is domaines_fictifs: real TLDs make a fictional domain plausible (D1) at the risk that it really exists; RFC 2606 reserved names guarantee the opposite at the cost of plausibility. Neither is "the right one" — which is exactly why it is configurable.

But a setting still has a default, and the default closes. That one had drifted: the default mode carried the permissive value while the other two carried the safe one, so choosing a mode opened something — the thing the line above says no mode may do. And the engine's own condition tested for the closed value, which made everything not explicitly closed open: no policy, a silent policy, a caller who forgets to pass one. The condition now tests for the OPENING. A fictional domain under a real TLD can name someone's machine exactly as a routable IP can, and that question had already been settled the other way (RFC 2544) without being negotiable.

The general form: write the condition so that the opening is what has to be declared. Same inversion as the walker's list of opaque deltas.

An accepted residual must be counted, never silent. /detect returns public_by_shape: the deduplicated list of tokens a form rule made public, with their span types and the rule at fault. What fails must fail loudly — the only failure mode this project treats as unacceptable is the one nobody can see.