Sensitive data flow report

Organization: Example HR Co.

System: HR assistant (taintward-hr-bot demo)

Period: 2026-10-23 10:26:55 UTC to 2026-10-24 10:26:55 UTC

Generated: 2026-10-24 10:26:55 UTC by Taintward evidence report v1

Data source: Jaeger v3 API at http://localhost:16686 (services: taintward-hr-bot)

1. Summary

0 raw sensitive values were sent to external or LLM destinations in this period (6 call(s) checked).

How this was measured and what it does not cover: see sections 7 and 9.

3
Agent runs
18
Tool and model calls
18
Calls with sensitive data
9
Policy violations
6
Cross-border flags

2. Calls that touched sensitive data

A call counts here when Taintward found sensitive data in its input or output, or when it ran later in a run that had already touched sensitive data. One call can carry more than one class.

ClassCalls
pii18
secret18

3. Calls by destination

Each tool is configured with a destination class. Internal means systems you run; llm, external, log and rag mean the data leaves that boundary or is stored where it is hard to remove.

DestinationCallsWith sensitive dataViolations
internal: Internal systems (own database, own services)660
llm: LLM providers333
external: External APIs and third parties333
log: Logs333
rag: Retrieval / vector store330

4. Policy violations and what happened to them

A violation is a call where the policy says sensitive data must not reach that destination as is. The outcome shows what Taintward did.

OutcomeViolations
Redacted before sending3
Sent with no raw value left to redact6
Blocked (the call was not made)0
Audit only (recorded, data sent unchanged)0

By policy rule

RuleCount
pii_egress9
transfer6

Rules: pii_egress = sensitive data reaching an external, llm or log destination; transfer = personal data going to a jurisdiction the policy marks as not adequate (GDPR Art. 44); sdk_egress_gate = flagged by the SDK when no collector decision was recorded.

Who made the decision: collector: 18 call(s).

5. Cross-border transfers (GDPR Art. 44)

Calls whose destination is in another jurisdiction, grouped by jurisdiction. A transfer flag is raised by the policy for personal data going to a jurisdiction it does not treat as adequate.

JurisdictionCallsWith personal dataTransfer flagsOutcome of flagged calls
us666redacted before sending: 3, sent with no raw value left to redact: 3

6. Recipients of data (GDPR Art. 30)

Every tool that received data in this period, with its destination class and jurisdiction. This is the list of recipients for a record of processing activities, taken from what actually ran.

ToolDestinationJurisdictionCallsWith sensitive dataClassesViolationsOutcome
internal_storeinternal-33pii, secret0
query_dbinternal-33pii, secret0
ask_llmllmus33pii, secret3redacted before sending: 3
call_external_apiexternalus33pii, secret3sent with no raw value left to redact: 3
write_loglog-33pii, secret3sent with no raw value left to redact: 3
rag_retrieverag-33pii, secret0

7. Raw value check on data sent out

Every call to an llm, external, log or rag destination was checked. The recorded input of the call (gen_ai.tool.call.arguments or gen_ai.input.messages) was scanned for raw values with these patterns: US_SSN, AWS_ACCESS_KEY, GITHUB_TOKEN, EMAIL_ADDRESS, PHONE_NUMBER, CREDIT_CARD, PRIVATE_KEY. Masks such as [PII] do not match.

DestinationCallsInput checkedInput not recordedBlockedAudit only, sensitiveCalls with raw valuesRaw values found
llm3300000
external3300000
log3300000
rag3300000

No raw values were found in the checked inputs.

8. Tamper-evident evidence log

Each violation is stored as a leaf in an append-only Merkle log (SHA-256). Changing, removing or reordering any record changes the root. Signed checkpoints fix the roots at a point in time with an Ed25519 key.

ItemValue
Log locationevidence-log
Records in the log9
Violations in this period9
Of these, found in the log9
Of these, covered by a signed checkpoint9
Newest checkpoint#1 at 2026-10-24T10:23:57Z
Checkpoint hash62b3162ebc495f9c079eec5cfcfc93691da5ada96be46c9ba6be96547e3ccf32
Signing key id4572b3464d294310
Verification when this report was madepassed (1 shard(s) checked)

Shards for the days in this report

TenantDay (UTC)RecordsRoot
acme2026-10-2496cea02385fd81fb327893bbfaa473ed0a369f4390dc956aa61bfe8159483641f

How to verify

taintward-evidence verify-checkpoints --evidence-dir <dir> --public-key evidence.pub \
    --expect-head 62b3162ebc495f9c079eec5cfcfc93691da5ada96be46c9ba6be96547e3ccf32

# one record, with only the proof file, the checkpoint and the key:
taintward-evidence prove-shard --evidence-dir <dir> --tenant <t> --day <YYYY-MM-DD> --index <i> > proof.json
taintward-evidence verify-proof proof.json --public-key evidence.pub

Ask the operator for the public key through a separate channel, not together with this report.

9. Method and limits

How the data is produced: each tool call made through Taintward is recorded as an OpenTelemetry span. The SDK or gateway detects sensitive data, carries a taint label along the run, and redacts the input before it reaches an outside destination. The Taintward collector evaluates a Rego policy on every span and records the decision (taintward.policy.*). This report reads those spans back and counts them. It does not call any LLM.

What this report does not show:

10. List of violations

TimeToolDestinationJurisdictionClassesRulesOutcomeTrace
2026-10-24 04:54:37 UTCask_llmllmuspii, secretpii_egress, transferRedacted before sending7e87959920b32aff7ec13f5f52820ec6
2026-10-24 04:54:37 UTCcall_external_apiexternaluspii, secretpii_egress, transferSent with no raw value left to redact7e87959920b32aff7ec13f5f52820ec6
2026-10-24 04:54:37 UTCwrite_loglog-pii, secretpii_egressSent with no raw value left to redact7e87959920b32aff7ec13f5f52820ec6
2026-10-24 10:23:48 UTCask_llmllmuspii, secretpii_egress, transferRedacted before sending67cc8f836555a234a5482812f6665f3e
2026-10-24 10:23:48 UTCcall_external_apiexternaluspii, secretpii_egress, transferSent with no raw value left to redact67cc8f836555a234a5482812f6665f3e
2026-10-24 10:23:48 UTCwrite_loglog-pii, secretpii_egressSent with no raw value left to redact67cc8f836555a234a5482812f6665f3e
2026-10-24 10:23:51 UTCask_llmllmuspii, secretpii_egress, transferRedacted before sendingaac9b1d6f82b793de0f8762a62f65695
2026-10-24 10:23:51 UTCcall_external_apiexternaluspii, secretpii_egress, transferSent with no raw value left to redactaac9b1d6f82b793de0f8762a62f65695
2026-10-24 10:23:51 UTCwrite_loglog-pii, secretpii_egressSent with no raw value left to redactaac9b1d6f82b793de0f8762a62f65695