v1.20.0: inbound sync, event rename, deploy hardening
"Inbound sync, event rename, and deploy hardening" release. Three threads.
BREAKING: webhook event rename
transfer.completed/1 and adjustment.applied/1 are retired and replaced by the entity-prefixed names connectors filter on:
transfer.completed -> inventorytransfer.completed
adjustment.applied -> inventoryadjusted.completed
Payload shapes are unchanged, so a consumer migrates by subscribing to the new event_type. Every emit site emits only the new name. cycle_count.adjusted/1 is kept (it carries variance detail the canonical event does not) and now rides alongside inventoryadjusted.completed on the cycle-count branch. The inventoryadjusted.completed/1 schema permits a null applied_by_user_external_id for the system-driven inbound path.
Added
- Inbound inventory sync (#392):
POST /api/v1/inbound/inventory_updatetakes a desired final quantity, computes the delta against current on-hand, and applies it as an APPROVED adjustment emitting the adjustment event; idempotent (same target = 0-delta no-op). Scoped by a newinventory_updateinbound resource key. The per-token inbound rate limit is env-configurable viaINBOUND_RATE_LIMIT_PER_MINUTE(default 500).
Changed
- Source-system external_ids in webhook payloads (#392): outbound
*_external_idfields now carry the source-system identifier the upstream connector pushed (resolved fromcross_system_mappings), not Sentry's internal canonical UUID, so consumers no longer round-trip the Sentry API per event. The canonical UUID stays on the envelopeaggregate_id; falls back to the canonical UUID when no mapping exists. - Deploy portability (#394):
admin/nginx.confbecomes a${API_UPSTREAM_*}-templated config so one image deploys across environments; the api image bakesdb/mappings/so Pipe B inbound works without a volume mount; gunicorn's worker timeout is raised to 60s.
Notes
No migrations this release. No mobile changes; the mobile build stays at version 1.19.0 (versionCode 9).