Context
taintline's ingest (src/taintline/ingest.py) auto-detects two input shapes: an OTLP-ish span list and a Strands AgentResult dict. LangGraph agents can emit OpenTelemetry GenAI spans too, but we have no LangGraph-derived fixture proving the OTLP path ingests one cleanly. A fixture from a third stack strengthens the "producer-agnostic" claim in the README.
Scope note: this rides the existing OTLP path — capture a real OTel export and assert on it. No new ingest mapper is required (that would be a separate help wanted issue).
What to do
- Run a small LangGraph agent with OTel GenAI instrumentation and capture the span export as JSON (a tool call + an LLM span is enough).
- Add it under
tests/fixtures/portability/langgraph_*.json.
- Add a case to
tests/test_portability.py that loads it via load_trace and asserts the expected spans/tool names normalize correctly (mirror the existing claude_agent_sdk_read_to_bash.json case).
Acceptance criteria
- New fixture file committed under
tests/fixtures/portability/.
- A
test_portability.py case loads it and asserts normalized Span fields (tool_name, tool_output, kind).
uv run pytest tests/test_portability.py passes.
Pointers
src/taintline/ingest.py — load_trace, OTLP detection
tests/fixtures/portability/claude_agent_sdk_read_to_bash.json — pattern to mirror
tests/test_portability.py
- README "Producer-agnostic"
Context
taintline's ingest (
src/taintline/ingest.py) auto-detects two input shapes: an OTLP-ish span list and a StrandsAgentResultdict. LangGraph agents can emit OpenTelemetry GenAI spans too, but we have no LangGraph-derived fixture proving the OTLP path ingests one cleanly. A fixture from a third stack strengthens the "producer-agnostic" claim in the README.Scope note: this rides the existing OTLP path — capture a real OTel export and assert on it. No new ingest mapper is required (that would be a separate
help wantedissue).What to do
tests/fixtures/portability/langgraph_*.json.tests/test_portability.pythat loads it viaload_traceand asserts the expected spans/tool names normalize correctly (mirror the existingclaude_agent_sdk_read_to_bash.jsoncase).Acceptance criteria
tests/fixtures/portability/.test_portability.pycase loads it and asserts normalizedSpanfields (tool_name, tool_output, kind).uv run pytest tests/test_portability.pypasses.Pointers
src/taintline/ingest.py—load_trace, OTLP detectiontests/fixtures/portability/claude_agent_sdk_read_to_bash.json— pattern to mirrortests/test_portability.py