feat(observability): OTel tracing chassis + request-id propagation
Optional, off-by-default native OpenTelemetry export (the [otel] extra),
wired as chassis so call sites never branch on config:
- ObservabilitySettings ([observability]) — enabled / endpoint / headers /
sample_rate / capture_content / langfuse_* / recall_hit_threshold; langfuse
creds derive the OTLP endpoint + Basic-auth header.
- core.observability.tracing: TracerProvider lifecycle (module-local, no-op
when off/absent), memory_span helper stamping the langfuse.* contract,
set_generation_usage, privacy-gated capture_input/output (redaction +
truncation), non-blocking recall-score sink, W3C traceparent in/out helpers.
- TracingLifespanProvider builds provider + score sink at startup.
- RequestIdMiddleware: per-request id (state + contextvar + structlog +
X-Request-Id) and continues an upstream traceparent when present; managers
read the propagated id via resolve_request_id.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>