Sandbox y entornos de prueba
TL; DR
Caja de arena confiable = aislamiento total, datos sintéticos/impersonales, simuladores realistas de sistemas externos, asientos predecibles y tiempo de viaje, idempotencia incorporada y webhooks, límites transparentes y métricas. Prod - inalcanzable, llaves - girar, promoción - sólo por las listas de cheques.
1) Mapa de los entornos y sus funciones
Regla: sandbox ≠ prod. Cualquier comunicación es a través de simuladores unidireccionales sin acceso a medios reales/juegos/datos personales.
2) Datos: sintética, anonimización, sentado
Sintética predeterminada. Generadores de datos de pasaportes/tarjetas, PAN válido pero no financiero (BIN de prueba), patrones de apuestas y balances «vivos».
Anonimización para stage: tokenización de ID, privacidad diferencial para agregados, eliminación de combinaciones raras.
Sids y determinismo: un comando es un estado.
bash make db-reset && make db-seed ENV=sandbox SEED=2025_11_03
Time-travel: la «hora» global del entorno para las pruebas de deadline/expiración.
3) Simuladores y tapones (stubs)
Pagos/bancos/PSP
Auth/Capture/Refund/Payout со сценариями: `approved`, `declined_insufficient`, `3ds_required`, `timeout`, `duplicate`.
Webhooks PSP: firmados por HMAC, retraídas, retrasos e «internet sucio».
KYC/AML/Sanctions
Ответы: `clear`, `pep_match`, `sanction_hit`, `doc_mismatch`, `manual_review`.
Soporte de idempotencia y rate limits como en prod.
Proveedores de juegos/directorio
Lobby, fiches, RTP/rondas - generación pseudoespacial, «pagos/fallos» gestionados para casos UX.
Opción: interruptor de «rigor» del simulador (happy-path vs chaos).
4) Webhooks en la caja de arena
Firmas HMAC (v1), titulares 'X-Event-Id', 'X-Timestamp', ventana ≤ 5 minutos.
Retrés con retroceso exponencial, DLQ y replay.
Consola de «reajuste» y registros de intentos.
pseudo
POST /psp/webhooks
Headers: X-Signature, X-Timestamp, X-Event-Id
Body: { event_id, type, data, attempt }
5) Idempotencia y determinismo
Todas las mutaciones toman 'Idempotency-Key'.
Los simuladores almacenan el resultado por clave (TTL 24-72 h).
«Seed-determinismo»: con la misma entrada, el mismo resultado (para pruebas repetibles).
6) Seguridad y acceso
Aislamiento de redes/VPC, secretos individuales y dominios ('sandbox. example. com`).
RBAC/ABAC: los roles de «partner», «qa», «dev», los scops de tokens son mínimos.
Ratios-límites y cuotas: cuota justa per-tenant/clave, comprensible '429 '/' Retry-After'.
Secretos sólo en KMS/Vault; rotación regular.
Prohibición de pagos reales a nivel de código/confiscación (feature-flag hard block).
7) API Gateway y observabilidad en sandbox
Las mismas políticas: OAuth2/OIDC/JWT, CORS, WAF, perfil DDoS.
Métricas: p50/p95/p99, 4xx/5xx, límites de puntuación, latency webhooks, éxitos idempotentes.
Registros/trayectos: sin PII; Corellation 'trace _ id'.
Dashboard «Sandbox Health»: aptime, colas de webhooks, errores de simuladores.
8) Banderas de fichas, versiones y compatibilidad
Incluir el fich en sandbox → stage → prod.
SemVer para la API; banner Deprecation/Sunset en Swagger/Redoc sandbox.
Persisted queries para escaparates GraphQL (si los hay).
9) CI/CD и promotion
1. Build/Unit →
2. Contract/Mock tests (OpenAPI/Protobuf/GraphQL SDL) →
3. Integración contra simuladores →
4. Retroceso en el escenario (anon. snapshots) →
5. Canary в prod.
Gate-check-list promotion: abajo en § 12.
10) Escenarios UAT para socios (en sandbox)
Pagos: auth/capture/refund/payout con webhooks y errores PSP.
KYC/AML: todos los estados + escalada manual.
Idempotencia: repetición de 'Idempotency-Key' → el mismo resultado.
Rate-limit: procesamiento correcto '429'.
Ventanas temporales: expiración de tokens, 'Retry-After', casos de viaje en tiempo.
Webhooks: firmas/retraídas/DLQ, replay manual y dedoup.
11) Política de datos y privacidad
Nunca almacene docks de PAN/KYC reales en sandbox/stage.
Anonimización: enmascaramiento, eliminación de identificadores directos, correlación sintética.
TTL de almacenamiento de registros y cuerpos webhooks ≤ reglamentario.
12) Hojas de cheques
12. 1 Lanzamiento de una nueva caja de arena
- Red/base/caché/almacenamiento de objetos aislados
- Secretos creados en KMS/Vault, acceso por roles
- Los simuladores de PSP/KYC/juegos son zaploens y versionados
- Swagger/Redoc + Postman colección (sandbox endpoints)
- Webhooks: HMAC, retry, DLQ, consola replay
- Rate/Quota perfiles, banners de Deprecation/Sunset (si los hay)
- Dashboards y alertas (latency, 5xx, 429, DLQ)
12. 2 Promotion release (stage→prod)
- Controles de diff contractuales (sin breaking)
- La carga p95/p99 es normal en el escenario
- Webhooks han pasado UAT, idempotencia aprox
- Las banderas de la fiesta están preparadas, hay un plan de retroceso
- Changelog, guía de migración y envío a socios
13) Antipatternas
Sandbox, «secretamente» tocando prod-services/bases.
Datos reales de tarjetas/pasaportes en stage/sandbox.
Los simuladores sin wabhooks/retrayes son un «sendero feliz» sólo.
Falta de idempotencia → duplicación de pagos/tasas.
Un secreto HMAC compartido para todos los socios.
No hay límites y 429/Retry-After transparentes.
14) Mini-snippets
.env. sandbox (ejemplo)
dotenv
API_BASE=https://sandbox.api.example.com
OAUTH_ISS=https://sandbox.idp.example.com
PSP_SIM_URL=https://sandbox.psp-sim.example.com
KYC_SIM_URL=https://sandbox.kyc-sim.example.com
WEBHOOK_SECRET_ROTATION_DAYS=90
FEATURE_FORCE_SANDBOX_PAYMENTS=1
fragmento OpenAPI (servidor de sandbox)
yaml servers:
- url: https://sandbox.api.example.com/v1 description: Public Sandbox
Pseudocódigo de idempotencia
pseudo if store.exists(idem_key): return store.get(idem_key)
res = do_business()
store.set(idem_key, res, ttl=72h)
return res
Desencadenadores del simulador PSP
json
{ "scenario": "payout", "case": "declined_insufficient", "payout_id": "p_123" }
15) Observabilidad y SLO de sandbox
Uptime sandbox API ≥ 99. 5% (el escaparate de integraciones no debe bajar).
Webhooks p95 ≤ 3 con hasta 2xx bajo carga normal.
Error budget 5xx gateway ≤ 0. 1%.
El portal Dock está disponible y sincronizado con el contrato.
16) Governance
Propietario del entorno (SRE/Plataforma) y steward API (contratos).
Proceso RFC para cambios de breaking, calendario de Deprecation/Sunset.
Límites/cuotas individuales y prising «fair-use» para la caja de arena pública.
Resumen
Sandbox es un producto para desarrolladores, no una «copia de la base». Dale: aislamiento estricto, datos sintéticos, simuladores completos con webhooks y retrés, determinismo a través de sides y time-travel, banderas de fichas y límites transparentes. Vincule todos los contratos, la observabilidad y el gobierno, y sus integraciones se volverán rápidas, seguras y predecibles, y los lanzamientos sin dolor.