Operating limits & precautions — read before you rely on it¶
NaZelo Trust states, in the code and here, exactly what each control proves and where it stops. None of the limits below is a defect; each is a boundary you must know so you neither over-trust a result nor mis-configure a policy. The rule underneath all of them: enforcement is real, but read what it actually observed, not what you hoped it did.
1. Assurance is a ladder — Enforced is not Attested¶
Each assertion carries an assurance_class, DERIVED from facts, never declared:
| Class | Means |
|---|---|
imported |
a workload's own self-report — proves nothing on its own |
observed |
the enforcer saw it, but did not enforce it |
enforced |
the enforcer applied the control (the common, honest result) |
attested |
enforced AND proven by an adversarial suite on a hardware-isolated (MicroVM) boundary AND anchored by an external witness |
enforced is the ceiling for a bwrap/namespace run. attested needs the MicroVM
posture + an external witness (Rekor/TSA/SCITT). If the enforcer acted but its
own evidence could not be read, the run seals observation_status: unavailable
and is capped BELOW attested — enforcement still happened, its proof is
incomplete, and the run says so.
2. TLS without termination sees the host, not the request¶
Under the default SNI mode, the L7 proxy enforces the destination host at
the connection, but the request method, size, body schema, fields and data class
are inside the encryption and are not seen. Such a decision is sealed with
observation_status: unavailable — never presented as if the semantics were
enforced. To enforce method/size/schema/fields/data-class over TLS you must run
the terminating proxy (a per-run CA you control); otherwise those apply only
to cleartext HTTP and to OT protocols.
3. Body checks (schema, fields, data class) see only the read window¶
Rate, schema, field allow-list and data-class rules act on the request body the
proxy reads on the first pass. A body whose declared Content-Length exceeds the
read window is fail-closed (blocked) rather than passed unchecked — safe, but
it means very large bodies are refused, not partially inspected.
4. Data-class detection is deterministic, not semantic — and has two escapes¶
Classification is the DLP approach (deterministic, explainable), by field name and by value:
- By name — a field named
ssn/card_number/diagnosisis classified. A field named exotically (note,x,field_7) escapes name matching. - By value — a value that IS a card number (Luhn-valid), a JWT/AWS/PEM key,
an email or an SSN is caught even in an oddly-named field. It is deliberately
conservative (few false positives), so it can miss a value with no
standard shape. In particular,
criticalcontrol values have no universal value shape (a valve setpoint is just a number).
Therefore, for the values that matter most, the real lock is the deterministic
pair — a body_schema and an allowed_fields allow-list — with the data class
as the semantic net on top, not the sole control. A vertical can add its own
value shapes via register_value_matcher, and any deployment overrides the whole
catalog via NAZELO_DATA_CLASSES.
5. What leaves the machine is YOUR choice, with a safe default¶
Exports are operational, never evidentiary — the sealed Litatoli chain is the
only source of authority, and a collector/SIEM/log being down never authorises an
action nor turns a proof into a non-proof. See DISCLOSURE-POLICY.md:
- Your own SIEM (
--otlp) — you choose the detail (--otlp-disclosure minimal|standard|verbose), safe defaultminimal. - A public transparency log (Rekor/TSA/SCITT) — commitment only, by design:
a public log is permanent and world-readable, so content is never sent (and a
hashedrekordis a digest by format anyway). - A registry you control (customer ledger) — the "publish more" path.
No secret or credential VALUE is ever emitted by any export.
6. JAQ is fail-soft; the base policy always holds¶
Adaptive containment (drift → tighten) is best-effort tightening only. If the telemetry, the drift check, or the atomic re-attach errors, the run keeps the signed base BIM in full force — JAQ never widens, and a JAQ failure never fails the run.
7. Cooperative controls state that they are cooperative¶
The agent-action gate and the SDK action token are cooperative (no valid token, no action) — enforced by the runtime that admits the action, not by a kernel. They are labelled as such; they are not a substitute for a network/kernel boundary, they are the layer above it.
For the formal model of what a run proves see EVIDENCE-CONTRACT.md, and for
what leaves the machine see DISCLOSURE-POLICY.md.