Skip to main content

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​

SymptomLikely anti-pattern
Duplicate signals on retryRandom idempotency keys
Score jumps after backfillWrong occurred_at
Challenge on explainabilityGlobal score UI
Cross-tenant data leakMissing tenant filter