@nvisy/sdk 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4578,7 +4578,7 @@ interface paths {
4578
4578
  * here; labels are re-derived from the policy set on each
4579
4579
  * anonymize call.
4580
4580
  *
4581
- * No [`Default`] a well-formed audit must carry a real
4581
+ * No [`Default`]: a well-formed audit must carry a real
4582
4582
  * [`AuditContext`] with a real correlation id. Callers building
4583
4583
  * an audit outside the analyze path construct it explicitly.
4584
4584
  */
@@ -5226,7 +5226,9 @@ interface paths {
5226
5226
  /**
5227
5227
  * @description Request payload for updating an existing workspace policy.
5228
5228
  *
5229
- * Replacing the `definition` replaces the whole policy body.
5229
+ * Replacing the `definition` replaces the whole policy body. The policy's
5230
+ * template origin is server-owned and preserved across updates — it is not
5231
+ * settable here.
5230
5232
  */
5231
5233
  requestBody: {
5232
5234
  content: {
@@ -8113,195 +8115,137 @@ interface components {
8113
8115
  token: string;
8114
8116
  };
8115
8117
  /**
8116
- * @description Author-supplied rationale for a redaction: a policy name and an optional
8117
- * description.
8118
+ * @description Author-supplied rationale for a redaction: *under what authority* it was made.
8118
8119
  *
8119
8120
  * Where the matched selection rule answers *which rule fired*, an
8120
- * `Attribution` answers *under what authority* — a compliance clause, an
8121
+ * `Attribution` answers *why the policy demanded it* — a compliance clause, an
8121
8122
  * internal policy, a data-handling rule. A policy author attaches it to a
8122
- * selection rule (`Rule::because` in `elide-redaction`); the anonymizer
8123
- * records it on the entity's [`Redaction`] event so an audit can trace a
8124
- * change back to the policy that demanded it.
8123
+ * selection rule (`Rule::because` in `elide-redaction`); the anonymizer records
8124
+ * it on the entity's [`Redaction`] event so an audit can trace a change back to
8125
+ * the policy that demanded it.
8125
8126
  *
8126
- * The `name` is the author's label for that policy (`"gdpr-art-17"`,
8127
- * `"hipaa-safe-harbor"`, `"PII removal"`); an optional `description` adds
8128
- * human context. Any stable machine identity a policy layer needs (a rule
8129
- * UUID, a jurisdiction) is that layer's concern — it can encode it in the
8130
- * name or carry it separately.
8127
+ * The rationale takes one of two [`kind`](Attribution::kind)s, by how much
8128
+ * structure the author has ([`AttributionKind::Freeform`] /
8129
+ * [`AttributionKind::Cited`]). Orthogonal to that, an attribution may carry a
8130
+ * [`source_id`](Attribution::source_id): an opaque, caller-owned [`Uuid`] the
8131
+ * policy layer uses to link back to a source record (a rule, a request, a
8132
+ * document). elide-core stores and hashes it verbatim; it never resolves or
8133
+ * validates it.
8131
8134
  *
8132
- * [`Redaction`]: crate::entity::provenance::EventKind::Redaction
8135
+ * [`Redaction`]: crate::entity::audit::AuditKind::Redaction
8133
8136
  */
8134
8137
  Attribution: {
8138
+ /** @description The shape of the rationale: a freeform label or a formal citation. */
8139
+ kind: components["schemas"]["AttributionKind"];
8140
+ /**
8141
+ * Format: uuid
8142
+ * @description Opaque, caller-owned link to a source record, when given.
8143
+ */
8144
+ source_id?: string;
8145
+ };
8146
+ /** @description The shape of an [`Attribution`]'s rationale. */
8147
+ AttributionKind: {
8135
8148
  /** @description Human-readable description (e.g. `"right to erasure"`), when given. */
8136
8149
  description?: string;
8150
+ /** @constant */
8151
+ kind: "freeform";
8137
8152
  /** @description The policy's name (e.g. `"gdpr-art-17"`, `"hipaa-safe-harbor"`). */
8138
8153
  name: string;
8139
- };
8140
- /**
8141
- * @description Per-call payload a recognizer inspects for the [`Audio`] modality.
8142
- *
8143
- * Carries the encoded audio bytes; an optional filename aids diagnostics
8144
- * and encoding inference (the container format a decoder should expect).
8145
- * The recognizable text — a timestamped transcript — is *not* held here;
8146
- * a speech-to-text [`Enricher`] stamps it onto the call's
8147
- * [`artifacts`], keeping
8148
- * `AudioData` the codec's payload alone.
8149
- *
8150
- * [`Audio`]: super::Audio
8151
- * [`Enricher`]: crate::recognition::Enricher
8152
- * [`artifacts`]: crate::recognition::RecognizerContext::artifacts
8153
- */
8154
- AudioData: {
8155
- /** @description Original filename, when known. */
8156
- filename?: string;
8157
- };
8158
- /**
8159
- * @description Detected piece of sensitive information within some medium.
8160
- *
8161
- * Generic over the [`Modality`] `M`, which is what makes the model
8162
- * multimodal: a text pipeline yields `Entity<Text>`, an audio pipeline
8163
- * `Entity<Audio>`, and so on. The entity's location is the modality's
8164
- * [`Location`] type, `M::Location`.
8165
- *
8166
- * # Birth and fusion
8167
- *
8168
- * A recognizer emits an entity directly, carrying a single recognition
8169
- * [`Event`] (its own finding) in the entity's [`provenance`]. When
8170
- * several recognizers find the same thing, a fusion step (in
8171
- * `elide`) combines their entities into one: the survivor's
8172
- * [`location`] and [`confidence`] are the *fused* values, and every
8173
- * contributing recognition event, plus a deduplication event, is
8174
- * retained in its provenance. The entity therefore carries its full
8175
- * audit trail with it.
8176
- *
8177
- * [`Location`]: Modality::Location
8178
- * [`Event`]: crate::entity::provenance::Event
8179
- * [`provenance`]: Entity::provenance
8180
- * [`location`]: Entity::location
8181
- * [`confidence`]: Entity::confidence
8182
- */
8183
- AudioEntity: {
8184
- /** @description Effective confidence in `0.0..=1.0` (fused, if applicable). */
8185
- confidence: components["schemas"]["Confidence"];
8186
- /**
8187
- * @description Coreference identifier, if a recognizer resolved this entity as one
8188
- * mention of a cluster. Entities sharing an [`EntityCoRef`] denote the
8189
- * same real-world thing.
8190
- */
8191
- coref?: components["schemas"]["EntityCoRef"];
8192
- /**
8193
- * Format: uuid
8194
- * @description Stable unique identity for this entity (time-ordered UUIDv7), minted
8195
- * when the entity is assembled.
8196
- */
8197
- id: string;
8198
- /**
8199
- * @description What kind of sensitive information this is (resolved via a
8200
- * [`LabelCatalog`]).
8201
- */
8202
- label: components["schemas"]["LabelRef"];
8203
- /**
8204
- * @description The language of this entity's surrounding text, when a recognizer
8205
- * resolved one. `None` when unknown or language-agnostic.
8206
- */
8207
- language?: string;
8208
- /**
8209
- * @description Location of the entity within the medium (fused, if it came from more
8210
- * than one detection).
8211
- */
8212
- location: components["schemas"]["AudioLocation"];
8213
- /**
8214
- * @description Detection audit trail: every contributing detection and the fusion
8215
- * event, if any.
8154
+ } | {
8155
+ /** @description The authority cited (e.g. `"GDPR"`, `"HIPAA"`, `"internal-policy"`). */
8156
+ authority: string;
8157
+ /** @description The citation within that authority (e.g. `"Art. 17(1)"`, `"§164.514"`). */
8158
+ citation: string;
8159
+ /** @constant */
8160
+ kind: "cited";
8161
+ /** @description Why the citation applies here (e.g. `"data subject requested erasure"`). */
8162
+ rationale: string;
8163
+ };
8164
+ /**
8165
+ * @description One node in an entity's audit DAG: a thing that happened, with its
8166
+ * effect on confidence and its tamper-evident links.
8167
+ *
8168
+ * Events are recorded on an entity's [`AuditLog`], forming the full audit
8169
+ * trail of its life: each recognizer that found it, the deduplication that
8170
+ * fused them, any score calibration, and the redaction that hid it. The
8171
+ * uniform spine (who, resulting score, when) is the same for every event; the
8172
+ * [`kind`] carries the event-specific detail *and* the explanation of why the
8173
+ * event happened.
8174
+ *
8175
+ * Each event links to its [`parents`] by their [`hash`]: a birth event (a
8176
+ * recognizer's first detection) has no parents, a normal step has one, and a
8177
+ * [fusion](crate::entity::audit::AuditLog::record_fusion) has several. Its own
8178
+ * [`hash`] folds the
8179
+ * payload together with the parents' hashes, so altering any event breaks
8180
+ * every event downstream of it: [`AuditLog::verify`] walks the DAG and
8181
+ * reports the first break.
8182
+ *
8183
+ * `entity.confidence` always equals the [`confidence`] of the most recent
8184
+ * event. The confidence *flowing in* is not stored: it is the parents'
8185
+ * [`confidence`], recovered from the DAG.
8186
+ *
8187
+ * [`AuditLog`]: crate::entity::audit::AuditLog
8188
+ * [`AuditLog::record_fusion`]: crate::entity::audit::AuditLog::record_fusion
8189
+ * [`AuditLog::verify`]: crate::entity::audit::AuditLog::verify
8190
+ * [`kind`]: AuditEvent::kind
8191
+ * [`parents`]: AuditEvent::parents
8192
+ * [`hash`]: AuditEvent::hash
8193
+ * [`confidence`]: AuditEvent::confidence
8194
+ */
8195
+ AudioAuditEvent: {
8196
+ /**
8197
+ * @description Confidence after this event: the entity's effective confidence once it
8198
+ * has happened.
8216
8199
  */
8217
- provenance: components["schemas"]["AudioProvenance"];
8200
+ confidence: components["schemas"]["Confidence"];
8218
8201
  /**
8219
- * @description Byte range of the match in the *recognized text* it was found in (the
8220
- * OCR layout text, the audio transcript, or the text payload itself) —
8221
- * the stable key back into that enrichment artifact, where the rich
8222
- * context lives (which OCR block, which speaker) that the geometric
8223
- * [`location`] cannot hold. `None` for entities not found via text
8224
- * recognition (e.g. a VLM box). Provenance, not a coordinate: redaction
8225
- * uses [`location`]; an audit uses this with the artifact.
8202
+ * @description This event's hash, over its payload and its parents' hashes. Assigned by
8203
+ * [`AuditLog`] when the event is recorded; read it through
8204
+ * [`hash`](Self::hash). Recomputing it is how the DAG is verified.
8226
8205
  *
8227
- * [`location`]: Entity::location
8228
- */
8229
- recognized_range?: components["schemas"]["Range_of_uint"];
8230
- };
8231
- /**
8232
- * @description One recognized entity plus the optional reviewer override.
8233
- *
8234
- * The bound mirrors elide's [`Entity<M>`]: serialization needs
8235
- * `M::Location` and `M::Data` (de)serializable, and JsonSchema
8236
- * derivation needs them schema-able. All four modalities elide
8237
- * ships satisfy these under the `serde` + `schema` features.
8238
- */
8239
- AudioEntityRecord: {
8240
- /** @description The elide entity, as recognition produced it. */
8241
- entity: components["schemas"]["AudioEntity"];
8242
- /**
8243
- * @description Reviewer-supplied redaction override.
8206
+ * Not publicly settable: only [`AuditLog`] assigns it, so a caller cannot
8207
+ * forge a self-consistent event outside the recording path.
8244
8208
  *
8245
- * `None` means "use the matching policy rule's decision";
8246
- * `Some(...)` overrides that rule for this specific entity
8247
- * at apply time. Reviewer overrides take precedence over
8248
- * every policy rule and inherit the authority of the
8249
- * [`Review::policy_id`] they name — the audit event's
8250
- * attribution stamps that policy so the trail names the
8251
- * authority under which the override fired.
8209
+ * [`AuditLog`]: crate::entity::audit::AuditLog
8252
8210
  */
8253
- review?: components["schemas"]["Review"];
8254
- };
8255
- /**
8256
- * @description One thing that happened to an entity, with its effect on confidence.
8257
- *
8258
- * Events are recorded in order on an entity's [`Provenance`], forming
8259
- * the full audit trail of its life: each recognizer that found it, the
8260
- * deduplication that fused them, any score calibration, and the
8261
- * redaction that hid it. The uniform spine (who, before/after score,
8262
- * when, why) is the same for every event; the [`kind`] carries the
8263
- * event-specific detail.
8264
- *
8265
- * `entity.confidence` always equals the [`after`] of the most recent
8266
- * event.
8267
- *
8268
- * [`Provenance`]: crate::entity::provenance::Provenance
8269
- * [`kind`]: Event::kind
8270
- * [`after`]: Event::after
8271
- */
8272
- AudioEvent: {
8273
- /** @description Confidence after this event. */
8274
- after: components["schemas"]["Confidence"];
8275
- /** @description When the event happened (UTC). */
8276
- at: string;
8211
+ hash: components["schemas"]["AuditHash"];
8212
+ /** @description Kind of event, with its event-specific detail and its rationale. */
8213
+ kind: components["schemas"]["AudioAuditKind"];
8277
8214
  /**
8278
- * @description Confidence before this event, if there was a prior value. `None` on
8279
- * the first (birth) event.
8215
+ * @description The events this one follows, by their hash. Empty for a birth event, one
8216
+ * entry for a normal step, several for a fusion. Assigned by [`AuditLog`]
8217
+ * when the event is recorded; read it through [`parents`](Self::parents).
8218
+ *
8219
+ * Not publicly settable: the links are the tamper-evident structure, so
8220
+ * only [`AuditLog::record`] / [`AuditLog::record_fusion`] assign them.
8221
+ *
8222
+ * [`AuditLog`]: crate::entity::audit::AuditLog
8223
+ * [`AuditLog::record`]: crate::entity::audit::AuditLog::record
8224
+ * [`AuditLog::record_fusion`]: crate::entity::audit::AuditLog::record_fusion
8280
8225
  */
8281
- before?: components["schemas"]["Confidence"];
8282
- /** @description Kind of event, with its event-specific detail. */
8283
- kind: components["schemas"]["AudioEventKind"];
8284
- /** @description Free-text explanation of what the event did and why. */
8285
- reason: string;
8226
+ parents: components["schemas"]["AuditHash"][];
8286
8227
  /**
8287
8228
  * @description Who produced this event: a recognizer name, a deduplication strategy,
8288
8229
  * an operator, or whatever acted.
8289
8230
  */
8290
8231
  source: string;
8232
+ /** @description When the event happened (UTC). */
8233
+ timestamp: string;
8291
8234
  };
8292
8235
  /**
8293
- * @description Kind of an [`Event`], carrying its event-specific detail.
8236
+ * @description Kind of an [`AuditEvent`], carrying its event-specific detail and the
8237
+ * rationale for why it happened.
8294
8238
  *
8295
8239
  * `#[non_exhaustive]`: new event kinds (verification, annotation, …)
8296
8240
  * can be added compatibly. The recognition kinds ([`Pattern`],
8297
8241
  * [`Model`]) carry the matched [`Location`]; the rest carry their own
8298
8242
  * data.
8299
8243
  *
8300
- * [`Pattern`]: EventKind::Pattern
8301
- * [`Model`]: EventKind::Model
8244
+ * [`Pattern`]: AuditKind::Pattern
8245
+ * [`Model`]: AuditKind::Model
8302
8246
  * [`Location`]: Modality::Location
8303
8247
  */
8304
- AudioEventKind: {
8248
+ AudioAuditKind: {
8305
8249
  /** @constant */
8306
8250
  kind: "pattern";
8307
8251
  /** @description Where the recognizer matched. */
@@ -8365,7 +8309,7 @@ interface components {
8365
8309
  * it is the keyword resolved through the modality's [`locate`] (a
8366
8310
  * pixel box for image, a time span for audio, the byte range for
8367
8311
  * text/tabular). `None` when the keyword's stream range could not be
8368
- * placed symmetric with a match the recognizer itself drops.
8312
+ * placed, symmetric with a match the recognizer itself drops.
8369
8313
  *
8370
8314
  * [`locate`]: crate::modality::TextRecognizable::locate
8371
8315
  */
@@ -8383,12 +8327,176 @@ interface components {
8383
8327
  /** @description How much the output leaks about the original. */
8384
8328
  leak_profile: components["schemas"]["LeakProfile"];
8385
8329
  /**
8386
- * @description Which selection rule chose this operator the automatic "why"
8330
+ * @description Which selection rule chose this operator: the automatic "why"
8387
8331
  * (matched a label, a tag, a predicate, or the fallback).
8388
8332
  */
8389
8333
  matched_by: components["schemas"]["RuleMatch"];
8390
8334
  /** @description Which operator (name + version) ran. */
8391
8335
  operator: components["schemas"]["OperatorId"];
8336
+ /**
8337
+ * @description BLAKE3 digest of the original text the operator hid, when the
8338
+ * redaction layer recorded it. Proves *what* was redacted without
8339
+ * storing the plaintext; `None` when the operator did not capture it.
8340
+ */
8341
+ span_hash?: components["schemas"]["AuditHash"];
8342
+ /**
8343
+ * Format: uint32
8344
+ * @description Byte length of the original text the operator hid, paired with
8345
+ * [`span_hash`](Self::Redaction::span_hash). `None` when not captured.
8346
+ */
8347
+ span_length?: number;
8348
+ };
8349
+ /**
8350
+ * @description Full audit trail of an [`Entity`]: every [`AuditEvent`] in its life, as a
8351
+ * tamper-evident DAG.
8352
+ *
8353
+ * Where Presidio keeps a shallow, optional, per-stage explanation that is
8354
+ * stripped by default, an `AuditLog` is always present and records the
8355
+ * entity's *entire* life: each recognizer that found it, the deduplication
8356
+ * that fused them, any confidence calibration, and the redaction that hid it.
8357
+ * Nothing is collapsed: every recognizer keeps its own recognition event with
8358
+ * its location and score.
8359
+ *
8360
+ * The events form a **directed acyclic graph**, not a flat list. A recognizer
8361
+ * records a birth event (no parents); each later step links to the event it
8362
+ * follows; and a [fusion](Self::record_fusion) links to *several* parents at
8363
+ * once: the heads of the trails it combines. This is the true shape of a
8364
+ * deduplicated entity: two recognizers are siblings, then a fusion joins them.
8365
+ * The events are stored in the order they were recorded, which is a
8366
+ * topological order of the DAG (a parent is always recorded before its
8367
+ * children).
8368
+ *
8369
+ * Two chains ride the DAG's edges:
8370
+ *
8371
+ * - a **confidence chain**, where each event's [`confidence`] is the entity's
8372
+ * effective score after it; the score flowing *in* is its parents'
8373
+ * confidence, so [`final_confidence`] and the full history are recoverable;
8374
+ * - a **hash chain**, where each event's [`hash`] folds its payload together
8375
+ * with its parents' hashes, so any edit, reorder, insertion, or deletion of
8376
+ * an earlier event breaks every event downstream. [`verify`] walks the DAG
8377
+ * and reports the first break.
8378
+ *
8379
+ * [`Entity`]: crate::entity::Entity
8380
+ * [`confidence`]: AuditEvent::confidence
8381
+ * [`hash`]: AuditEvent::hash
8382
+ * [`final_confidence`]: Self::final_confidence
8383
+ * [`verify`]: Self::verify
8384
+ */
8385
+ AudioAuditLog: components["schemas"]["AudioAuditEvent"][];
8386
+ /**
8387
+ * @description Per-call payload a recognizer inspects for the [`Audio`] modality.
8388
+ *
8389
+ * Carries the encoded audio bytes; an optional filename aids diagnostics
8390
+ * and encoding inference (the container format a decoder should expect).
8391
+ * The recognizable text — a timestamped transcript — is *not* held here;
8392
+ * a speech-to-text [`Enricher`] stamps it onto the call's
8393
+ * [`artifacts`], keeping
8394
+ * `AudioData` the codec's payload alone.
8395
+ *
8396
+ * [`Audio`]: super::Audio
8397
+ * [`Enricher`]: crate::recognition::Enricher
8398
+ * [`artifacts`]: crate::recognition::RecognizerContext::artifacts
8399
+ */
8400
+ AudioData: {
8401
+ /** @description Original filename, when known. */
8402
+ filename?: string;
8403
+ };
8404
+ /**
8405
+ * @description Detected piece of sensitive information within some medium.
8406
+ *
8407
+ * Generic over the [`Modality`] `M`, which is what makes the model
8408
+ * multimodal: a text pipeline yields `Entity<Text>`, an audio pipeline
8409
+ * `Entity<Audio>`, and so on. The entity's location is the modality's
8410
+ * [`Location`] type, `M::Location`.
8411
+ *
8412
+ * # Birth and fusion
8413
+ *
8414
+ * A recognizer emits an entity directly, carrying a single recognition
8415
+ * [`AuditEvent`] (its own finding) in the entity's [`audit`] trail. When
8416
+ * several recognizers find the same thing, a fusion step (in
8417
+ * `elide`) combines their entities into one: the survivor's
8418
+ * [`location`] and [`confidence`] are the *fused* values, and every
8419
+ * contributing recognition event, plus a deduplication event, is
8420
+ * retained in its audit trail. The entity therefore carries its full
8421
+ * audit trail with it.
8422
+ *
8423
+ * [`Location`]: Modality::Location
8424
+ * [`AuditEvent`]: crate::entity::audit::AuditEvent
8425
+ * [`audit`]: Entity::audit
8426
+ * [`location`]: Entity::location
8427
+ * [`confidence`]: Entity::confidence
8428
+ */
8429
+ AudioEntity: {
8430
+ /**
8431
+ * @description Tamper-evident audit trail: every contributing detection, the fusion
8432
+ * event if any, and the redaction that hid it, as a hash-linked DAG.
8433
+ */
8434
+ audit: components["schemas"]["AudioAuditLog"];
8435
+ /** @description Effective confidence in `0.0..=1.0` (fused, if applicable). */
8436
+ confidence: components["schemas"]["Confidence"];
8437
+ /**
8438
+ * @description Coreference identifier, if a recognizer resolved this entity as one
8439
+ * mention of a cluster. Entities sharing an [`EntityCoRef`] denote the
8440
+ * same real-world thing.
8441
+ */
8442
+ coref?: components["schemas"]["EntityCoRef"];
8443
+ /**
8444
+ * Format: uuid
8445
+ * @description Stable unique identity for this entity (time-ordered UUIDv7), minted
8446
+ * when the entity is assembled.
8447
+ */
8448
+ id: string;
8449
+ /**
8450
+ * @description What kind of sensitive information this is (resolved via a
8451
+ * [`LabelCatalog`]).
8452
+ */
8453
+ label: components["schemas"]["LabelRef"];
8454
+ /**
8455
+ * @description The language of this entity's surrounding text, when a recognizer
8456
+ * resolved one. `None` when unknown or language-agnostic.
8457
+ */
8458
+ language?: string;
8459
+ /**
8460
+ * @description Location of the entity within the medium (fused, if it came from more
8461
+ * than one detection).
8462
+ */
8463
+ location: components["schemas"]["AudioLocation"];
8464
+ /**
8465
+ * @description Byte range of the match in the *recognized text* it was found in (the
8466
+ * OCR layout text, the audio transcript, or the text payload itself) —
8467
+ * the stable key back into that enrichment artifact, where the rich
8468
+ * context lives (which OCR block, which speaker) that the geometric
8469
+ * [`location`] cannot hold. `None` for entities not found via text
8470
+ * recognition (e.g. a VLM box). An audit key, not a coordinate: redaction
8471
+ * uses [`location`]; an audit uses this with the artifact.
8472
+ *
8473
+ * [`location`]: Entity::location
8474
+ */
8475
+ recognized_range?: components["schemas"]["Range_of_uint"];
8476
+ };
8477
+ /**
8478
+ * @description One recognized entity plus the optional reviewer override.
8479
+ *
8480
+ * The bound mirrors elide's [`Entity<M>`]: serialization needs
8481
+ * `M::Location` and `M::Data` (de)serializable, and JsonSchema
8482
+ * derivation needs them schema-able. All four modalities elide
8483
+ * ships satisfy these under the `serde` + `schema` features.
8484
+ */
8485
+ AudioEntityRecord: {
8486
+ /** @description The elide entity, as recognition produced it. */
8487
+ entity: components["schemas"]["AudioEntity"];
8488
+ /**
8489
+ * @description Reviewer-supplied redaction override.
8490
+ *
8491
+ * `None` means "use the matching policy rule's decision";
8492
+ * `Some(...)` overrides that rule for this specific entity
8493
+ * at apply time. Reviewer overrides take precedence over
8494
+ * every policy rule and inherit the authority of the
8495
+ * [`Review::policy_id`] they name: the audit event's
8496
+ * attribution stamps that policy so the trail names the
8497
+ * authority under which the override fired.
8498
+ */
8499
+ review?: components["schemas"]["Review"];
8392
8500
  };
8393
8501
  /**
8394
8502
  * @description Located, typed piece of context a recognizer may treat as in-context
@@ -8430,31 +8538,6 @@ interface components {
8430
8538
  /** @description Diarization label of the speaker, when a diarizer assigned one. */
8431
8539
  speaker_id?: string;
8432
8540
  };
8433
- /**
8434
- * @description Full audit trail of an [`Entity`]: every [`Event`] in its life, in
8435
- * order.
8436
- *
8437
- * This is the model's answer to "full provenance": where Presidio keeps
8438
- * a shallow, optional, per-stage explanation that is stripped by
8439
- * default, a `Provenance` is always present and records the entity's
8440
- * *entire* life as an ordered list of events: each recognizer that
8441
- * found it, the deduplication that fused them, any confidence
8442
- * calibration, and the redaction that hid it. Nothing is collapsed:
8443
- * every recognizer keeps its own recognition event with its location
8444
- * and score.
8445
- *
8446
- * The events form a confidence chain (each event's [`after`] is the
8447
- * next's [`before`]) so the final confidence and its full history are
8448
- * always recoverable.
8449
- *
8450
- * [`Entity`]: crate::entity::Entity
8451
- * [`after`]: Event::after
8452
- * [`before`]: Event::before
8453
- */
8454
- AudioProvenance: {
8455
- /** @description Events, in the order they happened. */
8456
- events: components["schemas"]["AudioEvent"][];
8457
- };
8458
8541
  /** @description Operator spec a `redact` audio rule carries. */
8459
8542
  AudioRedaction: {
8460
8543
  /** @constant */
@@ -8502,7 +8585,7 @@ interface components {
8502
8585
  * here; labels are re-derived from the policy set on each
8503
8586
  * anonymize call.
8504
8587
  *
8505
- * No [`Default`] a well-formed audit must carry a real
8588
+ * No [`Default`]: a well-formed audit must carry a real
8506
8589
  * [`AuditContext`] with a real correlation id. Callers building
8507
8590
  * an audit outside the analyze path construct it explicitly.
8508
8591
  */
@@ -8524,7 +8607,7 @@ interface components {
8524
8607
  * vocabulary analyze used without the caller re-passing an
8525
8608
  * `AnalyzerParams`.
8526
8609
  *
8527
- * Required on the wire a missing context on an incoming
8610
+ * Required on the wire: a missing context on an incoming
8528
8611
  * [`Audit`] rejects at deserialize time so the shape
8529
8612
  * mismatch surfaces at load, not at apply.
8530
8613
  *
@@ -8549,11 +8632,11 @@ interface components {
8549
8632
  * for `languages` and `countries` (typed, elide-native), a
8550
8633
  * [`metadata`] sub-struct for free-form classification strings
8551
8634
  * (`tags`, `purpose`, `audience`), and the analyze-time
8552
- * [`correlation_id`]. The label catalog is not on here
8635
+ * [`correlation_id`]. The label catalog is not on here -
8553
8636
  * labels are policy-owned, and anonymize re-derives them from
8554
8637
  * the policy set it was handed.
8555
8638
  *
8556
- * No [`Default`] `correlation_id` has no meaningful default
8639
+ * No [`Default`]: `correlation_id` has no meaningful default
8557
8640
  * (a nil UUID would silently collapse unrelated audits under
8558
8641
  * one bucket in downstream trace aggregators), so callers
8559
8642
  * supply one explicitly. Everything else defaults to empty.
@@ -8571,12 +8654,12 @@ interface components {
8571
8654
  * carried over so the anonymize path can link its own spans
8572
8655
  * to the same request. The anonymize call supplies a fresh
8573
8656
  * id from the passed [`Document`] as the anonymize-side
8574
- * correlation id this one stays as the analyze-side
8657
+ * correlation id: this one stays as the analyze-side
8575
8658
  * pointer.
8576
8659
  *
8577
8660
  * Required on the wire.
8578
8661
  *
8579
- * [`Document`]: nvisy_schema::file::Document
8662
+ * [`Document`]: elide_wire::file::Document
8580
8663
  */
8581
8664
  correlationId: string;
8582
8665
  /**
@@ -8601,16 +8684,31 @@ interface components {
8601
8684
  /**
8602
8685
  * @description OCR mode the analyze call decoded with. Recorded so the
8603
8686
  * anonymize call re-decodes the same document under the same
8604
- * codec configuration otherwise entity offsets stored in
8687
+ * codec configuration: otherwise entity offsets stored in
8605
8688
  * the audit wouldn't line up against a differently-rendered
8606
- * second decode. Defaults to [`OcrMode::Auto`] (the codec's
8689
+ * second decode. Defaults to [`RasterMode::Auto`] (the codec's
8607
8690
  * built-in behaviour) when omitted.
8608
8691
  * @default {
8609
8692
  * "kind": "auto"
8610
8693
  * }
8611
8694
  */
8612
- ocrMode: components["schemas"]["OcrMode"];
8695
+ rasterMode: components["schemas"]["RasterMode"];
8613
8696
  };
8697
+ /**
8698
+ * @description A 32-byte BLAKE3 digest.
8699
+ *
8700
+ * The tamper-evident link in an [`AuditLog`] DAG: each [`AuditEvent`] hashes
8701
+ * its payload together with its parents' hashes, so altering any event breaks
8702
+ * every event downstream of it. Displays and (with the `serde` feature)
8703
+ * (de)serializes as lowercase hex.
8704
+ *
8705
+ * The all-zero hash is [`GENESIS`](AuditHash::GENESIS), the link a birth event
8706
+ * (one with no parents) chains from.
8707
+ *
8708
+ * [`AuditLog`]: crate::entity::audit::AuditLog
8709
+ * [`AuditEvent`]: crate::entity::audit::AuditEvent
8710
+ */
8711
+ AuditHash: string;
8614
8712
  /** @description Response returned after successful authentication (login/signup). */
8615
8713
  AuthToken: {
8616
8714
  /** @description The JWT API token for authentication. */
@@ -8690,17 +8788,35 @@ interface components {
8690
8788
  /** @description Minimum corner (top-left, conventionally). */
8691
8789
  min: components["schemas"]["Point"];
8692
8790
  };
8791
+ /**
8792
+ * @description The coarse group a [`Label`] belongs to, for organizing detected entities
8793
+ * by kind (`financial`, `health`, `identity`, …).
8794
+ *
8795
+ * A category answers "what *sort* of information is this" at a display level:
8796
+ * a consumer groups a redaction audit into sections by category. It is
8797
+ * distinct from a label's [`tags`], which are cross-cutting sensitivity
8798
+ * markers (`pii`, `phi`, `pci`) a label may carry several of; a label has at
8799
+ * most **one** category. Built-in labels ship with a category; a custom
8800
+ * [`Label`] has none unless one is set.
8801
+ *
8802
+ * The value is an open, lowercase `snake_case` identifier, so a custom label
8803
+ * can define its own category rather than being confined to the shipped set.
8804
+ *
8805
+ * [`Label`]: super::Label
8806
+ * [`tags`]: super::Label::tags
8807
+ */
8808
+ Category: string;
8693
8809
  /**
8694
8810
  * @description Text a [`TextRedaction::Clamp`] emits for out-of-range values.
8695
8811
  *
8696
8812
  * Three forms, deserialized untagged so callers can pick the
8697
8813
  * terser one for the case at hand:
8698
8814
  *
8699
- * - **Plain string** (`"90 or older"`) English-only shorthand.
8700
- * - **Localized map** (`{"en": "90 or older", "fr": "90 ou plus"}`)
8701
- * one entry per language the deployment ships; missing
8702
- * locales fall back to English at render time.
8703
- * - **Format template** (`{"format": "{n} or older"}`) the
8815
+ * - **Plain string** (`"90 or older"`): English-only shorthand.
8816
+ * - **Localized map** (`{"en": "90 or older", "fr": "90 ou plus"}`):
8817
+ * one entry per language the deployment ships; missing locales
8818
+ * fall back to English at render time.
8819
+ * - **Format template** (`{"format": "{n} or older"}`): the
8704
8820
  * engine substitutes `{n}` for the threshold, so a ceiling of
8705
8821
  * `90` renders `"90 or older"` without the caller repeating the
8706
8822
  * number. Same rendering in every language.
@@ -8750,7 +8866,7 @@ interface components {
8750
8866
  * Format: float
8751
8867
  * @description Confidence score in the closed range `0.0..=1.0`.
8752
8868
  *
8753
- * Carried by every provenance [`Event`] (the `before`/`after` of a
8869
+ * Carried by every provenance [`AuditEvent`] (the `before`/`after` of a
8754
8870
  * recognition, fusion, or calibration) and by the effective confidence
8755
8871
  * of an [`Entity`]. The newtype enforces the range at construction so
8756
8872
  * no downstream code has to defend against values outside `[0, 1]`.
@@ -8760,7 +8876,7 @@ interface components {
8760
8876
  * *cutoff* configured to filter scores. Compare the two with
8761
8877
  * [`ConfidenceThreshold::passes`].
8762
8878
  *
8763
- * [`Event`]: crate::entity::provenance::Event
8879
+ * [`AuditEvent`]: crate::entity::audit::AuditEvent
8764
8880
  * [`Entity`]: crate::entity::Entity
8765
8881
  */
8766
8882
  Confidence: number;
@@ -9085,12 +9201,12 @@ interface components {
9085
9201
  template: components["schemas"]["PolicyTemplate"];
9086
9202
  } | {
9087
9203
  /**
9088
- * @description The structured policy body.
9204
+ * @description The client-authored policy body.
9089
9205
  *
9090
9206
  * Boxed to keep the enum small: an inline body is much larger than a
9091
9207
  * template id, and most requests use a template.
9092
9208
  */
9093
- definition: components["schemas"]["PolicyDefinition"];
9209
+ definition: components["schemas"]["PolicyDraft"];
9094
9210
  /** @constant */
9095
9211
  source: "inline";
9096
9212
  });
@@ -9230,7 +9346,7 @@ interface components {
9230
9346
  *
9231
9347
  * Tagged by `modality` (snake_case) so deserialization picks the
9232
9348
  * right variant and the entity vec inside is statically typed
9233
- * per modality apply-time we hand each variant back to elide
9349
+ * per modality: apply-time we hand each variant back to elide
9234
9350
  * as a `Vec<Entity<M>>` for the appropriate `M`.
9235
9351
  *
9236
9352
  * [`Audit`]: crate::Audit
@@ -9387,9 +9503,9 @@ interface components {
9387
9503
  /**
9388
9504
  * @description Which operator to apply to Article 9 special-category entities.
9389
9505
  *
9390
- * - [`Erase`](Self::Erase) the default no-lawful-basis posture.
9506
+ * - [`Erase`](Self::Erase): the default no-lawful-basis posture.
9391
9507
  * Every match is removed.
9392
- * - [`Pseudonymize`](Self::Pseudonymize) identity-preserving
9508
+ * - [`Pseudonymize`](Self::Pseudonymize): identity-preserving
9393
9509
  * surrogate. Suitable when an Article 9(2) carve-out
9394
9510
  * (explicit consent, employment law, public-health public
9395
9511
  * interest, ...) authorizes retention and downstream
@@ -9398,6 +9514,38 @@ interface components {
9398
9514
  * obligation to establish and document.
9399
9515
  */
9400
9516
  GdprArticle9Treatment: "erase" | "pseudonymize";
9517
+ /**
9518
+ * @description Which sensitive-data labels the template's group covers.
9519
+ *
9520
+ * Three tiers, each strictly widening the previous one so a
9521
+ * caller upgrading through the tiers never loses coverage:
9522
+ *
9523
+ * - [`Article9`](Self::Article9): the nine Article 9(1)
9524
+ * special categories only. The default.
9525
+ * - [`Article9WithReidHardening`](Self::Article9WithReidHardening) -
9526
+ * Article 9 plus the quasi-identifiers that carry the most join
9527
+ * risk against public datasets: `date_of_birth`, `postal_code`,
9528
+ * and `gender` (the combination that re-identifies most of a
9529
+ * population on its own), widened with `age`, `city`,
9530
+ * `nationality`, `citizenship`, and `occupation`.
9531
+ *
9532
+ * A product-defined tier, not a complete answer to Recital 26:
9533
+ * the Recital sets a reasonableness test over "all the means
9534
+ * reasonably likely to be used" to re-identify, judged against
9535
+ * the caller's own data and adversary, so no fixed label list
9536
+ * can satisfy it. Callers whose threat model reaches wider
9537
+ * extend the policy after building it.
9538
+ * - [`Article9And10`](Self::Article9And10): Article 9 + Recital
9539
+ * 26 hardening + Article 10's criminal-justice labels
9540
+ * (`criminal_record`, `criminal_charge`, `judicial_narrative`).
9541
+ * Article 10 governs "personal data relating to criminal
9542
+ * convictions and offences", processed only under authorized
9543
+ * official-authority control or specific Union/Member-State
9544
+ * law. Callers with criminal-justice adjacency (background-
9545
+ * check services, court-records handling, HR compliance) pick
9546
+ * this tier.
9547
+ */
9548
+ GdprSensitiveScope: "article9" | "article9_with_reid_hardening" | "article9_and10";
9401
9549
  /** @description Request to generate a shareable invite code for a workspace. */
9402
9550
  GenerateInviteCode: {
9403
9551
  /** @description When the invite code expires. */
@@ -9418,193 +9566,138 @@ interface components {
9418
9566
  };
9419
9567
  /** @description Operational status of a service component. */
9420
9568
  HealthStatus: "healthy" | "degraded" | "unhealthy";
9569
+ /**
9570
+ * @description Which account-identifier labels §164.514(b)(2)(i)(J) covers.
9571
+ *
9572
+ * The regulation names "account numbers" without enumerating
9573
+ * them; HHS OCR's 2012 guidance doesn't narrow it either. In
9574
+ * practice, covered entities and de-ID vendors treat bank
9575
+ * accounts, IBANs, and payment cards as the core §(J) set -
9576
+ * [`Standard`](Self::Standard). Cryptocurrency wallet addresses
9577
+ * are the newer case: they identify a specific holder's account
9578
+ * by function, and the §(R) catch-all pulls in "any other unique
9579
+ * identifying number, characteristic, or code" tied to an
9580
+ * individual, which arguably captures them. Deployments where
9581
+ * crypto addresses can appear in patient-facing artifacts pick
9582
+ * [`Extended`](Self::Extended); deployments where they can't
9583
+ * stay on `Standard`.
9584
+ *
9585
+ * The compliant posture for anything account-shaped is
9586
+ * "remove"; the split is only about how broadly this template
9587
+ * pre-declares the account label scope. A caller who wants
9588
+ * broader coverage combines this template's policy with a
9589
+ * separate PII scope on the same request.
9590
+ */
9591
+ HipaaAccountNumbers: "standard" | "extended";
9421
9592
  /**
9422
9593
  * @description Which HIPAA §164.514 de-identification method to apply.
9423
9594
  *
9424
9595
  * The tradeoff is analytic yield vs. downstream constraint:
9425
9596
  *
9426
- * - [`SafeHarbor`](Self::SafeHarbor) strips all eighteen
9597
+ * - [`SafeHarbor`](Self::SafeHarbor): strips all eighteen
9427
9598
  * identifier categories. No Data Use Agreement or statistician
9428
9599
  * required, but dates, coarse geography, and ages ≥ 90 all
9429
9600
  * disappear or collapse.
9430
- * - [`LimitedDataSet`](Self::LimitedDataSet) narrower
9601
+ * - [`LimitedDataSet`](Self::LimitedDataSet): narrower
9431
9602
  * subtraction (§164.514(e)(2)) that keeps dates, town/city,
9432
9603
  * state, ZIP, and ages verbatim. Suitable for research and
9433
9604
  * public-health handoffs *only when* a Data Use Agreement
9434
9605
  * governs the recipient's use.
9435
- * - [`ExpertDetermination`](Self::ExpertDetermination)
9606
+ * - [`ExpertDetermination`](Self::ExpertDetermination) -
9436
9607
  * starting scaffold for §164.514(b)(1). Same label set as
9437
9608
  * Safe Harbor with pseudonymization as the default terminal
9438
9609
  * (identity-preserving across mentions). **Does not certify
9439
- * de-identification** a qualified statistician must
9610
+ * de-identification**: a qualified statistician must
9440
9611
  * document that re-identification risk is "very small" under
9441
9612
  * the applicable methodology before the output can be treated
9442
9613
  * as de-identified.
9443
9614
  */
9444
9615
  HipaaDeidMethod: "safe_harbor" | "limited_data_set" | "expert_determination";
9445
9616
  /**
9446
- * @description Per-call payload a recognizer inspects for the [`Image`] modality.
9447
- *
9448
- * Carries the encoded bytes plus the pixel [`Dimensions`], which a
9449
- * recognizer that emits unit-square boxes needs to scale them into pixel
9450
- * coordinates. An optional filename aids diagnostics and encoding
9451
- * inference.
9452
- *
9453
- * [`Image`]: super::Image
9454
- */
9455
- ImageData: {
9456
- /** @description Pixel dimensions of the encoded image. */
9457
- dimensions: components["schemas"]["Dimensions"];
9458
- /** @description Original filename, when known. */
9459
- filename?: string;
9460
- };
9461
- /**
9462
- * @description Detected piece of sensitive information within some medium.
9463
- *
9464
- * Generic over the [`Modality`] `M`, which is what makes the model
9465
- * multimodal: a text pipeline yields `Entity<Text>`, an audio pipeline
9466
- * `Entity<Audio>`, and so on. The entity's location is the modality's
9467
- * [`Location`] type, `M::Location`.
9468
- *
9469
- * # Birth and fusion
9470
- *
9471
- * A recognizer emits an entity directly, carrying a single recognition
9472
- * [`Event`] (its own finding) in the entity's [`provenance`]. When
9473
- * several recognizers find the same thing, a fusion step (in
9474
- * `elide`) combines their entities into one: the survivor's
9475
- * [`location`] and [`confidence`] are the *fused* values, and every
9476
- * contributing recognition event, plus a deduplication event, is
9477
- * retained in its provenance. The entity therefore carries its full
9478
- * audit trail with it.
9479
- *
9480
- * [`Location`]: Modality::Location
9481
- * [`Event`]: crate::entity::provenance::Event
9482
- * [`provenance`]: Entity::provenance
9483
- * [`location`]: Entity::location
9484
- * [`confidence`]: Entity::confidence
9485
- */
9486
- ImageEntity: {
9487
- /** @description Effective confidence in `0.0..=1.0` (fused, if applicable). */
9488
- confidence: components["schemas"]["Confidence"];
9489
- /**
9490
- * @description Coreference identifier, if a recognizer resolved this entity as one
9491
- * mention of a cluster. Entities sharing an [`EntityCoRef`] denote the
9492
- * same real-world thing.
9493
- */
9494
- coref?: components["schemas"]["EntityCoRef"];
9495
- /**
9496
- * Format: uuid
9497
- * @description Stable unique identity for this entity (time-ordered UUIDv7), minted
9498
- * when the entity is assembled.
9499
- */
9500
- id: string;
9501
- /**
9502
- * @description What kind of sensitive information this is (resolved via a
9503
- * [`LabelCatalog`]).
9504
- */
9505
- label: components["schemas"]["LabelRef"];
9506
- /**
9507
- * @description The language of this entity's surrounding text, when a recognizer
9508
- * resolved one. `None` when unknown or language-agnostic.
9509
- */
9510
- language?: string;
9511
- /**
9512
- * @description Location of the entity within the medium (fused, if it came from more
9513
- * than one detection).
9514
- */
9515
- location: components["schemas"]["ImageLocation"];
9516
- /**
9517
- * @description Detection audit trail: every contributing detection and the fusion
9518
- * event, if any.
9617
+ * @description One node in an entity's audit DAG: a thing that happened, with its
9618
+ * effect on confidence and its tamper-evident links.
9619
+ *
9620
+ * Events are recorded on an entity's [`AuditLog`], forming the full audit
9621
+ * trail of its life: each recognizer that found it, the deduplication that
9622
+ * fused them, any score calibration, and the redaction that hid it. The
9623
+ * uniform spine (who, resulting score, when) is the same for every event; the
9624
+ * [`kind`] carries the event-specific detail *and* the explanation of why the
9625
+ * event happened.
9626
+ *
9627
+ * Each event links to its [`parents`] by their [`hash`]: a birth event (a
9628
+ * recognizer's first detection) has no parents, a normal step has one, and a
9629
+ * [fusion](crate::entity::audit::AuditLog::record_fusion) has several. Its own
9630
+ * [`hash`] folds the
9631
+ * payload together with the parents' hashes, so altering any event breaks
9632
+ * every event downstream of it: [`AuditLog::verify`] walks the DAG and
9633
+ * reports the first break.
9634
+ *
9635
+ * `entity.confidence` always equals the [`confidence`] of the most recent
9636
+ * event. The confidence *flowing in* is not stored: it is the parents'
9637
+ * [`confidence`], recovered from the DAG.
9638
+ *
9639
+ * [`AuditLog`]: crate::entity::audit::AuditLog
9640
+ * [`AuditLog::record_fusion`]: crate::entity::audit::AuditLog::record_fusion
9641
+ * [`AuditLog::verify`]: crate::entity::audit::AuditLog::verify
9642
+ * [`kind`]: AuditEvent::kind
9643
+ * [`parents`]: AuditEvent::parents
9644
+ * [`hash`]: AuditEvent::hash
9645
+ * [`confidence`]: AuditEvent::confidence
9646
+ */
9647
+ ImageAuditEvent: {
9648
+ /**
9649
+ * @description Confidence after this event: the entity's effective confidence once it
9650
+ * has happened.
9519
9651
  */
9520
- provenance: components["schemas"]["ImageProvenance"];
9652
+ confidence: components["schemas"]["Confidence"];
9521
9653
  /**
9522
- * @description Byte range of the match in the *recognized text* it was found in (the
9523
- * OCR layout text, the audio transcript, or the text payload itself) —
9524
- * the stable key back into that enrichment artifact, where the rich
9525
- * context lives (which OCR block, which speaker) that the geometric
9526
- * [`location`] cannot hold. `None` for entities not found via text
9527
- * recognition (e.g. a VLM box). Provenance, not a coordinate: redaction
9528
- * uses [`location`]; an audit uses this with the artifact.
9654
+ * @description This event's hash, over its payload and its parents' hashes. Assigned by
9655
+ * [`AuditLog`] when the event is recorded; read it through
9656
+ * [`hash`](Self::hash). Recomputing it is how the DAG is verified.
9529
9657
  *
9530
- * [`location`]: Entity::location
9531
- */
9532
- recognized_range?: components["schemas"]["Range_of_uint"];
9533
- };
9534
- /**
9535
- * @description One recognized entity plus the optional reviewer override.
9536
- *
9537
- * The bound mirrors elide's [`Entity<M>`]: serialization needs
9538
- * `M::Location` and `M::Data` (de)serializable, and JsonSchema
9539
- * derivation needs them schema-able. All four modalities elide
9540
- * ships satisfy these under the `serde` + `schema` features.
9541
- */
9542
- ImageEntityRecord: {
9543
- /** @description The elide entity, as recognition produced it. */
9544
- entity: components["schemas"]["ImageEntity"];
9545
- /**
9546
- * @description Reviewer-supplied redaction override.
9658
+ * Not publicly settable: only [`AuditLog`] assigns it, so a caller cannot
9659
+ * forge a self-consistent event outside the recording path.
9547
9660
  *
9548
- * `None` means "use the matching policy rule's decision";
9549
- * `Some(...)` overrides that rule for this specific entity
9550
- * at apply time. Reviewer overrides take precedence over
9551
- * every policy rule and inherit the authority of the
9552
- * [`Review::policy_id`] they name — the audit event's
9553
- * attribution stamps that policy so the trail names the
9554
- * authority under which the override fired.
9661
+ * [`AuditLog`]: crate::entity::audit::AuditLog
9555
9662
  */
9556
- review?: components["schemas"]["Review"];
9557
- };
9558
- /**
9559
- * @description One thing that happened to an entity, with its effect on confidence.
9560
- *
9561
- * Events are recorded in order on an entity's [`Provenance`], forming
9562
- * the full audit trail of its life: each recognizer that found it, the
9563
- * deduplication that fused them, any score calibration, and the
9564
- * redaction that hid it. The uniform spine (who, before/after score,
9565
- * when, why) is the same for every event; the [`kind`] carries the
9566
- * event-specific detail.
9567
- *
9568
- * `entity.confidence` always equals the [`after`] of the most recent
9569
- * event.
9570
- *
9571
- * [`Provenance`]: crate::entity::provenance::Provenance
9572
- * [`kind`]: Event::kind
9573
- * [`after`]: Event::after
9574
- */
9575
- ImageEvent: {
9576
- /** @description Confidence after this event. */
9577
- after: components["schemas"]["Confidence"];
9578
- /** @description When the event happened (UTC). */
9579
- at: string;
9663
+ hash: components["schemas"]["AuditHash"];
9664
+ /** @description Kind of event, with its event-specific detail and its rationale. */
9665
+ kind: components["schemas"]["ImageAuditKind"];
9580
9666
  /**
9581
- * @description Confidence before this event, if there was a prior value. `None` on
9582
- * the first (birth) event.
9667
+ * @description The events this one follows, by their hash. Empty for a birth event, one
9668
+ * entry for a normal step, several for a fusion. Assigned by [`AuditLog`]
9669
+ * when the event is recorded; read it through [`parents`](Self::parents).
9670
+ *
9671
+ * Not publicly settable: the links are the tamper-evident structure, so
9672
+ * only [`AuditLog::record`] / [`AuditLog::record_fusion`] assign them.
9673
+ *
9674
+ * [`AuditLog`]: crate::entity::audit::AuditLog
9675
+ * [`AuditLog::record`]: crate::entity::audit::AuditLog::record
9676
+ * [`AuditLog::record_fusion`]: crate::entity::audit::AuditLog::record_fusion
9583
9677
  */
9584
- before?: components["schemas"]["Confidence"];
9585
- /** @description Kind of event, with its event-specific detail. */
9586
- kind: components["schemas"]["ImageEventKind"];
9587
- /** @description Free-text explanation of what the event did and why. */
9588
- reason: string;
9678
+ parents: components["schemas"]["AuditHash"][];
9589
9679
  /**
9590
9680
  * @description Who produced this event: a recognizer name, a deduplication strategy,
9591
9681
  * an operator, or whatever acted.
9592
9682
  */
9593
9683
  source: string;
9684
+ /** @description When the event happened (UTC). */
9685
+ timestamp: string;
9594
9686
  };
9595
9687
  /**
9596
- * @description Kind of an [`Event`], carrying its event-specific detail.
9688
+ * @description Kind of an [`AuditEvent`], carrying its event-specific detail and the
9689
+ * rationale for why it happened.
9597
9690
  *
9598
9691
  * `#[non_exhaustive]`: new event kinds (verification, annotation, …)
9599
9692
  * can be added compatibly. The recognition kinds ([`Pattern`],
9600
9693
  * [`Model`]) carry the matched [`Location`]; the rest carry their own
9601
9694
  * data.
9602
9695
  *
9603
- * [`Pattern`]: EventKind::Pattern
9604
- * [`Model`]: EventKind::Model
9696
+ * [`Pattern`]: AuditKind::Pattern
9697
+ * [`Model`]: AuditKind::Model
9605
9698
  * [`Location`]: Modality::Location
9606
9699
  */
9607
- ImageEventKind: {
9700
+ ImageAuditKind: {
9608
9701
  /** @constant */
9609
9702
  kind: "pattern";
9610
9703
  /** @description Where the recognizer matched. */
@@ -9668,7 +9761,7 @@ interface components {
9668
9761
  * it is the keyword resolved through the modality's [`locate`] (a
9669
9762
  * pixel box for image, a time span for audio, the byte range for
9670
9763
  * text/tabular). `None` when the keyword's stream range could not be
9671
- * placed symmetric with a match the recognizer itself drops.
9764
+ * placed, symmetric with a match the recognizer itself drops.
9672
9765
  *
9673
9766
  * [`locate`]: crate::modality::TextRecognizable::locate
9674
9767
  */
@@ -9686,12 +9779,174 @@ interface components {
9686
9779
  /** @description How much the output leaks about the original. */
9687
9780
  leak_profile: components["schemas"]["LeakProfile"];
9688
9781
  /**
9689
- * @description Which selection rule chose this operator the automatic "why"
9782
+ * @description Which selection rule chose this operator: the automatic "why"
9690
9783
  * (matched a label, a tag, a predicate, or the fallback).
9691
9784
  */
9692
9785
  matched_by: components["schemas"]["RuleMatch"];
9693
9786
  /** @description Which operator (name + version) ran. */
9694
9787
  operator: components["schemas"]["OperatorId"];
9788
+ /**
9789
+ * @description BLAKE3 digest of the original text the operator hid, when the
9790
+ * redaction layer recorded it. Proves *what* was redacted without
9791
+ * storing the plaintext; `None` when the operator did not capture it.
9792
+ */
9793
+ span_hash?: components["schemas"]["AuditHash"];
9794
+ /**
9795
+ * Format: uint32
9796
+ * @description Byte length of the original text the operator hid, paired with
9797
+ * [`span_hash`](Self::Redaction::span_hash). `None` when not captured.
9798
+ */
9799
+ span_length?: number;
9800
+ };
9801
+ /**
9802
+ * @description Full audit trail of an [`Entity`]: every [`AuditEvent`] in its life, as a
9803
+ * tamper-evident DAG.
9804
+ *
9805
+ * Where Presidio keeps a shallow, optional, per-stage explanation that is
9806
+ * stripped by default, an `AuditLog` is always present and records the
9807
+ * entity's *entire* life: each recognizer that found it, the deduplication
9808
+ * that fused them, any confidence calibration, and the redaction that hid it.
9809
+ * Nothing is collapsed: every recognizer keeps its own recognition event with
9810
+ * its location and score.
9811
+ *
9812
+ * The events form a **directed acyclic graph**, not a flat list. A recognizer
9813
+ * records a birth event (no parents); each later step links to the event it
9814
+ * follows; and a [fusion](Self::record_fusion) links to *several* parents at
9815
+ * once: the heads of the trails it combines. This is the true shape of a
9816
+ * deduplicated entity: two recognizers are siblings, then a fusion joins them.
9817
+ * The events are stored in the order they were recorded, which is a
9818
+ * topological order of the DAG (a parent is always recorded before its
9819
+ * children).
9820
+ *
9821
+ * Two chains ride the DAG's edges:
9822
+ *
9823
+ * - a **confidence chain**, where each event's [`confidence`] is the entity's
9824
+ * effective score after it; the score flowing *in* is its parents'
9825
+ * confidence, so [`final_confidence`] and the full history are recoverable;
9826
+ * - a **hash chain**, where each event's [`hash`] folds its payload together
9827
+ * with its parents' hashes, so any edit, reorder, insertion, or deletion of
9828
+ * an earlier event breaks every event downstream. [`verify`] walks the DAG
9829
+ * and reports the first break.
9830
+ *
9831
+ * [`Entity`]: crate::entity::Entity
9832
+ * [`confidence`]: AuditEvent::confidence
9833
+ * [`hash`]: AuditEvent::hash
9834
+ * [`final_confidence`]: Self::final_confidence
9835
+ * [`verify`]: Self::verify
9836
+ */
9837
+ ImageAuditLog: components["schemas"]["ImageAuditEvent"][];
9838
+ /**
9839
+ * @description Per-call payload a recognizer inspects for the [`Image`] modality.
9840
+ *
9841
+ * Carries the encoded bytes plus the pixel [`Dimensions`], which a
9842
+ * recognizer that emits unit-square boxes needs to scale them into pixel
9843
+ * coordinates. An optional filename aids diagnostics and encoding
9844
+ * inference.
9845
+ *
9846
+ * [`Image`]: super::Image
9847
+ */
9848
+ ImageData: {
9849
+ /** @description Pixel dimensions of the encoded image. */
9850
+ dimensions: components["schemas"]["Dimensions"];
9851
+ /** @description Original filename, when known. */
9852
+ filename?: string;
9853
+ };
9854
+ /**
9855
+ * @description Detected piece of sensitive information within some medium.
9856
+ *
9857
+ * Generic over the [`Modality`] `M`, which is what makes the model
9858
+ * multimodal: a text pipeline yields `Entity<Text>`, an audio pipeline
9859
+ * `Entity<Audio>`, and so on. The entity's location is the modality's
9860
+ * [`Location`] type, `M::Location`.
9861
+ *
9862
+ * # Birth and fusion
9863
+ *
9864
+ * A recognizer emits an entity directly, carrying a single recognition
9865
+ * [`AuditEvent`] (its own finding) in the entity's [`audit`] trail. When
9866
+ * several recognizers find the same thing, a fusion step (in
9867
+ * `elide`) combines their entities into one: the survivor's
9868
+ * [`location`] and [`confidence`] are the *fused* values, and every
9869
+ * contributing recognition event, plus a deduplication event, is
9870
+ * retained in its audit trail. The entity therefore carries its full
9871
+ * audit trail with it.
9872
+ *
9873
+ * [`Location`]: Modality::Location
9874
+ * [`AuditEvent`]: crate::entity::audit::AuditEvent
9875
+ * [`audit`]: Entity::audit
9876
+ * [`location`]: Entity::location
9877
+ * [`confidence`]: Entity::confidence
9878
+ */
9879
+ ImageEntity: {
9880
+ /**
9881
+ * @description Tamper-evident audit trail: every contributing detection, the fusion
9882
+ * event if any, and the redaction that hid it, as a hash-linked DAG.
9883
+ */
9884
+ audit: components["schemas"]["ImageAuditLog"];
9885
+ /** @description Effective confidence in `0.0..=1.0` (fused, if applicable). */
9886
+ confidence: components["schemas"]["Confidence"];
9887
+ /**
9888
+ * @description Coreference identifier, if a recognizer resolved this entity as one
9889
+ * mention of a cluster. Entities sharing an [`EntityCoRef`] denote the
9890
+ * same real-world thing.
9891
+ */
9892
+ coref?: components["schemas"]["EntityCoRef"];
9893
+ /**
9894
+ * Format: uuid
9895
+ * @description Stable unique identity for this entity (time-ordered UUIDv7), minted
9896
+ * when the entity is assembled.
9897
+ */
9898
+ id: string;
9899
+ /**
9900
+ * @description What kind of sensitive information this is (resolved via a
9901
+ * [`LabelCatalog`]).
9902
+ */
9903
+ label: components["schemas"]["LabelRef"];
9904
+ /**
9905
+ * @description The language of this entity's surrounding text, when a recognizer
9906
+ * resolved one. `None` when unknown or language-agnostic.
9907
+ */
9908
+ language?: string;
9909
+ /**
9910
+ * @description Location of the entity within the medium (fused, if it came from more
9911
+ * than one detection).
9912
+ */
9913
+ location: components["schemas"]["ImageLocation"];
9914
+ /**
9915
+ * @description Byte range of the match in the *recognized text* it was found in (the
9916
+ * OCR layout text, the audio transcript, or the text payload itself) —
9917
+ * the stable key back into that enrichment artifact, where the rich
9918
+ * context lives (which OCR block, which speaker) that the geometric
9919
+ * [`location`] cannot hold. `None` for entities not found via text
9920
+ * recognition (e.g. a VLM box). An audit key, not a coordinate: redaction
9921
+ * uses [`location`]; an audit uses this with the artifact.
9922
+ *
9923
+ * [`location`]: Entity::location
9924
+ */
9925
+ recognized_range?: components["schemas"]["Range_of_uint"];
9926
+ };
9927
+ /**
9928
+ * @description One recognized entity plus the optional reviewer override.
9929
+ *
9930
+ * The bound mirrors elide's [`Entity<M>`]: serialization needs
9931
+ * `M::Location` and `M::Data` (de)serializable, and JsonSchema
9932
+ * derivation needs them schema-able. All four modalities elide
9933
+ * ships satisfy these under the `serde` + `schema` features.
9934
+ */
9935
+ ImageEntityRecord: {
9936
+ /** @description The elide entity, as recognition produced it. */
9937
+ entity: components["schemas"]["ImageEntity"];
9938
+ /**
9939
+ * @description Reviewer-supplied redaction override.
9940
+ *
9941
+ * `None` means "use the matching policy rule's decision";
9942
+ * `Some(...)` overrides that rule for this specific entity
9943
+ * at apply time. Reviewer overrides take precedence over
9944
+ * every policy rule and inherit the authority of the
9945
+ * [`Review::policy_id`] they name: the audit event's
9946
+ * attribution stamps that policy so the trail names the
9947
+ * authority under which the override fired.
9948
+ */
9949
+ review?: components["schemas"]["Review"];
9695
9950
  };
9696
9951
  /**
9697
9952
  * @description Located, typed piece of context a recognizer may treat as in-context
@@ -9738,31 +9993,6 @@ interface components {
9738
9993
  */
9739
9994
  polygon?: components["schemas"]["Polygon"];
9740
9995
  };
9741
- /**
9742
- * @description Full audit trail of an [`Entity`]: every [`Event`] in its life, in
9743
- * order.
9744
- *
9745
- * This is the model's answer to "full provenance": where Presidio keeps
9746
- * a shallow, optional, per-stage explanation that is stripped by
9747
- * default, a `Provenance` is always present and records the entity's
9748
- * *entire* life as an ordered list of events: each recognizer that
9749
- * found it, the deduplication that fused them, any confidence
9750
- * calibration, and the redaction that hid it. Nothing is collapsed:
9751
- * every recognizer keeps its own recognition event with its location
9752
- * and score.
9753
- *
9754
- * The events form a confidence chain (each event's [`after`] is the
9755
- * next's [`before`]) so the final confidence and its full history are
9756
- * always recoverable.
9757
- *
9758
- * [`Entity`]: crate::entity::Entity
9759
- * [`after`]: Event::after
9760
- * [`before`]: Event::before
9761
- */
9762
- ImageProvenance: {
9763
- /** @description Events, in the order they happened. */
9764
- events: components["schemas"]["ImageEvent"][];
9765
- };
9766
9996
  /** @description Operator spec a `redact` image rule carries. */
9767
9997
  ImageRedaction: {
9768
9998
  /** @constant */
@@ -9947,7 +10177,7 @@ interface components {
9947
10177
  InviteStatus: "pending" | "accepted" | "declined" | "canceled" | "expired" | "revoked";
9948
10178
  /**
9949
10179
  * @description Kind of sensitive information: a stable [`id`], per-language
9950
- * [`LabelLocale`]s, and zero or more tags.
10180
+ * [`LabelLocale`]s, an optional [`category`], and zero or more tags.
9951
10181
  *
9952
10182
  * # Identity
9953
10183
  *
@@ -9965,18 +10195,25 @@ interface components {
9965
10195
  * text — NER and LLM read the analysis language's name and description to
9966
10196
  * prompt the model, keyed by the stable id.
9967
10197
  *
9968
- * # Tags
10198
+ * # Category and tags
10199
+ *
10200
+ * [`category`] is the single coarse group a label belongs to (`financial`,
10201
+ * `health`, `identity`, …), for organizing detected entities by kind. Built-in
10202
+ * labels ship with one; a custom label has none unless set.
9969
10203
  *
9970
- * [`tags`] is a free-form list of short identifiers policy selectors can
9971
- * match against. Built-in labels carry category tags (`personal_identity`,
9972
- * `contact_info`, `financial`, ) plus cross-cutting tags where applicable
9973
- * (`pii`, `phi`, `pci`). Custom labels can ship with zero tags.
10204
+ * [`tags`] is a free-form list of *cross-cutting* markers a policy selector
10205
+ * matches against sensitivity flags a label may carry several of (`pii`,
10206
+ * `phi`, `pci`, `sad`, `secret`). Distinct from the category: a label has at
10207
+ * most one category but any number of tags. Custom labels can ship with zero
10208
+ * of either.
9974
10209
  *
9975
10210
  * [`id`]: Label::id
9976
10211
  * [`localization`]: Label::localization
10212
+ * [`category`]: Label::category
9977
10213
  * [`tags`]: Label::tags
9978
10214
  */
9979
10215
  Label: {
10216
+ category?: components["schemas"]["Category"];
9980
10217
  id: string;
9981
10218
  localizations: components["schemas"]["LocalizedText"];
9982
10219
  tags: string[];
@@ -10019,27 +10256,32 @@ interface components {
10019
10256
  * rule that targets that list references the group by name
10020
10257
  * instead of respelling the labels. When elide adds a new label
10021
10258
  * to a category, extending the group covers every rule that
10022
- * referenced it no rule edit.
10023
- *
10024
- * **Compilation**: at request time the engine synthesises a
10025
- * `group:<policy_id>:<name>` tag on every label listed in the
10026
- * group, then rewrites [`Predicate::LabelInGroup { group }`]
10027
- * into [`Predicate::TagOneOf { tags: ["group:<policy_id>:<name>"] }`].
10028
- * That routes through the same `Anonymizer::with_tag` fast
10029
- * path as any authored tag — no new engine machinery, no
10030
- * per-request walk over group membership. Scoping the tag by
10031
- * `policy_id` keeps two policies that both declare `hipaa_18`
10032
- * with different labelsets from stepping on each other.
10259
+ * referenced it: no rule edit.
10260
+ *
10261
+ * **Compilation**: groups stay on the policy. Evaluating a
10262
+ * [`Predicate::LabelInGroup { group }`] looks the name up in
10263
+ * the policy's own group table and tests the entity's label for
10264
+ * membership. Nothing is stamped onto the label catalog, so two
10265
+ * policies that both declare `hipaa_18` with different labelsets
10266
+ * cannot step on each other.
10033
10267
  *
10034
10268
  * **Unknown group names error at request validation**, not at
10035
10269
  * apply time. A typo doesn't silently underfire.
10036
10270
  *
10037
10271
  * [`PolicyDefinition`]: super::PolicyDefinition
10038
- * [`Predicate::LabelInGroup`]: super::predicate::Predicate::LabelInGroup
10039
- * [`Predicate::LabelInGroup { group }`]: super::predicate::Predicate::LabelInGroup
10040
- * [`Predicate::TagOneOf { tags: ["group:<policy_id>:<name>"] }`]: super::predicate::Predicate::TagOneOf
10272
+ * [`Predicate::LabelInGroup`]: crate::Predicate::LabelInGroup
10273
+ * [`Predicate::LabelInGroup { group }`]: crate::Predicate::LabelInGroup
10041
10274
  */
10042
10275
  LabelGroup: {
10276
+ /**
10277
+ * @description Why this cluster exists: the authority that defines it.
10278
+ *
10279
+ * A group usually maps to one regulatory category (HIPAA's
10280
+ * eighteen identifiers, GDPR Article 9(1)'s nine special
10281
+ * categories), so this is where that mapping is recorded as
10282
+ * data rather than prose.
10283
+ */
10284
+ attribution?: components["schemas"]["AttributionKind"];
10043
10285
  /** @description Optional description for reviewers. */
10044
10286
  description?: string;
10045
10287
  /**
@@ -10047,7 +10289,7 @@ interface components {
10047
10289
  *
10048
10290
  * A label that doesn't appear in the request's compiled
10049
10291
  * [`LabelCatalog`] is silently skipped at tag-synthesis time
10050
- * a group can safely list labels the current build
10292
+ * : a group can safely list labels the current build
10051
10293
  * doesn't emit (e.g. modality-gated ones); rules keyed off
10052
10294
  * the group still fire on whatever labels *are* present.
10053
10295
  *
@@ -10058,11 +10300,10 @@ interface components {
10058
10300
  * @description Stable name a [`Predicate::LabelInGroup`] references.
10059
10301
  *
10060
10302
  * Free-form; a policy layer picks the vocabulary. Recommend
10061
- * snake_case identifiers (`hipaa_18`, `gdpr_article_9`)
10062
- * they compile to `group:hipaa_18` tags on the catalog and
10063
- * read cleanly in audit provenance.
10303
+ * snake_case identifiers (`hipaa_18`, `gdpr_article_9`) -
10304
+ * they read cleanly in audit provenance.
10064
10305
  *
10065
- * [`Predicate::LabelInGroup`]: super::predicate::Predicate::LabelInGroup
10306
+ * [`Predicate::LabelInGroup`]: crate::Predicate::LabelInGroup
10066
10307
  */
10067
10308
  name: string;
10068
10309
  };
@@ -10109,8 +10350,9 @@ interface components {
10109
10350
  /**
10110
10351
  * @description Builtin label names to enable.
10111
10352
  *
10112
- * E.g. `"email_address"`, `"phone_number"`. Unknown names
10113
- * log a warning and are skipped.
10353
+ * E.g. `"email_address"`, `"phone_number"`. An unknown name
10354
+ * is rejected at request compile time: a typo fails loudly
10355
+ * rather than quietly dropping the label from the policy.
10114
10356
  */
10115
10357
  builtins?: components["schemas"]["LabelRef"][];
10116
10358
  /** @description Custom labels defined inline by the caller. */
@@ -10527,33 +10769,6 @@ interface components {
10527
10769
  /** @description Whether to send email notifications. */
10528
10770
  notifyViaEmail: boolean;
10529
10771
  };
10530
- /**
10531
- * @description Policy for turning a document's pages into images for OCR.
10532
- *
10533
- * A born-digital PDF has a selectable text layer and needs no OCR; a
10534
- * scanned one is image-only and must be rendered to images first. [`Auto`]
10535
- * is the right default — extract text, render only what lacks it — but the
10536
- * text-layer parser that drives that decision is not in place yet, so today
10537
- * only [`Force`] actually renders.
10538
- *
10539
- * Serializes with an internal `kind` tag (`{"kind": "auto"}`,
10540
- * `{"kind": "force", "dpi": 300}`, `{"kind": "never"}`).
10541
- *
10542
- * [`Auto`]: OcrMode::Auto
10543
- * [`Force`]: OcrMode::Force
10544
- */
10545
- OcrMode: {
10546
- /** @constant */
10547
- kind: "auto";
10548
- } | {
10549
- /** @description Resolution to render pages at; [`Dpi::OCR`] (300) is typical. */
10550
- dpi: components["schemas"]["Dpi"];
10551
- /** @constant */
10552
- kind: "force";
10553
- } | {
10554
- /** @constant */
10555
- kind: "never";
10556
- };
10557
10772
  /**
10558
10773
  * @description How a workspace's documents are turned into images for OCR during detection.
10559
10774
  *
@@ -10601,12 +10816,12 @@ interface components {
10601
10816
  /**
10602
10817
  * @description Which PCI DSS subsection this template addresses.
10603
10818
  *
10604
- * - [`PanRender`](Self::PanRender) §3.5.1 render posture for
10819
+ * - [`PanRender`](Self::PanRender): §3.5.1 render posture for
10605
10820
  * stored Primary Account Numbers. Carries a [`PciPanRender`]
10606
10821
  * picking between the shipped render approaches.
10607
- * - [`SavErase`](Self::SavErase) §3.3.1 prohibition on
10822
+ * - [`SavErase`](Self::SavErase): §3.3.1 prohibition on
10608
10823
  * storing Sensitive Authentication Data (CVV/CVC, track data,
10609
- * PIN blocks) after authorization. No options SAV has one
10824
+ * PIN blocks) after authorization. No options: SAV has one
10610
10825
  * posture: erase.
10611
10826
  */
10612
10827
  PciDssPart: {
@@ -10643,7 +10858,7 @@ interface components {
10643
10858
  * Callers wanting more than one dispatched from one policy
10644
10859
  * compose multiple templates.
10645
10860
  *
10646
- * [`Engine::with_key_provider`]: https://docs.rs/nvisy-engine/latest/nvisy_engine/struct.Engine.html
10861
+ * [`Engine::with_key_provider`]: https://docs.rs/elide-pipeline/latest/elide_pipeline/struct.Engine.html
10647
10862
  */
10648
10863
  PciPanRender: "truncate" | "truncate_last_four" | "hmac_sha256" | "hmac_sha512";
10649
10864
  /** @description Pipeline response. */
@@ -11015,24 +11230,19 @@ interface components {
11015
11230
  /**
11016
11231
  * @description Named clusters of [`LabelRef`]s this policy's rules may
11017
11232
  * reference by name via [`Predicate::LabelInGroup`]. Scoped
11018
- * to this policy a rule can only name a group its own
11233
+ * to this policy: a rule can only name a group its own
11019
11234
  * policy declared; unknown references error at request
11020
11235
  * validation. Two policies that both declare `hipaa_18` with
11021
11236
  * different labelsets stay independent.
11022
11237
  *
11023
11238
  * [`LabelRef`]: elide_core::entity::LabelRef
11024
- * [`Predicate::LabelInGroup`]: predicate::Predicate::LabelInGroup
11239
+ * [`Predicate::LabelInGroup`]: crate::Predicate::LabelInGroup
11025
11240
  */
11026
11241
  groups?: components["schemas"]["LabelGroup"][];
11027
11242
  /**
11028
11243
  * Format: uuid
11029
11244
  * @description Stable identifier. UUIDv7 recommended (time-ordered);
11030
11245
  * customer-supplied so re-submissions carry the same id.
11031
- * Engine stamps this into the redaction event's
11032
- * [`Attribution::name`] so reviewers can find this policy
11033
- * from any redaction it drove.
11034
- *
11035
- * [`Attribution::name`]: elide_core::entity::provenance::Attribution::name
11036
11246
  */
11037
11247
  id: string;
11038
11248
  /**
@@ -11043,10 +11253,56 @@ interface components {
11043
11253
  * tag-based [`Predicate::TagOneOf`] matching.
11044
11254
  *
11045
11255
  * [`LabelCatalog`]: elide_core::entity::LabelCatalog
11046
- * [`Predicate::TagOneOf`]: predicate::Predicate::TagOneOf
11256
+ * [`Predicate::TagOneOf`]: crate::Predicate::TagOneOf
11257
+ */
11258
+ labels?: components["schemas"]["Labels"];
11259
+ /**
11260
+ * @description Human-readable name. Display-only. Does not key anything.
11261
+ *
11262
+ * Names the policy in a redaction event's [`Attribution`]
11263
+ * when a rule that fired carried no [`AttributionKind::Cited`]
11264
+ * attribution to render.
11265
+ *
11266
+ * [`Attribution`]: elide_core::entity::audit::Attribution
11267
+ * [`AttributionKind::Cited`]: elide_core::entity::audit::AttributionKind::Cited
11268
+ */
11269
+ name: string;
11270
+ /** @description Ordered rules. First match wins within this policy. */
11271
+ rules?: components["schemas"]["PolicyRule"][];
11272
+ /**
11273
+ * @description The shipped template this policy was built from, when it
11274
+ * was.
11275
+ *
11276
+ * Provenance, not fidelity: callers are expected to mutate a
11277
+ * template's policy before submitting, so this records where
11278
+ * the policy came from and says nothing about whether it
11279
+ * still matches. `None` means hand-authored.
11280
+ */
11281
+ template?: components["schemas"]["TemplateOrigin"];
11282
+ };
11283
+ /**
11284
+ * @description A client-authored policy body: the parts of a policy definition a caller may
11285
+ * set, without the fields the server owns.
11286
+ *
11287
+ * The engine's `PolicyDefinition` also carries an `id` and a `template` origin.
11288
+ * Both are server-owned — the `id` is minted at creation and the `template`
11289
+ * records which built-in a policy was seeded from (provenance). Neither is
11290
+ * representable here, so a client cannot mint ids or forge provenance; the
11291
+ * server stamps them in [`into_definition`](PolicyDraft::into_definition).
11292
+ */
11293
+ PolicyDraft: {
11294
+ /** @description Optional description for reviewers. */
11295
+ description?: string;
11296
+ /** @description Per-policy catch-all, fired when no rule matched. */
11297
+ fallback?: components["schemas"]["ModalityRedactions"];
11298
+ /** @description Named clusters of labels this policy's rules may reference by name. */
11299
+ groups?: components["schemas"]["LabelGroup"][];
11300
+ /**
11301
+ * @description Vocabulary the policy operates over: builtins picked by name plus
11302
+ * caller-authored custom label schemas.
11047
11303
  */
11048
11304
  labels?: components["schemas"]["Labels"];
11049
- /** @description Human-readable name. Display-only. Does not key anything. */
11305
+ /** @description Human-readable name. Display-only. */
11050
11306
  name: string;
11051
11307
  /** @description Ordered rules. First match wins within this policy. */
11052
11308
  rules?: components["schemas"]["PolicyRule"][];
@@ -11071,16 +11327,30 @@ interface components {
11071
11327
  * [`PolicyDefinition`]: super::PolicyDefinition
11072
11328
  */
11073
11329
  PolicyRule: {
11330
+ /**
11331
+ * @description Why this rule exists: the authority it answers to.
11332
+ *
11333
+ * The engine renders it into the redaction event's
11334
+ * [`Attribution`], so a reviewer sees the provision rather
11335
+ * than a bare UUID. `None` falls back to recording the
11336
+ * policy and rule ids alone.
11337
+ *
11338
+ * Optional so ad-hoc and hand-authored rules stay cheap to
11339
+ * write; the shipped templates set it on every rule.
11340
+ *
11341
+ * [`Attribution`]: elide_core::entity::audit::Attribution
11342
+ */
11343
+ attribution?: components["schemas"]["AttributionKind"];
11074
11344
  /** @description Optional description for reviewers. */
11075
11345
  description?: string;
11076
11346
  /**
11077
11347
  * Format: uuid
11078
11348
  * @description Stable identifier. UUIDv7 recommended. Engine stamps it
11079
- * into the redaction event's [`Attribution::description`] so
11349
+ * into the redaction event's [`Attribution::source_id`] so
11080
11350
  * reviewers can trace which rule fired. Every attachment a
11081
11351
  * [`RuleDispatch::Table`] expands into shares this UUID.
11082
11352
  *
11083
- * [`Attribution::description`]: elide_core::entity::provenance::Attribution::description
11353
+ * [`Attribution::source_id`]: elide_core::entity::audit::Attribution::source_id
11084
11354
  */
11085
11355
  id: string;
11086
11356
  /** @description Human-readable name. Display-only. */
@@ -11093,7 +11363,7 @@ interface components {
11093
11363
  * policy in the chain).
11094
11364
  *
11095
11365
  * Boxed to keep [`RuleDispatch`]'s stack footprint
11096
- * small [`ModalityRedactions`] carries four optional
11366
+ * small: [`ModalityRedactions`] carries four optional
11097
11367
  * per-modality operator enums and dominates the variant
11098
11368
  * size. `Table`'s `Vec<LabelEntry>` already heap-allocates
11099
11369
  * its entries, so boxing here keeps the two variants
@@ -11173,6 +11443,15 @@ interface components {
11173
11443
  * `{"kind": "pci_dss_pan", "render": "hmac_sha256"}`.
11174
11444
  */
11175
11445
  PolicyTemplate: {
11446
+ /**
11447
+ * @description Which §(J) account-identifier labels to remove. Defaults
11448
+ * to [`HipaaAccountNumbers::Standard`] (bank account +
11449
+ * IBAN + payment card). Pick
11450
+ * [`HipaaAccountNumbers::Extended`] to add crypto wallet
11451
+ * addresses under the §(R) catch-all reading.
11452
+ * @default standard
11453
+ */
11454
+ accounts: components["schemas"]["HipaaAccountNumbers"];
11176
11455
  /** @constant */
11177
11456
  kind: "hipaa_deidentification";
11178
11457
  /**
@@ -11184,7 +11463,18 @@ interface components {
11184
11463
  /** @constant */
11185
11464
  kind: "gdpr_article9";
11186
11465
  /**
11187
- * @description Which operator to apply to Article 9 matches. See
11466
+ * @description Which sensitive-data labels to cover. Defaults to
11467
+ * [`GdprSensitiveScope::Article9`] (nine Article 9(1)
11468
+ * categories only). Pick
11469
+ * [`GdprSensitiveScope::Article9WithReidHardening`] to add
11470
+ * the quasi-identifier set, or
11471
+ * [`GdprSensitiveScope::Article9And10`] to also cover
11472
+ * Article 10 criminal-justice data.
11473
+ * @default article9
11474
+ */
11475
+ scope: components["schemas"]["GdprSensitiveScope"];
11476
+ /**
11477
+ * @description Which operator to apply to matches. See
11188
11478
  * [`GdprArticle9Treatment`] for the tradeoff.
11189
11479
  */
11190
11480
  treatment: components["schemas"]["GdprArticle9Treatment"];
@@ -11286,6 +11576,33 @@ interface components {
11286
11576
  /** Format: uint */
11287
11577
  start: number;
11288
11578
  };
11579
+ /**
11580
+ * @description Policy for rendering a document's pages to images.
11581
+ *
11582
+ * [`Auto`] is the default: use the text layer where it exists (redact by
11583
+ * deleting glyphs) and render only where it is absent. [`Always`] renders
11584
+ * every page regardless of the text layer, for documents whose text is
11585
+ * missing, garbled, or a watermark. [`Never`] relies on the text layer only.
11586
+ *
11587
+ * Serializes with an internal `kind` tag (`{"kind": "auto"}`,
11588
+ * `{"kind": "always", "dpi": 300}`, `{"kind": "never"}`).
11589
+ *
11590
+ * [`Auto`]: RasterMode::Auto
11591
+ * [`Always`]: RasterMode::Always
11592
+ * [`Never`]: RasterMode::Never
11593
+ */
11594
+ RasterMode: {
11595
+ /** @constant */
11596
+ kind: "auto";
11597
+ } | {
11598
+ /** @description Resolution to render pages at; [`Dpi::OCR`] (300) is typical. */
11599
+ dpi: components["schemas"]["Dpi"];
11600
+ /** @constant */
11601
+ kind: "always";
11602
+ } | {
11603
+ /** @constant */
11604
+ kind: "never";
11605
+ };
11289
11606
  /** @description The engine's registered recognizers, grouped by kind. */
11290
11607
  RecognizerCatalog: {
11291
11608
  /** @description LLM recognizers. */
@@ -11304,20 +11621,28 @@ interface components {
11304
11621
  *
11305
11622
  * Owned rather than borrowing from the engine so callers can
11306
11623
  * carry the value past the borrow that produced it. Cloning is
11307
- * cheap [`HipStr`] shares the backing string via an `Arc`
11624
+ * cheap: [`HipStr`] shares the backing string via an `Arc`
11308
11625
  * header.
11309
11626
  */
11310
11627
  RegisteredRecognizer: {
11311
11628
  /** @description Optional human-readable description. */
11312
11629
  description?: string;
11313
11630
  /**
11314
- * @description Recognizer name the identifier a request's allowlist
11631
+ * @description Recognizer name: the identifier a request's allowlist
11315
11632
  * picks by.
11316
11633
  */
11317
11634
  name: string;
11318
11635
  /**
11319
11636
  * @description Provider slug. NER: `"bento"`, `"mock"`. LLM: `"openai"`,
11320
11637
  * `"anthropic"`, `"gemini"`, `"ollama"`, `"mock"`.
11638
+ *
11639
+ * Owned so the type deserializes from a runtime buffer: a
11640
+ * `&'static str` field would make the derive emit
11641
+ * `Deserialize<'static>` only, which compiles against string
11642
+ * literals but not against an owned `String` or a reader -
11643
+ * the shapes a host actually decodes from. Borrowing a
11644
+ * `&'static str` into a [`HipStr`] does not allocate, so
11645
+ * engine-side construction stays free.
11321
11646
  */
11322
11647
  provider: string;
11323
11648
  };
@@ -11398,7 +11723,7 @@ interface components {
11398
11723
  * @description A reviewer-supplied redaction override with the policy
11399
11724
  * authority it draws from.
11400
11725
  *
11401
- * The `policy_id` isn't just for audit it also picks which
11726
+ * The `policy_id` isn't just for audit: it also picks which
11402
11727
  * per-policy pseudonym vault and per-policy [`KeyProvider`] the
11403
11728
  * override's operator resolves against, so an override using
11404
11729
  * [`Pseudonymize`] or [`HmacHash`] stays consistent with the
@@ -11422,7 +11747,7 @@ interface components {
11422
11747
  * the anonymize request. The audit event stamps this UUID
11423
11748
  * as the attribution `name`.
11424
11749
  *
11425
- * [`PolicyDefinition`]: nvisy_schema::policy::PolicyDefinition
11750
+ * [`PolicyDefinition`]: elide_governance::PolicyDefinition
11426
11751
  */
11427
11752
  policyId: string;
11428
11753
  };
@@ -11439,7 +11764,7 @@ interface components {
11439
11764
  * closure into provenance, so [`Predicate`] records only that a predicate
11440
11765
  * matched, not which one.
11441
11766
  *
11442
- * [`Redaction`]: crate::entity::provenance::EventKind::Redaction
11767
+ * [`Redaction`]: crate::entity::audit::AuditKind::Redaction
11443
11768
  * [`Predicate`]: RuleMatch::Predicate
11444
11769
  */
11445
11770
  RuleMatch: {
@@ -11781,152 +12106,90 @@ interface components {
11781
12106
  reportId?: string;
11782
12107
  };
11783
12108
  /**
11784
- * @description Detected piece of sensitive information within some medium.
12109
+ * @description One node in an entity's audit DAG: a thing that happened, with its
12110
+ * effect on confidence and its tamper-evident links.
11785
12111
  *
11786
- * Generic over the [`Modality`] `M`, which is what makes the model
11787
- * multimodal: a text pipeline yields `Entity<Text>`, an audio pipeline
11788
- * `Entity<Audio>`, and so on. The entity's location is the modality's
11789
- * [`Location`] type, `M::Location`.
12112
+ * Events are recorded on an entity's [`AuditLog`], forming the full audit
12113
+ * trail of its life: each recognizer that found it, the deduplication that
12114
+ * fused them, any score calibration, and the redaction that hid it. The
12115
+ * uniform spine (who, resulting score, when) is the same for every event; the
12116
+ * [`kind`] carries the event-specific detail *and* the explanation of why the
12117
+ * event happened.
11790
12118
  *
11791
- * # Birth and fusion
12119
+ * Each event links to its [`parents`] by their [`hash`]: a birth event (a
12120
+ * recognizer's first detection) has no parents, a normal step has one, and a
12121
+ * [fusion](crate::entity::audit::AuditLog::record_fusion) has several. Its own
12122
+ * [`hash`] folds the
12123
+ * payload together with the parents' hashes, so altering any event breaks
12124
+ * every event downstream of it: [`AuditLog::verify`] walks the DAG and
12125
+ * reports the first break.
11792
12126
  *
11793
- * A recognizer emits an entity directly, carrying a single recognition
11794
- * [`Event`] (its own finding) in the entity's [`provenance`]. When
11795
- * several recognizers find the same thing, a fusion step (in
11796
- * `elide`) combines their entities into one: the survivor's
11797
- * [`location`] and [`confidence`] are the *fused* values, and every
11798
- * contributing recognition event, plus a deduplication event, is
11799
- * retained in its provenance. The entity therefore carries its full
11800
- * audit trail with it.
12127
+ * `entity.confidence` always equals the [`confidence`] of the most recent
12128
+ * event. The confidence *flowing in* is not stored: it is the parents'
12129
+ * [`confidence`], recovered from the DAG.
11801
12130
  *
11802
- * [`Location`]: Modality::Location
11803
- * [`Event`]: crate::entity::provenance::Event
11804
- * [`provenance`]: Entity::provenance
11805
- * [`location`]: Entity::location
11806
- * [`confidence`]: Entity::confidence
12131
+ * [`AuditLog`]: crate::entity::audit::AuditLog
12132
+ * [`AuditLog::record_fusion`]: crate::entity::audit::AuditLog::record_fusion
12133
+ * [`AuditLog::verify`]: crate::entity::audit::AuditLog::verify
12134
+ * [`kind`]: AuditEvent::kind
12135
+ * [`parents`]: AuditEvent::parents
12136
+ * [`hash`]: AuditEvent::hash
12137
+ * [`confidence`]: AuditEvent::confidence
11807
12138
  */
11808
- TabularEntity: {
11809
- /** @description Effective confidence in `0.0..=1.0` (fused, if applicable). */
11810
- confidence: components["schemas"]["Confidence"];
11811
- /**
11812
- * @description Coreference identifier, if a recognizer resolved this entity as one
11813
- * mention of a cluster. Entities sharing an [`EntityCoRef`] denote the
11814
- * same real-world thing.
11815
- */
11816
- coref?: components["schemas"]["EntityCoRef"];
11817
- /**
11818
- * Format: uuid
11819
- * @description Stable unique identity for this entity (time-ordered UUIDv7), minted
11820
- * when the entity is assembled.
11821
- */
11822
- id: string;
12139
+ TabularAuditEvent: {
11823
12140
  /**
11824
- * @description What kind of sensitive information this is (resolved via a
11825
- * [`LabelCatalog`]).
12141
+ * @description Confidence after this event: the entity's effective confidence once it
12142
+ * has happened.
11826
12143
  */
11827
- label: components["schemas"]["LabelRef"];
11828
- /**
11829
- * @description The language of this entity's surrounding text, when a recognizer
11830
- * resolved one. `None` when unknown or language-agnostic.
11831
- */
11832
- language?: string;
11833
- /**
11834
- * @description Location of the entity within the medium (fused, if it came from more
11835
- * than one detection).
11836
- */
11837
- location: components["schemas"]["TabularLocation"];
11838
- /**
11839
- * @description Detection audit trail: every contributing detection and the fusion
11840
- * event, if any.
11841
- */
11842
- provenance: components["schemas"]["TabularProvenance"];
12144
+ confidence: components["schemas"]["Confidence"];
11843
12145
  /**
11844
- * @description Byte range of the match in the *recognized text* it was found in (the
11845
- * OCR layout text, the audio transcript, or the text payload itself) —
11846
- * the stable key back into that enrichment artifact, where the rich
11847
- * context lives (which OCR block, which speaker) that the geometric
11848
- * [`location`] cannot hold. `None` for entities not found via text
11849
- * recognition (e.g. a VLM box). Provenance, not a coordinate: redaction
11850
- * uses [`location`]; an audit uses this with the artifact.
12146
+ * @description This event's hash, over its payload and its parents' hashes. Assigned by
12147
+ * [`AuditLog`] when the event is recorded; read it through
12148
+ * [`hash`](Self::hash). Recomputing it is how the DAG is verified.
11851
12149
  *
11852
- * [`location`]: Entity::location
11853
- */
11854
- recognized_range?: components["schemas"]["Range_of_uint"];
11855
- };
11856
- /**
11857
- * @description One recognized entity plus the optional reviewer override.
11858
- *
11859
- * The bound mirrors elide's [`Entity<M>`]: serialization needs
11860
- * `M::Location` and `M::Data` (de)serializable, and JsonSchema
11861
- * derivation needs them schema-able. All four modalities elide
11862
- * ships satisfy these under the `serde` + `schema` features.
11863
- */
11864
- TabularEntityRecord: {
11865
- /** @description The elide entity, as recognition produced it. */
11866
- entity: components["schemas"]["TabularEntity"];
11867
- /**
11868
- * @description Reviewer-supplied redaction override.
12150
+ * Not publicly settable: only [`AuditLog`] assigns it, so a caller cannot
12151
+ * forge a self-consistent event outside the recording path.
11869
12152
  *
11870
- * `None` means "use the matching policy rule's decision";
11871
- * `Some(...)` overrides that rule for this specific entity
11872
- * at apply time. Reviewer overrides take precedence over
11873
- * every policy rule and inherit the authority of the
11874
- * [`Review::policy_id`] they name — the audit event's
11875
- * attribution stamps that policy so the trail names the
11876
- * authority under which the override fired.
12153
+ * [`AuditLog`]: crate::entity::audit::AuditLog
11877
12154
  */
11878
- review?: components["schemas"]["Review"];
11879
- };
11880
- /**
11881
- * @description One thing that happened to an entity, with its effect on confidence.
11882
- *
11883
- * Events are recorded in order on an entity's [`Provenance`], forming
11884
- * the full audit trail of its life: each recognizer that found it, the
11885
- * deduplication that fused them, any score calibration, and the
11886
- * redaction that hid it. The uniform spine (who, before/after score,
11887
- * when, why) is the same for every event; the [`kind`] carries the
11888
- * event-specific detail.
11889
- *
11890
- * `entity.confidence` always equals the [`after`] of the most recent
11891
- * event.
11892
- *
11893
- * [`Provenance`]: crate::entity::provenance::Provenance
11894
- * [`kind`]: Event::kind
11895
- * [`after`]: Event::after
11896
- */
11897
- TabularEvent: {
11898
- /** @description Confidence after this event. */
11899
- after: components["schemas"]["Confidence"];
11900
- /** @description When the event happened (UTC). */
11901
- at: string;
12155
+ hash: components["schemas"]["AuditHash"];
12156
+ /** @description Kind of event, with its event-specific detail and its rationale. */
12157
+ kind: components["schemas"]["TabularAuditKind"];
11902
12158
  /**
11903
- * @description Confidence before this event, if there was a prior value. `None` on
11904
- * the first (birth) event.
12159
+ * @description The events this one follows, by their hash. Empty for a birth event, one
12160
+ * entry for a normal step, several for a fusion. Assigned by [`AuditLog`]
12161
+ * when the event is recorded; read it through [`parents`](Self::parents).
12162
+ *
12163
+ * Not publicly settable: the links are the tamper-evident structure, so
12164
+ * only [`AuditLog::record`] / [`AuditLog::record_fusion`] assign them.
12165
+ *
12166
+ * [`AuditLog`]: crate::entity::audit::AuditLog
12167
+ * [`AuditLog::record`]: crate::entity::audit::AuditLog::record
12168
+ * [`AuditLog::record_fusion`]: crate::entity::audit::AuditLog::record_fusion
11905
12169
  */
11906
- before?: components["schemas"]["Confidence"];
11907
- /** @description Kind of event, with its event-specific detail. */
11908
- kind: components["schemas"]["TabularEventKind"];
11909
- /** @description Free-text explanation of what the event did and why. */
11910
- reason: string;
12170
+ parents: components["schemas"]["AuditHash"][];
11911
12171
  /**
11912
12172
  * @description Who produced this event: a recognizer name, a deduplication strategy,
11913
12173
  * an operator, or whatever acted.
11914
12174
  */
11915
12175
  source: string;
12176
+ /** @description When the event happened (UTC). */
12177
+ timestamp: string;
11916
12178
  };
11917
12179
  /**
11918
- * @description Kind of an [`Event`], carrying its event-specific detail.
12180
+ * @description Kind of an [`AuditEvent`], carrying its event-specific detail and the
12181
+ * rationale for why it happened.
11919
12182
  *
11920
12183
  * `#[non_exhaustive]`: new event kinds (verification, annotation, …)
11921
12184
  * can be added compatibly. The recognition kinds ([`Pattern`],
11922
12185
  * [`Model`]) carry the matched [`Location`]; the rest carry their own
11923
12186
  * data.
11924
12187
  *
11925
- * [`Pattern`]: EventKind::Pattern
11926
- * [`Model`]: EventKind::Model
12188
+ * [`Pattern`]: AuditKind::Pattern
12189
+ * [`Model`]: AuditKind::Model
11927
12190
  * [`Location`]: Modality::Location
11928
12191
  */
11929
- TabularEventKind: {
12192
+ TabularAuditKind: {
11930
12193
  /** @constant */
11931
12194
  kind: "pattern";
11932
12195
  /** @description Where the recognizer matched. */
@@ -11990,7 +12253,7 @@ interface components {
11990
12253
  * it is the keyword resolved through the modality's [`locate`] (a
11991
12254
  * pixel box for image, a time span for audio, the byte range for
11992
12255
  * text/tabular). `None` when the keyword's stream range could not be
11993
- * placed symmetric with a match the recognizer itself drops.
12256
+ * placed, symmetric with a match the recognizer itself drops.
11994
12257
  *
11995
12258
  * [`locate`]: crate::modality::TextRecognizable::locate
11996
12259
  */
@@ -12008,12 +12271,158 @@ interface components {
12008
12271
  /** @description How much the output leaks about the original. */
12009
12272
  leak_profile: components["schemas"]["LeakProfile"];
12010
12273
  /**
12011
- * @description Which selection rule chose this operator the automatic "why"
12274
+ * @description Which selection rule chose this operator: the automatic "why"
12012
12275
  * (matched a label, a tag, a predicate, or the fallback).
12013
12276
  */
12014
12277
  matched_by: components["schemas"]["RuleMatch"];
12015
12278
  /** @description Which operator (name + version) ran. */
12016
12279
  operator: components["schemas"]["OperatorId"];
12280
+ /**
12281
+ * @description BLAKE3 digest of the original text the operator hid, when the
12282
+ * redaction layer recorded it. Proves *what* was redacted without
12283
+ * storing the plaintext; `None` when the operator did not capture it.
12284
+ */
12285
+ span_hash?: components["schemas"]["AuditHash"];
12286
+ /**
12287
+ * Format: uint32
12288
+ * @description Byte length of the original text the operator hid, paired with
12289
+ * [`span_hash`](Self::Redaction::span_hash). `None` when not captured.
12290
+ */
12291
+ span_length?: number;
12292
+ };
12293
+ /**
12294
+ * @description Full audit trail of an [`Entity`]: every [`AuditEvent`] in its life, as a
12295
+ * tamper-evident DAG.
12296
+ *
12297
+ * Where Presidio keeps a shallow, optional, per-stage explanation that is
12298
+ * stripped by default, an `AuditLog` is always present and records the
12299
+ * entity's *entire* life: each recognizer that found it, the deduplication
12300
+ * that fused them, any confidence calibration, and the redaction that hid it.
12301
+ * Nothing is collapsed: every recognizer keeps its own recognition event with
12302
+ * its location and score.
12303
+ *
12304
+ * The events form a **directed acyclic graph**, not a flat list. A recognizer
12305
+ * records a birth event (no parents); each later step links to the event it
12306
+ * follows; and a [fusion](Self::record_fusion) links to *several* parents at
12307
+ * once: the heads of the trails it combines. This is the true shape of a
12308
+ * deduplicated entity: two recognizers are siblings, then a fusion joins them.
12309
+ * The events are stored in the order they were recorded, which is a
12310
+ * topological order of the DAG (a parent is always recorded before its
12311
+ * children).
12312
+ *
12313
+ * Two chains ride the DAG's edges:
12314
+ *
12315
+ * - a **confidence chain**, where each event's [`confidence`] is the entity's
12316
+ * effective score after it; the score flowing *in* is its parents'
12317
+ * confidence, so [`final_confidence`] and the full history are recoverable;
12318
+ * - a **hash chain**, where each event's [`hash`] folds its payload together
12319
+ * with its parents' hashes, so any edit, reorder, insertion, or deletion of
12320
+ * an earlier event breaks every event downstream. [`verify`] walks the DAG
12321
+ * and reports the first break.
12322
+ *
12323
+ * [`Entity`]: crate::entity::Entity
12324
+ * [`confidence`]: AuditEvent::confidence
12325
+ * [`hash`]: AuditEvent::hash
12326
+ * [`final_confidence`]: Self::final_confidence
12327
+ * [`verify`]: Self::verify
12328
+ */
12329
+ TabularAuditLog: components["schemas"]["TabularAuditEvent"][];
12330
+ /**
12331
+ * @description Detected piece of sensitive information within some medium.
12332
+ *
12333
+ * Generic over the [`Modality`] `M`, which is what makes the model
12334
+ * multimodal: a text pipeline yields `Entity<Text>`, an audio pipeline
12335
+ * `Entity<Audio>`, and so on. The entity's location is the modality's
12336
+ * [`Location`] type, `M::Location`.
12337
+ *
12338
+ * # Birth and fusion
12339
+ *
12340
+ * A recognizer emits an entity directly, carrying a single recognition
12341
+ * [`AuditEvent`] (its own finding) in the entity's [`audit`] trail. When
12342
+ * several recognizers find the same thing, a fusion step (in
12343
+ * `elide`) combines their entities into one: the survivor's
12344
+ * [`location`] and [`confidence`] are the *fused* values, and every
12345
+ * contributing recognition event, plus a deduplication event, is
12346
+ * retained in its audit trail. The entity therefore carries its full
12347
+ * audit trail with it.
12348
+ *
12349
+ * [`Location`]: Modality::Location
12350
+ * [`AuditEvent`]: crate::entity::audit::AuditEvent
12351
+ * [`audit`]: Entity::audit
12352
+ * [`location`]: Entity::location
12353
+ * [`confidence`]: Entity::confidence
12354
+ */
12355
+ TabularEntity: {
12356
+ /**
12357
+ * @description Tamper-evident audit trail: every contributing detection, the fusion
12358
+ * event if any, and the redaction that hid it, as a hash-linked DAG.
12359
+ */
12360
+ audit: components["schemas"]["TabularAuditLog"];
12361
+ /** @description Effective confidence in `0.0..=1.0` (fused, if applicable). */
12362
+ confidence: components["schemas"]["Confidence"];
12363
+ /**
12364
+ * @description Coreference identifier, if a recognizer resolved this entity as one
12365
+ * mention of a cluster. Entities sharing an [`EntityCoRef`] denote the
12366
+ * same real-world thing.
12367
+ */
12368
+ coref?: components["schemas"]["EntityCoRef"];
12369
+ /**
12370
+ * Format: uuid
12371
+ * @description Stable unique identity for this entity (time-ordered UUIDv7), minted
12372
+ * when the entity is assembled.
12373
+ */
12374
+ id: string;
12375
+ /**
12376
+ * @description What kind of sensitive information this is (resolved via a
12377
+ * [`LabelCatalog`]).
12378
+ */
12379
+ label: components["schemas"]["LabelRef"];
12380
+ /**
12381
+ * @description The language of this entity's surrounding text, when a recognizer
12382
+ * resolved one. `None` when unknown or language-agnostic.
12383
+ */
12384
+ language?: string;
12385
+ /**
12386
+ * @description Location of the entity within the medium (fused, if it came from more
12387
+ * than one detection).
12388
+ */
12389
+ location: components["schemas"]["TabularLocation"];
12390
+ /**
12391
+ * @description Byte range of the match in the *recognized text* it was found in (the
12392
+ * OCR layout text, the audio transcript, or the text payload itself) —
12393
+ * the stable key back into that enrichment artifact, where the rich
12394
+ * context lives (which OCR block, which speaker) that the geometric
12395
+ * [`location`] cannot hold. `None` for entities not found via text
12396
+ * recognition (e.g. a VLM box). An audit key, not a coordinate: redaction
12397
+ * uses [`location`]; an audit uses this with the artifact.
12398
+ *
12399
+ * [`location`]: Entity::location
12400
+ */
12401
+ recognized_range?: components["schemas"]["Range_of_uint"];
12402
+ };
12403
+ /**
12404
+ * @description One recognized entity plus the optional reviewer override.
12405
+ *
12406
+ * The bound mirrors elide's [`Entity<M>`]: serialization needs
12407
+ * `M::Location` and `M::Data` (de)serializable, and JsonSchema
12408
+ * derivation needs them schema-able. All four modalities elide
12409
+ * ships satisfy these under the `serde` + `schema` features.
12410
+ */
12411
+ TabularEntityRecord: {
12412
+ /** @description The elide entity, as recognition produced it. */
12413
+ entity: components["schemas"]["TabularEntity"];
12414
+ /**
12415
+ * @description Reviewer-supplied redaction override.
12416
+ *
12417
+ * `None` means "use the matching policy rule's decision";
12418
+ * `Some(...)` overrides that rule for this specific entity
12419
+ * at apply time. Reviewer overrides take precedence over
12420
+ * every policy rule and inherit the authority of the
12421
+ * [`Review::policy_id`] they name: the audit event's
12422
+ * attribution stamps that policy so the trail names the
12423
+ * authority under which the override fired.
12424
+ */
12425
+ review?: components["schemas"]["Review"];
12017
12426
  };
12018
12427
  /**
12019
12428
  * @description Located, typed piece of context a recognizer may treat as in-context
@@ -12085,31 +12494,6 @@ interface components {
12085
12494
  */
12086
12495
  start_offset?: number;
12087
12496
  };
12088
- /**
12089
- * @description Full audit trail of an [`Entity`]: every [`Event`] in its life, in
12090
- * order.
12091
- *
12092
- * This is the model's answer to "full provenance": where Presidio keeps
12093
- * a shallow, optional, per-stage explanation that is stripped by
12094
- * default, a `Provenance` is always present and records the entity's
12095
- * *entire* life as an ordered list of events: each recognizer that
12096
- * found it, the deduplication that fused them, any confidence
12097
- * calibration, and the redaction that hid it. Nothing is collapsed:
12098
- * every recognizer keeps its own recognition event with its location
12099
- * and score.
12100
- *
12101
- * The events form a confidence chain (each event's [`after`] is the
12102
- * next's [`before`]) so the final confidence and its full history are
12103
- * always recoverable.
12104
- *
12105
- * [`Entity`]: crate::entity::Entity
12106
- * [`after`]: Event::after
12107
- * [`before`]: Event::before
12108
- */
12109
- TabularProvenance: {
12110
- /** @description Events, in the order they happened. */
12111
- events: components["schemas"]["TabularEvent"][];
12112
- };
12113
12497
  /** @description Operator spec a `redact` tabular rule carries. */
12114
12498
  TabularRedaction: {
12115
12499
  /** @constant */
@@ -12127,6 +12511,39 @@ interface components {
12127
12511
  /** @constant */
12128
12512
  kind: "drop_column";
12129
12513
  };
12514
+ /**
12515
+ * @description The template a [`PolicyDefinition`] was built from.
12516
+ *
12517
+ * Records **provenance, not fidelity**. Templates are plain data
12518
+ * and callers are expected to mutate the returned policy before
12519
+ * submitting it (swapping an operator, widening a group), so this
12520
+ * says "built from `hipaa_deid_safe_harbor` v1.0.0" and nothing
12521
+ * about whether the policy still matches what that template
12522
+ * ships. A reviewer who needs that rebuilds the template and
12523
+ * diffs.
12524
+ *
12525
+ * `None` on a policy means hand-authored, not "unknown template".
12526
+ *
12527
+ * Both fields are needed: a policy built from v1 of a template
12528
+ * can differ materially from one built from v2 (a widened label
12529
+ * set, a changed operator), and an audit that records only the id
12530
+ * cannot tell the two apart.
12531
+ *
12532
+ * [`PolicyDefinition`]: super::PolicyDefinition
12533
+ */
12534
+ TemplateOrigin: {
12535
+ /**
12536
+ * @description The template's machine key: `"hipaa_deid_safe_harbor"`,
12537
+ * `"pci_dss_pan_hmac_sha256"`. Stable across version bumps.
12538
+ */
12539
+ id: string;
12540
+ /**
12541
+ * @description The template's own semver version, distinct from the
12542
+ * crate's release version. A shipped template bumps this when
12543
+ * its labelset or operator dispatch changes.
12544
+ */
12545
+ version: string;
12546
+ };
12130
12547
  /**
12131
12548
  * @description Fallback operator that runs when a declinable primary
12132
12549
  * ([`TextRedaction::Clamp`], [`TextRedaction::GeneralizeDate`])
@@ -12140,7 +12557,7 @@ interface components {
12140
12557
  * or `→ Mask` / `→ Keep` on the rare occasion those fit.
12141
12558
  *
12142
12559
  * Absent from the primary's spec, elide's baked-in default is
12143
- * [`Erase`] a bare [`TextRedaction::Clamp`] without a `fallback`
12560
+ * [`Erase`]: a bare [`TextRedaction::Clamp`] without a `fallback`
12144
12561
  * erases values that aren't numeric.
12145
12562
  *
12146
12563
  * [`Erase`]: TerminalFallback::Erase
@@ -12187,163 +12604,90 @@ interface components {
12187
12604
  payload?: unknown;
12188
12605
  };
12189
12606
  /**
12190
- * @description Run of text.
12191
- *
12192
- * Either the payload a text recognizer inspects, or the value sliced out
12193
- * at an entity's location for an operator.
12194
- *
12195
- * Held as a [`HipStr`] so short values inline and longer ones share a
12196
- * refcounted buffer, making cheap clones when one payload is passed to
12197
- * several recognizers.
12198
- */
12199
- TextData: string;
12200
- /**
12201
- * @description Detected piece of sensitive information within some medium.
12607
+ * @description One node in an entity's audit DAG: a thing that happened, with its
12608
+ * effect on confidence and its tamper-evident links.
12202
12609
  *
12203
- * Generic over the [`Modality`] `M`, which is what makes the model
12204
- * multimodal: a text pipeline yields `Entity<Text>`, an audio pipeline
12205
- * `Entity<Audio>`, and so on. The entity's location is the modality's
12206
- * [`Location`] type, `M::Location`.
12610
+ * Events are recorded on an entity's [`AuditLog`], forming the full audit
12611
+ * trail of its life: each recognizer that found it, the deduplication that
12612
+ * fused them, any score calibration, and the redaction that hid it. The
12613
+ * uniform spine (who, resulting score, when) is the same for every event; the
12614
+ * [`kind`] carries the event-specific detail *and* the explanation of why the
12615
+ * event happened.
12207
12616
  *
12208
- * # Birth and fusion
12617
+ * Each event links to its [`parents`] by their [`hash`]: a birth event (a
12618
+ * recognizer's first detection) has no parents, a normal step has one, and a
12619
+ * [fusion](crate::entity::audit::AuditLog::record_fusion) has several. Its own
12620
+ * [`hash`] folds the
12621
+ * payload together with the parents' hashes, so altering any event breaks
12622
+ * every event downstream of it: [`AuditLog::verify`] walks the DAG and
12623
+ * reports the first break.
12209
12624
  *
12210
- * A recognizer emits an entity directly, carrying a single recognition
12211
- * [`Event`] (its own finding) in the entity's [`provenance`]. When
12212
- * several recognizers find the same thing, a fusion step (in
12213
- * `elide`) combines their entities into one: the survivor's
12214
- * [`location`] and [`confidence`] are the *fused* values, and every
12215
- * contributing recognition event, plus a deduplication event, is
12216
- * retained in its provenance. The entity therefore carries its full
12217
- * audit trail with it.
12625
+ * `entity.confidence` always equals the [`confidence`] of the most recent
12626
+ * event. The confidence *flowing in* is not stored: it is the parents'
12627
+ * [`confidence`], recovered from the DAG.
12218
12628
  *
12219
- * [`Location`]: Modality::Location
12220
- * [`Event`]: crate::entity::provenance::Event
12221
- * [`provenance`]: Entity::provenance
12222
- * [`location`]: Entity::location
12223
- * [`confidence`]: Entity::confidence
12629
+ * [`AuditLog`]: crate::entity::audit::AuditLog
12630
+ * [`AuditLog::record_fusion`]: crate::entity::audit::AuditLog::record_fusion
12631
+ * [`AuditLog::verify`]: crate::entity::audit::AuditLog::verify
12632
+ * [`kind`]: AuditEvent::kind
12633
+ * [`parents`]: AuditEvent::parents
12634
+ * [`hash`]: AuditEvent::hash
12635
+ * [`confidence`]: AuditEvent::confidence
12224
12636
  */
12225
- TextEntity: {
12226
- /** @description Effective confidence in `0.0..=1.0` (fused, if applicable). */
12227
- confidence: components["schemas"]["Confidence"];
12637
+ TextAuditEvent: {
12228
12638
  /**
12229
- * @description Coreference identifier, if a recognizer resolved this entity as one
12230
- * mention of a cluster. Entities sharing an [`EntityCoRef`] denote the
12231
- * same real-world thing.
12639
+ * @description Confidence after this event: the entity's effective confidence once it
12640
+ * has happened.
12232
12641
  */
12233
- coref?: components["schemas"]["EntityCoRef"];
12234
- /**
12235
- * Format: uuid
12236
- * @description Stable unique identity for this entity (time-ordered UUIDv7), minted
12237
- * when the entity is assembled.
12238
- */
12239
- id: string;
12240
- /**
12241
- * @description What kind of sensitive information this is (resolved via a
12242
- * [`LabelCatalog`]).
12243
- */
12244
- label: components["schemas"]["LabelRef"];
12245
- /**
12246
- * @description The language of this entity's surrounding text, when a recognizer
12247
- * resolved one. `None` when unknown or language-agnostic.
12248
- */
12249
- language?: string;
12250
- /**
12251
- * @description Location of the entity within the medium (fused, if it came from more
12252
- * than one detection).
12253
- */
12254
- location: components["schemas"]["TextLocation"];
12255
- /**
12256
- * @description Detection audit trail: every contributing detection and the fusion
12257
- * event, if any.
12258
- */
12259
- provenance: components["schemas"]["TextProvenance"];
12642
+ confidence: components["schemas"]["Confidence"];
12260
12643
  /**
12261
- * @description Byte range of the match in the *recognized text* it was found in (the
12262
- * OCR layout text, the audio transcript, or the text payload itself) —
12263
- * the stable key back into that enrichment artifact, where the rich
12264
- * context lives (which OCR block, which speaker) that the geometric
12265
- * [`location`] cannot hold. `None` for entities not found via text
12266
- * recognition (e.g. a VLM box). Provenance, not a coordinate: redaction
12267
- * uses [`location`]; an audit uses this with the artifact.
12644
+ * @description This event's hash, over its payload and its parents' hashes. Assigned by
12645
+ * [`AuditLog`] when the event is recorded; read it through
12646
+ * [`hash`](Self::hash). Recomputing it is how the DAG is verified.
12268
12647
  *
12269
- * [`location`]: Entity::location
12270
- */
12271
- recognized_range?: components["schemas"]["Range_of_uint"];
12272
- };
12273
- /**
12274
- * @description One recognized entity plus the optional reviewer override.
12275
- *
12276
- * The bound mirrors elide's [`Entity<M>`]: serialization needs
12277
- * `M::Location` and `M::Data` (de)serializable, and JsonSchema
12278
- * derivation needs them schema-able. All four modalities elide
12279
- * ships satisfy these under the `serde` + `schema` features.
12280
- */
12281
- TextEntityRecord: {
12282
- /** @description The elide entity, as recognition produced it. */
12283
- entity: components["schemas"]["TextEntity"];
12284
- /**
12285
- * @description Reviewer-supplied redaction override.
12648
+ * Not publicly settable: only [`AuditLog`] assigns it, so a caller cannot
12649
+ * forge a self-consistent event outside the recording path.
12286
12650
  *
12287
- * `None` means "use the matching policy rule's decision";
12288
- * `Some(...)` overrides that rule for this specific entity
12289
- * at apply time. Reviewer overrides take precedence over
12290
- * every policy rule and inherit the authority of the
12291
- * [`Review::policy_id`] they name — the audit event's
12292
- * attribution stamps that policy so the trail names the
12293
- * authority under which the override fired.
12651
+ * [`AuditLog`]: crate::entity::audit::AuditLog
12294
12652
  */
12295
- review?: components["schemas"]["Review"];
12296
- };
12297
- /**
12298
- * @description One thing that happened to an entity, with its effect on confidence.
12299
- *
12300
- * Events are recorded in order on an entity's [`Provenance`], forming
12301
- * the full audit trail of its life: each recognizer that found it, the
12302
- * deduplication that fused them, any score calibration, and the
12303
- * redaction that hid it. The uniform spine (who, before/after score,
12304
- * when, why) is the same for every event; the [`kind`] carries the
12305
- * event-specific detail.
12306
- *
12307
- * `entity.confidence` always equals the [`after`] of the most recent
12308
- * event.
12309
- *
12310
- * [`Provenance`]: crate::entity::provenance::Provenance
12311
- * [`kind`]: Event::kind
12312
- * [`after`]: Event::after
12313
- */
12314
- TextEvent: {
12315
- /** @description Confidence after this event. */
12316
- after: components["schemas"]["Confidence"];
12317
- /** @description When the event happened (UTC). */
12318
- at: string;
12653
+ hash: components["schemas"]["AuditHash"];
12654
+ /** @description Kind of event, with its event-specific detail and its rationale. */
12655
+ kind: components["schemas"]["TextAuditKind"];
12319
12656
  /**
12320
- * @description Confidence before this event, if there was a prior value. `None` on
12321
- * the first (birth) event.
12657
+ * @description The events this one follows, by their hash. Empty for a birth event, one
12658
+ * entry for a normal step, several for a fusion. Assigned by [`AuditLog`]
12659
+ * when the event is recorded; read it through [`parents`](Self::parents).
12660
+ *
12661
+ * Not publicly settable: the links are the tamper-evident structure, so
12662
+ * only [`AuditLog::record`] / [`AuditLog::record_fusion`] assign them.
12663
+ *
12664
+ * [`AuditLog`]: crate::entity::audit::AuditLog
12665
+ * [`AuditLog::record`]: crate::entity::audit::AuditLog::record
12666
+ * [`AuditLog::record_fusion`]: crate::entity::audit::AuditLog::record_fusion
12322
12667
  */
12323
- before?: components["schemas"]["Confidence"];
12324
- /** @description Kind of event, with its event-specific detail. */
12325
- kind: components["schemas"]["TextEventKind"];
12326
- /** @description Free-text explanation of what the event did and why. */
12327
- reason: string;
12668
+ parents: components["schemas"]["AuditHash"][];
12328
12669
  /**
12329
12670
  * @description Who produced this event: a recognizer name, a deduplication strategy,
12330
12671
  * an operator, or whatever acted.
12331
12672
  */
12332
12673
  source: string;
12674
+ /** @description When the event happened (UTC). */
12675
+ timestamp: string;
12333
12676
  };
12334
12677
  /**
12335
- * @description Kind of an [`Event`], carrying its event-specific detail.
12678
+ * @description Kind of an [`AuditEvent`], carrying its event-specific detail and the
12679
+ * rationale for why it happened.
12336
12680
  *
12337
12681
  * `#[non_exhaustive]`: new event kinds (verification, annotation, …)
12338
12682
  * can be added compatibly. The recognition kinds ([`Pattern`],
12339
12683
  * [`Model`]) carry the matched [`Location`]; the rest carry their own
12340
12684
  * data.
12341
12685
  *
12342
- * [`Pattern`]: EventKind::Pattern
12343
- * [`Model`]: EventKind::Model
12686
+ * [`Pattern`]: AuditKind::Pattern
12687
+ * [`Model`]: AuditKind::Model
12344
12688
  * [`Location`]: Modality::Location
12345
12689
  */
12346
- TextEventKind: {
12690
+ TextAuditKind: {
12347
12691
  /** @constant */
12348
12692
  kind: "pattern";
12349
12693
  /** @description Where the recognizer matched. */
@@ -12407,7 +12751,7 @@ interface components {
12407
12751
  * it is the keyword resolved through the modality's [`locate`] (a
12408
12752
  * pixel box for image, a time span for audio, the byte range for
12409
12753
  * text/tabular). `None` when the keyword's stream range could not be
12410
- * placed symmetric with a match the recognizer itself drops.
12754
+ * placed, symmetric with a match the recognizer itself drops.
12411
12755
  *
12412
12756
  * [`locate`]: crate::modality::TextRecognizable::locate
12413
12757
  */
@@ -12425,12 +12769,169 @@ interface components {
12425
12769
  /** @description How much the output leaks about the original. */
12426
12770
  leak_profile: components["schemas"]["LeakProfile"];
12427
12771
  /**
12428
- * @description Which selection rule chose this operator the automatic "why"
12772
+ * @description Which selection rule chose this operator: the automatic "why"
12429
12773
  * (matched a label, a tag, a predicate, or the fallback).
12430
12774
  */
12431
12775
  matched_by: components["schemas"]["RuleMatch"];
12432
12776
  /** @description Which operator (name + version) ran. */
12433
12777
  operator: components["schemas"]["OperatorId"];
12778
+ /**
12779
+ * @description BLAKE3 digest of the original text the operator hid, when the
12780
+ * redaction layer recorded it. Proves *what* was redacted without
12781
+ * storing the plaintext; `None` when the operator did not capture it.
12782
+ */
12783
+ span_hash?: components["schemas"]["AuditHash"];
12784
+ /**
12785
+ * Format: uint32
12786
+ * @description Byte length of the original text the operator hid, paired with
12787
+ * [`span_hash`](Self::Redaction::span_hash). `None` when not captured.
12788
+ */
12789
+ span_length?: number;
12790
+ };
12791
+ /**
12792
+ * @description Full audit trail of an [`Entity`]: every [`AuditEvent`] in its life, as a
12793
+ * tamper-evident DAG.
12794
+ *
12795
+ * Where Presidio keeps a shallow, optional, per-stage explanation that is
12796
+ * stripped by default, an `AuditLog` is always present and records the
12797
+ * entity's *entire* life: each recognizer that found it, the deduplication
12798
+ * that fused them, any confidence calibration, and the redaction that hid it.
12799
+ * Nothing is collapsed: every recognizer keeps its own recognition event with
12800
+ * its location and score.
12801
+ *
12802
+ * The events form a **directed acyclic graph**, not a flat list. A recognizer
12803
+ * records a birth event (no parents); each later step links to the event it
12804
+ * follows; and a [fusion](Self::record_fusion) links to *several* parents at
12805
+ * once: the heads of the trails it combines. This is the true shape of a
12806
+ * deduplicated entity: two recognizers are siblings, then a fusion joins them.
12807
+ * The events are stored in the order they were recorded, which is a
12808
+ * topological order of the DAG (a parent is always recorded before its
12809
+ * children).
12810
+ *
12811
+ * Two chains ride the DAG's edges:
12812
+ *
12813
+ * - a **confidence chain**, where each event's [`confidence`] is the entity's
12814
+ * effective score after it; the score flowing *in* is its parents'
12815
+ * confidence, so [`final_confidence`] and the full history are recoverable;
12816
+ * - a **hash chain**, where each event's [`hash`] folds its payload together
12817
+ * with its parents' hashes, so any edit, reorder, insertion, or deletion of
12818
+ * an earlier event breaks every event downstream. [`verify`] walks the DAG
12819
+ * and reports the first break.
12820
+ *
12821
+ * [`Entity`]: crate::entity::Entity
12822
+ * [`confidence`]: AuditEvent::confidence
12823
+ * [`hash`]: AuditEvent::hash
12824
+ * [`final_confidence`]: Self::final_confidence
12825
+ * [`verify`]: Self::verify
12826
+ */
12827
+ TextAuditLog: components["schemas"]["TextAuditEvent"][];
12828
+ /**
12829
+ * @description Run of text.
12830
+ *
12831
+ * Either the payload a text recognizer inspects, or the value sliced out
12832
+ * at an entity's location for an operator.
12833
+ *
12834
+ * Held as a [`HipStr`] so short values inline and longer ones share a
12835
+ * refcounted buffer, making cheap clones when one payload is passed to
12836
+ * several recognizers.
12837
+ */
12838
+ TextData: string;
12839
+ /**
12840
+ * @description Detected piece of sensitive information within some medium.
12841
+ *
12842
+ * Generic over the [`Modality`] `M`, which is what makes the model
12843
+ * multimodal: a text pipeline yields `Entity<Text>`, an audio pipeline
12844
+ * `Entity<Audio>`, and so on. The entity's location is the modality's
12845
+ * [`Location`] type, `M::Location`.
12846
+ *
12847
+ * # Birth and fusion
12848
+ *
12849
+ * A recognizer emits an entity directly, carrying a single recognition
12850
+ * [`AuditEvent`] (its own finding) in the entity's [`audit`] trail. When
12851
+ * several recognizers find the same thing, a fusion step (in
12852
+ * `elide`) combines their entities into one: the survivor's
12853
+ * [`location`] and [`confidence`] are the *fused* values, and every
12854
+ * contributing recognition event, plus a deduplication event, is
12855
+ * retained in its audit trail. The entity therefore carries its full
12856
+ * audit trail with it.
12857
+ *
12858
+ * [`Location`]: Modality::Location
12859
+ * [`AuditEvent`]: crate::entity::audit::AuditEvent
12860
+ * [`audit`]: Entity::audit
12861
+ * [`location`]: Entity::location
12862
+ * [`confidence`]: Entity::confidence
12863
+ */
12864
+ TextEntity: {
12865
+ /**
12866
+ * @description Tamper-evident audit trail: every contributing detection, the fusion
12867
+ * event if any, and the redaction that hid it, as a hash-linked DAG.
12868
+ */
12869
+ audit: components["schemas"]["TextAuditLog"];
12870
+ /** @description Effective confidence in `0.0..=1.0` (fused, if applicable). */
12871
+ confidence: components["schemas"]["Confidence"];
12872
+ /**
12873
+ * @description Coreference identifier, if a recognizer resolved this entity as one
12874
+ * mention of a cluster. Entities sharing an [`EntityCoRef`] denote the
12875
+ * same real-world thing.
12876
+ */
12877
+ coref?: components["schemas"]["EntityCoRef"];
12878
+ /**
12879
+ * Format: uuid
12880
+ * @description Stable unique identity for this entity (time-ordered UUIDv7), minted
12881
+ * when the entity is assembled.
12882
+ */
12883
+ id: string;
12884
+ /**
12885
+ * @description What kind of sensitive information this is (resolved via a
12886
+ * [`LabelCatalog`]).
12887
+ */
12888
+ label: components["schemas"]["LabelRef"];
12889
+ /**
12890
+ * @description The language of this entity's surrounding text, when a recognizer
12891
+ * resolved one. `None` when unknown or language-agnostic.
12892
+ */
12893
+ language?: string;
12894
+ /**
12895
+ * @description Location of the entity within the medium (fused, if it came from more
12896
+ * than one detection).
12897
+ */
12898
+ location: components["schemas"]["TextLocation"];
12899
+ /**
12900
+ * @description Byte range of the match in the *recognized text* it was found in (the
12901
+ * OCR layout text, the audio transcript, or the text payload itself) —
12902
+ * the stable key back into that enrichment artifact, where the rich
12903
+ * context lives (which OCR block, which speaker) that the geometric
12904
+ * [`location`] cannot hold. `None` for entities not found via text
12905
+ * recognition (e.g. a VLM box). An audit key, not a coordinate: redaction
12906
+ * uses [`location`]; an audit uses this with the artifact.
12907
+ *
12908
+ * [`location`]: Entity::location
12909
+ */
12910
+ recognized_range?: components["schemas"]["Range_of_uint"];
12911
+ };
12912
+ /**
12913
+ * @description One recognized entity plus the optional reviewer override.
12914
+ *
12915
+ * The bound mirrors elide's [`Entity<M>`]: serialization needs
12916
+ * `M::Location` and `M::Data` (de)serializable, and JsonSchema
12917
+ * derivation needs them schema-able. All four modalities elide
12918
+ * ships satisfy these under the `serde` + `schema` features.
12919
+ */
12920
+ TextEntityRecord: {
12921
+ /** @description The elide entity, as recognition produced it. */
12922
+ entity: components["schemas"]["TextEntity"];
12923
+ /**
12924
+ * @description Reviewer-supplied redaction override.
12925
+ *
12926
+ * `None` means "use the matching policy rule's decision";
12927
+ * `Some(...)` overrides that rule for this specific entity
12928
+ * at apply time. Reviewer overrides take precedence over
12929
+ * every policy rule and inherit the authority of the
12930
+ * [`Review::policy_id`] they name: the audit event's
12931
+ * attribution stamps that policy so the trail names the
12932
+ * authority under which the override fired.
12933
+ */
12934
+ review?: components["schemas"]["Review"];
12434
12935
  };
12435
12936
  /**
12436
12937
  * @description Located, typed piece of context a recognizer may treat as in-context
@@ -12479,31 +12980,6 @@ interface components {
12479
12980
  */
12480
12981
  start: number;
12481
12982
  };
12482
- /**
12483
- * @description Full audit trail of an [`Entity`]: every [`Event`] in its life, in
12484
- * order.
12485
- *
12486
- * This is the model's answer to "full provenance": where Presidio keeps
12487
- * a shallow, optional, per-stage explanation that is stripped by
12488
- * default, a `Provenance` is always present and records the entity's
12489
- * *entire* life as an ordered list of events: each recognizer that
12490
- * found it, the deduplication that fused them, any confidence
12491
- * calibration, and the redaction that hid it. Nothing is collapsed:
12492
- * every recognizer keeps its own recognition event with its location
12493
- * and score.
12494
- *
12495
- * The events form a confidence chain (each event's [`after`] is the
12496
- * next's [`before`]) so the final confidence and its full history are
12497
- * always recoverable.
12498
- *
12499
- * [`Entity`]: crate::entity::Entity
12500
- * [`after`]: Event::after
12501
- * [`before`]: Event::before
12502
- */
12503
- TextProvenance: {
12504
- /** @description Events, in the order they happened. */
12505
- events: components["schemas"]["TextEvent"][];
12506
- };
12507
12983
  /** @description Operator spec a `redact` text rule carries. */
12508
12984
  TextRedaction: {
12509
12985
  /** @constant */
@@ -12804,11 +13280,13 @@ interface components {
12804
13280
  /**
12805
13281
  * @description Request payload for updating an existing workspace policy.
12806
13282
  *
12807
- * Replacing the `definition` replaces the whole policy body.
13283
+ * Replacing the `definition` replaces the whole policy body. The policy's
13284
+ * template origin is server-owned and preserved across updates — it is not
13285
+ * settable here.
12808
13286
  */
12809
13287
  UpdatePolicy: {
12810
13288
  /** @description New policy body (replaces the stored definition). */
12811
- definition?: components["schemas"]["PolicyDefinition"];
13289
+ definition?: components["schemas"]["PolicyDraft"];
12812
13290
  /** @description Policy description. */
12813
13291
  description?: string;
12814
13292
  /** @description Human-readable policy display name. */
@@ -13220,15 +13698,18 @@ type Schemas$16 = components["schemas"];
13220
13698
  type EntityGroup = Schemas$16["EntityGroup"];
13221
13699
  type AuditContext = Schemas$16["AuditContext"];
13222
13700
  type EntityCoRef = Schemas$16["EntityCoRef"];
13223
- type OcrMode = Schemas$16["OcrMode"];
13701
+ type RasterMode = Schemas$16["RasterMode"];
13224
13702
  type Dpi = Schemas$16["Dpi"];
13225
13703
  type Review = Schemas$16["Review"];
13226
13704
  type Attribution = Schemas$16["Attribution"];
13705
+ type AttributionKind = Schemas$16["AttributionKind"];
13227
13706
  type LeakProfile = Schemas$16["LeakProfile"];
13228
13707
  type RuleMatch = Schemas$16["RuleMatch"];
13229
13708
  type ModelEvent = Schemas$16["ModelEvent"];
13230
13709
  type PatternEvent = Schemas$16["PatternEvent"];
13231
13710
  type OperatorId = Schemas$16["OperatorId"];
13711
+ type AuditHash = Schemas$16["AuditHash"];
13712
+ type Category = Schemas$16["Category"];
13232
13713
  /** Half-open `[start, end)` index range. Generated name; a plain uint range. */
13233
13714
  type RangeOfUint = Schemas$16["Range_of_uint"];
13234
13715
  type BoundingBox = Schemas$16["BoundingBox"];
@@ -13238,35 +13719,35 @@ type Dimensions = Schemas$16["Dimensions"];
13238
13719
  type TimeSpan = Schemas$16["TimeSpan"];
13239
13720
  type TextEntity = Schemas$16["TextEntity"];
13240
13721
  type TextEntityRecord = Schemas$16["TextEntityRecord"];
13241
- type TextEvent = Schemas$16["TextEvent"];
13242
- type TextEventKind = Schemas$16["TextEventKind"];
13722
+ type TextAuditEvent = Schemas$16["TextAuditEvent"];
13723
+ type TextAuditKind = Schemas$16["TextAuditKind"];
13243
13724
  type TextHint = Schemas$16["TextHint"];
13244
13725
  type TextLocation = Schemas$16["TextLocation"];
13245
- type TextProvenance = Schemas$16["TextProvenance"];
13726
+ type TextAuditLog = Schemas$16["TextAuditLog"];
13246
13727
  type TextData = Schemas$16["TextData"];
13247
13728
  type ImageEntity = Schemas$16["ImageEntity"];
13248
13729
  type ImageEntityRecord = Schemas$16["ImageEntityRecord"];
13249
- type ImageEvent = Schemas$16["ImageEvent"];
13250
- type ImageEventKind = Schemas$16["ImageEventKind"];
13730
+ type ImageAuditEvent = Schemas$16["ImageAuditEvent"];
13731
+ type ImageAuditKind = Schemas$16["ImageAuditKind"];
13251
13732
  type ImageHint = Schemas$16["ImageHint"];
13252
13733
  type ImageLocation = Schemas$16["ImageLocation"];
13253
- type ImageProvenance = Schemas$16["ImageProvenance"];
13734
+ type ImageAuditLog = Schemas$16["ImageAuditLog"];
13254
13735
  type ImageData = Schemas$16["ImageData"];
13255
13736
  type AudioEntity = Schemas$16["AudioEntity"];
13256
13737
  type AudioEntityRecord = Schemas$16["AudioEntityRecord"];
13257
- type AudioEvent = Schemas$16["AudioEvent"];
13258
- type AudioEventKind = Schemas$16["AudioEventKind"];
13738
+ type AudioAuditEvent = Schemas$16["AudioAuditEvent"];
13739
+ type AudioAuditKind = Schemas$16["AudioAuditKind"];
13259
13740
  type AudioHint = Schemas$16["AudioHint"];
13260
13741
  type AudioLocation = Schemas$16["AudioLocation"];
13261
- type AudioProvenance = Schemas$16["AudioProvenance"];
13742
+ type AudioAuditLog = Schemas$16["AudioAuditLog"];
13262
13743
  type AudioData = Schemas$16["AudioData"];
13263
13744
  type TabularEntity = Schemas$16["TabularEntity"];
13264
13745
  type TabularEntityRecord = Schemas$16["TabularEntityRecord"];
13265
- type TabularEvent = Schemas$16["TabularEvent"];
13266
- type TabularEventKind = Schemas$16["TabularEventKind"];
13746
+ type TabularAuditEvent = Schemas$16["TabularAuditEvent"];
13747
+ type TabularAuditKind = Schemas$16["TabularAuditKind"];
13267
13748
  type TabularHint = Schemas$16["TabularHint"];
13268
13749
  type TabularLocation = Schemas$16["TabularLocation"];
13269
- type TabularProvenance = Schemas$16["TabularProvenance"];
13750
+ type TabularAuditLog = Schemas$16["TabularAuditLog"];
13270
13751
  //#endregion
13271
13752
  //#region src/datatypes/auth.d.ts
13272
13753
  type Schemas$15 = components["schemas"];
@@ -13396,12 +13877,16 @@ type Policy = Schemas$4["Policy"];
13396
13877
  type PolicySummary = Schemas$4["PolicySummary"];
13397
13878
  type PolicySummaryPage = Schemas$4["PolicySummaryPage"];
13398
13879
  type PolicyDefinition = Schemas$4["PolicyDefinition"];
13880
+ type PolicyDraft = Schemas$4["PolicyDraft"];
13399
13881
  type CreatePolicy = Schemas$4["CreatePolicy"];
13400
13882
  type UpdatePolicy = Schemas$4["UpdatePolicy"];
13401
13883
  type PolicyRule = Schemas$4["PolicyRule"];
13402
13884
  type PolicyTemplate = Schemas$4["PolicyTemplate"];
13885
+ type TemplateOrigin = Schemas$4["TemplateOrigin"];
13403
13886
  type HipaaDeidMethod = Schemas$4["HipaaDeidMethod"];
13887
+ type HipaaAccountNumbers = Schemas$4["HipaaAccountNumbers"];
13404
13888
  type GdprArticle9Treatment = Schemas$4["GdprArticle9Treatment"];
13889
+ type GdprSensitiveScope = Schemas$4["GdprSensitiveScope"];
13405
13890
  type PciDssPart = Schemas$4["PciDssPart"];
13406
13891
  type PciPanRender = Schemas$4["PciPanRender"];
13407
13892
  type Predicate = Schemas$4["Predicate"];
@@ -13473,5 +13958,5 @@ type Retention = Schemas["Retention"];
13473
13958
  type RetentionSettings = Schemas["RetentionSettings"];
13474
13959
  type RetentionOverride = Schemas["RetentionOverride"];
13475
13960
  //#endregion
13476
- export { ModalityRedactions as $, AudioEventKind as $n, ConnectionActivityParams as $r, InvitePage as $t, PipelineRun as A, LlmConfig as An, TabularEventKind as Ar, Notification as At, CreatePolicy as B, SyncTriggerType as Bn, TextLocation as Br, UnreadCountEvent as Bt, LanguageProvenance as C, ConnectionPage as Cn, Polygon as Cr, UpdatePipeline as Ct, ScopeParams as D, ConnectionsQuery as Dn, TabularEntity as Dr, MarkedReadStatus as Dt, ScopeMetadata as E, ConnectionVerification as En, RuleMatch as Er, ConnectionSyncFailedParams as Et, RunStatusEvent as F, SyncDeletionPolicy as Fn, TextEntity as Fr, PipelineRunAnalyzedParams as Ft, ImageRedaction as G, AuthToken as Gn, ApiTokenType as Gr, MemberPage as Gt, DateStyle as H, LabelCatalog as Hn, TimeSpan as Hr, UpdateNotificationSettings as Ht, AudioRedaction as I, SyncMode as In, TextEntityRecord as Ir, PipelineRunCompletedParams as It, LabelGroup as J, Attribution as Jn, TokenExpiration as Jr, CreateInvite as Jt, Label as K, Login as Kn, ApiTokenWithJWT as Kr, MemberSortField as Kt, ClampBucket as L, SyncSchedule as Ln, TextEvent as Lr, PipelineRunFailedParams as Lt, PipelineRunStatus as M, S3Credentials as Mn, TabularLocation as Mr, NotificationPage as Mt, PipelineRunsQuery as N, StorageConfig as Nn, TabularProvenance as Nr, NotificationPayload as Nt, Audit as O, CreateConnection as On, TabularEntityRecord as Or, MemberInvitedParams as Ot, RunMetadata as P, SyncConnection as Pn, TextData as Pr, NotificationSettings as Pt, LocalizedText as Q, AudioEvent as Qn, ActivityPayload as Qr, InviteExpiration as Qt, Color as R, SyncScheduleInput as Rn, TextEventKind as Rr, SystemAnnouncementParams as Rt, Language as S, ConnectionConfig as Sn, Point as Sr, PipelineTriggerType as St, Languages as T, ConnectionSyncPage as Tn, Review as Tr, ConnectionSyncCompletedParams as Tt, GdprArticle9Treatment as U, RecognizerCatalog as Un, ApiToken as Ur, ListMembers as Ut, DateGranularity as V, UpdateConnection as Vn, TextProvenance as Vr, UnreadStatus as Vt, HipaaDeidMethod as W, RegisteredRecognizer as Wn, ApiTokenPage as Wr, Member as Wt, Labels as X, AudioEntity as Xn, Activity as Xr, Invite as Xt, LabelLocale as Y, AudioData as Yn, UpdateApiToken as Yr, GenerateInviteCode as Yt, LanguageTag as Z, AudioEntityRecord as Zn, ActivityPage as Zr, InviteCode as Zt, WebhookPage as _, ErrorResponse as _n, LeakProfile as _r, PipelineDefinition as _t, RetentionSettings as a, PolicyActivityParams as ai, ReplyInvite as an, Dimensions as ar, PolicySummary as at, Confidence as b, AzureCredentials as bn, OperatorId as br, PipelineSummary as bt, WorkspacePage as c, Account as ci, Health as cn, EntityGroup as cr, Predicate as ct, CreateWebhook as d, UpdateAccount as di, FileKind as dn, ImageEntityRecord as dr, TerminalFallback as dt, FileActivityParams as ei, InvitePreview as en, AudioHint as er, PciDssPart as et, TestWebhook as f, paths as fi, FilePage as fn, ImageEvent as fr, TextRedaction as ft, WebhookEvent as g, UpdateFile as gn, ImageProvenance as gr, Pipeline as gt, WebhookCreated as h, ModalityToken as hn, ImageLocation as hr, CreatePipeline as ht, RetentionOverride as i, PipelineRunActivityParams as ii, ListInvites as in, BoundingBox as ir, PolicyRule as it, PipelineRunPage as j, OpenAiCredentials as jn, TabularHint as jr, NotificationEvent as jt, CreatePipelineRun as k, GcsCredentials as kn, TabularEvent as kr, MemberJoinedParams as kt, WorkspaceRole as l, AccountRef as li, HealthStatus as ln, ImageData as lr, Sha2Algorithm as lt, Webhook as m, ListFiles as mn, ImageHint as mr, Waveform as mt, OcrPolicy as n, MemberActivityParams as ni, InviteSortField as nn, AudioProvenance as nr, Policy as nt, UpdateWorkspace as o, WebhookActivityParams as oi, SortOrder as on, Dpi as or, PolicySummaryPage as ot, UpdateWebhook as p, FormatToken as pn, ImageEventKind as pr, UpdatePolicy as pt, LabelEntry as q, Signup as qn, CreateApiToken as qr, UpdateMember as qt, Retention as r, PipelineActivityParams as ri, InviteStatus as rn, AuditContext as rr, PolicyDefinition as rt, Workspace as s, WorkspaceActivityParams as si, ComponentHealth as sn, EntityCoRef as sr, PolicyTemplate as st, CreateWorkspace as t, InviteActivityParams as ti, InviteSent as tn, AudioLocation as tr, PciPanRender as tt, WorkspaceSettings as u, PublicAccount as ui, File as un, ImageEntity as ur, TabularRedaction as ut, WebhookResult as v, ValidationErrorDetail as vn, ModelEvent as vr, PipelineFilter as vt, LanguageSpan as w, ConnectionSync as wn, RangeOfUint as wr, CursorPagination as wt, CountryCode as x, Connection as xn, PatternEvent as xr, PipelineSummaryPage as xt, WebhookStatus as y, AnthropicCredentials as yn, OcrMode as yr, PipelineStatus as yt, ConfidenceThreshold as z, SyncStatus as zn, TextHint as zr, SystemReportParams as zt };
13477
- //# sourceMappingURL=index-Cijg5CMy.d.ts.map
13961
+ export { LanguageTag as $, AttributionKind as $n, ApiTokenWithJWT as $r, GenerateInviteCode as $t, PipelineRun as A, ConnectionVerification as An, RangeOfUint as Ar, ConnectionSyncFailedParams as At, CreatePolicy as B, SyncMode as Bn, TabularLocation as Br, PipelineRunCompletedParams as Bt, LanguageProvenance as C, AnthropicCredentials as Cn, ImageLocation as Cr, PipelineStatus as Ct, ScopeParams as D, ConnectionPage as Dn, PatternEvent as Dr, UpdatePipeline as Dt, ScopeMetadata as E, ConnectionConfig as En, OperatorId as Er, PipelineTriggerType as Et, RunStatusEvent as F, OpenAiCredentials as Fn, TabularAuditKind as Fr, NotificationEvent as Ft, HipaaAccountNumbers as G, UpdateConnection as Gn, TextEntity as Gr, UnreadStatus as Gt, DateStyle as H, SyncScheduleInput as Hn, TextAuditKind as Hr, SystemAnnouncementParams as Ht, AudioRedaction as I, S3Credentials as In, TabularAuditLog as Ir, NotificationPage as It, Label as J, RegisteredRecognizer as Jn, TextLocation as Jr, Member as Jt, HipaaDeidMethod as K, LabelCatalog as Kn, TextEntityRecord as Kr, UpdateNotificationSettings as Kt, ClampBucket as L, StorageConfig as Ln, TabularEntity as Lr, NotificationPayload as Lt, PipelineRunStatus as M, CreateConnection as Mn, Review as Mr, MemberInvitedParams as Mt, PipelineRunsQuery as N, GcsCredentials as Nn, RuleMatch as Nr, MemberJoinedParams as Nt, Audit as O, ConnectionSync as On, Point as Or, CursorPagination as Ot, RunMetadata as P, LlmConfig as Pn, TabularAuditEvent as Pr, Notification as Pt, Labels as Q, Attribution as Qn, ApiTokenType as Qr, CreateInvite as Qt, Color as R, SyncConnection as Rn, TabularEntityRecord as Rr, NotificationSettings as Rt, Language as S, ValidationErrorDetail as Sn, ImageHint as Sr, PipelineFilter as St, Languages as T, Connection as Tn, ModelEvent as Tr, PipelineSummaryPage as Tt, GdprArticle9Treatment as U, SyncStatus as Un, TextAuditLog as Ur, SystemReportParams as Ut, DateGranularity as V, SyncSchedule as Vn, TextAuditEvent as Vr, PipelineRunFailedParams as Vt, GdprSensitiveScope as W, SyncTriggerType as Wn, TextData as Wr, UnreadCountEvent as Wt, LabelGroup as X, Login as Xn, ApiToken as Xr, MemberSortField as Xt, LabelEntry as Y, AuthToken as Yn, TimeSpan as Yr, MemberPage as Yt, LabelLocale as Z, Signup as Zn, ApiTokenPage as Zr, UpdateMember as Zt, WebhookPage as _, PublicAccount as _i, FormatToken as _n, ImageAuditKind as _r, UpdatePolicy as _t, RetentionSettings as a, ActivityPayload as ai, InviteSent as an, AudioEntityRecord as ar, PolicyDefinition as at, Confidence as b, UpdateFile as bn, ImageEntity as br, Pipeline as bt, WorkspacePage as c, InviteActivityParams as ci, ListInvites as cn, AuditContext as cr, PolicySummary as ct, CreateWebhook as d, PipelineRunActivityParams as di, ComponentHealth as dn, Category as dr, Predicate as dt, CreateApiToken as ei, Invite as en, AudioAuditEvent as er, LocalizedText as et, TestWebhook as f, PolicyActivityParams as fi, Health as fn, Dimensions as fr, Sha2Algorithm as ft, WebhookEvent as g, AccountRef as gi, FilePage as gn, ImageAuditEvent as gr, TextRedaction as gt, WebhookCreated as h, Account as hi, FileKind as hn, EntityGroup as hr, TerminalFallback as ht, RetentionOverride as i, ActivityPage as ii, InvitePreview as in, AudioEntity as ir, Policy as it, PipelineRunPage as j, ConnectionsQuery as jn, RasterMode as jr, MarkedReadStatus as jt, CreatePipelineRun as k, ConnectionSyncPage as kn, Polygon as kr, ConnectionSyncCompletedParams as kt, WorkspaceRole as l, MemberActivityParams as li, ReplyInvite as ln, AuditHash as lr, PolicySummaryPage as lt, Webhook as m, WorkspaceActivityParams as mi, File as mn, EntityCoRef as mr, TemplateOrigin as mt, OcrPolicy as n, UpdateApiToken as ni, InviteExpiration as nn, AudioAuditLog as nr, PciDssPart as nt, UpdateWorkspace as o, ConnectionActivityParams as oi, InviteSortField as on, AudioHint as or, PolicyDraft as ot, UpdateWebhook as p, WebhookActivityParams as pi, HealthStatus as pn, Dpi as pr, TabularRedaction as pt, ImageRedaction as q, RecognizerCatalog as qn, TextHint as qr, ListMembers as qt, Retention as r, Activity as ri, InvitePage as rn, AudioData as rr, PciPanRender as rt, Workspace as s, FileActivityParams as si, InviteStatus as sn, AudioLocation as sr, PolicyRule as st, CreateWorkspace as t, TokenExpiration as ti, InviteCode as tn, AudioAuditKind as tr, ModalityRedactions as tt, WorkspaceSettings as u, PipelineActivityParams as ui, SortOrder as un, BoundingBox as ur, PolicyTemplate as ut, WebhookResult as v, UpdateAccount as vi, ListFiles as vn, ImageAuditLog as vr, Waveform as vt, LanguageSpan as w, AzureCredentials as wn, LeakProfile as wr, PipelineSummary as wt, CountryCode as x, ErrorResponse as xn, ImageEntityRecord as xr, PipelineDefinition as xt, WebhookStatus as y, paths as yi, ModalityToken as yn, ImageData as yr, CreatePipeline as yt, ConfidenceThreshold as z, SyncDeletionPolicy as zn, TabularHint as zr, PipelineRunAnalyzedParams as zt };
13962
+ //# sourceMappingURL=index-D7O7ZJNs.d.ts.map