Table of Contents

PII

Arc automatically decrypts [PII]-annotated properties on read models before they are served to clients. This builds on top of the Read Model Interception pipeline so decryption is applied consistently across all query types — controller-based, model-bound, and observable (WebSocket and SSE).

For the full Chronicle-level guide on annotating types, identifying subjects, and honoring erasure requests, see Chronicle compliance.

How It Works

Chronicle encrypts [PII] properties at the event log boundary under the subject's encryption key. Arc's interception pipeline calls Release() on IReadModels before each query response, decrypting those values transparently — no changes to query methods are needed.

Given a read model with a PII-annotated property:

public record CustomerProfile(
    [Subject] CustomerId CustomerId,
    string CompanyName,
    [PII] string ContactEmail);

All query endpoints that return CustomerProfile serve decrypted values automatically.

Behavior on Failure

Release() is intentionally non-breaking:

  • If the read model has no PII-annotated properties, the original instance is returned immediately without contacting the server.
  • If the encryption key no longer exists (e.g. after a right-to-erasure request), the original encrypted instance is returned and an error is logged. No exception is thrown.