Troubleshoot the PII removal mapping
Source fields remain
Compare the input schema with every configured path. Check nested objects and case differences; the example mappings do not discover fields dynamically.
Derived fields disappear
A later root = ... assignment can replace fields added earlier in the same mapping. Build the new root first, or store derived values in variables before assigning them.
Hashes change between runs
Confirm that every process receives the same non-empty salt without printing the secret:
for key in IP_SALT EMAIL_SALT USER_SALT; do
if test -n "${!key}"; then
printf '%s=set\n' "$key"
else
printf '%s=missing\n' "$key"
fi
done
Review an output file
Use explicit field checks as a starting point, then add paths from the actual schema:
jq '{
direct: (has("email") or has("ip_address") or has("user_name")),
payment: (.payment_method | has("full_number") or has("expiry")),
coordinates: (.location | has("latitude") or has("longitude"))
}' processed.json
This check covers named fields, not all identifying data. Compare the result with the full configuration and the intended output contract.