Surfaced by the 2026-05-02 cross-runtime test: when a caller
forwarded X-Lakehouse-Trace-Id but the langfuse middleware was a
passthrough (no Langfuse env), the header was never read — Go minted
a fallback id, breaking cross-daemon parent-trace linkage.
The middleware only honored the header when its lf client was
non-nil. With LANGFUSE_URL unset on the persistent stack, every
inbound iterate request lost the parent linkage.
Fix: validatord's iterate handler reads the header DIRECTLY (matches
Rust's iterate.rs pattern) before falling through to the ctx value
+ fallback id. Now Go behavior matches Rust regardless of Langfuse
configuration.
Resolution order is:
1. req.TraceID (caller put it in the JSON body)
2. X-Lakehouse-Trace-Id header (read directly here)
3. context value from langfuse middleware (when configured)
4. fallback to a locally-minted time-ordered hex id
Verified end-to-end:
curl -H 'X-Lakehouse-Trace-Id: go-cmp-fixed' POST /v1/iterate
→ response.trace_id = "go-cmp-fixed" ✓
→ sessions.jsonl row session_id = "go-cmp-fixed" ✓
Pre-fix (this commit's parent ran from /tmp/val-fresh3 binary):
same call → trace_id minted as 18abbb5a008061b7-008061e9
(header silently ignored)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>