common/telemetry.py builds the Resource, TracerProvider, BatchSpanProcessor and OTLP/HTTP exporter by hand; sanctions calls setup_telemetry() at import instead of running under opentelemetry-instrument. No instrumentor is enabled yet, so sanctions emits no spans for now. service.version comes from OTEL_RESOURCE_ATTRIBUTES: deploy.sh exports DEPLOY_HASH (the server's HEAD after the pull) and compose falls back to "dev". deployment.environment.name=prod is dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>