Zava Learning — Redaction Guard
A cross-cutting safety layer: nothing sensitive ever reaches an operator-visible surface. The
triggering alert is symptom-only and the investigation touches Key Vault secrets, connection
strings, access tokens and learner PII — none of which may be exposed in chat, notes, PRs, or
reports.
Load the standard, then scrub
Retrieve the canonical policy and scrubber with SearchMemory("zava-redaction"). It defines what
counts as sensitive, the credential files you must never print, and a deterministic redact()
function. Apply redact() (via ExecutePythonCode) to every string you are about to emit —
chat summary, note body, PR/commit text, and the assembled HTML/markdown/deck — before it leaves the
agent. The scrubber is idempotent, so running it more than once is safe.
What to redact (summary — see zava-redaction for the full list)
- Secrets & credentials: passwords,
PGPASSWORD, connection strings, Key Vault secret values,
client secrets, API / access / account keys, SAS tokens.
- Tokens: GitHub PATs (
gho_/ghp_/github_pat_…), JWTs / AAD access tokens (eyJ…), bearer /
Authorization values.
- Private keys: any
-----BEGIN … PRIVATE KEY----- block, SSH/cert keys.
- Credentials inside URIs: the password in
scheme://user:password@host.
- PII: email addresses and learner personal data from the database.
Keep resource names, resource groups, regions, app names, alert names, and PR/CR numbers — they are
not sensitive and are needed for the narrative.
Hard rules
- Never read or print credential files. Reference them by name only — never
cat / Get-Content
/ echo / type the contents of .git/git-credentials, .env, *.pem, id_rsa*, *.pfx,
kubeconfig, ~/.azure/*, or *.tfstate into the thread or a report.
- When a command can echo a secret (e.g.
az keyvault secret show), do not paste its output —
confirm the fact ("secret present / rotated") without revealing the value.
- When in doubt, redact. Replace with
[REDACTED:<CLASS>]; for URI credentials keep the scheme and
username and mask only the password.
How the other skills use this
zava-reporting, pagerduty-incident-update, servicenow-change-management, and pr-delivery each
call redact() on their output before emitting. Because loading a separate skill swaps the active
toolset, those skills inline the redact() function (retrieved via SearchMemory("zava-redaction"))
within their own ExecutePythonCode step rather than handing off here — this skill is the
authoritative definition they follow.
Verification
Every operator-visible string has passed through redact() (or equivalent manual masking) and shows
[REDACTED:<CLASS>] in place of any secret, token, private key, URI credential, or PII. No
credential file was ever printed to the thread or a deliverable.
1---2name: redaction-guard3description: Use whenever you are about to emit operator-visible content — a chat/thread message, a PagerDuty or ServiceNow note, a commit message or pull-request body, or any report artifact (HTML, PowerPoint, Teams card). Deterministically masks secrets, credentials, tokens, private keys, URI-embedded passwords, and PII so they never appear in the thread or in any deliverable. This is a cross-cutting guardrail invoked by the output-producing skills, not a runbook step.4---56## Zava Learning — Redaction Guard78A cross-cutting safety layer: nothing sensitive ever reaches an operator-visible surface. The9triggering alert is symptom-only and the investigation touches Key Vault secrets, connection10strings, access tokens and learner PII — none of which may be exposed in chat, notes, PRs, or11reports.1213## Load the standard, then scrub14Retrieve the canonical policy and scrubber with `SearchMemory("zava-redaction")`. It defines what15counts as sensitive, the credential files you must never print, and a deterministic `redact()`16function. Apply `redact()` (via `ExecutePythonCode`) to **every** string you are about to emit —17chat summary, note body, PR/commit text, and the assembled HTML/markdown/deck — before it leaves the18agent. The scrubber is idempotent, so running it more than once is safe.1920## What to redact (summary — see `zava-redaction` for the full list)21- Secrets & credentials: passwords, `PGPASSWORD`, connection strings, Key Vault secret **values**,22 client secrets, API / access / account keys, SAS tokens.23- Tokens: GitHub PATs (`gho_`/`ghp_`/`github_pat_…`), JWTs / AAD access tokens (`eyJ…`), bearer /24 `Authorization` values.25- Private keys: any `-----BEGIN … PRIVATE KEY-----` block, SSH/cert keys.26- Credentials inside URIs: the password in `scheme://user:password@host`.27- PII: email addresses and learner personal data from the database.2829Keep resource names, resource groups, regions, app names, alert names, and PR/CR numbers — they are30not sensitive and are needed for the narrative.3132## Hard rules33- **Never read or print credential files.** Reference them by name only — never `cat` / `Get-Content`34 / `echo` / `type` the contents of `.git/git-credentials`, `.env`, `*.pem`, `id_rsa*`, `*.pfx`,35 `kubeconfig`, `~/.azure/*`, or `*.tfstate` into the thread or a report.36- When a command can echo a secret (e.g. `az keyvault secret show`), do not paste its output —37 confirm the fact ("secret present / rotated") without revealing the value.38- When in doubt, redact. Replace with `[REDACTED:<CLASS>]`; for URI credentials keep the scheme and39 username and mask only the password.4041## How the other skills use this42`zava-reporting`, `pagerduty-incident-update`, `servicenow-change-management`, and `pr-delivery` each43call `redact()` on their output before emitting. Because loading a separate skill swaps the active44toolset, those skills inline the `redact()` function (retrieved via `SearchMemory("zava-redaction")`)45within their own `ExecutePythonCode` step rather than handing off here — this skill is the46authoritative definition they follow.4748## Verification49Every operator-visible string has passed through `redact()` (or equivalent manual masking) and shows50`[REDACTED:<CLASS>]` in place of any secret, token, private key, URI credential, or PII. No51credential file was ever printed to the thread or a deliverable.