Anti-Patterns
Common mistakes when implementing PTI — and the corrective patterns that avoid them.
Identity
Embedding PII in pti_id
Problem: Custom identifiers encode phone numbers or national IDs, creating leakage risk and merge failures.
Fix: Use registry-allocated opaque pti_id values only.
Ignoring merge webhooks
Problem: Producer continues sending events to a merged (retired) pti_id.
Fix: Subscribe to identity.merged and update local mapping tables to the survivor ID.
Treating low-confidence matches as certain
Problem: Auto-decisioning on weak match confidence (for example 0.62).
Fix: Apply confidence thresholds; require secondary verification for high-impact decisions.
Ingest
Random idempotency keys
Problem: Every retry creates duplicate signals.
Fix: Use deterministic keys per business action (see Best Practices).
Using ingest time as occurred_at
Problem: Skews decay and misorders historical backfill.
Fix: Always send the true activity time; keep ingested_at as a separate server-set field.
Oversized payloads
Problem: Entire CRM records stuffed into payload, violating minimization.
Fix: Emit schema-required fields only; keep additional data in your own systems.
Context sprawl
Problem: Producer enables every context “just in case.”
Fix: Enable only entitled, observed contexts; request catalog additions when needed.
Consumer
Single global score
Problem: UI collapses lending, rental, and merchant into one number.
Fix: Present context scores separately with per-context drivers.
Thin data as approval
Problem: A high band is treated as “no risk” when coverage_gaps is non-empty.
Fix: Surface gaps clearly; treat thin bands as inconclusive.
Stale report reuse
Problem: A months-old report is used for a live decision without regeneration.
Fix: Check generated_at; regenerate or reject expired reports.
Skipping verification
Problem: PDF or JSON accepted without a verify_uri check.
Fix: Call the verify endpoint for audit-sensitive workflows.
Security
Shared producer and consumer credentials
Problem: One API key used for ingest and lookup — weak audit trail.
Fix: Separate credentials and scopes per role.
Disabled TLS verification
Problem: MITM exposure in partner integrations.
Fix: Always validate certificates in production; use mTLS for high-assurance profiles.
Logging full PII
Problem: Request bodies with national IDs land in application logs.
Fix: Log correlation_id, pti_id, and hashed identifiers only.
Architecture
Bypassing the exchange
Problem: Producer writes directly to a consumer database or shared cache.
Fix: All signals flow through the Exchange for policy, provenance, and audit.
Client-side scoring
Problem: Consumer reimplements the intelligence engine locally.
Fix: Consume server-derived scores; use drivers for transparency only.
Silent schema drift
Problem: Client ignores unknown JSON fields and breaks when new required fields appear.
Fix: Pin X-PTI-Version; monitor /capabilities deprecations.
Corrections
Deleting bad events
Problem: Hard delete without an audit trail.
Fix: Issue .corrected or .retracted lifecycle events.
Detection checklist
| Symptom | Likely anti-pattern |
|---|---|
| Duplicate signals on retry | Random idempotency keys |
| Score jumps after backfill | Wrong occurred_at |
| Challenge on explainability | Global score UI |
| Cross-tenant data leak | Missing tenant filter |