Data Flow
How data actually moves through Hoziron — from an inbound trigger through competency/workflow execution to a mediated, billed outbound write at a carrier system of record. Grounded in ADR-042 (outbound mediation seam), ADR-047 (unified outbound egress), ADR-049 (unified PII policy authority), ADR-043/046 (billable event detection), and ADR-061 (inbound ingress authority).
End-to-End: FNOL Trigger to Billed Carrier Write
Two structural facts this diagram encodes:
- There is exactly one mediated egress, regardless of transport. MCP
tools/call, direct REST, and direct SOAP carrier writes all express as the same transport-agnosticOutboundCall{tool_name, target_server, arguments}and cross the identicalCoreOutboundMediator.mediate()chokepoint (ADR-047 generalizes the ADR-042 MCP-only seam to every carrier transport). A structural test (the "C3" invariant) asserts there is exactly one call site to the underlying transport and thatmediate()precedes it — this is enforced at build time, not by review discipline. - Billing and PII are the same seam, not two.
CoreOutboundMediatorresolves destination trust once and does two things with it: transforms the arguments (hydrate for a trusted SoR, tokenize/reject otherwise) and — on a complete write signature to a licence-specified target — draws credits (ADR-043, amended by ADR-046 to bill per value-event signature rather than per individual write). A stranded, incomplete write (RunState::Escalated) is unbilled by the same rule that makes it PII-safe: partial completion never crosses the line that triggers hydration or billing.
Inbound PII: One Unified Carrier Policy (ADR-049)
PII policy is not agent-configurable. It is a single operator-owned, file-sourced (carrier-pii-policy.toml) policy with two dimensions:
- Unconditional substrate: any PII bound for a cloud LLM or an unlisted tool destination is tokenized before egress, always — this is not a configurable choice.
- LLM dimension — binary:
local_only(named types may not leave the box even tokenized) or the defaultcloud_permitted(tokenized form may reach a cloud model). - Tool dimension — default-tokenize, with explicit per-
(destination, PII-type)hydrateorrejectescalations. There is no path to hydration except an explicit rule. - No runtime mutation. There is no
PUT /agents/{id}/trust-policyor agent-levelset_agent_trust_policyAPI — agents have no input into PII egress at all. Deny-by-default extends to API responses too: hydration back to the calling client only happens if"api"is explicitly in the policy's trusted destinations (ADR-027, generalized by ADR-049). local_onlyis the sole force-local source forPiiPolicyEngine::evaluate().
Workflow Step-to-Step PII Boundary
Memory Isolation
Cross-agent memory access is a compile-time impossibility at the handle's own API surface — not a runtime-rejected call. Data crosses agent boundaries only through step outputs, tokenized at each hop.
Provider Interaction and Fallback
Audit Trail Flow (ADR-039, v2 preimage per 2026-07-05 amendment)
Every policy-relevant event — kernel-emitted MechanicalEvent and core-emitted PolicyEvent — lands in one hash chain:
The preimage is length-prefixed, not delimiter-joined, so a byte occurring inside a variable-length field can never be mistaken for the field separator. There is no migration path for a chain built under a different preimage encoding — verify_chain() flags a mismatch at the very first entry as the signature of an encoding mismatch, not tampering.
Credential Flow
Provider credentials resolved during routing are Zeroizing-wrapped end-to-end from AES-GCM decrypt through ResolvedModelTarget to the driver — ResolvedModelTarget carries a manual redacting Debug impl so a derived Debug can never leak the key.
Related:
- system-overview.md — the crate boundary this flow crosses
- object-model.md — the objects involved at each hop
- ../internals/pii-data-protection.md, ../internals/provider-routing.md, ../internals/workflow-engine.md
docs/decisions/042,043,046,047,049,039,061