diff --git a/apps/ingest/src/ai_equivalence_fixtures.rs b/apps/ingest/src/ai_equivalence_fixtures.rs new file mode 100644 index 000000000..353e32f9c --- /dev/null +++ b/apps/ingest/src/ai_equivalence_fixtures.rs @@ -0,0 +1,2795 @@ +//! Rust↔SQL equivalence fixtures: adversarial spans, driven through the **real** +//! row writer. +//! +//! # The claim +//! +//! For any span, the SQL compiled from `registry.json` +//! (`packages/domain/src/ai-registry/compile-sql.ts`) evaluated over the row ingest +//! *actually wrote* produces the same `AiVendor` and `AiSessionKeyState` as the Rust +//! classifier that wrote it, and `AiSessionKeyHash` is byte-identical to +//! `cityHash64(value)` computed inside ClickHouse. +//! +//! This module owns the Rust half: it generates a deterministic corpus of adversarial +//! spans (write-side plan §6's fuzz surface), runs each one through [`super::encode_traces`] +//! — the same function the ingest request path calls, with the classification flag on +//! — and serialises **the exact NDJSON row the writer produced** +//! plus the Rust verdict as a JSONL artifact. The TypeScript half +//! (`packages/domain/src/ai-registry/equivalence.clickhouse.e2e.test.ts`) replays that +//! artifact into a real ClickHouse through the same generated INSERT shape ingest uses +//! and compares. +//! +//! Because the Rust verdict is already *on the row* (`ai_vendor`, +//! `ai_session_key_state`), the differential needs no join key: it is a single +//! `WHERE computed != stored` over the inserted rows. The `rust` block on each fixture +//! record is a redundant cross-check, and the generator asserts the two agree before +//! writing a line. +//! +//! # What this proves, and what it does not +//! +//! Rust↔SQL only. The trace-capture reference evaluator (`scripts/verify-seed.ts`) is a +//! third implementation and is **not** in this loop: it renders kvlist values in +//! insertion order and `JSON.stringify`s bytes, where `any_value_string` sorts kvlist +//! keys (the row Map is a `serde_json::Map`) and hex-encodes bytes. That divergence +//! cannot affect this suite — SQL reads the string the row writer already produced — +//! but it means "the fixture agrees with the seed verifier" is not a claim made here. +//! +//! # Determinism +//! +//! No clock, no RNG, no environment. Receive time, span start times, trace/span ids +//! and every attribute value are constants or derived from a fixed counter, so +//! regenerating the artifact is byte-stable; [`fixture_is_reproducible`] pins that. +//! +//! # Regeneration +//! +//! ```sh +//! EQUIVALENCE_FIXTURE_OUT=packages/domain/src/ai-registry/__fixtures__/equivalence-spans.jsonl \ +//! cargo test -p maple-ingest --lib write_equivalence_fixture -- --ignored --nocapture +//! ``` +//! +//! and, for the full capture corpus (local only, never checked in): +//! +//! ```sh +//! TRACE_CAPTURE_DIR=~/Documents/repos/trace-capture \ +//! CORPUS_EQUIVALENCE_OUT=/tmp/corpus-equivalence.jsonl \ +//! cargo test -p maple-ingest --lib write_corpus_equivalence_fixture -- --ignored --nocapture +//! ``` + +use std::collections::BTreeSet; + +use opentelemetry_proto::tonic::common::v1::{ArrayValue, InstrumentationScope, KeyValueList}; +use opentelemetry_proto::tonic::resource::v1::Resource; +use opentelemetry_proto::tonic::trace::v1::{ResourceSpans, ScopeSpans}; + +use super::*; +use crate::ai_classifier::ResourceContext; + +// --------------------------------------------------------------------------- +// constants +// --------------------------------------------------------------------------- + +/// Batch receive time, epoch seconds — 2023-11-14 22:13:20 UTC. Fixed so +/// `ai_rollup_hour` never depends on when the fixture was generated. +const RECEIVE_SECS: i64 = 1_700_000_000; +/// Every span starts at the receive second, inside the rollup clamp window. +const START_NANOS: u64 = RECEIVE_SECS as u64 * 1_000_000_000; + +const ORG_ID: &str = "org_equivalence"; + +// --------------------------------------------------------------------------- +// attribute helpers +// --------------------------------------------------------------------------- + +fn any(value: any_value::Value) -> Option { + Some(AnyValue { value: Some(value) }) +} + +/// String-valued attribute. +fn s(key: &str, value: &str) -> KeyValue { + KeyValue { + key: key.to_string(), + value: any(any_value::Value::StringValue(value.to_string())), + } +} + +fn int(key: &str, value: i64) -> KeyValue { + KeyValue { + key: key.to_string(), + value: any(any_value::Value::IntValue(value)), + } +} + +fn double(key: &str, value: f64) -> KeyValue { + KeyValue { + key: key.to_string(), + value: any(any_value::Value::DoubleValue(value)), + } +} + +fn boolean(key: &str, value: bool) -> KeyValue { + KeyValue { + key: key.to_string(), + value: any(any_value::Value::BoolValue(value)), + } +} + +fn bytes(key: &str, value: &[u8]) -> KeyValue { + KeyValue { + key: key.to_string(), + value: any(any_value::Value::BytesValue(value.to_vec())), + } +} + +fn array(key: &str, values: Vec) -> KeyValue { + KeyValue { + key: key.to_string(), + value: any(any_value::Value::ArrayValue(ArrayValue { + values: values.into_iter().filter_map(|kv| kv.value).collect(), + })), + } +} + +fn kvlist(key: &str, values: Vec) -> KeyValue { + KeyValue { + key: key.to_string(), + value: any(any_value::Value::KvlistValue(KeyValueList { values })), + } +} + +/// `AnyValue { value: None }` — a wire-legal "typed nothing". +fn untyped(key: &str) -> KeyValue { + KeyValue { + key: key.to_string(), + value: Some(AnyValue { value: None }), + } +} + +/// `KeyValue { value: None }` — the attribute exists, the value field does not. +fn valueless(key: &str) -> KeyValue { + KeyValue { + key: key.to_string(), + value: None, + } +} + +fn scope(name: &str) -> InstrumentationScope { + InstrumentationScope { + name: name.to_string(), + version: "1.2.3".to_string(), + attributes: Vec::new(), + dropped_attributes_count: 0, + } +} + +// --------------------------------------------------------------------------- +// spec model +// --------------------------------------------------------------------------- + +/// One span to classify. +struct Case { + id: String, + category: &'static str, + note: String, + span_name: String, + attributes: Vec, +} + +fn case( + category: &'static str, + id: &str, + note: &str, + span_name: &str, + attributes: Vec, +) -> Case { + Case { + id: id.to_string(), + category, + note: note.to_string(), + span_name: span_name.to_string(), + attributes, + } +} + +/// A `ResourceSpans`/`ScopeSpans` pair and the spans under it. Groups with more than +/// one case exercise the hoisting path — resource and scope evidence resolved once and +/// shared — which a corpus of singletons would never reach. +struct Group { + resource: Vec, + scope: Option, + schema_url: String, + cases: Vec, +} + +impl Group { + fn new(scope_name: &str, cases: Vec) -> Self { + Self { + resource: vec![s("service.name", "equivalence-fixture")], + scope: Some(scope(scope_name)), + schema_url: String::new(), + cases, + } + } + + fn resource(mut self, attributes: Vec) -> Self { + self.resource = attributes; + self + } + + fn scope_attrs(mut self, attributes: Vec) -> Self { + if let Some(scope) = self.scope.as_mut() { + scope.attributes = attributes; + } + self + } + + fn scope_version(mut self, version: &str) -> Self { + if let Some(scope) = self.scope.as_mut() { + scope.version = version.to_string(); + } + self + } + + fn no_scope(mut self) -> Self { + self.scope = None; + self + } + + fn schema_url(mut self, url: &str) -> Self { + self.schema_url = url.to_string(); + self + } + +} + +/// A single-span group — the common shape. +fn one(scope_name: &str, case: Case) -> Group { + Group::new(scope_name, vec![case]) +} + +// --------------------------------------------------------------------------- +// the corpus +// --------------------------------------------------------------------------- + +/// Neutral scope for spans whose classification must come from attributes alone. +const NEUTRAL_SCOPE: &str = "com.example.app"; + +fn groups() -> Vec { + let mut out = Vec::new(); + out.extend(sufficient_scope_groups()); + out.extend(resource_and_promotion_groups()); + out.extend(attr_only_groups()); + out.extend(cross_vendor_groups()); + out.extend(unknown_tier_groups()); + out.extend(non_ai_groups()); + out.extend(session_state_groups()); + out.extend(typed_value_groups()); + out.extend(present_but_empty_groups()); + out.extend(duplicate_key_groups()); + out.extend(near_miss_groups()); + out.extend(unicode_groups()); + out.extend(oversized_groups()); + out.extend(pseudo_key_groups()); + out.extend(cross_class_groups()); + out +} + +/// Every vendor whose scope matcher is `sufficient` — the branch where resource/scope +/// evidence classifies on its own, with no span attribute involved. +fn sufficient_scope_groups() -> Vec { + const SCOPES: &[(&str, &str)] = &[ + ("openinference.instrumentation.agno", "agno"), + ("com.anthropic.claude_code.tracing", "claude_agent_sdk"), + ("com.anthropic.claude_code.events", "claude_agent_sdk"), + ("com.anthropic.claude_code", "claude_agent_sdk"), + ("openinference.instrumentation.crewai", "crewai"), + ("crewai.telemetry", "crewai"), + ("openinference.instrumentation.dspy", "dspy"), + ("@flue/opentelemetry", "flue"), + ("gcp.vertex.agent", "google_adk"), + ("haystack", "haystack"), + ("langsmith", "langchain"), + ("litellm", "litellm"), + ("llamaindex.opentelemetry.tracer", "llamaindex"), + ("@mastra/otel-exporter", "mastra"), + ("agent_framework", "microsoft_agent_framework"), + ( + "openinference.instrumentation.openai_agents", + "openai_agents_sdk", + ), + ( + "openinference.instrumentation.openai", + "openinference-openai", + ), + ("pydantic-ai", "pydantic_ai"), + ( + "semantic_kernel.utils.telemetry.agent_diagnostics.decorators", + "semantic_kernel", + ), + ( + "semantic_kernel.utils.telemetry.model_diagnostics.decorators", + "semantic_kernel", + ), + ( + "semantic_kernel.functions.kernel_function", + "semantic_kernel", + ), + ( + "semantic_kernel.connectors.ai.chat_completion_client_base", + "semantic_kernel", + ), + ("agent_runtime InProcessRuntime", "semantic_kernel"), + ("openinference.instrumentation.smolagents", "smolagents"), + ("strands.telemetry.tracer", "strands"), + ]; + SCOPES + .iter() + .enumerate() + .map(|(index, (scope_name, vendor))| { + Group::new( + scope_name, + vec![ + case( + "resolution/sufficient_scope", + &format!("sufficient_scope/{vendor}/{index}"), + &format!("sufficient scope matcher for {vendor}, no AI attribute at all"), + "operation", + vec![s("http.route", "/x")], + ), + case( + "resolution/sufficient_scope", + &format!("sufficient_scope_hoisted/{vendor}/{index}"), + "second span under the same hoisted scope", + "operation.two", + vec![], + ), + ], + ) + }) + .collect() +} + +/// Insufficient resource/scope matchers: promoted by a same-vendor attr hit, and the +/// same evidence without one (the negative the plan names explicitly). +fn resource_and_promotion_groups() -> Vec { + // (label, resource attrs, scope name, promoting attrs) + let cases: Vec<(&str, Vec, &str, Vec)> = vec![ + ( + "spring_ai_scope", + vec![s("service.name", "spring-app")], + "org.springframework.boot", + vec![s("spring.ai.kind", "chat_client")], + ), + ( + "vercel_scope_ai", + vec![s("service.name", "next-app")], + "ai", + vec![s("ai.operationId", "ai.generateText")], + ), + ( + "vercel_scope_gen_ai", + vec![s("service.name", "next-app")], + "gen_ai", + vec![s("gen_ai.operation.name", "agent_step")], + ), + ( + "claude_resource", + vec![s("service.name", "claude-code")], + NEUTRAL_SCOPE, + vec![s("span.type", "interaction")], + ), + ( + "litellm_resource", + vec![s("service.name", "gateway"), s("model_id", "gpt-4o-mini")], + NEUTRAL_SCOPE, + vec![s("litellm.call_id", "call-1")], + ), + ( + "llamaindex_resource", + vec![s("service.name", "llamaindex.opentelemetry")], + NEUTRAL_SCOPE, + vec![s("llamaindex.run_id", "run-1")], + ), + ( + "langchain_resource", + vec![ + s("service.name", "langgraph-app"), + s("langsmith.internal_provider", "true"), + ], + NEUTRAL_SCOPE, + vec![s("langsmith.trace.name", "chain")], + ), + ( + "effect_ai_resource", + vec![ + s("service.name", "effect-app"), + s("telemetry.sdk.name", "@effect/opentelemetry"), + ], + NEUTRAL_SCOPE, + vec![], + ), + ]; + + let mut out = Vec::new(); + for (label, resource, scope_name, promoting) in cases { + // effect_ai promotes on span *name*, not an attribute. + let span_name = if label == "effect_ai_resource" { + "LanguageModel.generateText" + } else { + "op" + }; + let mut promoted = promoting.clone(); + promoted.push(s("http.route", "/api")); + out.push( + Group::new( + scope_name, + vec![case( + "resolution/insufficient_promoted", + &format!("promoted/{label}"), + "insufficient resource/scope candidate promoted by a same-vendor hit", + span_name, + promoted, + )], + ) + .resource(resource.clone()), + ); + out.push( + Group::new( + scope_name, + vec![case( + "resolution/insufficient_not_promoted", + &format!("not_promoted/{label}"), + "same insufficient evidence with nothing to promote it", + "POST", + vec![s("http.request.method", "POST"), s("http.route", "/api")], + )], + ) + .resource(resource), + ); + } + out +} + +/// Attr-class matchers on their own, under a scope no rule claims. +fn attr_only_groups() -> Vec { + let attrs: Vec<(&str, Vec)> = vec![ + ("agno", vec![s("agno.run.id", "r-1")]), + ("claude_agent_sdk", vec![s("span.type", "tool.execution")]), + ("crewai", vec![s("crew_key", "k")]), + ("crewai_task_key", vec![s("task_key", "research")]), + ( + "crewai_tool_result", + vec![s("tool.result_as_answer", "false")], + ), + ("crewai_flow", vec![s("flow_name", "f")]), + ("crewai_flow_node", vec![s("flow.node.id", "n")]), + ("flue", vec![s("flue.operation.kind", "tool")]), + ( + "google_adk_prefix", + vec![s("gcp.vertex.agent.invocation_id", "i-1")], + ), + ( + "google_adk_system", + vec![s("gen_ai.system", "gcp.vertex.agent")], + ), + ("haystack", vec![s("haystack.component.name", "retriever")]), + ( + "langchain_prefix", + vec![s("langsmith.metadata.thread_id", "t-1")], + ), + ("langchain_system", vec![s("gen_ai.system", "langchain")]), + ("litellm", vec![s("litellm.call_id", "c-1")]), + ("llamaindex", vec![s("llamaindex.span.kind", "query")]), + ("mastra", vec![s("mastra.span.type", "agent_run")]), + ( + "microsoft_provider", + vec![s("gen_ai.provider.name", "microsoft.agent_framework")], + ), + ("microsoft_prefix", vec![s("agent_framework.run.id", "r")]), + ("microsoft_executor", vec![s("executor.id", "e")]), + ( + "microsoft_edge_group", + vec![s("edge_group.type", "fan_out")], + ), + ("pydantic_ai", vec![s("pydantic_ai.all_messages", "[]")]), + ( + "pydantic_ai_usage", + vec![s("gen_ai.aggregated_usage.input_tokens", "12")], + ), + ("semantic_kernel_prefix", vec![s("sk.function.name", "f")]), + ( + "semantic_kernel_streaming", + vec![s("gen_ai.operation.name", "chat.streaming_completions")], + ), + ("smolagents", vec![s("smolagents.max_steps", "10")]), + ("spring_ai_prefix", vec![s("spring.ai.kind", "chat_client")]), + ("spring_ai_system", vec![s("gen_ai.system", "spring_ai")]), + ("strands_system", vec![s("gen_ai.system", "strands-agents")]), + ( + "strands_provider", + vec![s("gen_ai.provider.name", "strands-agents")], + ), + ("strands_event_loop", vec![s("event_loop.cycle_id", "c")]), + ( + "vercel_prefix", + vec![s("ai.operationId", "ai.generateText")], + ), + ( + "vercel_execute_tool", + vec![s("gen_ai.execute_tool.duration", "1")], + ), + ( + "vercel_agent_step", + vec![s("gen_ai.operation.name", "agent_step")], + ), + ]; + attrs + .into_iter() + .map(|(label, attributes)| { + one( + NEUTRAL_SCOPE, + case( + "resolution/attr_only", + &format!("attr_only/{label}"), + "attr-class matcher alone under an unclaimed scope", + "op", + attributes, + ), + ) + }) + .collect() +} + +/// Spans carrying two vendors' evidence at once: the global priority ordering, not a +/// per-candidate probe, decides. +fn cross_vendor_groups() -> Vec { + vec![ + Group::new( + "openinference.instrumentation.openai", + vec![case( + "resolution/cross_vendor", + "cross_vendor/openai_scope_vs_crewai_attr", + "sufficient scope (band 3xxxx) outranks another vendor's attr hit (2xxxx)", + "ChatCompletion", + vec![ + s("openinference.span.kind", "LLM"), + s("task_key", "research"), + ], + )], + ), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "resolution/cross_vendor", + "cross_vendor/mastra_resource_vs_agno_attr", + "sufficient *resource* matcher outranks an attr hit", + "agent.generate", + vec![s("agno.run.id", "r-1")], + )], + ) + .resource(vec![ + s("service.name", "mastra-app"), + s("telemetry.sdk.name", "@mastra/otel-exporter"), + ]), + one( + NEUTRAL_SCOPE, + case( + "resolution/cross_vendor", + "cross_vendor/two_attr_bands", + "two vendors' attr matchers on one span: highest priority wins", + "op", + vec![ + s("spring.ai.kind", "chat_client"), + s("mastra.span.type", "llm"), + ], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "resolution/cross_vendor", + "cross_vendor/vendor_beats_unknown", + "a vendor attr hit outranks the unknown tier it overlaps", + "ai.generateText", + vec![ + s("ai.operationId", "ai.generateText"), + s("gen_ai.operation.name", "chat"), + ], + ), + ), + one( + "org.springframework.boot", + case( + "resolution/cross_vendor", + "cross_vendor/unpromoted_candidate_loses_to_unknown", + "an unpromoted candidate does not suppress the unknown tier", + "POST", + vec![s("gen_ai.operation.name", "chat")], + ), + ), + one( + "gcp.vertex.agent", + case( + "resolution/cross_vendor", + "cross_vendor/sufficient_scope_with_foreign_system", + "sufficient scope wins over a conflicting gen_ai.system attr matcher", + "invocation", + vec![s("gen_ai.system", "langchain")], + ), + ), + ] +} + +fn unknown_tier_groups() -> Vec { + vec![ + one( + NEUTRAL_SCOPE, + case( + "resolution/unknown_tier", + "unknown/genai", + "present(gen_ai.operation.name)", + "chat", + vec![s("gen_ai.operation.name", "chat")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "resolution/unknown_tier", + "unknown/openinference", + "present(openinference.span.kind)", + "call", + vec![s("openinference.span.kind", "LLM")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "resolution/unknown_tier", + "unknown/llm_prefix", + "key_prefix(llm.)", + "call", + vec![s("llm.model_name", "gpt-4o")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "resolution/unknown_tier", + "unknown/traceloop_prefix", + "key_prefix(traceloop.)", + "workflow", + vec![s("traceloop.workflow.name", "w")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "resolution/unknown_tier", + "unknown/ai_prefix", + "key_prefix(ai.) with no vercel-specific evidence — still vercel's attr family", + "call", + vec![s("ai.telemetry.functionId", "f")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "resolution/unknown_tier", + "unknown/co_occurrence_gate_off", + "input.value/output.value alone are deliberately not fingerprints", + "handler", + vec![s("input.value", "{}"), s("output.value", "{}")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "resolution/unknown_tier", + "unknown/co_occurrence_gate_on", + "the same generic values with an OpenInference attribute present", + "handler", + vec![ + s("input.value", "{}"), + s("openinference.span.kind", "CHAIN"), + ], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "resolution/unknown_tier", + "unknown/priority_between_buckets", + "genai outranks openinference outranks llm.", + "call", + vec![ + s("gen_ai.operation.name", "chat"), + s("openinference.span.kind", "LLM"), + s("llm.model_name", "gpt-4o"), + ], + ), + ), + ] +} + +fn non_ai_groups() -> Vec { + vec![ + one( + "@opentelemetry/instrumentation-http", + case( + "resolution/non_ai", + "non_ai/http_server", + "ordinary HTTP server span", + "GET /health", + vec![ + s("http.request.method", "GET"), + s("url.path", "/health"), + int("http.response.status_code", 200), + ], + ), + ), + one( + "@opentelemetry/instrumentation-pg", + case( + "resolution/non_ai", + "non_ai/db_client", + "ordinary DB client span", + "SELECT maple.traces", + vec![ + s("db.system.name", "postgresql"), + s("db.namespace", "maple"), + ], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "resolution/non_ai", + "non_ai/no_attributes", + "no attributes at all", + "work", + vec![], + ), + ), + Group::new( + "", + vec![case( + "resolution/non_ai", + "non_ai/empty_scope_name", + "empty scope name", + "work", + vec![s("http.route", "/")], + )], + ), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "resolution/non_ai", + "non_ai/no_scope", + "ScopeSpans with no InstrumentationScope at all", + "work", + vec![s("http.route", "/")], + )], + ) + .no_scope(), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "resolution/non_ai", + "non_ai/no_resource", + "ResourceSpans with no resource attributes", + "work", + vec![s("http.route", "/")], + )], + ) + .resource(vec![]), + ] +} + +/// The session-state ladder (1..6), per vendor, one span per rung it can reach. +// One `push` per vendor keeps each vendor's ladder a self-contained block with its own +// comment; a single `vec![]` literal would bury the boundaries. +#[allow(clippy::vec_init_then_push)] +fn session_state_groups() -> Vec { + let mut out = Vec::new(); + + // -- agno: two candidates, authority = AGENT kind or an agno.workflow. key ---- + out.push(Group::new( + "openinference.instrumentation.agno", + vec![ + case( + "session/agno", + "session/agno/state2_not_authoritative", + "no AGENT kind, no agno.workflow. key", + "Model.invoke", + vec![s("agno.run.id", "r-1"), s("session.id", "s-1")], + ), + case( + "session/agno", + "session/agno/state3_key_absent", + "authoritative, neither candidate key present", + "Agent.run", + vec![s("openinference.span.kind", "AGENT")], + ), + case( + "session/agno", + "session/agno/state4_empty", + "authoritative, session.id present but empty; agno.run.id also empty", + "Agent.run", + vec![ + s("openinference.span.kind", "AGENT"), + s("session.id", ""), + s("agno.run.id", ""), + ], + ), + case( + "session/agno", + "session/agno/state5_run_only", + "run-granularity candidate only", + "Agent.run", + vec![ + s("openinference.span.kind", "AGENT"), + s("agno.run.id", "r-9"), + ], + ), + case( + "session/agno", + "session/agno/state6_session", + "session-granularity candidate resolves; max over candidates", + "Agent.run", + vec![ + s("openinference.span.kind", "AGENT"), + s("session.id", "sess-agno"), + s("agno.run.id", "r-9"), + ], + ), + case( + "session/agno", + "session/agno/state6_via_workflow_prefix", + "authority via key_prefix(agno.workflow.)", + "Workflow.run", + vec![ + s("agno.workflow.name", "research"), + s("session.id", "sess-agno-2"), + ], + ), + case( + "session/agno", + "session/agno/state4_empty_wins_over_absent", + "empty session.id (4) beats absent agno.run.id (3) under max", + "Agent.run", + vec![s("openinference.span.kind", "AGENT"), s("session.id", "")], + ), + ], + )); + + // -- claude_agent_sdk: authority = present(span.type) ------------------------- + out.push(Group::new( + "com.anthropic.claude_code", + vec![ + case( + "session/claude_agent_sdk", + "session/claude/state2", + "no span.type ⇒ neither candidate is authoritative", + "claude_code.other", + vec![s("session.id", "sess-1")], + ), + case( + "session/claude_agent_sdk", + "session/claude/state3", + "authoritative, no key", + "claude_code.interaction", + vec![s("span.type", "interaction")], + ), + case( + "session/claude_agent_sdk", + "session/claude/state4", + "present-but-empty session.id", + "claude_code.interaction", + vec![s("span.type", "interaction"), s("session.id", "")], + ), + case( + "session/claude_agent_sdk", + "session/claude/state5_user_only", + "user granularity only", + "claude_code.interaction", + vec![s("span.type", "interaction"), s("user.id", "u-7")], + ), + case( + "session/claude_agent_sdk", + "session/claude/state6", + "session id present and valid", + "claude_code.interaction", + vec![ + s("span.type", "interaction"), + s("session.id", "sess-claude"), + s("user.id", "u-7"), + ], + ), + ], + )); + + // -- flue: one ALWAYS candidate, one gated; decoy value 'default' ------------- + out.push(Group::new( + "@flue/opentelemetry", + vec![ + case( + "session/flue", + "session/flue/state3_always_candidate_absent", + "the ALWAYS candidate is authoritative but its key is absent", + "flue.tool", + vec![s("flue.operation.kind", "tool")], + ), + case( + "session/flue", + "session/flue/state5_instance", + "instance granularity resolves at 5", + "flue.tool", + vec![ + s("flue.operation.kind", "tool"), + s("flue.instance.id", "inst-7"), + ], + ), + case( + "session/flue", + "session/flue/state6_conversation", + "prompt span with a conversation id", + "flue.prompt", + vec![ + s("flue.operation.kind", "prompt"), + s("gen_ai.conversation.id", "conv-3"), + s("flue.instance.id", "inst-7"), + ], + ), + case( + "session/flue", + "session/flue/state5_decoy_conversation", + "decoy value 'default' invalidates candidate 1 (4) but instance still resolves (5)", + "flue.prompt", + vec![ + s("flue.operation.kind", "prompt"), + s("gen_ai.conversation.id", "default"), + s("flue.instance.id", "inst-7"), + ], + ), + case( + "session/flue", + "session/flue/state4_decoy_only", + "decoy conversation id, no instance id ⇒ 4", + "flue.prompt", + vec![ + s("flue.operation.kind", "prompt"), + s("gen_ai.conversation.id", "default"), + ], + ), + ], + )); + + // -- google_adk: three candidates, disjoint authority populations ------------- + out.push(Group::new( + "gcp.vertex.agent", + vec![ + case( + "session/google_adk", + "session/adk/state2", + "none of the three authority predicates hold", + "internal", + vec![s("gcp.vertex.agent.session_id", "s-1")], + ), + case( + "session/google_adk", + "session/adk/state3", + "authoritative via gen_ai.system, key absent", + "invocation", + vec![s("gen_ai.system", "gcp.vertex.agent")], + ), + case( + "session/google_adk", + "session/adk/state6_via_system", + "candidate 2 resolves at session granularity", + "invocation", + vec![ + s("gen_ai.system", "gcp.vertex.agent"), + s("gcp.vertex.agent.session_id", "s-1"), + ], + ), + case( + "session/google_adk", + "session/adk/state6_via_conversation", + "candidate 1's population: invoke_agent", + "invoke_agent weather", + vec![ + s("gen_ai.operation.name", "invoke_agent"), + s("gen_ai.conversation.id", "c-9"), + ], + ), + case( + "session/google_adk", + "session/adk/state5_invocation_run", + "run-granularity candidate 3 (authority = present(gen_ai.request.model))", + "generate_content", + vec![ + s("gen_ai.request.model", "gemini-2.0-flash"), + s("gcp.vertex.agent.invocation_id", "inv-1"), + ], + ), + case( + "session/google_adk", + "session/adk/state6_max_unions_disjoint", + "one candidate at 2, one at 6 — max unions instead of cancelling", + "generate_content", + vec![ + s("gen_ai.operation.name", "generate_content"), + s("gen_ai.conversation.id", "c-11"), + s("gcp.vertex.agent.invocation_id", "inv-2"), + ], + ), + ], + )); + + // -- spring_ai: promoted candidate + decoy 'default' -------------------------- + out.push( + Group::new( + "org.springframework.boot", + vec![ + case( + "session/spring_ai", + "session/spring/state2", + "not a chat_client span ⇒ not authoritative", + "chat", + vec![ + s("spring.ai.kind", "chat_model"), + s("spring.ai.chat.client.conversation.id", "c-1"), + ], + ), + case( + "session/spring_ai", + "session/spring/state3", + "authoritative, key absent", + "chat_client", + vec![s("spring.ai.kind", "chat_client")], + ), + case( + "session/spring_ai", + "session/spring/state4_decoy", + "the 'default' decoy value", + "chat_client", + vec![ + s("spring.ai.kind", "chat_client"), + s("spring.ai.chat.client.conversation.id", "default"), + ], + ), + case( + "session/spring_ai", + "session/spring/state4_empty", + "present-but-empty", + "chat_client", + vec![ + s("spring.ai.kind", "chat_client"), + s("spring.ai.chat.client.conversation.id", ""), + ], + ), + case( + "session/spring_ai", + "session/spring/state6", + "resolved", + "chat_client", + vec![ + s("spring.ai.kind", "chat_client"), + s("spring.ai.chat.client.conversation.id", "conv-42"), + ], + ), + ], + ) + .resource(vec![s("service.name", "spring-ai-app")]), + ); + + // -- litellm: two user-granularity candidates, decoys incl. the empty string -- + out.push(Group::new( + "litellm", + vec![ + case( + "session/litellm", + "session/litellm/state2", + "no litellm.call_id ⇒ not authoritative", + "litellm_request", + vec![s("metadata.user_api_key_user_id", "u-1")], + ), + case( + "session/litellm", + "session/litellm/state3", + "authoritative, no key", + "litellm_request", + vec![s("litellm.call_id", "c-1")], + ), + case( + "session/litellm", + "session/litellm/state4_decoy_default_user", + "'default_user_id' is a decoy value", + "litellm_request", + vec![ + s("litellm.call_id", "c-1"), + s("metadata.user_api_key_end_user_id", "default_user_id"), + ], + ), + case( + "session/litellm", + "session/litellm/state4_decoy_empty", + "the empty string is BOTH a non_empty failure and a declared decoy", + "litellm_request", + vec![ + s("litellm.call_id", "c-1"), + s("metadata.user_api_key_end_user_id", ""), + ], + ), + case( + "session/litellm", + "session/litellm/state5", + "user granularity resolves at 5, never 6", + "litellm_request", + vec![ + s("litellm.call_id", "c-1"), + s("metadata.user_api_key_user_id", "user-77"), + ], + ), + ], + )); + + // -- langchain: ALWAYS candidate + decoy -------------------------------------- + out.push(Group::new( + "langsmith", + vec![ + case( + "session/langchain", + "session/langchain/state3", + "ALWAYS-authoritative candidate with no key", + "chain", + vec![s("langsmith.trace.name", "chain")], + ), + case( + "session/langchain", + "session/langchain/state4_decoy", + "'default' decoy", + "chain", + vec![s("langsmith.metadata.thread_id", "default")], + ), + case( + "session/langchain", + "session/langchain/state6", + "resolved thread id", + "chain", + vec![s("langsmith.metadata.thread_id", "thread-9")], + ), + ], + )); + + // -- mastra: three candidates at three granularities -------------------------- + out.push(Group::new( + "@mastra/otel-exporter", + vec![ + case( + "session/mastra", + "session/mastra/state2", + "no mastra.span.type ⇒ not authoritative", + "agent.generate", + vec![s("gen_ai.conversation.id", "c-1")], + ), + case( + "session/mastra", + "session/mastra/state3", + "authoritative, no candidate key", + "agent.generate", + vec![s("mastra.span.type", "agent_run")], + ), + case( + "session/mastra", + "session/mastra/state5_run", + "run granularity", + "agent.generate", + vec![ + s("mastra.span.type", "agent_run"), + s("mastra.metadata.runId", "run-1"), + ], + ), + case( + "session/mastra", + "session/mastra/state5_user", + "user granularity", + "agent.generate", + vec![ + s("mastra.span.type", "agent_run"), + s("mastra.metadata.resourceId", "res-1"), + ], + ), + case( + "session/mastra", + "session/mastra/state6_max", + "all three candidates resolve; max picks session and the hash follows it", + "agent.generate", + vec![ + s("mastra.span.type", "agent_run"), + s("gen_ai.conversation.id", "conv-mastra"), + s("mastra.metadata.runId", "run-1"), + s("mastra.metadata.resourceId", "res-1"), + ], + ), + ], + )); + + // -- pydantic_ai -------------------------------------------------------------- + out.push(Group::new( + "pydantic-ai", + vec![ + case( + "session/pydantic_ai", + "session/pydantic/state2", + "no gen_ai.operation.name ⇒ not authoritative", + "agent run", + vec![s("gen_ai.conversation.id", "c-1")], + ), + case( + "session/pydantic_ai", + "session/pydantic/state5_call_id", + "run granularity only", + "agent run", + vec![ + s("gen_ai.operation.name", "invoke_agent"), + s("gen_ai.agent.call.id", "call-1"), + ], + ), + case( + "session/pydantic_ai", + "session/pydantic/state6", + "conversation id at session granularity", + "agent run", + vec![ + s("gen_ai.operation.name", "invoke_agent"), + s("gen_ai.conversation.id", "run-1"), + s("pydantic_ai.all_messages", "[]"), + ], + ), + ], + )); + + // -- microsoft_agent_framework: two decoy values ------------------------------ + out.push(Group::new( + "agent_framework", + vec![ + case( + "session/microsoft_agent_framework", + "session/maf/state2", + "operation is not invoke_agent", + "chat", + vec![s("gen_ai.conversation.id", "c-1")], + ), + case( + "session/microsoft_agent_framework", + "session/maf/state4_decoy_local_history", + "'agent_framework_local_history_persistence' decoy", + "invoke_agent", + vec![ + s("gen_ai.operation.name", "invoke_agent"), + s( + "gen_ai.conversation.id", + "agent_framework_local_history_persistence", + ), + ], + ), + case( + "session/microsoft_agent_framework", + "session/maf/state4_decoy_unknown", + "'unknown' decoy", + "invoke_agent", + vec![ + s("gen_ai.operation.name", "invoke_agent"), + s("gen_ai.conversation.id", "unknown"), + ], + ), + case( + "session/microsoft_agent_framework", + "session/maf/state6", + "resolved", + "invoke_agent", + vec![ + s("gen_ai.operation.name", "invoke_agent"), + s("gen_ai.conversation.id", "thread_abc"), + ], + ), + ], + )); + + // -- strands / openai_agents_sdk / smolagents / crewai / dspy / llamaindex ---- + out.push(Group::new( + "strands.telemetry.tracer", + vec![ + case( + "session/strands", + "session/strands/state2", + "no gen_ai.system / provider ⇒ not authoritative", + "Model invoke", + vec![s("session.id", "s-1")], + ), + case( + "session/strands", + "session/strands/state6", + "authoritative via gen_ai.system", + "Cycle", + vec![s("gen_ai.system", "strands-agents"), s("session.id", "s-2")], + ), + case( + "session/strands", + "session/strands/state6_via_provider", + "authoritative via gen_ai.provider.name", + "Cycle", + vec![ + s("gen_ai.provider.name", "strands-agents"), + s("session.id", "s-3"), + ], + ), + ], + )); + out.push(Group::new( + "openinference.instrumentation.openai_agents", + vec![ + case( + "session/openai_agents_sdk", + "session/openai_agents/state2", + "no openinference.span.kind ⇒ not authoritative", + "Response", + vec![s("session.id", "s-1")], + ), + case( + "session/openai_agents_sdk", + "session/openai_agents/state6_session_id", + "session.id wins; gen_ai.conversation.id ties at 6 and loses on order", + "Agent workflow", + vec![ + s("openinference.span.kind", "AGENT"), + s("session.id", "sess-a"), + s("gen_ai.conversation.id", "conv-b"), + ], + ), + case( + "session/openai_agents_sdk", + "session/openai_agents/state6_conversation_only", + "second candidate alone", + "Agent workflow", + vec![ + s("openinference.span.kind", "AGENT"), + s("gen_ai.conversation.id", "conv-b"), + ], + ), + ], + )); + out.push(Group::new( + "openinference.instrumentation.smolagents", + vec![ + case( + "session/smolagents", + "session/smolagents/state3", + "authoritative, no key", + "CodeAgent.run", + vec![s("openinference.span.kind", "AGENT")], + ), + case( + "session/smolagents", + "session/smolagents/state5_user", + "user granularity only", + "CodeAgent.run", + vec![s("openinference.span.kind", "AGENT"), s("user.id", "u-1")], + ), + ], + )); + out.push(Group::new( + "openinference.instrumentation.crewai", + vec![ + case( + "session/crewai", + "session/crewai/state3", + "authority is the scope itself; key absent", + "Crew.kickoff", + vec![s("crew_key", "k")], + ), + case( + "session/crewai", + "session/crewai/state6", + "resolved", + "Crew.kickoff", + vec![s("crew_key", "k"), s("session.id", "sess-crew")], + ), + ], + )); + out.push(Group::new( + "openinference.instrumentation.dspy", + vec![case( + "session/dspy", + "session/dspy/state6", + "scope-gated authority, session granularity", + "Predict.forward", + vec![s("session.id", "sess-dspy"), s("user.id", "u-dspy")], + )], + )); + out.push(Group::new( + "llamaindex.opentelemetry.tracer", + vec![ + case( + "session/llamaindex", + "session/llamaindex/state3", + "ALWAYS candidate, key absent", + "query", + vec![s("llamaindex.span.kind", "query")], + ), + case( + "session/llamaindex", + "session/llamaindex/state5", + "run granularity", + "query", + vec![s("llamaindex.run_id", "run-3")], + ), + ], + )); + + // -- vendors with no session rules at all ⇒ state 1 --------------------------- + for (scope_name, label) in [ + ("haystack", "haystack"), + ( + "semantic_kernel.functions.kernel_function", + "semantic_kernel", + ), + ("ai", "vercel_ai_sdk"), + ] { + out.push(one( + scope_name, + case( + "session/no_rules", + &format!("session/no_rules/{label}"), + "vendor with zero session candidates ⇒ state 1", + "op", + vec![s("ai.operationId", "ai.generateText")], + ), + )); + } + out.push(one( + NEUTRAL_SCOPE, + case( + "session/no_rules", + "session/no_rules/unknown_bucket", + "unknown-tier buckets carry no session rules ⇒ state 1", + "call", + vec![s("gen_ai.operation.name", "chat"), s("session.id", "s-1")], + ), + )); + out.push(one( + "effect_ai_scope_is_not_a_thing", + case( + "session/no_rules", + "session/no_rules/effect_ai", + "effect_ai classifies on span name and has no candidates", + "LanguageModel.generateText", + vec![s("gen_ai.operation.name", "chat")], + ), + )); + + out +} + +/// Typed `AnyValue`s: the canonicalization the alignment contract rests on. Each case +/// pairs a typed value with a rule that reads it, so a canonicalization difference +/// changes the verdict rather than hiding in an unread column. +fn typed_value_groups() -> Vec { + let mut out = vec![ + // bool ⇒ "true"/"false", read by langchain's resource matcher. + Group::new( + NEUTRAL_SCOPE, + vec![case( + "values/typed", + "typed/bool_true_resource", + "BoolValue(true) canonicalizes to 'true' for eq()", + "chain", + vec![s("langsmith.trace.name", "x")], + )], + ) + .resource(vec![ + s("service.name", "lc"), + boolean("langsmith.internal_provider", true), + ]), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "values/typed", + "typed/bool_false_resource", + "BoolValue(false) must NOT satisfy eq(..., 'true')", + "chain", + vec![s("http.route", "/x")], + )], + ) + .resource(vec![ + s("service.name", "lc"), + boolean("langsmith.internal_provider", false), + ]), + ]; + + // Typed session-key values: the hash is taken over the canonical string. + let typed_keys: Vec<(&str, KeyValue, &str)> = vec![ + ( + "int", + int("session.id", 4_294_967_296), + "IntValue beyond 2^32 as a session key", + ), + ( + "int_negative", + int("session.id", i64::MIN), + "IntValue::MIN as a session key", + ), + ( + "double", + double("session.id", 1.5), + "DoubleValue canonicalizes with Rust's float formatting", + ), + ( + "double_integral", + double("session.id", 42.0), + "42.0 renders as '42', not '42.0'", + ), + ( + "bool", + boolean("session.id", true), + "BoolValue as a session key", + ), + ( + "bytes", + bytes("session.id", &[0xde, 0xad, 0xbe, 0xef, 0x00, 0x01]), + "BytesValue hex-encodes (the row writer's rule, not JSON.stringify)", + ), + ( + "array", + array( + "session.id", + vec![s("", "a"), int("", 2), boolean("", false)], + ), + "ArrayValue renders as a JSON array of canonical strings", + ), + ( + "kvlist", + kvlist( + "session.id", + vec![s("z", "last"), s("a", "first"), int("m", 7)], + ), + "KvlistValue renders as a JSON object; the row Map's key order is what SQL sees", + ), + ( + "nested", + array( + "session.id", + vec![kvlist("", vec![s("k", "v")]), array("", vec![int("", 1)])], + ), + "nested array/kvlist", + ), + ( + "untyped", + untyped("session.id"), + "AnyValue with no value ⇒ empty string ⇒ state 4", + ), + ( + "valueless", + valueless("session.id"), + "KeyValue with no AnyValue ⇒ empty string ⇒ state 4", + ), + ]; + for (label, key_value, note) in typed_keys { + out.push(Group::new( + "com.anthropic.claude_code", + vec![case( + "values/typed", + &format!("typed/session_key_{label}"), + note, + "claude_code.interaction", + vec![s("span.type", "interaction"), key_value], + )], + )); + } + + // Typed values on keys compared by eq(): a canonicalization slip flips the vendor. + out.push(one( + NEUTRAL_SCOPE, + case( + "values/typed", + "typed/eq_int_vs_string", + "IntValue on gen_ai.system cannot match any vendor's string literal", + "op", + vec![int("gen_ai.system", 42)], + ), + )); + out.push(one( + NEUTRAL_SCOPE, + case( + "values/typed", + "typed/eq_kvlist_on_matched_key", + "KvlistValue on an eq()-compared key", + "op", + vec![kvlist("gen_ai.system", vec![s("spring_ai", "yes")])], + ), + )); + out.push(one( + NEUTRAL_SCOPE, + case( + "values/typed", + "typed/present_only_key_is_type_blind", + "present() ignores the value's type entirely", + "op", + vec![bytes("gen_ai.operation.name", &[0x00, 0xff])], + ), + )); + out.push(one( + NEUTRAL_SCOPE, + case( + "values/typed", + "typed/array_on_prefix_key", + "key_prefix() ignores values; the key alone decides", + "op", + vec![array("llm.token_counts", vec![int("", 1), int("", 2)])], + ), + )); + out +} + +/// Present-but-empty: the algebra's load-bearing subtlety. `mapContains` sees it, +/// `!= ''` would not. +fn present_but_empty_groups() -> Vec { + vec![ + one( + NEUTRAL_SCOPE, + case( + "values/present_empty", + "present_empty/unknown_genai", + "gen_ai.operation.name = '' still fingerprints as unknown:genai", + "llm", + vec![s("gen_ai.operation.name", "")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "values/present_empty", + "present_empty/unknown_openinference", + "openinference.span.kind = ''", + "llm", + vec![s("openinference.span.kind", "")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "values/present_empty", + "present_empty/eq_matcher_not_satisfied", + "an empty value cannot satisfy eq() against a non-empty literal", + "op", + vec![s("gen_ai.system", "")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "values/present_empty", + "present_empty/prefix_key_empty_value", + "key_prefix() reads keys, so an empty value still hits", + "op", + vec![s("spring.ai.kind", "")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "values/present_empty", + "present_empty/empty_key_name", + "an attribute whose key is the empty string", + "op", + vec![s("", ""), s("gen_ai.operation.name", "chat")], + ), + ), + Group::new( + "com.anthropic.claude_code", + vec![ + case( + "values/present_empty", + "present_empty/state4_vs_state3_empty", + "present-but-empty ⇒ 4", + "claude_code.interaction", + vec![s("span.type", "interaction"), s("session.id", "")], + ), + case( + "values/present_empty", + "present_empty/state4_vs_state3_absent", + "the same span with the key absent ⇒ 3", + "claude_code.interaction", + vec![s("span.type", "interaction")], + ), + case( + "values/present_empty", + "present_empty/authority_key_empty", + "the authority predicate is present(), so an empty span.type still grants it", + "claude_code.interaction", + vec![s("span.type", ""), s("session.id", "sess-empty-auth")], + ), + ], + ), + one( + "@flue/opentelemetry", + case( + "values/present_empty", + "present_empty/eq_authority_empty", + "eq()-based authority against an empty value", + "flue.prompt", + vec![ + s("flue.operation.kind", ""), + s("gen_ai.conversation.id", "c-1"), + ], + ), + ), + ] +} + +/// Duplicate keys. Registry-referenced keys are first-occurrence-wins in *both* the +/// classifier and the row Map; every other key keeps the last occurrence. +fn duplicate_key_groups() -> Vec { + let mut out = Vec::new(); + let orders: [(&str, [&str; 2]); 2] = [ + ("spring_first", ["spring_ai", "strands-agents"]), + ("strands_first", ["strands-agents", "spring_ai"]), + ]; + for (label, [first, second]) in orders { + out.push(one( + NEUTRAL_SCOPE, + case( + "keys/duplicate", + &format!("duplicate/gen_ai_system_{label}"), + "duplicate registry key: the first occurrence decides both the verdict and the row", + "chat", + vec![s("gen_ai.system", first), s("gen_ai.system", second)], + ), + )); + } + out.push(Group::new( + "com.anthropic.claude_code", + vec![ + case( + "keys/duplicate", + "duplicate/session_id_valid_then_empty", + "first occurrence valid, second empty ⇒ state 6", + "claude_code.interaction", + vec![ + s("span.type", "interaction"), + s("session.id", "sess-dup-1"), + s("session.id", ""), + ], + ), + case( + "keys/duplicate", + "duplicate/session_id_empty_then_valid", + "first occurrence empty, second valid ⇒ state 4", + "claude_code.interaction", + vec![ + s("span.type", "interaction"), + s("session.id", ""), + s("session.id", "sess-dup-2"), + ], + ), + case( + "keys/duplicate", + "duplicate/session_id_typed_then_string", + "typed first occurrence wins over a later string", + "claude_code.interaction", + vec![ + s("span.type", "interaction"), + int("session.id", 7), + s("session.id", "nine"), + ], + ), + case( + "keys/duplicate", + "duplicate/authority_key_duplicated", + "the authority key duplicated with a contradicting second value", + "claude_code.interaction", + vec![ + s("span.type", "interaction"), + s("span.type", "not-a-type"), + s("session.id", "sess-dup-3"), + ], + ), + case( + "keys/duplicate", + "duplicate/authority_key_contradiction_first", + "the mirror image: the non-matching value comes first", + "claude_code.interaction", + vec![ + s("span.type", "not-a-type"), + s("span.type", "interaction"), + s("session.id", "sess-dup-4"), + ], + ), + case( + "keys/duplicate", + "duplicate/triplicate", + "three occurrences of a registry key", + "claude_code.interaction", + vec![ + s("span.type", "interaction"), + s("session.id", "first"), + s("session.id", "second"), + s("session.id", "third"), + ], + ), + ], + )); + out.push(one( + NEUTRAL_SCOPE, + case( + "keys/duplicate", + "duplicate/non_registry_key_last_wins", + "a key no rule consults keeps the LAST occurrence in the row Map", + "op", + vec![ + s("http.route", "/first"), + s("http.route", "/second"), + s("gen_ai.operation.name", "chat"), + ], + ), + )); + out.push(one( + NEUTRAL_SCOPE, + case( + "keys/duplicate", + "duplicate/prefix_family_duplicated", + "duplicated keys inside a key_prefix family", + "op", + vec![ + s("spring.ai.kind", "chat_client"), + s("spring.ai.kind", "chat_model"), + s("spring.ai.other", "x"), + ], + ), + )); + out.push( + Group::new( + NEUTRAL_SCOPE, + vec![case( + "keys/duplicate", + "duplicate/resource_and_scope_same_key", + "the same registry key on the resource, the scope and the span", + "op", + vec![s("gen_ai.system", "spring_ai")], + )], + ) + .resource(vec![ + s("service.name", "dup"), + s("gen_ai.system", "strands-agents"), + ]) + .scope_attrs(vec![s("gen_ai.system", "langchain")]), + ); + out.push( + Group::new( + NEUTRAL_SCOPE, + vec![case( + "keys/duplicate", + "duplicate/scope_attribute_duplicated", + "duplicate keys inside the scope attribute list", + "op", + vec![s("http.route", "/x")], + )], + ) + .scope_attrs(vec![ + s("gen_ai.system", "spring_ai"), + s("gen_ai.system", "strands-agents"), + ]), + ); + out +} + +/// Near misses: keys engineered to share a first byte and length with a registry key, +/// or to sit one character away from a registry prefix. These are what the byte/length +/// screens are for, and a screen that leaks would show up as a spurious vendor. +fn near_miss_groups() -> Vec { + let near: Vec<(&str, &str)> = vec![ + ("gen_ai.systen", "same length, last byte differs"), + ("gen_ai.systemm", "one byte longer"), + ("gen_ai.syste", "one byte shorter"), + ("Gen_ai.system", "case-flipped first byte"), + ("gen_ai.operation.namf", "same length as a fingerprint key"), + ("session.iD", "case-flipped tail"), + ("sessionXid", "separator replaced"), + ("span.typ", "prefix of a registry key"), + ("span.typee", "registry key plus a byte"), + ("spring.ai", "the prefix without its trailing dot"), + ("spring/ai.kind", "separator swapped inside a prefix"), + ("spring.ao.kind", "one byte inside the prefix differs"), + ("agno", "prefix minus the dot"), + ("agnos.run", "prefix plus a byte before the dot"), + ("ai", "the shortest prefix minus its dot"), + ("aix.thing", "shares the first byte of the ai. prefix"), + ("llm", "llm. minus the dot"), + ("llmx.model", "llm prefix near miss"), + ("traceloop", "traceloop. minus the dot"), + ("traceloo.x", "one byte short inside the prefix"), + ("flue", "flue. minus the dot"), + ("mastra", "mastra. minus the dot"), + ("model_i", "resource key minus a byte"), + ("model_idx", "resource key plus a byte"), + ("telemetry.sdk.nam", "sufficient-resource key minus a byte"), + ("openinference.span.kin", "fingerprint key minus a byte"), + ("crew", "crew_ prefix minus the underscore"), + ("flow", "flow_ prefix minus the underscore"), + ("event_loop", "event_loop. minus the dot"), + ("executor", "executor. minus the dot"), + ("edge_group", "edge_group. minus the dot"), + ("sk", "sk. minus the dot"), + ("smolagents", "smolagents. minus the dot"), + ("langsmith", "langsmith. minus the dot"), + ("litellm", "litellm. minus the dot"), + ("haystack", "haystack. minus the dot"), + ("llamaindex", "llamaindex. minus the dot"), + ("pydantic_ai", "pydantic_ai. minus the dot"), + ("agent_framework", "agent_framework. minus the dot"), + ("gcp.vertex.agent", "gcp.vertex.agent. minus the dot"), + ]; + let mut out: Vec = near + .into_iter() + .map(|(key, note)| { + one( + NEUTRAL_SCOPE, + case( + "keys/near_miss", + &format!("near_miss/{key}"), + note, + "op", + vec![s(key, "value"), s("http.route", "/x")], + ), + ) + }) + .collect(); + + // Near-miss scope names against `eq(scope.name, …)` matchers. + for (scope_name, note) in [ + ("openinference.instrumentation.agn", "one byte short"), + ("openinference.instrumentation.agnoo", "one byte long"), + ("Openinference.instrumentation.agno", "case-flipped"), + ("openinference.instrumentation.agno ", "trailing space"), + (" openinference.instrumentation.agno", "leading space"), + ("pydantic_ai", "underscore instead of the hyphen"), + ("langsmit", "one byte short"), + ("litellmx", "one byte long"), + ] { + out.push(one( + scope_name, + case( + "keys/near_miss", + &format!("near_miss/scope/{scope_name}"), + note, + "op", + vec![s("http.route", "/x")], + ), + )); + } + out +} + +/// Unicode, including multi-byte boundaries — the byte screens index by first *byte*, +/// so a multi-byte lead byte is the interesting case. +fn unicode_groups() -> Vec { + let mut out = Vec::new(); + let unicode_values: Vec<(&str, String, &str)> = vec![ + ("emoji", "🙂🧠🚀".to_string(), "astral-plane characters"), + ("cjk", "会話-識別子-42".to_string(), "3-byte sequences"), + ("rtl", "מזהה-שיחה".to_string(), "RTL text"), + ( + "combining", + "e\u{0301}\u{0327}session".to_string(), + "combining marks after ASCII", + ), + ( + "zero_width", + "sess\u{200b}\u{200d}ion".to_string(), + "zero-width joiners inside the value", + ), + ( + "bom", + "\u{feff}session-1".to_string(), + "a leading byte-order mark", + ), + ( + "surrogate_pair_boundary", + format!("{}{}", "a".repeat(3), '\u{10FFFF}'), + "the last valid scalar value", + ), + ( + "nul_adjacent", + "before\u{0}after".to_string(), + "an embedded NUL", + ), + ("nul_leading", "\u{0}leading".to_string(), "a leading NUL"), + ( + "nul_trailing", + "trailing\u{0}".to_string(), + "a trailing NUL", + ), + ( + "control_chars", + "a\u{1}\u{2}\u{1f}b".to_string(), + "C0 control characters", + ), + ( + "quotes_and_backslash", + "it's a \\ \"test\" -- /* */".to_string(), + "SQL-hostile punctuation in a hashed value", + ), + ( + "newlines", + "line1\nline2\r\nline3\t".to_string(), + "newlines and tabs (NDJSON is line-delimited)", + ), + ]; + for (label, value, note) in unicode_values { + out.push(Group::new( + "com.anthropic.claude_code", + vec![case( + "unicode", + &format!("unicode/session_value/{label}"), + note, + "claude_code.interaction", + vec![s("span.type", "interaction"), s("session.id", &value)], + )], + )); + } + + // Unicode in KEYS: near-misses against the byte screen at multi-byte boundaries. + for (key, note) in [ + ("🌍.emoji.key", "a 4-byte lead byte"), + ("gen_ai.系统", "multi-byte tail on a registry-ish key"), + ("ai.🙂", "multi-byte tail inside a registry prefix"), + ("аi.operationId", "Cyrillic 'а' homoglyph as the first byte"), + ("gen_ai.system\u{0}", "a trailing NUL in the key"), + ("\u{feff}gen_ai.system", "a BOM in front of a registry key"), + ] { + out.push(one( + NEUTRAL_SCOPE, + case( + "unicode", + &format!("unicode/key/{key}"), + note, + "op", + vec![s(key, "v"), s("http.route", "/x")], + ), + )); + } + + // Unicode in the scope name and the span name (real columns on both sides). + out.push(one( + "openinference.instrumentation.agnő", + case( + "unicode", + "unicode/scope_name", + "a multi-byte near miss on a sufficient scope matcher", + "Agent.run", + vec![s("openinference.span.kind", "AGENT")], + ), + )); + out.push(one( + NEUTRAL_SCOPE, + case( + "unicode", + "unicode/span_name", + "a span name that is a unicode near miss of an effect_ai matcher", + "LanguageModel.generateTéxt", + vec![s("telemetry.sdk.name", "@effect/opentelemetry")], + ), + )); + + // The hash is over bytes, not chars: a non-ASCII session-key value. + out.push(Group::new( + "com.anthropic.claude_code", + vec![case( + "unicode", + "unicode/session_value", + "a non-ASCII session-key value", + "claude_code.interaction", + vec![ + s("span.type", "interaction"), + s("session.id", "セッション-1"), + ], + )], + )); + out +} + +/// Oversized values and attribute lists: the never-truncate list for registry keys, +/// and the spill path out of the classifier's inline attribute view. +fn oversized_groups() -> Vec { + let big_value = "x".repeat(64 * 1024); + let big_unicode = "🙂".repeat(4096); + let big_key = format!("spring.ai.{}", "k".repeat(4096)); + let mut filler: Vec = (0..60) + .map(|index| s(&format!("http.request.header.x_{index:03}"), "v")) + .collect(); + filler.push(s("span.type", "interaction")); + filler.push(s("session.id", "sess-wide")); + + // More registry-referenced keys than the classifier's inline view holds. + let mut spilled: Vec = vec![ + s("span.type", "interaction"), + s("session.id", "sess-spill"), + s("user.id", "u-spill"), + s("gen_ai.operation.name", "chat"), + s("gen_ai.system", "spring_ai"), + s("gen_ai.conversation.id", "conv-spill"), + s("gen_ai.request.model", "gpt-4o"), + s("openinference.span.kind", "AGENT"), + s("agno.run.id", "r-spill"), + s("mastra.span.type", "agent_run"), + s("mastra.metadata.runId", "run-spill"), + s("litellm.call_id", "call-spill"), + ]; + spilled.push(s("task_key", "research")); + + vec![ + Group::new( + "com.anthropic.claude_code", + vec![ + case( + "oversized", + "oversized/64kib_session_value", + "a 64 KiB session key value, hashed in full", + "claude_code.interaction", + vec![s("span.type", "interaction"), s("session.id", &big_value)], + ), + case( + "oversized", + "oversized/16kib_unicode_session_value", + "16 Ki astral characters (64 KiB of UTF-8)", + "claude_code.interaction", + vec![s("span.type", "interaction"), s("session.id", &big_unicode)], + ), + case( + "oversized", + "oversized/wide_attribute_list", + "60 non-registry attributes around the two that matter", + "claude_code.interaction", + filler, + ), + case( + "oversized", + "oversized/spilled_registry_keys", + "more registry keys than the inline attribute view holds", + "claude_code.interaction", + spilled, + ), + ], + ), + one( + NEUTRAL_SCOPE, + case( + "oversized", + "oversized/long_key", + "a 4 KiB key inside a registry prefix family", + "op", + vec![s(&big_key, "v")], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "oversized", + "oversized/deep_array", + "a deeply nested array value", + "op", + vec![array( + "llm.messages", + vec![array( + "", + vec![array("", vec![array("", vec![s("", "deep")])])], + )], + )], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "oversized", + "oversized/long_span_name", + "a 4 KiB span name", + &"n".repeat(4096), + vec![s("gen_ai.operation.name", "chat")], + ), + ), + ] +} + +/// Pseudo-keys are real columns on both sides. The interesting cases are span +/// attributes that impersonate one, and the `value_prefix` op (D1), which the current +/// registry never uses — covered here at the canonicalization level so the columns it +/// would read are exercised. +fn pseudo_key_groups() -> Vec { + vec![ + one( + "openinference.instrumentation.agno", + case( + "pseudo_keys", + "pseudo/span_attribute_named_scope_name", + "a span attribute literally called scope.name must not shadow the column", + "Agent.run", + vec![ + s("scope.name", "litellm"), + s("openinference.span.kind", "AGENT"), + ], + ), + ), + one( + NEUTRAL_SCOPE, + case( + "pseudo_keys", + "pseudo/span_attribute_named_span_name", + "a span attribute called span.name against effect_ai's span-name matchers", + "op", + vec![ + s("span.name", "LanguageModel.generateText"), + s("telemetry.sdk.name", "@effect/opentelemetry"), + ], + ), + ), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "pseudo_keys", + "pseudo/effect_ai_span_name_match", + "the real span-name matcher, promoted by the resource candidate", + "Chat.generateText", + vec![s("http.route", "/x")], + )], + ) + .resource(vec![ + s("service.name", "effect-app"), + s("telemetry.sdk.name", "@effect/opentelemetry"), + ]), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "pseudo_keys", + "pseudo/scope_version_and_schema_url", + "scope.version / scope.schema_url carry values (no matcher reads them today)", + "op", + vec![s("gen_ai.operation.name", "chat")], + )], + ) + .scope_version("2.0.0-rc.1+build.7") + .schema_url("https://opentelemetry.io/schemas/1.34.0"), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "pseudo_keys", + "pseudo/empty_scope_version", + "empty scope version and schema url", + "op", + vec![s("openinference.span.kind", "LLM")], + )], + ) + .scope_version(""), + one( + "gen_ai", + case( + "pseudo_keys", + "pseudo/scope_name_eq_is_case_sensitive", + "vercel's insufficient scope matcher, exact match", + "ai.generateText", + vec![s("ai.operationId", "ai.generateText")], + ), + ), + ] +} + +/// Cross-class placement probes: registry keys deliberately put where their matcher's +/// declared class does not look. +/// +/// Both engines are class-directed: a matcher's keys resolve in the one attribute list +/// its class names, and the class-less predicates (unknown-tier fingerprints, session +/// candidates, authority predicates) are span-local. So every span here must classify +/// as if the misplaced key were not there at all. +/// +/// These are the spans that caught the divergence when the Rust side still fell back +/// span → scope → resource for every key: ten of them, plus +/// `not_promoted/langchain_resource` and `typed/bool_false_resource`, were pinned +/// mismatches until 2026-08. They stay in the fixture as the regression surface. +fn cross_class_groups() -> Vec { + vec![ + Group::new( + NEUTRAL_SCOPE, + vec![case( + "cross_class", + "cross_class/resource_key_on_span", + "a resource-class matcher's key carried as a span attribute", + "agent.generate", + vec![s("telemetry.sdk.name", "@mastra/otel-exporter")], + )], + ) + .resource(vec![s("service.name", "app")]), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "cross_class", + "cross_class/resource_key_shadowed_by_span", + "the resource carries the matching value; a span attribute of the same name disagrees", + "agent.generate", + vec![s("telemetry.sdk.name", "@opentelemetry/sdk-node")], + )], + ) + .resource(vec![ + s("service.name", "app"), + s("telemetry.sdk.name", "@mastra/otel-exporter"), + ]), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "cross_class", + "cross_class/attr_prefix_on_resource", + "an attr-class key_prefix family carried on the resource", + "op", + vec![s("http.route", "/x")], + )], + ) + .resource(vec![s("service.name", "app"), s("agno.run.id", "r-1")]), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "cross_class", + "cross_class/attr_key_on_scope", + "an attr-class eq() key carried on the scope", + "op", + vec![s("http.route", "/x")], + )], + ) + .scope_attrs(vec![s("gen_ai.system", "spring_ai")]), + Group::new( + "com.anthropic.claude_code", + vec![case( + "cross_class", + "cross_class/session_key_on_resource", + "the session-candidate key carried on the resource instead of the span", + "claude_code.interaction", + vec![s("span.type", "interaction")], + )], + ) + .resource(vec![s("service.name", "app"), s("session.id", "sess-res")]), + Group::new( + "com.anthropic.claude_code", + vec![case( + "cross_class", + "cross_class/session_key_on_scope", + "the session-candidate key carried on the scope", + "claude_code.interaction", + vec![s("span.type", "interaction")], + )], + ) + .scope_attrs(vec![s("session.id", "sess-scope")]), + Group::new( + "com.anthropic.claude_code", + vec![case( + "cross_class", + "cross_class/authority_key_on_resource", + "the authority predicate's key carried on the resource", + "claude_code.interaction", + vec![s("session.id", "sess-auth-res")], + )], + ) + .resource(vec![s("service.name", "app"), s("span.type", "interaction")]), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "cross_class", + "cross_class/unknown_fingerprint_on_resource", + "an unknown-tier fingerprint key carried on the resource", + "op", + vec![s("http.route", "/x")], + )], + ) + .resource(vec![ + s("service.name", "app"), + s("gen_ai.operation.name", "chat"), + ]), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "cross_class", + "cross_class/unknown_fingerprint_on_scope", + "an unknown-tier fingerprint key carried on the scope", + "op", + vec![s("http.route", "/x")], + )], + ) + .scope_attrs(vec![s("openinference.span.kind", "LLM")]), + Group::new( + NEUTRAL_SCOPE, + vec![case( + "cross_class", + "cross_class/scope_class_key_on_span", + "a scope-class matcher keyed on a real attribute, carried on the span", + "op", + vec![s("http.route", "/x")], + )], + ) + .resource(vec![ + s("service.name", "gateway"), + s("model_id", "gpt-4o-mini"), + ]), + ] +} + +// --------------------------------------------------------------------------- +// generation +// --------------------------------------------------------------------------- + +fn hex(bytes: &[u8]) -> String { + let mut out = String::with_capacity(bytes.len() * 2); + for byte in bytes { + out.push_str(&format!("{byte:02x}")); + } + out +} + +fn id_bytes(counter: u64, len: usize) -> Vec { + let mut out = vec![0u8; len]; + let source = counter.to_be_bytes(); + for (index, slot) in out.iter_mut().enumerate() { + // Deterministic, never all-zero (bytes_hex() renders an all-zero id as ""). + *slot = source[index % source.len()] ^ (0x5a + index as u8); + } + out +} + +/// Runs every group through the real row writer and returns the JSONL body. +fn generate(groups: &[Group]) -> String { + let datasources = DatasourceNames::defaults(); + let mut seen: BTreeSet = BTreeSet::new(); + let mut out = String::new(); + + for (position, group) in groups.iter().enumerate() { + // 1-based, and the only source of trace/span ids: stable ids are what makes the + // artifact byte-reproducible and what the differential joins fixtures back on. + let counter = position as u64 + 1; + let spans: Vec = group + .cases + .iter() + .enumerate() + .map(|(index, case)| Span { + trace_id: id_bytes(counter, 16), + span_id: id_bytes(counter * 1000 + index as u64 + 1, 8), + parent_span_id: Vec::new(), + trace_state: String::new(), + name: case.span_name.clone(), + kind: span::SpanKind::Internal as i32, + start_time_unix_nano: START_NANOS, + end_time_unix_nano: START_NANOS + 1_000_000, + attributes: case.attributes.clone(), + ..Default::default() + }) + .collect(); + + let request = ExportTraceServiceRequest { + resource_spans: vec![ResourceSpans { + resource: Some(Resource { + attributes: group.resource.clone(), + dropped_attributes_count: 0, + entity_refs: Vec::new(), + }), + scope_spans: vec![ScopeSpans { + scope: group.scope.clone(), + spans, + schema_url: group.schema_url.clone(), + }], + schema_url: String::new(), + }], + }; + + let settings = + AiClassificationSettings::at(true, RECEIVE_SECS); + let (frames, stats) = encode_traces( + &datasources, + ORG_ID, + &request, + &SamplingPolicy::default(), + &[], + &settings, + ) + .expect("encode_traces"); + assert_eq!( + stats.rows, + group.cases.len(), + "every span must produce a row" + ); + assert_eq!(stats.ai_spans_examined, stats.rows); + + let payload = String::from_utf8(frames[0].payload.clone()).expect("utf8 rows"); + let rows: Vec<&str> = payload.lines().filter(|line| !line.is_empty()).collect(); + assert_eq!(rows.len(), group.cases.len()); + + // The classifier, called directly, so the raw session-key value (never stored) + // is available for the hash-alignment leg. + let resource_context = ResourceContext::new(registry(), &group.resource); + let scope_context = resource_context.scope(group.scope.as_ref(), &group.schema_url); + + for (case, row_text) in group.cases.iter().zip(rows) { + assert!( + seen.insert(case.id.clone()), + "duplicate fixture id {}", + case.id + ); + let row: Value = serde_json::from_str(row_text).expect("row json"); + let classification = scope_context.classify_span(&case.span_name, &case.attributes); + let vendor = classification.vendor_slug().to_string(); + let state = classification.session_state; + let hash = classification.session_key_hash(); + + // The direct call and the row writer must agree — otherwise the fixture's + // `rust` block would describe a classification the row never carried. + assert_eq!( + row["ai_vendor"].as_str(), + Some(vendor.as_str()), + "{}", + case.id + ); + assert_eq!( + row["ai_session_key_state"].as_u64(), + Some(state as u64), + "{}", + case.id + ); + assert_eq!( + row["ai_session_key_hash"].as_u64(), + Some(hash), + "{}", + case.id + ); + assert_eq!( + row["ai_rules_version"].as_u64(), + Some(registry().version() as u64), + "{}", + case.id + ); + + let session_key = classification.session_key.as_deref(); + if let Some(value) = session_key { + // Third leg of the hash claim: the classifier's own hash is exactly + // cityhash102 over the pinned construction. + assert_eq!( + hash, + crate::cityhash102::city_hash64(value.as_bytes()), + "{}", + case.id + ); + } + + let record = json!({ + "id": case.id, + "category": case.category, + "note": case.note, + "rust": { + "vendor": vendor, + "session_state": state, + // A string: u64 hashes above 2^53 do not survive JSON.parse. + "session_key_hash": hash.to_string(), + "rules_version": registry().version(), + "session_key_hex": session_key.map(|value| hex(value.as_bytes())), + }, + // The exact NDJSON line the writer produced, verbatim. Kept as a string + // so the ClickHouse leg can replay the bytes rather than a re-serialized + // approximation of them. + "row": row_text, + }); + out.push_str(&serde_json::to_string(&record).expect("record json")); + out.push('\n'); + } + } + out +} + +fn fixture_path() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../packages/domain/src/ai-registry/__fixtures__/equivalence-spans.jsonl") +} + +// --------------------------------------------------------------------------- +// tests +// --------------------------------------------------------------------------- + +/// Writes the artifact. Opt-in, because a test that writes into the source tree on +/// every `cargo test` would fight the determinism check it exists to feed. +#[test] +#[ignore = "regeneration: set EQUIVALENCE_FIXTURE_OUT"] +fn write_equivalence_fixture() { + let Some(out) = std::env::var_os("EQUIVALENCE_FIXTURE_OUT") else { + panic!("set EQUIVALENCE_FIXTURE_OUT to the artifact path"); + }; + let body = generate(&groups()); + let path = PathBuf::from(out); + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent).expect("create fixture directory"); + } + std::fs::write(&path, &body).expect("write fixture"); + println!( + "wrote {} spans, {} bytes to {}", + body.lines().count(), + body.len(), + path.display() + ); +} + +/// Regeneration is byte-stable. Skips when the artifact is absent (a fresh checkout of +/// apps/ingest alone still builds), fails loudly when it is present and stale. +#[test] +fn fixture_is_reproducible() { + let path = fixture_path(); + let Ok(checked_in) = std::fs::read_to_string(&path) else { + eprintln!("skipping: {} is not present", path.display()); + return; + }; + let regenerated = generate(&groups()); + if regenerated != checked_in { + let expected: Vec<&str> = checked_in.lines().collect(); + let actual: Vec<&str> = regenerated.lines().collect(); + let first_difference = expected + .iter() + .zip(&actual) + .position(|(left, right)| left != right); + panic!( + "{} is stale ({} lines checked in, {} regenerated, first differing line {:?}). \ + Regenerate with EQUIVALENCE_FIXTURE_OUT= cargo test --lib write_equivalence_fixture -- --ignored", + path.display(), + expected.len(), + actual.len(), + first_difference + ); + } +} + +/// Composition guard: every branch the plan's §6 fuzz surface names must be present, +/// so a future edit cannot quietly shrink the corpus. +#[test] +fn fixture_covers_every_branch() { + let body = generate(&groups()); + let mut categories: BTreeMap = BTreeMap::new(); + let mut vendors: BTreeSet = BTreeSet::new(); + let mut states: BTreeSet = BTreeSet::new(); + for line in body.lines() { + let record: Value = serde_json::from_str(line).expect("record"); + *categories + .entry(record["category"].as_str().expect("category").to_string()) + .or_default() += 1; + vendors.insert( + record["rust"]["vendor"] + .as_str() + .expect("vendor") + .to_string(), + ); + states.insert(record["rust"]["session_state"].as_u64().expect("state")); + } + + for category in [ + "resolution/sufficient_scope", + "resolution/insufficient_promoted", + "resolution/insufficient_not_promoted", + "resolution/attr_only", + "resolution/cross_vendor", + "resolution/unknown_tier", + "resolution/non_ai", + "values/typed", + "values/present_empty", + "keys/duplicate", + "keys/near_miss", + "unicode", + "oversized", + "pseudo_keys", + "cross_class", + ] { + assert!( + categories.contains_key(category), + "missing category {category}" + ); + } + // Every session-key state, 0..=6. + assert_eq!( + states, + (0..=6u64).collect::>(), + "states covered" + ); + // Every vendor in the registry classifies at least one fixture span. + for vendor in registry().vendors() { + assert!( + vendors.contains(vendor.slug()), + "no fixture span classifies as {}", + vendor.slug() + ); + } + assert!( + body.lines().count() >= 250, + "corpus is too small to be adversarial" + ); + assert!(body.len() < 1_000_000, "artifact must stay under ~1 MB"); +} + +// --------------------------------------------------------------------------- +// full-corpus replay (local only) +// --------------------------------------------------------------------------- + +/// Emits row+verdict JSONL for every span in the trace-capture corpus, through the same +/// real row writer. Local-only: the corpus is a sibling repo, not a vendored fixture. +/// +/// ```sh +/// TRACE_CAPTURE_DIR=~/Documents/repos/trace-capture \ +/// CORPUS_EQUIVALENCE_OUT=/tmp/corpus-equivalence.jsonl \ +/// cargo test -p maple-ingest --lib write_corpus_equivalence_fixture -- --ignored --nocapture +/// ``` +#[test] +#[ignore = "corpus replay: set TRACE_CAPTURE_DIR and CORPUS_EQUIVALENCE_OUT"] +fn write_corpus_equivalence_fixture() { + let root = PathBuf::from(std::env::var_os("TRACE_CAPTURE_DIR").expect("set TRACE_CAPTURE_DIR")); + let out = PathBuf::from( + std::env::var_os("CORPUS_EQUIVALENCE_OUT").expect("set CORPUS_EQUIVALENCE_OUT"), + ); + let captures = root.join("captures"); + assert!(captures.is_dir(), "no captures/ under {}", root.display()); + + let datasources = DatasourceNames::defaults(); + let settings = AiClassificationSettings::at(true, RECEIVE_SECS); + let mut file = std::io::BufWriter::new(File::create(&out).expect("create corpus fixture")); + let mut directories: Vec = std::fs::read_dir(&captures) + .expect("read captures") + .filter_map(|entry| entry.ok().map(|entry| entry.path())) + .filter(|path| path.is_dir()) + .collect(); + directories.sort(); + + let mut total = 0usize; + for directory in directories { + let name = directory + .file_name() + .map(|name| name.to_string_lossy().into_owned()) + .unwrap_or_default(); + let Ok(records) = std::fs::read_to_string(directory.join("records.jsonl")) else { + continue; + }; + for (sequence, line) in records.lines().enumerate() { + if line.trim().is_empty() { + continue; + } + let record: Value = serde_json::from_str(line).expect("record json"); + if record.get("signal").and_then(Value::as_str) != Some("traces") { + continue; + } + let Some(mut body) = record.get("body").cloned().filter(|body| !body.is_null()) else { + continue; + }; + crate::otlp_json::normalize(&mut body, "resourceSpans"); + let request: ExportTraceServiceRequest = + serde_json::from_value(body).expect("OTLP/JSON decodes"); + let (frames, _) = encode_traces( + &datasources, + ORG_ID, + &request, + &SamplingPolicy::default(), + &[], + &settings, + ) + .expect("encode_traces"); + for frame in &frames { + let payload = String::from_utf8(frame.payload.clone()).expect("utf8 rows"); + for (index, row_text) in payload.lines().filter(|l| !l.is_empty()).enumerate() { + let record = json!({ + "id": format!("{name}/{sequence}/{index}"), + "category": "corpus", + "capture": name, + "row": row_text, + }); + writeln!(file, "{}", serde_json::to_string(&record).expect("record")) + .expect("write row"); + total += 1; + } + } + } + } + file.flush().expect("flush"); + println!("wrote {total} corpus spans to {}", out.display()); +} diff --git a/apps/ingest/src/telemetry.rs b/apps/ingest/src/telemetry.rs index a3330e1c1..abbd0ed0d 100644 --- a/apps/ingest/src/telemetry.rs +++ b/apps/ingest/src/telemetry.rs @@ -3132,6 +3132,12 @@ fn count_log_rows(request: &ExportLogsServiceRequest) -> usize { .sum() } +/// Rust↔SQL equivalence fixtures. A child of this module, not of `tests`, because it +/// drives [`encode_traces`] — the real row writer — and that is private here. +#[cfg(test)] +#[path = "ai_equivalence_fixtures.rs"] +mod ai_equivalence_fixtures; + #[cfg(test)] mod tests { use super::*; diff --git a/packages/domain/src/ai-registry/__fixtures__/README.md b/packages/domain/src/ai-registry/__fixtures__/README.md new file mode 100644 index 000000000..0a44c8751 --- /dev/null +++ b/packages/domain/src/ai-registry/__fixtures__/README.md @@ -0,0 +1,158 @@ +# `equivalence-spans.jsonl` + +Adversarial spans, driven through **the real ingest row writer**, for the Rust↔SQL +equivalence suites in this directory. + +## The claim + +For any span, the SQL compiled from `registry.json` (`../compile-sql.ts`) evaluated over +the row ingest _actually wrote_ must produce the same `AiVendor` and `AiSessionKeyState` as +the Rust classifier that wrote it, and `AiSessionKeyHash` must be exactly +`cityHash64(value)` as ClickHouse computes it. + +Each line is one span: + +```jsonc +{ + "id": "session/spring/state6", // unique, stable across regenerations + "category": "session/spring_ai", // fuzz-surface bucket (see below) + "note": "resolved", + "rust": { + "vendor": "spring_ai", + "session_state": 6, + "session_key_hash": "10836…", // a decimal STRING: UInt64 > 2^53 + "rules_version": 1, + "session_key_hex": "636f6e762d3432", // raw winning key, or null below state 5 + }, + "row": "{\"start_time\":…}", // the exact NDJSON line the writer produced +} +``` + +`row` is the writer's bytes verbatim, kept as a string. The suites replay it unmodified +through the same generated INSERT statement ingest uses — re-serialising a parsed row would +corrupt `ai_session_key_hash` on the way through `JSON.parse`. Because `row` already carries +the Rust verdict in `ai_vendor` / `ai_session_key_state`, the differential needs no join +key: it is `WHERE computed != stored` over a real `traces` table. + +## Regeneration + +The generator is `apps/ingest/src/ai_equivalence_fixtures.rs`. It builds each span, runs it +through `encode_traces` — the same function the ingest request path calls — with the +classification flag on, and serialises the row the writer produced. + +```sh +cd apps/ingest +EQUIVALENCE_FIXTURE_OUT=../../packages/domain/src/ai-registry/__fixtures__/equivalence-spans.jsonl \ + cargo test --lib write_equivalence_fixture -- --ignored --nocapture +``` + +Regenerate after any change to `registry.json`, to the classifier, or to the row writer's +canonicalization. `cargo test --lib fixture_is_reproducible` fails when the checked-in +artifact is stale; `fixture_covers_every_branch` fails when a category, a session-key state +or a vendor stops being represented. + +**Determinism.** No clock, no RNG, no environment: receive time and span start times are the +constant `1700000000`, trace/span ids come from a fixed counter, and every value is a +literal. Regeneration is byte-stable, which is what makes the staleness check meaningful. +The artifact is ~630 KB and must stay under 1 MB (asserted). + +## Corpus composition + +316 spans. Categories: + +| category | spans | what it exercises | +| -------------------------------------- | ----- | --------------------------------------------------------------------------------- | +| `resolution/sufficient_scope` | 50 | every sufficient scope matcher, plus a second span under the same hoisted scope | +| `resolution/attr_only` | 33 | every attr-class matcher alone under an unclaimed scope | +| `resolution/insufficient_promoted` | 8 | insufficient resource/scope candidates promoted by a same-vendor attr hit | +| `resolution/insufficient_not_promoted` | 8 | the same evidence with nothing to promote it | +| `resolution/cross_vendor` | 6 | two vendors' evidence on one span; the global priority bands decide | +| `resolution/unknown_tier` | 8 | each fingerprint, bucket ordering, and the `input.value` co-occurrence gate | +| `resolution/non_ai` | 6 | HTTP/DB spans, no attributes, no scope, no resource | +| `session/*` (18 vendors) | 71 | the state ladder 1–6, decoy values, `max` over disjoint candidate populations | +| `values/typed` | 17 | int/double/bool/bytes/array/kvlist/`None` canonicalization, incl. as session keys | +| `values/present_empty` | 9 | present-but-empty vs absent (states 4 vs 3), empty keys, empty authority values | +| `keys/duplicate` | 12 | registry keys first-occurrence-wins, non-registry keys last-wins, both orders | +| `keys/near_miss` | 48 | keys/scopes sharing a first byte and length with a registry key or prefix | +| `unicode` | 22 | astral planes, combining marks, BOM, embedded NUL, RTL, CJK, non-ASCII key values | +| `oversized` | 7 | 64 KiB values, 4 KiB keys and span names, 60-attribute spans, inline-view spill | +| `pseudo_keys` | 6 | span attributes impersonating `scope.name`/`span.name`, empty/populated versions | +| `cross_class` | 10 | registry keys carried where their matcher's class does not look — all non-hits | + +All 21 registry vendors and all three `unknown:*` buckets classify at least one span; all +seven session-key states (0–6) are represented; 64 spans resolve a session key and become +hash-alignment vectors. + +## What this proves — and what it does not + +**Rust↔SQL only.** trace-capture's reference evaluator (`scripts/verify-seed.ts`) is a third +implementation of the same algebra and is deliberately _not_ in this loop: it renders kvlist +values in insertion order and `JSON.stringify`s byte values, where the row writer's +`any_value_string` sorts kvlist keys (the row Map is a `serde_json::Map`) and hex-encodes +bytes. That divergence cannot affect these suites — the SQL reads the string the row writer +already produced — but "the fixture agrees with the seed verifier" is not a claim made here. + +**`value_prefix` has no registry rule.** The registry currently contains zero `value_prefix` +matchers, so no vendor branch exercises the operator. `equivalence.clickhouse.e2e.test.ts` +covers it directly instead: it compiles the predicate against all four pseudo-keys and +compares ClickHouse's `startsWith` against the byte compare Rust performs on the same column +value, over every fixture row. + +## Suites + +| file | gate | +| ---------------------------------------------- | ----------------------------------------------------------------------------------------------- | +| `../equivalence.clickhouse.e2e.test.ts` | the synthetic differential, present-but-empty, dedup, `value_prefix` | +| `../hash-alignment.clickhouse.e2e.test.ts` | `cityHash64(value)` vs the stored hash, incl. the multi-argument negative pin | +| `../corpus-equivalence.clickhouse.e2e.test.ts` | the same differential over the whole capture corpus | + +```sh +bun ch:up +CLICKHOUSE_E2E=1 bun run --cwd packages/domain test -- clickhouse.e2e +``` + +### Full-corpus gate (local, on demand) + +The trace-capture corpus is a sibling repo, not a vendored fixture, and its replay artifact +is ~150 MB — never checked in. Two commands: + +```sh +# 1. emit rows + verdicts from the real writer +cd apps/ingest +TRACE_CAPTURE_DIR=~/Documents/repos/trace-capture \ +CORPUS_EQUIVALENCE_OUT=/tmp/corpus-equivalence.jsonl \ + cargo test --lib write_corpus_equivalence_fixture -- --ignored --nocapture + +# 2. replay them into ClickHouse and compare +CLICKHOUSE_E2E=1 CORPUS_EQUIVALENCE_FIXTURES=/tmp/corpus-equivalence.jsonl \ + bun run --cwd packages/domain test -- corpus-equivalence.clickhouse.e2e +``` + +Last run (2026-08-11, registry version 1, after the class-directed fix below): **10,091 spans +across 57 captures, 0 mismatches** — 5,921 classified spans over 23 distinct vendors and all +seven session-key states, span for span the same verdicts as before the fix. + +## Findings + +`PINNED_DIVERGENCES` in `../equivalence.clickhouse.e2e.test.ts` is **empty**: all 316 spans +agree. It was not always — twelve were pinned until 2026-08-11 under two findings that were +one root cause, and both are now fixed in the Rust classifier rather than pinned: + +- **F1 — cross-class lookup.** Rust resolved a predicate's key span → scope → resource for + _every_ matcher class, and took `key_prefix` evidence from the union of all three + attribute lists, where the compiled SQL targets one map per matcher class. Ten fixture + spans, engineered to carry a registry key where its class does not look, disagreed — in + both directions, because Rust also let a span attribute veto a hoisted resource `eq` hit + that SQL still saw. +- **F2 — prefix-family self-promotion.** `langsmith.internal_provider` is langchain's + _insufficient_ resource matcher key and also lies inside langchain's `attr`-class + `key_prefix(langsmith.)` family. Via F1 the resource key satisfied that attr matcher, + which promotes, so a process that set the attribute on its **resource** had every span — + plain HTTP included, and even with the value `'false'` — classified `langchain` by Rust. + That defeated the plan's sufficiency gate on realistic, wire-observed input. + +`apps/ingest/src/ai_classifier.rs` is now class-directed, mirroring `targetForClass`; the +span → scope → resource fallback survives only in trace-capture's single-seed +`scripts/verify-seed.ts`. The corpus never distinguished the two rules (its 10,091 spans +classify identically either way), so no golden moved. The twelve spans stay in the fixture +as the regression surface. diff --git a/packages/domain/src/ai-registry/__fixtures__/equivalence-spans.jsonl b/packages/domain/src/ai-registry/__fixtures__/equivalence-spans.jsonl new file mode 100644 index 000000000..1404f2c63 --- /dev/null +++ b/packages/domain/src/ai-registry/__fixtures__/equivalence-spans.jsonl @@ -0,0 +1,316 @@ +{"category":"resolution/sufficient_scope","id":"sufficient_scope/agno/0","note":"sufficient scope matcher for agno, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f6388\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60606263646566676868\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"agno"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/agno/0","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f638b\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60606263646566676868\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"agno"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/claude_agent_sdk/1","note":"sufficient scope matcher for claude_agent_sdk, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code.tracing\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f67b0\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6063626364656667686b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"claude_agent_sdk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/claude_agent_sdk/1","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code.tracing\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f67b3\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6063626364656667686b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"claude_agent_sdk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/claude_agent_sdk/2","note":"sufficient scope matcher for claude_agent_sdk, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code.events\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f6bd8\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6062626364656667686a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"claude_agent_sdk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/claude_agent_sdk/2","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code.events\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f6bdb\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6062626364656667686a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"claude_agent_sdk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/claude_agent_sdk/3","note":"sufficient scope matcher for claude_agent_sdk, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f6fc0\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6065626364656667686d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"claude_agent_sdk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/claude_agent_sdk/3","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f6fc3\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6065626364656667686d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"claude_agent_sdk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/crewai/4","note":"sufficient scope matcher for crewai, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.crewai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f73e8\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6064626364656667686c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"crewai"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/crewai/4","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.crewai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f73eb\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6064626364656667686c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"crewai"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/crewai/5","note":"sufficient scope matcher for crewai, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"crewai.telemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f7710\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6067626364656667686f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"crewai"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/crewai/5","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"crewai.telemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f7713\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6067626364656667686f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"crewai"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/dspy/6","note":"sufficient scope matcher for dspy, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"dspy\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.dspy\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f7b38\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6066626364656667686e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"dspy"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/dspy/6","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"dspy\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.dspy\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f7b3b\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6066626364656667686e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"dspy"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/flue/7","note":"sufficient scope matcher for flue, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"flue\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@flue/opentelemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f7f20\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60696263646566676861\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"flue"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/flue/7","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"flue\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@flue/opentelemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f7f23\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60696263646566676861\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"flue"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/google_adk/8","note":"sufficient scope matcher for google_adk, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gcp.vertex.agent\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f4348\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60686263646566676860\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"google_adk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/google_adk/8","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gcp.vertex.agent\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f434b\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60686263646566676860\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"google_adk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/haystack/9","note":"sufficient scope matcher for haystack, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"haystack\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"haystack\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f4770\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606b6263646566676863\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"haystack"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/haystack/9","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"haystack\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"haystack\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f4773\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606b6263646566676863\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"haystack"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/langchain/10","note":"sufficient scope matcher for langchain, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"langchain\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"langsmith\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f4a98\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606a6263646566676862\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"langchain"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/langchain/10","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"langchain\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"langsmith\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f4a9b\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606a6263646566676862\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"langchain"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/litellm/11","note":"sufficient scope matcher for litellm, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"litellm\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"litellm\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f4e80\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606d6263646566676865\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"litellm"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/litellm/11","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"litellm\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"litellm\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f4e83\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606d6263646566676865\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"litellm"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/llamaindex/12","note":"sufficient scope matcher for llamaindex, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"llamaindex\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"llamaindex.opentelemetry.tracer\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f52a8\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606c6263646566676864\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"llamaindex"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/llamaindex/12","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"llamaindex\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"llamaindex.opentelemetry.tracer\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f52ab\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606c6263646566676864\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"llamaindex"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/mastra/13","note":"sufficient scope matcher for mastra, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@mastra/otel-exporter\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f56d0\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606f6263646566676867\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"mastra"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/mastra/13","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@mastra/otel-exporter\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f56d3\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606f6263646566676867\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"mastra"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/microsoft_agent_framework/14","note":"sufficient scope matcher for microsoft_agent_framework, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"agent_framework\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f5af8\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606e6263646566676866\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"microsoft_agent_framework"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/microsoft_agent_framework/14","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"agent_framework\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f5afb\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f606e6263646566676866\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"microsoft_agent_framework"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/openai_agents_sdk/15","note":"sufficient scope matcher for openai_agents_sdk, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"openai_agents_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.openai_agents\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f5ee0\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60716263646566676879\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"openai_agents_sdk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/openai_agents_sdk/15","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"openai_agents_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.openai_agents\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f5ee3\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60716263646566676879\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"openai_agents_sdk"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/openinference-openai/16","note":"sufficient scope matcher for openinference-openai, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"openinference-openai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.openai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f2208\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60706263646566676878\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"openinference-openai"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/openinference-openai/16","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"openinference-openai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.openai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f220b\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60706263646566676878\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"openinference-openai"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/pydantic_ai/17","note":"sufficient scope matcher for pydantic_ai, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"pydantic_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"pydantic-ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f2630\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6073626364656667687b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"pydantic_ai"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/pydantic_ai/17","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"pydantic_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"pydantic-ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f2633\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6073626364656667687b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"pydantic_ai"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/semantic_kernel/18","note":"sufficient scope matcher for semantic_kernel, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"semantic_kernel.utils.telemetry.agent_diagnostics.decorators\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f2a58\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6072626364656667687a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/semantic_kernel/18","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"semantic_kernel.utils.telemetry.agent_diagnostics.decorators\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f2a5b\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6072626364656667687a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/semantic_kernel/19","note":"sufficient scope matcher for semantic_kernel, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"semantic_kernel.utils.telemetry.model_diagnostics.decorators\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f2e40\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6075626364656667687d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/semantic_kernel/19","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"semantic_kernel.utils.telemetry.model_diagnostics.decorators\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f2e43\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6075626364656667687d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/semantic_kernel/20","note":"sufficient scope matcher for semantic_kernel, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"semantic_kernel.functions.kernel_function\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f3268\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6074626364656667687c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/semantic_kernel/20","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"semantic_kernel.functions.kernel_function\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f326b\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6074626364656667687c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/semantic_kernel/21","note":"sufficient scope matcher for semantic_kernel, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"semantic_kernel.connectors.ai.chat_completion_client_base\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f3590\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6077626364656667687f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/semantic_kernel/21","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"semantic_kernel.connectors.ai.chat_completion_client_base\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f3593\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6077626364656667687f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/semantic_kernel/22","note":"sufficient scope matcher for semantic_kernel, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"agent_runtime InProcessRuntime\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f39b8\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6076626364656667687e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/semantic_kernel/22","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"agent_runtime InProcessRuntime\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f39bb\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6076626364656667687e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/smolagents/23","note":"sufficient scope matcher for smolagents, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"smolagents\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.smolagents\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f3da0\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60796263646566676871\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"smolagents"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/smolagents/23","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"smolagents\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.smolagents\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f3da3\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60796263646566676871\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"smolagents"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope/strands/24","note":"sufficient scope matcher for strands, no AI attribute at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"strands\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"strands.telemetry.tracer\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5f01c8\",\"span_kind\":\"Internal\",\"span_name\":\"operation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60786263646566676870\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"strands"}} +{"category":"resolution/sufficient_scope","id":"sufficient_scope_hoisted/strands/24","note":"second span under the same hoisted scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"strands\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"strands.telemetry.tracer\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5f01cb\",\"span_kind\":\"Internal\",\"span_name\":\"operation.two\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60786263646566676870\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"strands"}} +{"category":"resolution/insufficient_promoted","id":"promoted/spring_ai_scope","note":"insufficient resource/scope candidate promoted by a same-vendor hit","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"spring-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"org.springframework.boot\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"spring-app\",\"span_attributes\":{\"http.route\":\"/api\",\"spring.ai.kind\":\"chat_client\"},\"span_id\":\"5a5b5c5d5e5f05f0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f607b6263646566676873\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"spring_ai"}} +{"category":"resolution/insufficient_not_promoted","id":"not_promoted/spring_ai_scope","note":"same insufficient evidence with nothing to promote it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"spring-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"org.springframework.boot\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"spring-app\",\"span_attributes\":{\"http.request.method\":\"POST\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5f0918\",\"span_kind\":\"Internal\",\"span_name\":\"POST\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f607a6263646566676872\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/insufficient_promoted","id":"promoted/vercel_scope_ai","note":"insufficient resource/scope candidate promoted by a same-vendor hit","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"next-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"next-app\",\"span_attributes\":{\"ai.operationId\":\"ai.generateText\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5f0d00\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f607d6263646566676875\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"resolution/insufficient_not_promoted","id":"not_promoted/vercel_scope_ai","note":"same insufficient evidence with nothing to promote it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"next-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"next-app\",\"span_attributes\":{\"http.request.method\":\"POST\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5f1128\",\"span_kind\":\"Internal\",\"span_name\":\"POST\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f607c6263646566676874\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/insufficient_promoted","id":"promoted/vercel_scope_gen_ai","note":"insufficient resource/scope candidate promoted by a same-vendor hit","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"next-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gen_ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"next-app\",\"span_attributes\":{\"gen_ai.operation.name\":\"agent_step\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5f1550\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f607f6263646566676877\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"resolution/insufficient_not_promoted","id":"not_promoted/vercel_scope_gen_ai","note":"same insufficient evidence with nothing to promote it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"next-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gen_ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"next-app\",\"span_attributes\":{\"http.request.method\":\"POST\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5f1978\",\"span_kind\":\"Internal\",\"span_name\":\"POST\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f607e6263646566676876\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/insufficient_promoted","id":"promoted/claude_resource","note":"insufficient resource/scope candidate promoted by a same-vendor hit","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"claude-code\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"claude-code\",\"span_attributes\":{\"http.route\":\"/api\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5f1d60\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60416263646566676849\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"claude_agent_sdk"}} +{"category":"resolution/insufficient_not_promoted","id":"not_promoted/claude_resource","note":"same insufficient evidence with nothing to promote it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"claude-code\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"claude-code\",\"span_attributes\":{\"http.request.method\":\"POST\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5fe088\",\"span_kind\":\"Internal\",\"span_name\":\"POST\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60406263646566676848\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/insufficient_promoted","id":"promoted/litellm_resource","note":"insufficient resource/scope candidate promoted by a same-vendor hit","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"litellm\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"model_id\":\"gpt-4o-mini\",\"service.name\":\"gateway\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"gateway\",\"span_attributes\":{\"http.route\":\"/api\",\"litellm.call_id\":\"call-1\"},\"span_id\":\"5a5b5c5d5e5fe4b0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6043626364656667684b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"litellm"}} +{"category":"resolution/insufficient_not_promoted","id":"not_promoted/litellm_resource","note":"same insufficient evidence with nothing to promote it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"model_id\":\"gpt-4o-mini\",\"service.name\":\"gateway\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"gateway\",\"span_attributes\":{\"http.request.method\":\"POST\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5fe8d8\",\"span_kind\":\"Internal\",\"span_name\":\"POST\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6042626364656667684a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/insufficient_promoted","id":"promoted/llamaindex_resource","note":"insufficient resource/scope candidate promoted by a same-vendor hit","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":17391958930642725075,\"ai_session_key_state\":5,\"ai_vendor\":\"llamaindex\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"llamaindex.opentelemetry\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"llamaindex.opentelemetry\",\"span_attributes\":{\"http.route\":\"/api\",\"llamaindex.run_id\":\"run-1\"},\"span_id\":\"5a5b5c5d5e5fecc0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6045626364656667684d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"17391958930642725075","session_key_hex":"72756e2d31","session_state":5,"vendor":"llamaindex"}} +{"category":"resolution/insufficient_not_promoted","id":"not_promoted/llamaindex_resource","note":"same insufficient evidence with nothing to promote it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"llamaindex.opentelemetry\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"llamaindex.opentelemetry\",\"span_attributes\":{\"http.request.method\":\"POST\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5ff0e8\",\"span_kind\":\"Internal\",\"span_name\":\"POST\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6044626364656667684c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/insufficient_promoted","id":"promoted/langchain_resource","note":"insufficient resource/scope candidate promoted by a same-vendor hit","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"langchain\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"langsmith.internal_provider\":\"true\",\"service.name\":\"langgraph-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"langgraph-app\",\"span_attributes\":{\"http.route\":\"/api\",\"langsmith.trace.name\":\"chain\"},\"span_id\":\"5a5b5c5d5e5ff410\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6047626364656667684f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"langchain"}} +{"category":"resolution/insufficient_not_promoted","id":"not_promoted/langchain_resource","note":"same insufficient evidence with nothing to promote it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"langsmith.internal_provider\":\"true\",\"service.name\":\"langgraph-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"langgraph-app\",\"span_attributes\":{\"http.request.method\":\"POST\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5ff838\",\"span_kind\":\"Internal\",\"span_name\":\"POST\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6046626364656667684e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/insufficient_promoted","id":"promoted/effect_ai_resource","note":"insufficient resource/scope candidate promoted by a same-vendor hit","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"effect_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"effect-app\",\"telemetry.sdk.name\":\"@effect/opentelemetry\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"effect-app\",\"span_attributes\":{\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5ffc20\",\"span_kind\":\"Internal\",\"span_name\":\"LanguageModel.generateText\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60496263646566676841\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"effect_ai"}} +{"category":"resolution/insufficient_not_promoted","id":"not_promoted/effect_ai_resource","note":"same insufficient evidence with nothing to promote it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"effect-app\",\"telemetry.sdk.name\":\"@effect/opentelemetry\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"effect-app\",\"span_attributes\":{\"http.request.method\":\"POST\",\"http.route\":\"/api\"},\"span_id\":\"5a5b5c5d5e5fc048\",\"span_kind\":\"Internal\",\"span_name\":\"POST\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60486263646566676840\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/attr_only","id":"attr_only/agno","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agno.run.id\":\"r-1\"},\"span_id\":\"5a5b5c5d5e5fc470\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f604b6263646566676843\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"agno"}} +{"category":"resolution/attr_only","id":"attr_only/claude_agent_sdk","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"span.type\":\"tool.execution\"},\"span_id\":\"5a5b5c5d5e5fc798\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f604a6263646566676842\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"claude_agent_sdk"}} +{"category":"resolution/attr_only","id":"attr_only/crewai","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"crew_key\":\"k\"},\"span_id\":\"5a5b5c5d5e5fcb80\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f604d6263646566676845\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"crewai"}} +{"category":"resolution/attr_only","id":"attr_only/crewai_task_key","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"task_key\":\"research\"},\"span_id\":\"5a5b5c5d5e5fcfa8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f604c6263646566676844\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"crewai"}} +{"category":"resolution/attr_only","id":"attr_only/crewai_tool_result","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"tool.result_as_answer\":\"false\"},\"span_id\":\"5a5b5c5d5e5fd3d0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f604f6263646566676847\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"crewai"}} +{"category":"resolution/attr_only","id":"attr_only/crewai_flow","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flow_name\":\"f\"},\"span_id\":\"5a5b5c5d5e5fd7f8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f604e6263646566676846\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"crewai"}} +{"category":"resolution/attr_only","id":"attr_only/crewai_flow_node","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flow.node.id\":\"n\"},\"span_id\":\"5a5b5c5d5e5fdbe0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60516263646566676859\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"crewai"}} +{"category":"resolution/attr_only","id":"attr_only/flue","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"flue\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flue.operation.kind\":\"tool\"},\"span_id\":\"5a5b5c5d5e5fdf08\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60506263646566676858\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"flue"}} +{"category":"resolution/attr_only","id":"attr_only/google_adk_prefix","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gcp.vertex.agent.invocation_id\":\"i-1\"},\"span_id\":\"5a5b5c5d5e5fa330\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6053626364656667685b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"google_adk"}} +{"category":"resolution/attr_only","id":"attr_only/google_adk_system","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"gcp.vertex.agent\"},\"span_id\":\"5a5b5c5d5e5fa758\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6052626364656667685a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"google_adk"}} +{"category":"resolution/attr_only","id":"attr_only/haystack","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"haystack\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"haystack.component.name\":\"retriever\"},\"span_id\":\"5a5b5c5d5e5fab40\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6055626364656667685d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"haystack"}} +{"category":"resolution/attr_only","id":"attr_only/langchain_prefix","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":2953009462557476175,\"ai_session_key_state\":6,\"ai_vendor\":\"langchain\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"langsmith.metadata.thread_id\":\"t-1\"},\"span_id\":\"5a5b5c5d5e5faf68\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6054626364656667685c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"2953009462557476175","session_key_hex":"742d31","session_state":6,"vendor":"langchain"}} +{"category":"resolution/attr_only","id":"attr_only/langchain_system","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"langchain\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"langchain\"},\"span_id\":\"5a5b5c5d5e5fb290\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6057626364656667685f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"langchain"}} +{"category":"resolution/attr_only","id":"attr_only/litellm","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"litellm\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"litellm.call_id\":\"c-1\"},\"span_id\":\"5a5b5c5d5e5fb6b8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6056626364656667685e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"litellm"}} +{"category":"resolution/attr_only","id":"attr_only/llamaindex","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"llamaindex\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"llamaindex.span.kind\":\"query\"},\"span_id\":\"5a5b5c5d5e5fbaa0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60596263646566676851\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"llamaindex"}} +{"category":"resolution/attr_only","id":"attr_only/mastra","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"mastra.span.type\":\"agent_run\"},\"span_id\":\"5a5b5c5d5e5fbec8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60586263646566676850\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"mastra"}} +{"category":"resolution/attr_only","id":"attr_only/microsoft_provider","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.provider.name\":\"microsoft.agent_framework\"},\"span_id\":\"5a5b5c5d5e5f82f0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f605b6263646566676853\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"microsoft_agent_framework"}} +{"category":"resolution/attr_only","id":"attr_only/microsoft_prefix","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agent_framework.run.id\":\"r\"},\"span_id\":\"5a5b5c5d5e5f8618\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f605a6263646566676852\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"microsoft_agent_framework"}} +{"category":"resolution/attr_only","id":"attr_only/microsoft_executor","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"executor.id\":\"e\"},\"span_id\":\"5a5b5c5d5e5f8a00\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f605d6263646566676855\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"microsoft_agent_framework"}} +{"category":"resolution/attr_only","id":"attr_only/microsoft_edge_group","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"edge_group.type\":\"fan_out\"},\"span_id\":\"5a5b5c5d5e5f8e28\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f605c6263646566676854\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"microsoft_agent_framework"}} +{"category":"resolution/attr_only","id":"attr_only/pydantic_ai","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"pydantic_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"pydantic_ai.all_messages\":\"[]\"},\"span_id\":\"5a5b5c5d5e5f9250\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f605f6263646566676857\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"pydantic_ai"}} +{"category":"resolution/attr_only","id":"attr_only/pydantic_ai_usage","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"pydantic_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.aggregated_usage.input_tokens\":\"12\"},\"span_id\":\"5a5b5c5d5e5f9678\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f605e6263646566676856\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"pydantic_ai"}} +{"category":"resolution/attr_only","id":"attr_only/semantic_kernel_prefix","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"sk.function.name\":\"f\"},\"span_id\":\"5a5b5c5d5e5f9a60\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60216263646566676829\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/attr_only","id":"attr_only/semantic_kernel_streaming","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"chat.streaming_completions\"},\"span_id\":\"5a5b5c5d5e5f9d88\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60206263646566676828\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"resolution/attr_only","id":"attr_only/smolagents","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"smolagents\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"smolagents.max_steps\":\"10\"},\"span_id\":\"5a5b5c5d5e5e61b0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6023626364656667682b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"smolagents"}} +{"category":"resolution/attr_only","id":"attr_only/spring_ai_prefix","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"spring.ai.kind\":\"chat_client\"},\"span_id\":\"5a5b5c5d5e5e65d8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6022626364656667682a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"spring_ai"}} +{"category":"resolution/attr_only","id":"attr_only/spring_ai_system","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"spring_ai\"},\"span_id\":\"5a5b5c5d5e5e69c0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6025626364656667682d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"spring_ai"}} +{"category":"resolution/attr_only","id":"attr_only/strands_system","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"strands\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"strands-agents\"},\"span_id\":\"5a5b5c5d5e5e6de8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6024626364656667682c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"strands"}} +{"category":"resolution/attr_only","id":"attr_only/strands_provider","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"strands\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.provider.name\":\"strands-agents\"},\"span_id\":\"5a5b5c5d5e5e7110\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6027626364656667682f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"strands"}} +{"category":"resolution/attr_only","id":"attr_only/strands_event_loop","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"strands\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"event_loop.cycle_id\":\"c\"},\"span_id\":\"5a5b5c5d5e5e7538\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6026626364656667682e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"strands"}} +{"category":"resolution/attr_only","id":"attr_only/vercel_prefix","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"ai.operationId\":\"ai.generateText\"},\"span_id\":\"5a5b5c5d5e5e7920\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60296263646566676821\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"resolution/attr_only","id":"attr_only/vercel_execute_tool","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.execute_tool.duration\":\"1\"},\"span_id\":\"5a5b5c5d5e5e7d48\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60286263646566676820\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"resolution/attr_only","id":"attr_only/vercel_agent_step","note":"attr-class matcher alone under an unclaimed scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"agent_step\"},\"span_id\":\"5a5b5c5d5e5e4170\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f602b6263646566676823\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"resolution/cross_vendor","id":"cross_vendor/openai_scope_vs_crewai_attr","note":"sufficient scope (band 3xxxx) outranks another vendor's attr hit (2xxxx)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"openinference-openai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.openai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"LLM\",\"task_key\":\"research\"},\"span_id\":\"5a5b5c5d5e5e4498\",\"span_kind\":\"Internal\",\"span_name\":\"ChatCompletion\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f602a6263646566676822\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"openinference-openai"}} +{"category":"resolution/cross_vendor","id":"cross_vendor/mastra_resource_vs_agno_attr","note":"sufficient *resource* matcher outranks an attr hit","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"mastra-app\",\"telemetry.sdk.name\":\"@mastra/otel-exporter\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"mastra-app\",\"span_attributes\":{\"agno.run.id\":\"r-1\"},\"span_id\":\"5a5b5c5d5e5e4880\",\"span_kind\":\"Internal\",\"span_name\":\"agent.generate\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f602d6263646566676825\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"mastra"}} +{"category":"resolution/cross_vendor","id":"cross_vendor/two_attr_bands","note":"two vendors' attr matchers on one span: highest priority wins","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"mastra.span.type\":\"llm\",\"spring.ai.kind\":\"chat_client\"},\"span_id\":\"5a5b5c5d5e5e4ca8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f602c6263646566676824\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"mastra"}} +{"category":"resolution/cross_vendor","id":"cross_vendor/vendor_beats_unknown","note":"a vendor attr hit outranks the unknown tier it overlaps","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"ai.operationId\":\"ai.generateText\",\"gen_ai.operation.name\":\"chat\"},\"span_id\":\"5a5b5c5d5e5e50d0\",\"span_kind\":\"Internal\",\"span_name\":\"ai.generateText\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f602f6263646566676827\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"resolution/cross_vendor","id":"cross_vendor/unpromoted_candidate_loses_to_unknown","note":"an unpromoted candidate does not suppress the unknown tier","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"org.springframework.boot\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"chat\"},\"span_id\":\"5a5b5c5d5e5e54f8\",\"span_kind\":\"Internal\",\"span_name\":\"POST\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f602e6263646566676826\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"resolution/cross_vendor","id":"cross_vendor/sufficient_scope_with_foreign_system","note":"sufficient scope wins over a conflicting gen_ai.system attr matcher","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gcp.vertex.agent\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"langchain\"},\"span_id\":\"5a5b5c5d5e5e58e0\",\"span_kind\":\"Internal\",\"span_name\":\"invocation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60316263646566676839\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"google_adk"}} +{"category":"resolution/unknown_tier","id":"unknown/genai","note":"present(gen_ai.operation.name)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"chat\"},\"span_id\":\"5a5b5c5d5e5e5c08\",\"span_kind\":\"Internal\",\"span_name\":\"chat\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60306263646566676838\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"resolution/unknown_tier","id":"unknown/openinference","note":"present(openinference.span.kind)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:openinference\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"LLM\"},\"span_id\":\"5a5b5c5d5e5e2030\",\"span_kind\":\"Internal\",\"span_name\":\"call\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6033626364656667683b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:openinference"}} +{"category":"resolution/unknown_tier","id":"unknown/llm_prefix","note":"key_prefix(llm.)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:other\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"llm.model_name\":\"gpt-4o\"},\"span_id\":\"5a5b5c5d5e5e2458\",\"span_kind\":\"Internal\",\"span_name\":\"call\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6032626364656667683a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:other"}} +{"category":"resolution/unknown_tier","id":"unknown/traceloop_prefix","note":"key_prefix(traceloop.)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:other\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"traceloop.workflow.name\":\"w\"},\"span_id\":\"5a5b5c5d5e5e2840\",\"span_kind\":\"Internal\",\"span_name\":\"workflow\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6035626364656667683d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:other"}} +{"category":"resolution/unknown_tier","id":"unknown/ai_prefix","note":"key_prefix(ai.) with no vercel-specific evidence — still vercel's attr family","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"ai.telemetry.functionId\":\"f\"},\"span_id\":\"5a5b5c5d5e5e2c68\",\"span_kind\":\"Internal\",\"span_name\":\"call\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6034626364656667683c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"resolution/unknown_tier","id":"unknown/co_occurrence_gate_off","note":"input.value/output.value alone are deliberately not fingerprints","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"input.value\":\"{}\",\"output.value\":\"{}\"},\"span_id\":\"5a5b5c5d5e5e2f90\",\"span_kind\":\"Internal\",\"span_name\":\"handler\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6037626364656667683f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/unknown_tier","id":"unknown/co_occurrence_gate_on","note":"the same generic values with an OpenInference attribute present","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:openinference\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"input.value\":\"{}\",\"openinference.span.kind\":\"CHAIN\"},\"span_id\":\"5a5b5c5d5e5e33b8\",\"span_kind\":\"Internal\",\"span_name\":\"handler\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6036626364656667683e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:openinference"}} +{"category":"resolution/unknown_tier","id":"unknown/priority_between_buckets","note":"genai outranks openinference outranks llm.","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"chat\",\"llm.model_name\":\"gpt-4o\",\"openinference.span.kind\":\"LLM\"},\"span_id\":\"5a5b5c5d5e5e37a0\",\"span_kind\":\"Internal\",\"span_name\":\"call\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60396263646566676831\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"resolution/non_ai","id":"non_ai/http_server","note":"ordinary HTTP server span","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@opentelemetry/instrumentation-http\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.request.method\":\"GET\",\"http.response.status_code\":\"200\",\"url.path\":\"/health\"},\"span_id\":\"5a5b5c5d5e5e3bc8\",\"span_kind\":\"Internal\",\"span_name\":\"GET /health\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60386263646566676830\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/non_ai","id":"non_ai/db_client","note":"ordinary DB client span","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@opentelemetry/instrumentation-pg\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"db.namespace\":\"maple\",\"db.system.name\":\"postgresql\"},\"span_id\":\"5a5b5c5d5e5e3ff0\",\"span_kind\":\"Internal\",\"span_name\":\"SELECT maple.traces\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603b6263646566676833\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/non_ai","id":"non_ai/no_attributes","note":"no attributes at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{},\"span_id\":\"5a5b5c5d5e5e0318\",\"span_kind\":\"Internal\",\"span_name\":\"work\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603a6263646566676832\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/non_ai","id":"non_ai/empty_scope_name","note":"empty scope name","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/\"},\"span_id\":\"5a5b5c5d5e5e0700\",\"span_kind\":\"Internal\",\"span_name\":\"work\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603d6263646566676835\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/non_ai","id":"non_ai/no_scope","note":"ScopeSpans with no InstrumentationScope at all","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"\",\"scope_schema_url\":\"\",\"scope_version\":\"\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/\"},\"span_id\":\"5a5b5c5d5e5e0b28\",\"span_kind\":\"Internal\",\"span_name\":\"work\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603c6263646566676834\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"resolution/non_ai","id":"non_ai/no_resource","note":"ResourceSpans with no resource attributes","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"\",\"span_attributes\":{\"http.route\":\"/\"},\"span_id\":\"5a5b5c5d5e5e0f50\",\"span_kind\":\"Internal\",\"span_name\":\"work\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603f6263646566676837\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"session/agno","id":"session/agno/state2_not_authoritative","note":"no AGENT kind, no agno.workflow. key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agno.run.id\":\"r-1\",\"session.id\":\"s-1\"},\"span_id\":\"5a5b5c5d5e5e1378\",\"span_kind\":\"Internal\",\"span_name\":\"Model.invoke\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603e6263646566676836\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"agno"}} +{"category":"session/agno","id":"session/agno/state3_key_absent","note":"authoritative, neither candidate key present","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"AGENT\"},\"span_id\":\"5a5b5c5d5e5e137b\",\"span_kind\":\"Internal\",\"span_name\":\"Agent.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603e6263646566676836\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"agno"}} +{"category":"session/agno","id":"session/agno/state4_empty","note":"authoritative, session.id present but empty; agno.run.id also empty","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agno.run.id\":\"\",\"openinference.span.kind\":\"AGENT\",\"session.id\":\"\"},\"span_id\":\"5a5b5c5d5e5e137a\",\"span_kind\":\"Internal\",\"span_name\":\"Agent.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603e6263646566676836\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"agno"}} +{"category":"session/agno","id":"session/agno/state5_run_only","note":"run-granularity candidate only","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":16977468257975912505,\"ai_session_key_state\":5,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agno.run.id\":\"r-9\",\"openinference.span.kind\":\"AGENT\"},\"span_id\":\"5a5b5c5d5e5e137d\",\"span_kind\":\"Internal\",\"span_name\":\"Agent.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603e6263646566676836\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"16977468257975912505","session_key_hex":"722d39","session_state":5,"vendor":"agno"}} +{"category":"session/agno","id":"session/agno/state6_session","note":"session-granularity candidate resolves; max over candidates","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":15860208464106379930,\"ai_session_key_state\":6,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agno.run.id\":\"r-9\",\"openinference.span.kind\":\"AGENT\",\"session.id\":\"sess-agno\"},\"span_id\":\"5a5b5c5d5e5e137c\",\"span_kind\":\"Internal\",\"span_name\":\"Agent.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603e6263646566676836\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"15860208464106379930","session_key_hex":"736573732d61676e6f","session_state":6,"vendor":"agno"}} +{"category":"session/agno","id":"session/agno/state6_via_workflow_prefix","note":"authority via key_prefix(agno.workflow.)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":4822631405716103833,\"ai_session_key_state\":6,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agno.workflow.name\":\"research\",\"session.id\":\"sess-agno-2\"},\"span_id\":\"5a5b5c5d5e5e137f\",\"span_kind\":\"Internal\",\"span_name\":\"Workflow.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603e6263646566676836\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"4822631405716103833","session_key_hex":"736573732d61676e6f2d32","session_state":6,"vendor":"agno"}} +{"category":"session/agno","id":"session/agno/state4_empty_wins_over_absent","note":"empty session.id (4) beats absent agno.run.id (3) under max","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"AGENT\",\"session.id\":\"\"},\"span_id\":\"5a5b5c5d5e5e137e\",\"span_kind\":\"Internal\",\"span_name\":\"Agent.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f603e6263646566676836\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"agno"}} +{"category":"session/claude_agent_sdk","id":"session/claude/state2","note":"no span.type ⇒ neither candidate is authoritative","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"sess-1\"},\"span_id\":\"5a5b5c5d5e5e1760\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.other\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60016263646566676809\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"claude_agent_sdk"}} +{"category":"session/claude_agent_sdk","id":"session/claude/state3","note":"authoritative, no key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5e1763\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60016263646566676809\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"claude_agent_sdk"}} +{"category":"session/claude_agent_sdk","id":"session/claude/state4","note":"present-but-empty session.id","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5e1762\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60016263646566676809\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"claude_agent_sdk"}} +{"category":"session/claude_agent_sdk","id":"session/claude/state5_user_only","note":"user granularity only","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":1139775732335700012,\"ai_session_key_state\":5,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"span.type\":\"interaction\",\"user.id\":\"u-7\"},\"span_id\":\"5a5b5c5d5e5e1765\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60016263646566676809\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"1139775732335700012","session_key_hex":"752d37","session_state":5,"vendor":"claude_agent_sdk"}} +{"category":"session/claude_agent_sdk","id":"session/claude/state6","note":"session id present and valid","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":15639569774906704414,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"sess-claude\",\"span.type\":\"interaction\",\"user.id\":\"u-7\"},\"span_id\":\"5a5b5c5d5e5e1764\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60016263646566676809\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"15639569774906704414","session_key_hex":"736573732d636c61756465","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"session/flue","id":"session/flue/state3_always_candidate_absent","note":"the ALWAYS candidate is authoritative but its key is absent","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"flue\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@flue/opentelemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flue.operation.kind\":\"tool\"},\"span_id\":\"5a5b5c5d5e5e1a88\",\"span_kind\":\"Internal\",\"span_name\":\"flue.tool\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60006263646566676808\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"flue"}} +{"category":"session/flue","id":"session/flue/state5_instance","note":"instance granularity resolves at 5","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":2449292642492405285,\"ai_session_key_state\":5,\"ai_vendor\":\"flue\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@flue/opentelemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flue.instance.id\":\"inst-7\",\"flue.operation.kind\":\"tool\"},\"span_id\":\"5a5b5c5d5e5e1a8b\",\"span_kind\":\"Internal\",\"span_name\":\"flue.tool\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60006263646566676808\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"2449292642492405285","session_key_hex":"696e73742d37","session_state":5,"vendor":"flue"}} +{"category":"session/flue","id":"session/flue/state6_conversation","note":"prompt span with a conversation id","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":12245458656043361916,\"ai_session_key_state\":6,\"ai_vendor\":\"flue\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@flue/opentelemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flue.instance.id\":\"inst-7\",\"flue.operation.kind\":\"prompt\",\"gen_ai.conversation.id\":\"conv-3\"},\"span_id\":\"5a5b5c5d5e5e1a8a\",\"span_kind\":\"Internal\",\"span_name\":\"flue.prompt\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60006263646566676808\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"12245458656043361916","session_key_hex":"636f6e762d33","session_state":6,"vendor":"flue"}} +{"category":"session/flue","id":"session/flue/state5_decoy_conversation","note":"decoy value 'default' invalidates candidate 1 (4) but instance still resolves (5)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":2449292642492405285,\"ai_session_key_state\":5,\"ai_vendor\":\"flue\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@flue/opentelemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flue.instance.id\":\"inst-7\",\"flue.operation.kind\":\"prompt\",\"gen_ai.conversation.id\":\"default\"},\"span_id\":\"5a5b5c5d5e5e1a8d\",\"span_kind\":\"Internal\",\"span_name\":\"flue.prompt\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60006263646566676808\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"2449292642492405285","session_key_hex":"696e73742d37","session_state":5,"vendor":"flue"}} +{"category":"session/flue","id":"session/flue/state4_decoy_only","note":"decoy conversation id, no instance id ⇒ 4","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"flue\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@flue/opentelemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flue.operation.kind\":\"prompt\",\"gen_ai.conversation.id\":\"default\"},\"span_id\":\"5a5b5c5d5e5e1a8c\",\"span_kind\":\"Internal\",\"span_name\":\"flue.prompt\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60006263646566676808\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"flue"}} +{"category":"session/google_adk","id":"session/adk/state2","note":"none of the three authority predicates hold","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gcp.vertex.agent\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gcp.vertex.agent.session_id\":\"s-1\"},\"span_id\":\"5a5b5c5d5e5e1eb0\",\"span_kind\":\"Internal\",\"span_name\":\"internal\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6003626364656667680b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"google_adk"}} +{"category":"session/google_adk","id":"session/adk/state3","note":"authoritative via gen_ai.system, key absent","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gcp.vertex.agent\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"gcp.vertex.agent\"},\"span_id\":\"5a5b5c5d5e5e1eb3\",\"span_kind\":\"Internal\",\"span_name\":\"invocation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6003626364656667680b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"google_adk"}} +{"category":"session/google_adk","id":"session/adk/state6_via_system","note":"candidate 2 resolves at session granularity","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":13162659078926236385,\"ai_session_key_state\":6,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gcp.vertex.agent\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gcp.vertex.agent.session_id\":\"s-1\",\"gen_ai.system\":\"gcp.vertex.agent\"},\"span_id\":\"5a5b5c5d5e5e1eb2\",\"span_kind\":\"Internal\",\"span_name\":\"invocation\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6003626364656667680b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"13162659078926236385","session_key_hex":"732d31","session_state":6,"vendor":"google_adk"}} +{"category":"session/google_adk","id":"session/adk/state6_via_conversation","note":"candidate 1's population: invoke_agent","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":17286432163829527729,\"ai_session_key_state\":6,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gcp.vertex.agent\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"c-9\",\"gen_ai.operation.name\":\"invoke_agent\"},\"span_id\":\"5a5b5c5d5e5e1eb5\",\"span_kind\":\"Internal\",\"span_name\":\"invoke_agent weather\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6003626364656667680b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"17286432163829527729","session_key_hex":"632d39","session_state":6,"vendor":"google_adk"}} +{"category":"session/google_adk","id":"session/adk/state5_invocation_run","note":"run-granularity candidate 3 (authority = present(gen_ai.request.model))","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":2502602755074883861,\"ai_session_key_state\":5,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gcp.vertex.agent\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gcp.vertex.agent.invocation_id\":\"inv-1\",\"gen_ai.request.model\":\"gemini-2.0-flash\"},\"span_id\":\"5a5b5c5d5e5e1eb4\",\"span_kind\":\"Internal\",\"span_name\":\"generate_content\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6003626364656667680b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"2502602755074883861","session_key_hex":"696e762d31","session_state":5,"vendor":"google_adk"}} +{"category":"session/google_adk","id":"session/adk/state6_max_unions_disjoint","note":"one candidate at 2, one at 6 — max unions instead of cancelling","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":9028445063357370541,\"ai_session_key_state\":6,\"ai_vendor\":\"google_adk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gcp.vertex.agent\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gcp.vertex.agent.invocation_id\":\"inv-2\",\"gen_ai.conversation.id\":\"c-11\",\"gen_ai.operation.name\":\"generate_content\"},\"span_id\":\"5a5b5c5d5e5e1eb7\",\"span_kind\":\"Internal\",\"span_name\":\"generate_content\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6003626364656667680b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"9028445063357370541","session_key_hex":"632d3131","session_state":6,"vendor":"google_adk"}} +{"category":"session/spring_ai","id":"session/spring/state2","note":"not a chat_client span ⇒ not authoritative","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"spring-ai-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"org.springframework.boot\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"spring-ai-app\",\"span_attributes\":{\"spring.ai.chat.client.conversation.id\":\"c-1\",\"spring.ai.kind\":\"chat_model\"},\"span_id\":\"5a5b5c5d5e5ee2d8\",\"span_kind\":\"Internal\",\"span_name\":\"chat\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6002626364656667680a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"spring_ai"}} +{"category":"session/spring_ai","id":"session/spring/state3","note":"authoritative, key absent","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"spring-ai-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"org.springframework.boot\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"spring-ai-app\",\"span_attributes\":{\"spring.ai.kind\":\"chat_client\"},\"span_id\":\"5a5b5c5d5e5ee2db\",\"span_kind\":\"Internal\",\"span_name\":\"chat_client\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6002626364656667680a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"spring_ai"}} +{"category":"session/spring_ai","id":"session/spring/state4_decoy","note":"the 'default' decoy value","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"spring-ai-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"org.springframework.boot\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"spring-ai-app\",\"span_attributes\":{\"spring.ai.chat.client.conversation.id\":\"default\",\"spring.ai.kind\":\"chat_client\"},\"span_id\":\"5a5b5c5d5e5ee2da\",\"span_kind\":\"Internal\",\"span_name\":\"chat_client\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6002626364656667680a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"spring_ai"}} +{"category":"session/spring_ai","id":"session/spring/state4_empty","note":"present-but-empty","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"spring-ai-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"org.springframework.boot\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"spring-ai-app\",\"span_attributes\":{\"spring.ai.chat.client.conversation.id\":\"\",\"spring.ai.kind\":\"chat_client\"},\"span_id\":\"5a5b5c5d5e5ee2dd\",\"span_kind\":\"Internal\",\"span_name\":\"chat_client\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6002626364656667680a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"spring_ai"}} +{"category":"session/spring_ai","id":"session/spring/state6","note":"resolved","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":17550326829461552516,\"ai_session_key_state\":6,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"spring-ai-app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"org.springframework.boot\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"spring-ai-app\",\"span_attributes\":{\"spring.ai.chat.client.conversation.id\":\"conv-42\",\"spring.ai.kind\":\"chat_client\"},\"span_id\":\"5a5b5c5d5e5ee2dc\",\"span_kind\":\"Internal\",\"span_name\":\"chat_client\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6002626364656667680a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"17550326829461552516","session_key_hex":"636f6e762d3432","session_state":6,"vendor":"spring_ai"}} +{"category":"session/litellm","id":"session/litellm/state2","note":"no litellm.call_id ⇒ not authoritative","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"litellm\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"litellm\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"metadata.user_api_key_user_id\":\"u-1\"},\"span_id\":\"5a5b5c5d5e5ee6c0\",\"span_kind\":\"Internal\",\"span_name\":\"litellm_request\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6005626364656667680d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"litellm"}} +{"category":"session/litellm","id":"session/litellm/state3","note":"authoritative, no key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"litellm\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"litellm\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"litellm.call_id\":\"c-1\"},\"span_id\":\"5a5b5c5d5e5ee6c3\",\"span_kind\":\"Internal\",\"span_name\":\"litellm_request\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6005626364656667680d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"litellm"}} +{"category":"session/litellm","id":"session/litellm/state4_decoy_default_user","note":"'default_user_id' is a decoy value","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"litellm\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"litellm\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"litellm.call_id\":\"c-1\",\"metadata.user_api_key_end_user_id\":\"default_user_id\"},\"span_id\":\"5a5b5c5d5e5ee6c2\",\"span_kind\":\"Internal\",\"span_name\":\"litellm_request\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6005626364656667680d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"litellm"}} +{"category":"session/litellm","id":"session/litellm/state4_decoy_empty","note":"the empty string is BOTH a non_empty failure and a declared decoy","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"litellm\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"litellm\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"litellm.call_id\":\"c-1\",\"metadata.user_api_key_end_user_id\":\"\"},\"span_id\":\"5a5b5c5d5e5ee6c5\",\"span_kind\":\"Internal\",\"span_name\":\"litellm_request\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6005626364656667680d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"litellm"}} +{"category":"session/litellm","id":"session/litellm/state5","note":"user granularity resolves at 5, never 6","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":7407841233302966981,\"ai_session_key_state\":5,\"ai_vendor\":\"litellm\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"litellm\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"litellm.call_id\":\"c-1\",\"metadata.user_api_key_user_id\":\"user-77\"},\"span_id\":\"5a5b5c5d5e5ee6c4\",\"span_kind\":\"Internal\",\"span_name\":\"litellm_request\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6005626364656667680d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"7407841233302966981","session_key_hex":"757365722d3737","session_state":5,"vendor":"litellm"}} +{"category":"session/langchain","id":"session/langchain/state3","note":"ALWAYS-authoritative candidate with no key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"langchain\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"langsmith\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"langsmith.trace.name\":\"chain\"},\"span_id\":\"5a5b5c5d5e5eeae8\",\"span_kind\":\"Internal\",\"span_name\":\"chain\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6004626364656667680c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"langchain"}} +{"category":"session/langchain","id":"session/langchain/state4_decoy","note":"'default' decoy","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"langchain\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"langsmith\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"langsmith.metadata.thread_id\":\"default\"},\"span_id\":\"5a5b5c5d5e5eeaeb\",\"span_kind\":\"Internal\",\"span_name\":\"chain\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6004626364656667680c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"langchain"}} +{"category":"session/langchain","id":"session/langchain/state6","note":"resolved thread id","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":6338205964469458371,\"ai_session_key_state\":6,\"ai_vendor\":\"langchain\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"langsmith\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"langsmith.metadata.thread_id\":\"thread-9\"},\"span_id\":\"5a5b5c5d5e5eeaea\",\"span_kind\":\"Internal\",\"span_name\":\"chain\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6004626364656667680c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"6338205964469458371","session_key_hex":"7468726561642d39","session_state":6,"vendor":"langchain"}} +{"category":"session/mastra","id":"session/mastra/state2","note":"no mastra.span.type ⇒ not authoritative","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@mastra/otel-exporter\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"c-1\"},\"span_id\":\"5a5b5c5d5e5eee10\",\"span_kind\":\"Internal\",\"span_name\":\"agent.generate\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6007626364656667680f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"mastra"}} +{"category":"session/mastra","id":"session/mastra/state3","note":"authoritative, no candidate key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@mastra/otel-exporter\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"mastra.span.type\":\"agent_run\"},\"span_id\":\"5a5b5c5d5e5eee13\",\"span_kind\":\"Internal\",\"span_name\":\"agent.generate\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6007626364656667680f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"mastra"}} +{"category":"session/mastra","id":"session/mastra/state5_run","note":"run granularity","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":17391958930642725075,\"ai_session_key_state\":5,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@mastra/otel-exporter\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"mastra.metadata.runId\":\"run-1\",\"mastra.span.type\":\"agent_run\"},\"span_id\":\"5a5b5c5d5e5eee12\",\"span_kind\":\"Internal\",\"span_name\":\"agent.generate\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6007626364656667680f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"17391958930642725075","session_key_hex":"72756e2d31","session_state":5,"vendor":"mastra"}} +{"category":"session/mastra","id":"session/mastra/state5_user","note":"user granularity","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":1858641470362393213,\"ai_session_key_state\":5,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@mastra/otel-exporter\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"mastra.metadata.resourceId\":\"res-1\",\"mastra.span.type\":\"agent_run\"},\"span_id\":\"5a5b5c5d5e5eee15\",\"span_kind\":\"Internal\",\"span_name\":\"agent.generate\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6007626364656667680f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"1858641470362393213","session_key_hex":"7265732d31","session_state":5,"vendor":"mastra"}} +{"category":"session/mastra","id":"session/mastra/state6_max","note":"all three candidates resolve; max picks session and the hash follows it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":12884826459227698232,\"ai_session_key_state\":6,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@mastra/otel-exporter\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"conv-mastra\",\"mastra.metadata.resourceId\":\"res-1\",\"mastra.metadata.runId\":\"run-1\",\"mastra.span.type\":\"agent_run\"},\"span_id\":\"5a5b5c5d5e5eee14\",\"span_kind\":\"Internal\",\"span_name\":\"agent.generate\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6007626364656667680f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"12884826459227698232","session_key_hex":"636f6e762d6d6173747261","session_state":6,"vendor":"mastra"}} +{"category":"session/pydantic_ai","id":"session/pydantic/state2","note":"no gen_ai.operation.name ⇒ not authoritative","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"pydantic_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"pydantic-ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"c-1\"},\"span_id\":\"5a5b5c5d5e5ef238\",\"span_kind\":\"Internal\",\"span_name\":\"agent run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6006626364656667680e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"pydantic_ai"}} +{"category":"session/pydantic_ai","id":"session/pydantic/state5_call_id","note":"run granularity only","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":4226190707766527458,\"ai_session_key_state\":5,\"ai_vendor\":\"pydantic_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"pydantic-ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.agent.call.id\":\"call-1\",\"gen_ai.operation.name\":\"invoke_agent\"},\"span_id\":\"5a5b5c5d5e5ef23b\",\"span_kind\":\"Internal\",\"span_name\":\"agent run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6006626364656667680e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"4226190707766527458","session_key_hex":"63616c6c2d31","session_state":5,"vendor":"pydantic_ai"}} +{"category":"session/pydantic_ai","id":"session/pydantic/state6","note":"conversation id at session granularity","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":17391958930642725075,\"ai_session_key_state\":6,\"ai_vendor\":\"pydantic_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"pydantic-ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"run-1\",\"gen_ai.operation.name\":\"invoke_agent\",\"pydantic_ai.all_messages\":\"[]\"},\"span_id\":\"5a5b5c5d5e5ef23a\",\"span_kind\":\"Internal\",\"span_name\":\"agent run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6006626364656667680e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"17391958930642725075","session_key_hex":"72756e2d31","session_state":6,"vendor":"pydantic_ai"}} +{"category":"session/microsoft_agent_framework","id":"session/maf/state2","note":"operation is not invoke_agent","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"agent_framework\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"c-1\"},\"span_id\":\"5a5b5c5d5e5ef620\",\"span_kind\":\"Internal\",\"span_name\":\"chat\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60096263646566676801\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"microsoft_agent_framework"}} +{"category":"session/microsoft_agent_framework","id":"session/maf/state4_decoy_local_history","note":"'agent_framework_local_history_persistence' decoy","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"agent_framework\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"agent_framework_local_history_persistence\",\"gen_ai.operation.name\":\"invoke_agent\"},\"span_id\":\"5a5b5c5d5e5ef623\",\"span_kind\":\"Internal\",\"span_name\":\"invoke_agent\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60096263646566676801\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"microsoft_agent_framework"}} +{"category":"session/microsoft_agent_framework","id":"session/maf/state4_decoy_unknown","note":"'unknown' decoy","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"agent_framework\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"unknown\",\"gen_ai.operation.name\":\"invoke_agent\"},\"span_id\":\"5a5b5c5d5e5ef622\",\"span_kind\":\"Internal\",\"span_name\":\"invoke_agent\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60096263646566676801\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"microsoft_agent_framework"}} +{"category":"session/microsoft_agent_framework","id":"session/maf/state6","note":"resolved","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":977815689881094810,\"ai_session_key_state\":6,\"ai_vendor\":\"microsoft_agent_framework\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"agent_framework\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"thread_abc\",\"gen_ai.operation.name\":\"invoke_agent\"},\"span_id\":\"5a5b5c5d5e5ef625\",\"span_kind\":\"Internal\",\"span_name\":\"invoke_agent\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60096263646566676801\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"977815689881094810","session_key_hex":"7468726561645f616263","session_state":6,"vendor":"microsoft_agent_framework"}} +{"category":"session/strands","id":"session/strands/state2","note":"no gen_ai.system / provider ⇒ not authoritative","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"strands\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"strands.telemetry.tracer\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"s-1\"},\"span_id\":\"5a5b5c5d5e5efa48\",\"span_kind\":\"Internal\",\"span_name\":\"Model invoke\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60086263646566676800\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"strands"}} +{"category":"session/strands","id":"session/strands/state6","note":"authoritative via gen_ai.system","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":7387820565517287774,\"ai_session_key_state\":6,\"ai_vendor\":\"strands\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"strands.telemetry.tracer\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"strands-agents\",\"session.id\":\"s-2\"},\"span_id\":\"5a5b5c5d5e5efa4b\",\"span_kind\":\"Internal\",\"span_name\":\"Cycle\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60086263646566676800\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"7387820565517287774","session_key_hex":"732d32","session_state":6,"vendor":"strands"}} +{"category":"session/strands","id":"session/strands/state6_via_provider","note":"authoritative via gen_ai.provider.name","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":2606619711502189936,\"ai_session_key_state\":6,\"ai_vendor\":\"strands\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"strands.telemetry.tracer\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.provider.name\":\"strands-agents\",\"session.id\":\"s-3\"},\"span_id\":\"5a5b5c5d5e5efa4a\",\"span_kind\":\"Internal\",\"span_name\":\"Cycle\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60086263646566676800\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"2606619711502189936","session_key_hex":"732d33","session_state":6,"vendor":"strands"}} +{"category":"session/openai_agents_sdk","id":"session/openai_agents/state2","note":"no openinference.span.kind ⇒ not authoritative","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"openai_agents_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.openai_agents\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"s-1\"},\"span_id\":\"5a5b5c5d5e5efe70\",\"span_kind\":\"Internal\",\"span_name\":\"Response\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600b6263646566676803\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"openai_agents_sdk"}} +{"category":"session/openai_agents_sdk","id":"session/openai_agents/state6_session_id","note":"session.id wins; gen_ai.conversation.id ties at 6 and loses on order","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":5873743417506597526,\"ai_session_key_state\":6,\"ai_vendor\":\"openai_agents_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.openai_agents\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"conv-b\",\"openinference.span.kind\":\"AGENT\",\"session.id\":\"sess-a\"},\"span_id\":\"5a5b5c5d5e5efe73\",\"span_kind\":\"Internal\",\"span_name\":\"Agent workflow\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600b6263646566676803\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"5873743417506597526","session_key_hex":"736573732d61","session_state":6,"vendor":"openai_agents_sdk"}} +{"category":"session/openai_agents_sdk","id":"session/openai_agents/state6_conversation_only","note":"second candidate alone","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":4453951998959152841,\"ai_session_key_state\":6,\"ai_vendor\":\"openai_agents_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.openai_agents\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.conversation.id\":\"conv-b\",\"openinference.span.kind\":\"AGENT\"},\"span_id\":\"5a5b5c5d5e5efe72\",\"span_kind\":\"Internal\",\"span_name\":\"Agent workflow\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600b6263646566676803\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"4453951998959152841","session_key_hex":"636f6e762d62","session_state":6,"vendor":"openai_agents_sdk"}} +{"category":"session/smolagents","id":"session/smolagents/state3","note":"authoritative, no key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"smolagents\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.smolagents\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"AGENT\"},\"span_id\":\"5a5b5c5d5e5ec198\",\"span_kind\":\"Internal\",\"span_name\":\"CodeAgent.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600a6263646566676802\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"smolagents"}} +{"category":"session/smolagents","id":"session/smolagents/state5_user","note":"user granularity only","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":17164403324138251820,\"ai_session_key_state\":5,\"ai_vendor\":\"smolagents\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.smolagents\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"AGENT\",\"user.id\":\"u-1\"},\"span_id\":\"5a5b5c5d5e5ec19b\",\"span_kind\":\"Internal\",\"span_name\":\"CodeAgent.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600a6263646566676802\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"17164403324138251820","session_key_hex":"752d31","session_state":5,"vendor":"smolagents"}} +{"category":"session/crewai","id":"session/crewai/state3","note":"authority is the scope itself; key absent","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.crewai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"crew_key\":\"k\"},\"span_id\":\"5a5b5c5d5e5ec580\",\"span_kind\":\"Internal\",\"span_name\":\"Crew.kickoff\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600d6263646566676805\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"crewai"}} +{"category":"session/crewai","id":"session/crewai/state6","note":"resolved","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":8736018979143156140,\"ai_session_key_state\":6,\"ai_vendor\":\"crewai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.crewai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"crew_key\":\"k\",\"session.id\":\"sess-crew\"},\"span_id\":\"5a5b5c5d5e5ec583\",\"span_kind\":\"Internal\",\"span_name\":\"Crew.kickoff\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600d6263646566676805\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"8736018979143156140","session_key_hex":"736573732d63726577","session_state":6,"vendor":"crewai"}} +{"category":"session/dspy","id":"session/dspy/state6","note":"scope-gated authority, session granularity","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":16442119970499362894,\"ai_session_key_state\":6,\"ai_vendor\":\"dspy\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.dspy\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"sess-dspy\",\"user.id\":\"u-dspy\"},\"span_id\":\"5a5b5c5d5e5ec9a8\",\"span_kind\":\"Internal\",\"span_name\":\"Predict.forward\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600c6263646566676804\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"16442119970499362894","session_key_hex":"736573732d64737079","session_state":6,"vendor":"dspy"}} +{"category":"session/llamaindex","id":"session/llamaindex/state3","note":"ALWAYS candidate, key absent","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"llamaindex\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"llamaindex.opentelemetry.tracer\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"llamaindex.span.kind\":\"query\"},\"span_id\":\"5a5b5c5d5e5ecdd0\",\"span_kind\":\"Internal\",\"span_name\":\"query\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600f6263646566676807\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"llamaindex"}} +{"category":"session/llamaindex","id":"session/llamaindex/state5","note":"run granularity","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":5399217418148457536,\"ai_session_key_state\":5,\"ai_vendor\":\"llamaindex\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"llamaindex.opentelemetry.tracer\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"llamaindex.run_id\":\"run-3\"},\"span_id\":\"5a5b5c5d5e5ecdd3\",\"span_kind\":\"Internal\",\"span_name\":\"query\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600f6263646566676807\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"5399217418148457536","session_key_hex":"72756e2d33","session_state":5,"vendor":"llamaindex"}} +{"category":"session/no_rules","id":"session/no_rules/haystack","note":"vendor with zero session candidates ⇒ state 1","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"haystack\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"haystack\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"ai.operationId\":\"ai.generateText\"},\"span_id\":\"5a5b5c5d5e5ed1f8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f600e6263646566676806\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"haystack"}} +{"category":"session/no_rules","id":"session/no_rules/semantic_kernel","note":"vendor with zero session candidates ⇒ state 1","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"semantic_kernel\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"semantic_kernel.functions.kernel_function\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"ai.operationId\":\"ai.generateText\"},\"span_id\":\"5a5b5c5d5e5ed5e0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60116263646566676819\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"semantic_kernel"}} +{"category":"session/no_rules","id":"session/no_rules/vercel_ai_sdk","note":"vendor with zero session candidates ⇒ state 1","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"ai.operationId\":\"ai.generateText\"},\"span_id\":\"5a5b5c5d5e5ed908\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60106263646566676818\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"session/no_rules","id":"session/no_rules/unknown_bucket","note":"unknown-tier buckets carry no session rules ⇒ state 1","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"chat\",\"session.id\":\"s-1\"},\"span_id\":\"5a5b5c5d5e5edd30\",\"span_kind\":\"Internal\",\"span_name\":\"call\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6013626364656667681b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"session/no_rules","id":"session/no_rules/effect_ai","note":"effect_ai classifies on span name and has no candidates","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"effect_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"effect_ai_scope_is_not_a_thing\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"chat\"},\"span_id\":\"5a5b5c5d5e5ea158\",\"span_kind\":\"Internal\",\"span_name\":\"LanguageModel.generateText\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6012626364656667681a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"effect_ai"}} +{"category":"values/typed","id":"typed/bool_true_resource","note":"BoolValue(true) canonicalizes to 'true' for eq()","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"langchain\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"langsmith.internal_provider\":\"true\",\"service.name\":\"lc\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"lc\",\"span_attributes\":{\"langsmith.trace.name\":\"x\"},\"span_id\":\"5a5b5c5d5e5ea540\",\"span_kind\":\"Internal\",\"span_name\":\"chain\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6015626364656667681d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"langchain"}} +{"category":"values/typed","id":"typed/bool_false_resource","note":"BoolValue(false) must NOT satisfy eq(..., 'true')","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"langsmith.internal_provider\":\"false\",\"service.name\":\"lc\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"lc\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5ea968\",\"span_kind\":\"Internal\",\"span_name\":\"chain\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6014626364656667681c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"values/typed","id":"typed/session_key_int","note":"IntValue beyond 2^32 as a session key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":3314592284979140625,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"4294967296\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5eac90\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6017626364656667681f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"3314592284979140625","session_key_hex":"34323934393637323936","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_int_negative","note":"IntValue::MIN as a session key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":15897920141151212888,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"-9223372036854775808\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5eb0b8\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6016626364656667681e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"15897920141151212888","session_key_hex":"2d39323233333732303336383534373735383038","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_double","note":"DoubleValue canonicalizes with Rust's float formatting","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":7942122020128294879,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"1.5\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5eb4a0\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60196263646566676811\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"7942122020128294879","session_key_hex":"312e35","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_double_integral","note":"42.0 renders as '42', not '42.0'","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":985280342255011280,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"42\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5eb8c8\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60186263646566676810\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"985280342255011280","session_key_hex":"3432","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_bool","note":"BoolValue as a session key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":5512790967622792941,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"true\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5ebcf0\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f601b6263646566676813\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"5512790967622792941","session_key_hex":"74727565","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_bytes","note":"BytesValue hex-encodes (the row writer's rule, not JSON.stringify)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":1429165956392325225,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"deadbeef0001\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5e8018\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f601a6263646566676812\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"1429165956392325225","session_key_hex":"646561646265656630303031","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_array","note":"ArrayValue renders as a JSON array of canonical strings","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":12678579444740363438,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"[\\\"a\\\",\\\"2\\\",\\\"false\\\"]\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5e8400\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f601d6263646566676815\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"12678579444740363438","session_key_hex":"5b2261222c2232222c2266616c7365225d","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_kvlist","note":"KvlistValue renders as a JSON object; the row Map's key order is what SQL sees","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":5864374712609636384,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"{\\\"a\\\":\\\"first\\\",\\\"m\\\":\\\"7\\\",\\\"z\\\":\\\"last\\\"}\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5e8828\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f601c6263646566676814\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"5864374712609636384","session_key_hex":"7b2261223a226669727374222c226d223a2237222c227a223a226c617374227d","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_nested","note":"nested array/kvlist","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":1070448931733804658,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"[\\\"{\\\\\\\"k\\\\\\\":\\\\\\\"v\\\\\\\"}\\\",\\\"[\\\\\\\"1\\\\\\\"]\\\"]\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5e8c50\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f601f6263646566676817\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"1070448931733804658","session_key_hex":"5b227b5c226b5c223a5c22765c227d222c225b5c22315c225d225d","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_untyped","note":"AnyValue with no value ⇒ empty string ⇒ state 4","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5e9078\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f601e6263646566676816\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/session_key_valueless","note":"KeyValue with no AnyValue ⇒ empty string ⇒ state 4","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5e9460\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e162636465666768e9\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"claude_agent_sdk"}} +{"category":"values/typed","id":"typed/eq_int_vs_string","note":"IntValue on gen_ai.system cannot match any vendor's string literal","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"42\"},\"span_id\":\"5a5b5c5d5e5e9788\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e062636465666768e8\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"values/typed","id":"typed/eq_kvlist_on_matched_key","note":"KvlistValue on an eq()-compared key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"{\\\"spring_ai\\\":\\\"yes\\\"}\"},\"span_id\":\"5a5b5c5d5e5e9bb0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e362636465666768eb\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"values/typed","id":"typed/present_only_key_is_type_blind","note":"present() ignores the value's type entirely","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"00ff\"},\"span_id\":\"5a5b5c5d5e5e9fd8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e262636465666768ea\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"values/typed","id":"typed/array_on_prefix_key","note":"key_prefix() ignores values; the key alone decides","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:other\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"llm.token_counts\":\"[\\\"1\\\",\\\"2\\\"]\"},\"span_id\":\"5a5b5c5d5e5d63c0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e562636465666768ed\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:other"}} +{"category":"values/present_empty","id":"present_empty/unknown_genai","note":"gen_ai.operation.name = '' still fingerprints as unknown:genai","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"\"},\"span_id\":\"5a5b5c5d5e5d67e8\",\"span_kind\":\"Internal\",\"span_name\":\"llm\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e462636465666768ec\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"values/present_empty","id":"present_empty/unknown_openinference","note":"openinference.span.kind = ''","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:openinference\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"\"},\"span_id\":\"5a5b5c5d5e5d6b10\",\"span_kind\":\"Internal\",\"span_name\":\"llm\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e762636465666768ef\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:openinference"}} +{"category":"values/present_empty","id":"present_empty/eq_matcher_not_satisfied","note":"an empty value cannot satisfy eq() against a non-empty literal","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"\"},\"span_id\":\"5a5b5c5d5e5d6f38\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e662636465666768ee\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"values/present_empty","id":"present_empty/prefix_key_empty_value","note":"key_prefix() reads keys, so an empty value still hits","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"spring.ai.kind\":\"\"},\"span_id\":\"5a5b5c5d5e5d7320\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e962636465666768e1\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"spring_ai"}} +{"category":"values/present_empty","id":"present_empty/empty_key_name","note":"an attribute whose key is the empty string","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"\":\"\",\"gen_ai.operation.name\":\"chat\"},\"span_id\":\"5a5b5c5d5e5d7748\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60e862636465666768e0\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"values/present_empty","id":"present_empty/state4_vs_state3_empty","note":"present-but-empty ⇒ 4","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5d7b70\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60eb62636465666768e3\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"claude_agent_sdk"}} +{"category":"values/present_empty","id":"present_empty/state4_vs_state3_absent","note":"the same span with the key absent ⇒ 3","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5d7b73\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60eb62636465666768e3\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"claude_agent_sdk"}} +{"category":"values/present_empty","id":"present_empty/authority_key_empty","note":"the authority predicate is present(), so an empty span.type still grants it","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":18315090338952981153,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"sess-empty-auth\",\"span.type\":\"\"},\"span_id\":\"5a5b5c5d5e5d7b72\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60eb62636465666768e3\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"18315090338952981153","session_key_hex":"736573732d656d7074792d61757468","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"values/present_empty","id":"present_empty/eq_authority_empty","note":"eq()-based authority against an empty value","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"flue\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"@flue/opentelemetry\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flue.operation.kind\":\"\",\"gen_ai.conversation.id\":\"c-1\"},\"span_id\":\"5a5b5c5d5e5d7e98\",\"span_kind\":\"Internal\",\"span_name\":\"flue.prompt\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ea62636465666768e2\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"flue"}} +{"category":"keys/duplicate","id":"duplicate/gen_ai_system_spring_first","note":"duplicate registry key: the first occurrence decides both the verdict and the row","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"spring_ai\"},\"span_id\":\"5a5b5c5d5e5d4280\",\"span_kind\":\"Internal\",\"span_name\":\"chat\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ed62636465666768e5\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"spring_ai"}} +{"category":"keys/duplicate","id":"duplicate/gen_ai_system_strands_first","note":"duplicate registry key: the first occurrence decides both the verdict and the row","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"strands\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\":\"strands-agents\"},\"span_id\":\"5a5b5c5d5e5d46a8\",\"span_kind\":\"Internal\",\"span_name\":\"chat\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ec62636465666768e4\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"strands"}} +{"category":"keys/duplicate","id":"duplicate/session_id_valid_then_empty","note":"first occurrence valid, second empty ⇒ state 6","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":13732450810557198517,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"sess-dup-1\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5d4ad0\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ef62636465666768e7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"13732450810557198517","session_key_hex":"736573732d6475702d31","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"keys/duplicate","id":"duplicate/session_id_empty_then_valid","note":"first occurrence empty, second valid ⇒ state 4","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":4,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5d4ad3\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ef62636465666768e7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":4,"vendor":"claude_agent_sdk"}} +{"category":"keys/duplicate","id":"duplicate/session_id_typed_then_string","note":"typed first occurrence wins over a later string","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":5566429635965498611,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"7\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5d4ad2\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ef62636465666768e7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"5566429635965498611","session_key_hex":"37","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"keys/duplicate","id":"duplicate/authority_key_duplicated","note":"the authority key duplicated with a contradicting second value","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":8957691506115056961,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"sess-dup-3\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5d4ad5\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ef62636465666768e7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"8957691506115056961","session_key_hex":"736573732d6475702d33","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"keys/duplicate","id":"duplicate/authority_key_contradiction_first","note":"the mirror image: the non-matching value comes first","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":2162908562136087333,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"sess-dup-4\",\"span.type\":\"not-a-type\"},\"span_id\":\"5a5b5c5d5e5d4ad4\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ef62636465666768e7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"2162908562136087333","session_key_hex":"736573732d6475702d34","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"keys/duplicate","id":"duplicate/triplicate","note":"three occurrences of a registry key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":15096619121631409600,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"first\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5d4ad7\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ef62636465666768e7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"15096619121631409600","session_key_hex":"6669727374","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"keys/duplicate","id":"duplicate/non_registry_key_last_wins","note":"a key no rule consults keeps the LAST occurrence in the row Map","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"chat\",\"http.route\":\"/second\"},\"span_id\":\"5a5b5c5d5e5d4ef8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ee62636465666768e6\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"keys/duplicate","id":"duplicate/prefix_family_duplicated","note":"duplicated keys inside a key_prefix family","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"spring.ai.kind\":\"chat_client\",\"spring.ai.other\":\"x\"},\"span_id\":\"5a5b5c5d5e5d52e0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f162636465666768f9\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"spring_ai"}} +{"category":"keys/duplicate","id":"duplicate/resource_and_scope_same_key","note":"the same registry key on the resource, the scope and the span","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"gen_ai.system\":\"strands-agents\",\"service.name\":\"dup\"},\"resource_schema_url\":\"\",\"scope_attributes\":{\"gen_ai.system\":\"langchain\"},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"dup\",\"span_attributes\":{\"gen_ai.system\":\"spring_ai\"},\"span_id\":\"5a5b5c5d5e5d5608\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f062636465666768f8\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"spring_ai"}} +{"category":"keys/duplicate","id":"duplicate/scope_attribute_duplicated","note":"duplicate keys inside the scope attribute list","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{\"gen_ai.system\":\"spring_ai\"},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d5a30\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f362636465666768fb\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/gen_ai.systen","note":"same length, last byte differs","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.systen\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d5e58\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f262636465666768fa\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/gen_ai.systemm","note":"one byte longer","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.systemm\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d2240\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f562636465666768fd\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/gen_ai.syste","note":"one byte shorter","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.syste\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d2668\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f462636465666768fc\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/Gen_ai.system","note":"case-flipped first byte","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"Gen_ai.system\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d2990\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f762636465666768ff\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/gen_ai.operation.namf","note":"same length as a fingerprint key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.namf\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d2db8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f662636465666768fe\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/session.iD","note":"case-flipped tail","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"session.iD\":\"value\"},\"span_id\":\"5a5b5c5d5e5d31a0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f962636465666768f1\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/sessionXid","note":"separator replaced","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"sessionXid\":\"value\"},\"span_id\":\"5a5b5c5d5e5d35c8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60f862636465666768f0\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/span.typ","note":"prefix of a registry key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"span.typ\":\"value\"},\"span_id\":\"5a5b5c5d5e5d39f0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60fb62636465666768f3\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/span.typee","note":"registry key plus a byte","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"span.typee\":\"value\"},\"span_id\":\"5a5b5c5d5e5d3d18\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60fa62636465666768f2\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/spring.ai","note":"the prefix without its trailing dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"spring.ai\":\"value\"},\"span_id\":\"5a5b5c5d5e5d0100\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60fd62636465666768f5\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/spring/ai.kind","note":"separator swapped inside a prefix","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"spring/ai.kind\":\"value\"},\"span_id\":\"5a5b5c5d5e5d0528\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60fc62636465666768f4\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/spring.ao.kind","note":"one byte inside the prefix differs","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"spring.ao.kind\":\"value\"},\"span_id\":\"5a5b5c5d5e5d0950\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ff62636465666768f7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/agno","note":"prefix minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agno\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d0d78\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60fe62636465666768f6\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/agnos.run","note":"prefix plus a byte before the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agnos.run\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d1160\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c162636465666768c9\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/ai","note":"the shortest prefix minus its dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"ai\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d1488\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c062636465666768c8\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/aix.thing","note":"shares the first byte of the ai. prefix","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"aix.thing\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d18b0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c362636465666768cb\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/llm","note":"llm. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"llm\":\"value\"},\"span_id\":\"5a5b5c5d5e5d1cd8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c262636465666768ca\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/llmx.model","note":"llm prefix near miss","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"llmx.model\":\"value\"},\"span_id\":\"5a5b5c5d5e5de0c0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c562636465666768cd\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/traceloop","note":"traceloop. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"traceloop\":\"value\"},\"span_id\":\"5a5b5c5d5e5de4e8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c462636465666768cc\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/traceloo.x","note":"one byte short inside the prefix","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"traceloo.x\":\"value\"},\"span_id\":\"5a5b5c5d5e5de810\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c762636465666768cf\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/flue","note":"flue. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flue\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5dec38\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c662636465666768ce\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/mastra","note":"mastra. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"mastra\":\"value\"},\"span_id\":\"5a5b5c5d5e5df020\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c962636465666768c1\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/model_i","note":"resource key minus a byte","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"model_i\":\"value\"},\"span_id\":\"5a5b5c5d5e5df448\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60c862636465666768c0\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/model_idx","note":"resource key plus a byte","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"model_idx\":\"value\"},\"span_id\":\"5a5b5c5d5e5df870\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60cb62636465666768c3\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/telemetry.sdk.nam","note":"sufficient-resource key minus a byte","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"telemetry.sdk.nam\":\"value\"},\"span_id\":\"5a5b5c5d5e5dfb98\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ca62636465666768c2\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/openinference.span.kin","note":"fingerprint key minus a byte","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"openinference.span.kin\":\"value\"},\"span_id\":\"5a5b5c5d5e5dff80\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60cd62636465666768c5\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/crew","note":"crew_ prefix minus the underscore","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"crew\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5dc3a8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60cc62636465666768c4\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/flow","note":"flow_ prefix minus the underscore","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"flow\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5dc7d0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60cf62636465666768c7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/event_loop","note":"event_loop. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"event_loop\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5dcbf8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ce62636465666768c6\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/executor","note":"executor. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"executor\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5dcfe0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d162636465666768d9\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/edge_group","note":"edge_group. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"edge_group\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5dd308\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d062636465666768d8\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/sk","note":"sk. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"sk\":\"value\"},\"span_id\":\"5a5b5c5d5e5dd730\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d362636465666768db\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/smolagents","note":"smolagents. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"smolagents\":\"value\"},\"span_id\":\"5a5b5c5d5e5ddb58\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d262636465666768da\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/langsmith","note":"langsmith. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"langsmith\":\"value\"},\"span_id\":\"5a5b5c5d5e5ddf40\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d562636465666768dd\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/litellm","note":"litellm. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"litellm\":\"value\"},\"span_id\":\"5a5b5c5d5e5da368\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d462636465666768dc\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/haystack","note":"haystack. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"haystack\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5da690\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d762636465666768df\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/llamaindex","note":"llamaindex. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"llamaindex\":\"value\"},\"span_id\":\"5a5b5c5d5e5daab8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d662636465666768de\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/pydantic_ai","note":"pydantic_ai. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"pydantic_ai\":\"value\"},\"span_id\":\"5a5b5c5d5e5daea0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d962636465666768d1\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/agent_framework","note":"agent_framework. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agent_framework\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5db2c8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60d862636465666768d0\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/gcp.vertex.agent","note":"gcp.vertex.agent. minus the dot","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gcp.vertex.agent\":\"value\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5db6f0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60db62636465666768d3\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/scope/openinference.instrumentation.agn","note":"one byte short","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agn\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5dba18\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60da62636465666768d2\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/scope/openinference.instrumentation.agnoo","note":"one byte long","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agnoo\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5dbe00\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60dd62636465666768d5\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/scope/Openinference.instrumentation.agno","note":"case-flipped","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"Openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d8228\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60dc62636465666768d4\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/scope/openinference.instrumentation.agno ","note":"trailing space","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno \",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d8650\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60df62636465666768d7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/scope/ openinference.instrumentation.agno","note":"leading space","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\" openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d8a78\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60de62636465666768d6\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/scope/pydantic_ai","note":"underscore instead of the hyphen","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"pydantic_ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d8e60\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a162636465666768a9\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/scope/langsmit","note":"one byte short","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"langsmit\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d9188\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a062636465666768a8\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"keys/near_miss","id":"near_miss/scope/litellmx","note":"one byte long","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"litellmx\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5d95b0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a362636465666768ab\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"unicode","id":"unicode/session_value/emoji","note":"astral-plane characters","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":11038541917872144123,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"🙂🧠🚀\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5d99d8\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a262636465666768aa\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"11038541917872144123","session_key_hex":"f09f9982f09fa7a0f09f9a80","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/cjk","note":"3-byte sequences","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":15238778173770232695,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"会話-識別子-42\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5d9dc0\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a562636465666768ad\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"15238778173770232695","session_key_hex":"e4bc9ae8a9b12de8ad98e588a5e5ad902d3432","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/rtl","note":"RTL text","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":8593480859355344406,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"מזהה-שיחה\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c61e8\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a462636465666768ac\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"8593480859355344406","session_key_hex":"d79ed796d794d7942dd7a9d799d797d794","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/combining","note":"combining marks after ASCII","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":10252815871106751813,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"ȩ́session\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c6510\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a762636465666768af\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"10252815871106751813","session_key_hex":"65cc81cca773657373696f6e","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/zero_width","note":"zero-width joiners inside the value","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":5413262754819770266,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"sess​‍ion\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c6938\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a662636465666768ae\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"5413262754819770266","session_key_hex":"73657373e2808be2808d696f6e","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/bom","note":"a leading byte-order mark","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":9521285589434588519,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"session-1\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c6d20\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a962636465666768a1\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"9521285589434588519","session_key_hex":"efbbbf73657373696f6e2d31","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/surrogate_pair_boundary","note":"the last valid scalar value","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":9018560289838767314,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"aaa􏿿\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c7148\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60a862636465666768a0\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"9018560289838767314","session_key_hex":"616161f48fbfbf","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/nul_adjacent","note":"an embedded NUL","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":474006516132503015,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"before\\u0000after\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c7570\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ab62636465666768a3\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"474006516132503015","session_key_hex":"6265666f7265006166746572","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/nul_leading","note":"a leading NUL","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":2896917956751875279,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"\\u0000leading\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c7898\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60aa62636465666768a2\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"2896917956751875279","session_key_hex":"006c656164696e67","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/nul_trailing","note":"a trailing NUL","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":2730887940541437767,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"trailing\\u0000\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c7c80\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ad62636465666768a5\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"2730887940541437767","session_key_hex":"747261696c696e6700","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/control_chars","note":"C0 control characters","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":15664684759887450300,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"a\\u0001\\u0002\\u001fb\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c40a8\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ac62636465666768a4\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"15664684759887450300","session_key_hex":"6101021f62","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/quotes_and_backslash","note":"SQL-hostile punctuation in a hashed value","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":595630659587464574,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"it's a \\\\ \\\"test\\\" -- /* */\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c44d0\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60af62636465666768a7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"595630659587464574","session_key_hex":"697427732061205c20227465737422202d2d202f2a202a2f","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/session_value/newlines","note":"newlines and tabs (NDJSON is line-delimited)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":8866067739223767042,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"line1\\nline2\\r\\nline3\\t\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c48f8\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ae62636465666768a6\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"8866067739223767042","session_key_hex":"6c696e65310a6c696e65320d0a6c696e653309","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"unicode","id":"unicode/key/🌍.emoji.key","note":"a 4-byte lead byte","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"🌍.emoji.key\":\"v\"},\"span_id\":\"5a5b5c5d5e5c4ce0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b162636465666768b9\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"unicode","id":"unicode/key/gen_ai.系统","note":"multi-byte tail on a registry-ish key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.系统\":\"v\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5c5008\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b062636465666768b8\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"unicode","id":"unicode/key/ai.🙂","note":"multi-byte tail inside a registry prefix","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"ai.🙂\":\"v\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5c5430\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b362636465666768bb\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"unicode","id":"unicode/key/аi.operationId","note":"Cyrillic 'а' homoglyph as the first byte","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"аi.operationId\":\"v\"},\"span_id\":\"5a5b5c5d5e5c5858\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b262636465666768ba\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"unicode","id":"unicode/key/gen_ai.system\u0000","note":"a trailing NUL in the key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.system\\u0000\":\"v\",\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5c5c40\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b562636465666768bd\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"unicode","id":"unicode/key/gen_ai.system","note":"a BOM in front of a registry key","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\",\"gen_ai.system\":\"v\"},\"span_id\":\"5a5b5c5d5e5c2068\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b462636465666768bc\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"unicode","id":"unicode/scope_name","note":"a multi-byte near miss on a sufficient scope matcher","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:openinference\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agnő\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"AGENT\"},\"span_id\":\"5a5b5c5d5e5c2390\",\"span_kind\":\"Internal\",\"span_name\":\"Agent.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b762636465666768bf\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:openinference"}} +{"category":"unicode","id":"unicode/span_name","note":"a span name that is a unicode near miss of an effect_ai matcher","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"telemetry.sdk.name\":\"@effect/opentelemetry\"},\"span_id\":\"5a5b5c5d5e5c27b8\",\"span_kind\":\"Internal\",\"span_name\":\"LanguageModel.generateTéxt\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b662636465666768be\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"unicode","id":"unicode/session_value","note":"a non-ASCII session-key value","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":18045091784994185365,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"セッション-1\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c2ba0\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b962636465666768b1\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"18045091784994185365","session_key_hex":"e382bbe38383e382b7e383a7e383b32d31","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"oversized","id":"oversized/64kib_session_value","note":"a 64 KiB session key value, hashed in full","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":7524359276279220832,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c2fc8\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b862636465666768b0\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"7524359276279220832","session_key_hex":"78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"oversized","id":"oversized/16kib_unicode_session_value","note":"16 Ki astral characters (64 KiB of UTF-8)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":12360671198098928768,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"session.id\":\"🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c2fcb\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b862636465666768b0\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"12360671198098928768","session_key_hex":"f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982f09f9982","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"oversized","id":"oversized/wide_attribute_list","note":"60 non-registry attributes around the two that matter","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":4391406247644661733,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.request.header.x_000\":\"v\",\"http.request.header.x_001\":\"v\",\"http.request.header.x_002\":\"v\",\"http.request.header.x_003\":\"v\",\"http.request.header.x_004\":\"v\",\"http.request.header.x_005\":\"v\",\"http.request.header.x_006\":\"v\",\"http.request.header.x_007\":\"v\",\"http.request.header.x_008\":\"v\",\"http.request.header.x_009\":\"v\",\"http.request.header.x_010\":\"v\",\"http.request.header.x_011\":\"v\",\"http.request.header.x_012\":\"v\",\"http.request.header.x_013\":\"v\",\"http.request.header.x_014\":\"v\",\"http.request.header.x_015\":\"v\",\"http.request.header.x_016\":\"v\",\"http.request.header.x_017\":\"v\",\"http.request.header.x_018\":\"v\",\"http.request.header.x_019\":\"v\",\"http.request.header.x_020\":\"v\",\"http.request.header.x_021\":\"v\",\"http.request.header.x_022\":\"v\",\"http.request.header.x_023\":\"v\",\"http.request.header.x_024\":\"v\",\"http.request.header.x_025\":\"v\",\"http.request.header.x_026\":\"v\",\"http.request.header.x_027\":\"v\",\"http.request.header.x_028\":\"v\",\"http.request.header.x_029\":\"v\",\"http.request.header.x_030\":\"v\",\"http.request.header.x_031\":\"v\",\"http.request.header.x_032\":\"v\",\"http.request.header.x_033\":\"v\",\"http.request.header.x_034\":\"v\",\"http.request.header.x_035\":\"v\",\"http.request.header.x_036\":\"v\",\"http.request.header.x_037\":\"v\",\"http.request.header.x_038\":\"v\",\"http.request.header.x_039\":\"v\",\"http.request.header.x_040\":\"v\",\"http.request.header.x_041\":\"v\",\"http.request.header.x_042\":\"v\",\"http.request.header.x_043\":\"v\",\"http.request.header.x_044\":\"v\",\"http.request.header.x_045\":\"v\",\"http.request.header.x_046\":\"v\",\"http.request.header.x_047\":\"v\",\"http.request.header.x_048\":\"v\",\"http.request.header.x_049\":\"v\",\"http.request.header.x_050\":\"v\",\"http.request.header.x_051\":\"v\",\"http.request.header.x_052\":\"v\",\"http.request.header.x_053\":\"v\",\"http.request.header.x_054\":\"v\",\"http.request.header.x_055\":\"v\",\"http.request.header.x_056\":\"v\",\"http.request.header.x_057\":\"v\",\"http.request.header.x_058\":\"v\",\"http.request.header.x_059\":\"v\",\"session.id\":\"sess-wide\",\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5c2fca\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b862636465666768b0\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"4391406247644661733","session_key_hex":"736573732d77696465","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"oversized","id":"oversized/spilled_registry_keys","note":"more registry keys than the inline attribute view holds","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":6419705041821120113,\"ai_session_key_state\":6,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"agno.run.id\":\"r-spill\",\"gen_ai.conversation.id\":\"conv-spill\",\"gen_ai.operation.name\":\"chat\",\"gen_ai.request.model\":\"gpt-4o\",\"gen_ai.system\":\"spring_ai\",\"litellm.call_id\":\"call-spill\",\"mastra.metadata.runId\":\"run-spill\",\"mastra.span.type\":\"agent_run\",\"openinference.span.kind\":\"AGENT\",\"session.id\":\"sess-spill\",\"span.type\":\"interaction\",\"task_key\":\"research\",\"user.id\":\"u-spill\"},\"span_id\":\"5a5b5c5d5e5c2fcd\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60b862636465666768b0\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"6419705041821120113","session_key_hex":"736573732d7370696c6c","session_state":6,"vendor":"claude_agent_sdk"}} +{"category":"oversized","id":"oversized/long_key","note":"a 4 KiB key inside a registry prefix family","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"spring_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"spring.ai.kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk\":\"v\"},\"span_id\":\"5a5b5c5d5e5c33f0\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60bb62636465666768b3\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"spring_ai"}} +{"category":"oversized","id":"oversized/deep_array","note":"a deeply nested array value","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:other\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"llm.messages\":\"[\\\"[\\\\\\\"[\\\\\\\\\\\\\\\"[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"deep\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\"]\\\\\\\"]\\\"]\"},\"span_id\":\"5a5b5c5d5e5c3718\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60ba62636465666768b2\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:other"}} +{"category":"oversized","id":"oversized/long_span_name","note":"a 4 KiB span name","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"chat\"},\"span_id\":\"5a5b5c5d5e5c3b00\",\"span_kind\":\"Internal\",\"span_name\":\"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60bd62636465666768b5\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"pseudo_keys","id":"pseudo/span_attribute_named_scope_name","note":"a span attribute literally called scope.name must not shadow the column","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"agno\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"openinference.instrumentation.agno\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"AGENT\",\"scope.name\":\"litellm\"},\"span_id\":\"5a5b5c5d5e5c3f28\",\"span_kind\":\"Internal\",\"span_name\":\"Agent.run\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60bc62636465666768b4\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"agno"}} +{"category":"pseudo_keys","id":"pseudo/span_attribute_named_span_name","note":"a span attribute called span.name against effect_ai's span-name matchers","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"span.name\":\"LanguageModel.generateText\",\"telemetry.sdk.name\":\"@effect/opentelemetry\"},\"span_id\":\"5a5b5c5d5e5c0350\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60bf62636465666768b7\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"pseudo_keys","id":"pseudo/effect_ai_span_name_match","note":"the real span-name matcher, promoted by the resource candidate","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"effect_ai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"effect-app\",\"telemetry.sdk.name\":\"@effect/opentelemetry\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"effect-app\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5c0778\",\"span_kind\":\"Internal\",\"span_name\":\"Chat.generateText\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60be62636465666768b6\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"effect_ai"}} +{"category":"pseudo_keys","id":"pseudo/scope_version_and_schema_url","note":"scope.version / scope.schema_url carry values (no matcher reads them today)","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:genai\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"https://opentelemetry.io/schemas/1.34.0\",\"scope_version\":\"2.0.0-rc.1+build.7\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"gen_ai.operation.name\":\"chat\"},\"span_id\":\"5a5b5c5d5e5c0b60\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60816263646566676889\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:genai"}} +{"category":"pseudo_keys","id":"pseudo/empty_scope_version","note":"empty scope version and schema url","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"unknown:openinference\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"openinference.span.kind\":\"LLM\"},\"span_id\":\"5a5b5c5d5e5c0e88\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60806263646566676888\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"unknown:openinference"}} +{"category":"pseudo_keys","id":"pseudo/scope_name_eq_is_case_sensitive","note":"vercel's insufficient scope matcher, exact match","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":1,\"ai_vendor\":\"vercel_ai_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"gen_ai\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"ai.operationId\":\"ai.generateText\"},\"span_id\":\"5a5b5c5d5e5c12b0\",\"span_kind\":\"Internal\",\"span_name\":\"ai.generateText\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6083626364656667688b\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":1,"vendor":"vercel_ai_sdk"}} +{"category":"cross_class","id":"cross_class/resource_key_on_span","note":"a resource-class matcher's key carried as a span attribute","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"app\",\"span_attributes\":{\"telemetry.sdk.name\":\"@mastra/otel-exporter\"},\"span_id\":\"5a5b5c5d5e5c16d8\",\"span_kind\":\"Internal\",\"span_name\":\"agent.generate\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6082626364656667688a\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"cross_class","id":"cross_class/resource_key_shadowed_by_span","note":"the resource carries the matching value; a span attribute of the same name disagrees","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"mastra\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"app\",\"telemetry.sdk.name\":\"@mastra/otel-exporter\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"app\",\"span_attributes\":{\"telemetry.sdk.name\":\"@opentelemetry/sdk-node\"},\"span_id\":\"5a5b5c5d5e5c1ac0\",\"span_kind\":\"Internal\",\"span_name\":\"agent.generate\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6085626364656667688d\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"mastra"}} +{"category":"cross_class","id":"cross_class/attr_prefix_on_resource","note":"an attr-class key_prefix family carried on the resource","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"agno.run.id\":\"r-1\",\"service.name\":\"app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"app\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5c1ee8\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6084626364656667688c\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"cross_class","id":"cross_class/attr_key_on_scope","note":"an attr-class eq() key carried on the scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{\"gen_ai.system\":\"spring_ai\"},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5ce210\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6087626364656667688f\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"cross_class","id":"cross_class/session_key_on_resource","note":"the session-candidate key carried on the resource instead of the span","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"app\",\"session.id\":\"sess-res\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"app\",\"span_attributes\":{\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5ce638\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f6086626364656667688e\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"claude_agent_sdk"}} +{"category":"cross_class","id":"cross_class/session_key_on_scope","note":"the session-candidate key carried on the scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":3,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{\"session.id\":\"sess-scope\"},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"span.type\":\"interaction\"},\"span_id\":\"5a5b5c5d5e5cea20\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60896263646566676881\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":3,"vendor":"claude_agent_sdk"}} +{"category":"cross_class","id":"cross_class/authority_key_on_resource","note":"the authority predicate's key carried on the resource","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":2,\"ai_vendor\":\"claude_agent_sdk\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"app\",\"span.type\":\"interaction\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.anthropic.claude_code\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"app\",\"span_attributes\":{\"session.id\":\"sess-auth-res\"},\"span_id\":\"5a5b5c5d5e5cee48\",\"span_kind\":\"Internal\",\"span_name\":\"claude_code.interaction\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f60886263646566676880\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":2,"vendor":"claude_agent_sdk"}} +{"category":"cross_class","id":"cross_class/unknown_fingerprint_on_resource","note":"an unknown-tier fingerprint key carried on the resource","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"gen_ai.operation.name\":\"chat\",\"service.name\":\"app\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"app\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5cf270\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f608b6263646566676883\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"cross_class","id":"cross_class/unknown_fingerprint_on_scope","note":"an unknown-tier fingerprint key carried on the scope","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"service.name\":\"equivalence-fixture\"},\"resource_schema_url\":\"\",\"scope_attributes\":{\"openinference.span.kind\":\"LLM\"},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"equivalence-fixture\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5cf598\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f608a6263646566676882\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} +{"category":"cross_class","id":"cross_class/scope_class_key_on_span","note":"a scope-class matcher keyed on a real attribute, carried on the span","row":"{\"ai_rollup_hour\":\"2023-11-14 22:00:00\",\"ai_rules_version\":1,\"ai_session_key_hash\":0,\"ai_session_key_state\":0,\"ai_vendor\":\"\",\"duration\":1000000,\"events_attributes\":[],\"events_name\":[],\"events_timestamp\":[],\"links_attributes\":[],\"links_span_id\":[],\"links_trace_id\":[],\"links_trace_state\":[],\"parent_span_id\":\"\",\"resource_attributes\":{\"model_id\":\"gpt-4o-mini\",\"service.name\":\"gateway\"},\"resource_schema_url\":\"\",\"scope_attributes\":{},\"scope_name\":\"com.example.app\",\"scope_schema_url\":\"\",\"scope_version\":\"1.2.3\",\"service_name\":\"gateway\",\"span_attributes\":{\"http.route\":\"/x\"},\"span_id\":\"5a5b5c5d5e5cf980\",\"span_kind\":\"Internal\",\"span_name\":\"op\",\"start_time\":\"2023-11-14 22:13:20.000000000\",\"status_code\":\"Unset\",\"status_message\":\"\",\"trace_id\":\"5a5b5c5d5e5f608d6263646566676885\",\"trace_state\":\"\"}","rust":{"rules_version":1,"session_key_hash":"0","session_key_hex":null,"session_state":0,"vendor":""}} diff --git a/packages/domain/src/ai-registry/corpus-equivalence.clickhouse.e2e.test.ts b/packages/domain/src/ai-registry/corpus-equivalence.clickhouse.e2e.test.ts new file mode 100644 index 000000000..706300d58 --- /dev/null +++ b/packages/domain/src/ai-registry/corpus-equivalence.clickhouse.e2e.test.ts @@ -0,0 +1,217 @@ +// Full-corpus Rust↔SQL differential — the on-demand gate. +// +// `./equivalence.clickhouse.e2e.test.ts` runs the *synthetic* fuzz surface, which is +// checked in and always available. This suite runs the same differential over every span +// of the trace-capture corpus (~10k spans across 57 captures), replayed through the real +// row writer. The corpus is a sibling repo, not a vendored fixture, so both halves are +// opt-in and neither runs in CI: +// +// # 1. emit rows + verdicts from the real writer (apps/ingest) +// TRACE_CAPTURE_DIR=~/Documents/repos/trace-capture \ +// CORPUS_EQUIVALENCE_OUT=/tmp/corpus-equivalence.jsonl \ +// cargo test -p maple-ingest --lib write_corpus_equivalence_fixture -- --ignored --nocapture +// +// # 2. replay them into ClickHouse and compare (this file) +// bun ch:up +// CLICKHOUSE_E2E=1 CORPUS_EQUIVALENCE_FIXTURES=/tmp/corpus-equivalence.jsonl \ +// bun run --cwd packages/domain test -- corpus-equivalence.clickhouse.e2e +// +// The artifact is ~150 MB (the corpus contains multi-megabyte spans), which is why it is +// streamed rather than loaded, and why it is never checked in. + +import { createReadStream } from "node:fs" +import { createInterface } from "node:readline" +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { compileAiRegistrySql, renderAiRegistrySelect } from "./compile-sql" +import { + ANALYZER_STRICTNESS, + applyRealMigrations, + clickhouseE2eEnabled, + clickhouseExec, + clickhouseSelect, + createDatabase, + dropDatabase, + dropTracesRetentionTtl, + insertTracesRows, + uniqueDatabase, +} from "./equivalence-support" +import type { FixtureRecord } from "./equivalence-support" + +const fixturePath = process.env.CORPUS_EQUIVALENCE_FIXTURES +const enabled = clickhouseE2eEnabled && fixturePath !== undefined && fixturePath.length > 0 + +const database = uniqueDatabase("maple_ai_corpus_equivalence") +const orgId = "org_equivalence" +const compiled = compileAiRegistrySql() + +/** + * The corpus spreads across years of `Timestamp` values, and `traces` partitions by day. + * ClickHouse's default `max_partitions_per_insert_block` (100) would reject a batch that + * straddles more days than that; the production writer never sees such a batch because it + * writes what one exporter sent. Lifted here rather than reshaping the replay, which would + * mean not replaying the corpus. + */ +const CORPUS_INSERT_SETTINGS: Readonly> = { max_partitions_per_insert_block: "0" } + +interface MismatchRow { + readonly SpanId: string + readonly ServiceName: string + readonly ScopeName: string + readonly SpanName: string + readonly AiVendor: string + readonly AiVendorComputed: string + readonly AiSessionKeyState: number + readonly AiSessionKeyStateComputed: number + readonly SpanAttributes: Readonly> + readonly ResourceAttributes: Readonly> + readonly ScopeAttributes: Readonly> +} + +const PASSTHROUGH = [ + "SpanId", + "ServiceName", + "ScopeName", + "SpanName", + "AiVendor", + "AiSessionKeyState", + "SpanAttributes", + "ResourceAttributes", + "ScopeAttributes", +] as const + +const differentialSql = (where: string): string => + `SELECT * FROM (\n${renderAiRegistrySelect(compiled, "traces", { passthrough: [...PASSTHROUGH] })}\n)\nWHERE ${where}` + +let replayed = 0 + +describe.skipIf(!enabled)("full-corpus Rust↔SQL equivalence", () => { + beforeAll(async () => { + await createDatabase(database) + await applyRealMigrations(database) + await dropTracesRetentionTtl(database) + + const stream = createInterface({ + input: createReadStream(fixturePath as string, { encoding: "utf8" }), + crlfDelay: Number.POSITIVE_INFINITY, + }) + let batch: string[] = [] + for await (const line of stream) { + if (line.trim().length === 0) continue + const record = JSON.parse(line) as FixtureRecord + batch.push(record.row) + if (batch.length >= 500) { + replayed += await insertTracesRows( + database, + orgId, + batch, + 8 * 1024 * 1024, + CORPUS_INSERT_SETTINGS, + ) + batch = [] + } + } + if (batch.length > 0) + replayed += await insertTracesRows( + database, + orgId, + batch, + 8 * 1024 * 1024, + CORPUS_INSERT_SETTINGS, + ) + }, 1_800_000) + + afterAll(async () => { + await dropDatabase(database) + }, 60_000) + + it("replays every captured row into the real traces schema", async () => { + expect(replayed).toBeGreaterThan(9_000) + const stored = await clickhouseSelect<{ readonly count: string }>( + "SELECT toString(count()) AS count FROM traces", + database, + ) + expect(Number(stored[0]?.count)).toBe(replayed) + }, 120_000) + + it("computes the same vendor and session-key state as the Rust writer for every corpus span", async () => { + const where = "AiVendorComputed != AiVendor OR AiSessionKeyStateComputed != AiSessionKeyState" + const counted = await clickhouseSelect<{ readonly mismatches: string; readonly total: string }>( + `SELECT + toString(countIf(${where})) AS mismatches, + toString(count()) AS total +FROM (\n${renderAiRegistrySelect(compiled, "traces", { passthrough: [...PASSTHROUGH] })}\n)`, + database, + ANALYZER_STRICTNESS, + ) + const mismatches = Number(counted[0]?.mismatches ?? -1) + if (mismatches === 0) { + expect(Number(counted[0]?.total)).toBe(replayed) + return + } + + // A mismatch is a finding. Print enough of the offending spans to act on without + // re-running anything: both verdicts and all three attribute maps. + const samples = await clickhouseSelect( + `${differentialSql(where)}\nLIMIT 20`, + database, + ANALYZER_STRICTNESS, + ) + const breakdown = await clickhouseSelect<{ + readonly AiVendor: string + readonly AiVendorComputed: string + readonly spans: string + }>( + `SELECT AiVendor, AiVendorComputed, toString(count()) AS spans +FROM (\n${renderAiRegistrySelect(compiled, "traces", { passthrough: [...PASSTHROUGH] })}\n) +WHERE ${where} +GROUP BY AiVendor, AiVendorComputed +ORDER BY count() DESC`, + database, + ANALYZER_STRICTNESS, + ) + const report = [ + `${mismatches} of ${counted[0]?.total} corpus spans disagree.`, + "", + "by (rust vendor → sql vendor):", + ...breakdown.map( + (row) => + ` ${JSON.stringify(row.AiVendor)} → ${JSON.stringify(row.AiVendorComputed)}: ${row.spans}`, + ), + "", + ...samples.map((row) => + [ + `- ${row.ServiceName} / ${row.ScopeName} / ${row.SpanName} (${row.SpanId})`, + ` rust = ${JSON.stringify(row.AiVendor)}/${row.AiSessionKeyState} sql = ${JSON.stringify(row.AiVendorComputed)}/${row.AiSessionKeyStateComputed}`, + ` span = ${JSON.stringify(row.SpanAttributes).slice(0, 800)}`, + ` scope = ${JSON.stringify(row.ScopeAttributes).slice(0, 400)}`, + ` resource = ${JSON.stringify(row.ResourceAttributes).slice(0, 400)}`, + ].join("\n"), + ), + ].join("\n") + expect(mismatches, report).toBe(0) + }, 600_000) + + it("classifies a non-trivial share of the corpus (the differential is not vacuous)", async () => { + // Zero mismatches over ten thousand rows that all classified as non-AI would prove + // nothing; this pins that the corpus really exercises the vendor branches. + const rows = await clickhouseSelect<{ readonly vendors: string; readonly classified: string }>( + `SELECT + toString(uniqExact(AiVendor)) AS vendors, + toString(countIf(AiVendor != '')) AS classified +FROM traces`, + database, + ) + expect(Number(rows[0]?.vendors)).toBeGreaterThan(20) + expect(Number(rows[0]?.classified)).toBeGreaterThan(5_000) + }, 120_000) + + it("keeps the stored rules version on every replayed row", async () => { + const body = await clickhouseExec( + "SELECT toString(uniqExact(AiRulesVersion)), toString(min(AiRulesVersion)) FROM traces FORMAT TabSeparated", + database, + ) + const [distinct, minimum] = body.trim().split("\t") + expect(distinct).toBe("1") + expect(Number(minimum)).toBe(compiled.rulesVersion) + }, 60_000) +}) diff --git a/packages/domain/src/ai-registry/equivalence-support.ts b/packages/domain/src/ai-registry/equivalence-support.ts new file mode 100644 index 000000000..9c7420538 --- /dev/null +++ b/packages/domain/src/ai-registry/equivalence-support.ts @@ -0,0 +1,317 @@ +// Plumbing shared by the Rust↔SQL equivalence e2e legs. +// +// The suites here replay rows that `apps/ingest` actually wrote — captured by its +// fixture generator (`apps/ingest/src/ai_equivalence_fixtures.rs`) — into a real +// ClickHouse, then evaluate the SQL compiled from `registry.json` over them. Three +// things have to be faithful for that to prove anything: +// +// 1. **The schema is the real one.** Migrations are replayed through the shipped +// `packages/clickhouse-cli`, not a test-local DDL copy, so the suite sees the +// column set customers get (including `AiVendor`/`AiSessionKeyState`, which the +// compiled SQL is compared against). +// 2. **The INSERT is the real one.** The statement is rebuilt from +// `apps/cli/src/server/schema/local-inserts.json` — the checked-in artifact +// `scripts/generate-clickhouse-insert-mappings.ts` emits alongside +// `apps/ingest/src/clickhouse_insert_mappings.rs`, from the same Tinybird manifest. +// Reading the JSON rather than the Rust constant means both sides are pinned to one +// generator, and it is the only form a TypeScript test can consume. The query +// parameters mirror `TelemetryPipeline`'s ClickHouse export +// (`date_time_input_format=best_effort`, `input_format_skip_unknown_fields=1`). +// 3. **The row bytes are the real ones.** Fixture records carry the writer's NDJSON +// line verbatim as a string, replayed unmodified. Re-serialising a parsed row would +// corrupt `ai_session_key_hash` (a UInt64 above 2^53) on the way through +// `JSON.parse`. +// +// This file deliberately does not import `apps/api`'s ClickHouse harness: a package may +// not depend on a deployable. The migration spawn is the same shape, kept in sync by +// hand — it is twenty lines and changing rarely. + +import { spawn } from "node:child_process" +import { existsSync, readFileSync } from "node:fs" +import { dirname, join } from "node:path" +import { fileURLToPath } from "node:url" + +export const clickhouseE2eEnabled = process.env.CLICKHOUSE_E2E === "1" +export const clickhouseUrl = process.env.CLICKHOUSE_E2E_URL ?? "http://127.0.0.1:8123" +export const clickhouseUser = process.env.CLICKHOUSE_E2E_USER ?? "maple" +export const clickhousePassword = process.env.CLICKHOUSE_E2E_PASSWORD ?? "maple" + +/** + * Managed Tinybird is ClickHouse 24.12 with `use_variant_as_common_type = 0`, where a + * type mismatch between `multiIf` branches is a hard error; modern servers default it on + * and quietly resolve the same expression to a `Variant`. Pinned for the same reason the + * apps/api harness pins it. + */ +export const ANALYZER_STRICTNESS: Readonly> = { + use_variant_as_common_type: "0", +} + +/** Walk up to the workspace root rather than counting `../` segments. */ +const findRepoRoot = (): string => { + let dir = dirname(fileURLToPath(import.meta.url)) + while (!existsSync(join(dir, "turbo.json"))) { + const parent = dirname(dir) + if (parent === dir) + throw new Error("Could not locate the workspace root: no turbo.json above this file") + dir = parent + } + return dir +} + +const repoRoot = findRepoRoot() + +export const uniqueDatabase = (prefix: string): string => + `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}` + +const endpoint = (targetDatabase: string, settings: Readonly>): string => { + const query = new URLSearchParams({ database: targetDatabase, ...settings }) + return `${clickhouseUrl.replace(/\/$/, "")}/?${query.toString()}` +} + +const clickhouseHeaders = (targetDatabase: string): Readonly> => ({ + "X-ClickHouse-User": clickhouseUser, + "X-ClickHouse-Key": clickhousePassword, + "X-ClickHouse-Database": targetDatabase, +}) + +export const clickhouseExec = async ( + sql: string, + targetDatabase = "default", + settings: Readonly> = {}, +): Promise => { + const response = await fetch(endpoint(targetDatabase, settings), { + method: "POST", + redirect: "manual", + headers: { "Content-Type": "text/plain", ...clickhouseHeaders(targetDatabase) }, + body: sql, + }) + const body = await response.text() + if (!response.ok) throw new Error(`ClickHouse ${response.status}: ${body.slice(0, 1500)}`) + return body +} + +/** `SELECT … FORMAT JSONEachRow` into typed rows. */ +export const clickhouseSelect = async ( + sql: string, + targetDatabase: string, + settings: Readonly> = ANALYZER_STRICTNESS, +): Promise> => { + const body = await clickhouseExec(`${sql}\nFORMAT JSONEachRow`, targetDatabase, settings) + return body + .split("\n") + .filter((line) => line.trim().length > 0) + .map((line) => JSON.parse(line) as A) +} + +export const createDatabase = async (database: string): Promise => { + await clickhouseExec(`CREATE DATABASE ${database}`) +} + +export const dropDatabase = async (database: string): Promise => { + await clickhouseExec(`DROP DATABASE IF EXISTS ${database}`) +} + +/** Replay the real migration set through the shipped CLI. */ +export const applyRealMigrations = async (database: string): Promise => { + const child = spawn( + "bun", + [ + "run", + "--cwd", + "packages/clickhouse-cli", + "start", + "apply", + `--url=${clickhouseUrl}`, + `--user=${clickhouseUser}`, + `--password=${clickhousePassword}`, + `--database=${database}`, + ], + { cwd: repoRoot, stdio: ["ignore", "pipe", "pipe"] }, + ) + let stdout = "" + let stderr = "" + child.stdout.setEncoding("utf8").on("data", (chunk: string) => { + stdout += chunk + }) + child.stderr.setEncoding("utf8").on("data", (chunk: string) => { + stderr += chunk + }) + const exitCode = await new Promise((resolve, reject) => { + child.once("error", reject) + child.once("close", (code) => resolve(code ?? 1)) + }) + if (exitCode !== 0) throw new Error(`Migration CLI failed (${exitCode}): ${stderr || stdout}`) +} + +/** + * Drop `traces`' 30-day TTL in the ephemeral test database. + * + * Not a nicety: ClickHouse evaluates row TTL **at insert time** for a new part, so every + * fixture row lands and is dropped in the same request — `INSERT` returns 200 and + * `count()` returns 0, which is how this was found. Both replay corpora are historical by + * construction (the synthetic fixture pins a fixed 2023 timestamp so regeneration is + * byte-stable; the capture corpus is a recorded artifact), and retention has nothing to do + * with the classification algebra under test. The migration itself is untouched. + */ +export const dropTracesRetentionTtl = async (database: string): Promise => { + await clickhouseExec("ALTER TABLE traces REMOVE TTL", database) +} + +// --------------------------------------------------------------------------- +// the generated insert mapping +// --------------------------------------------------------------------------- + +interface DatasourceInsertMapping { + readonly table: string + readonly columns: ReadonlyArray + readonly selects: ReadonlyArray + readonly inputSchema: string +} + +interface LocalInsertsDocument { + readonly orgPlaceholder: string + readonly datasources: Readonly> +} + +const localInsertsPath = join(repoRoot, "apps/cli/src/server/schema/local-inserts.json") + +const readLocalInserts = (): LocalInsertsDocument => { + const parsed: unknown = JSON.parse(readFileSync(localInsertsPath, "utf8")) + if (typeof parsed !== "object" || parsed === null) throw new Error(`${localInsertsPath} is not an object`) + const document = parsed as LocalInsertsDocument + if (typeof document.orgPlaceholder !== "string" || typeof document.datasources !== "object") + throw new Error(`${localInsertsPath} is missing orgPlaceholder/datasources`) + return document +} + +/** Backslash first, or the quote escape is re-escaped — the Rust writer's rule. */ +const escapeSqlLiteral = (value: string): string => value.replace(/\\/g, "\\\\").replace(/'/g, "\\'") + +/** + * The exact INSERT statement `build_clickhouse_insert_sql` produces for `traces`: + * column list, `SELECT` list with the org placeholder replaced by a quoted literal, and + * `input()` over `FORMAT JSONEachRow` data. + */ +export const buildTracesInsertSql = (orgId: string): string => { + const document = readLocalInserts() + const mapping = document.datasources.traces + if (mapping === undefined) throw new Error(`${localInsertsPath} has no traces datasource`) + const orgLiteral = `'${escapeSqlLiteral(orgId)}'` + const selects = mapping.selects + .map((select) => (select === document.orgPlaceholder ? orgLiteral : select)) + .join(", ") + return `INSERT INTO ${mapping.table} (${mapping.columns.join(", ")}) SELECT ${selects} FROM input('${escapeSqlLiteral(mapping.inputSchema)}') FORMAT JSONEachRow` +} + +/** The export settings `TelemetryPipeline` sends with every ClickHouse insert. */ +const INGEST_INSERT_SETTINGS: Readonly> = { + input_format_skip_unknown_fields: "1", + date_time_input_format: "best_effort", +} + +/** + * Replay NDJSON rows through the ingest INSERT shape. Rows are written verbatim; batches + * keep any single request under a few MB, because the corpus contains multi-megabyte + * spans. + */ +export const insertTracesRows = async ( + database: string, + orgId: string, + rows: ReadonlyArray, + batchBytes = 4 * 1024 * 1024, + extraSettings: Readonly> = {}, +): Promise => { + const sql = buildTracesInsertSql(orgId) + const url = endpoint(database, { ...INGEST_INSERT_SETTINGS, ...extraSettings, query: sql }) + let batch: string[] = [] + let batchSize = 0 + let inserted = 0 + + const flush = async (): Promise => { + if (batch.length === 0) return + const response = await fetch(url, { + method: "POST", + redirect: "manual", + headers: { "Content-Type": "application/x-ndjson", ...clickhouseHeaders(database) }, + body: `${batch.join("\n")}\n`, + }) + const body = await response.text() + if (!response.ok) throw new Error(`ClickHouse insert ${response.status}: ${body.slice(0, 1500)}`) + inserted += batch.length + batch = [] + batchSize = 0 + } + + for (const row of rows) { + batch.push(row) + batchSize += row.length + 1 + if (batchSize >= batchBytes) await flush() + } + await flush() + return inserted +} + +// --------------------------------------------------------------------------- +// fixture records +// --------------------------------------------------------------------------- + +export interface FixtureVerdict { + readonly vendor: string + readonly session_state: number + /** A decimal string: a UInt64 hash above 2^53 does not survive `JSON.parse`. */ + readonly session_key_hash: string + readonly rules_version: number + /** Hex of the raw winning session-key value, or null below state 5. */ + readonly session_key_hex: string | null +} + +export interface FixtureRecord { + readonly id: string + readonly category: string + readonly note?: string + /** Present on synthetic fixtures; the corpus artifact carries rows only. */ + readonly rust?: FixtureVerdict + readonly capture?: string + /** The exact NDJSON line the row writer produced. */ + readonly row: string +} + +export const parseFixtureJsonl = (body: string): ReadonlyArray => + body + .split("\n") + .filter((line) => line.trim().length > 0) + .map((line) => JSON.parse(line) as FixtureRecord) + +export const syntheticFixturePath = join( + dirname(fileURLToPath(import.meta.url)), + "__fixtures__/equivalence-spans.jsonl", +) + +export const loadSyntheticFixtures = (): ReadonlyArray => + parseFixtureJsonl(readFileSync(syntheticFixturePath, "utf8")) + +/** The span id a row carries, used to name the offending span when a verdict differs. */ +export const rowSpanId = (record: FixtureRecord): string => { + const row: unknown = JSON.parse(record.row) + if (typeof row !== "object" || row === null) return "" + const spanId = (row as { span_id?: unknown }).span_id + return typeof spanId === "string" ? spanId : "" +} + +/** A readable dump of one row, for mismatch reports. */ +export const describeRow = (rowJson: string): string => { + const row: unknown = JSON.parse(rowJson) + if (typeof row !== "object" || row === null) return rowJson + const fields = row as Readonly> + const truncate = (value: unknown): string => { + const text = typeof value === "string" ? value : JSON.stringify(value) + return text !== undefined && text.length > 600 ? `${text.slice(0, 600)}…` : (text ?? "") + } + return [ + ` span_name = ${truncate(fields.span_name)}`, + ` scope_name = ${truncate(fields.scope_name)}`, + ` span_attributes = ${truncate(fields.span_attributes)}`, + ` scope_attributes = ${truncate(fields.scope_attributes)}`, + ` resource_attrs = ${truncate(fields.resource_attributes)}`, + ].join("\n") +} diff --git a/packages/domain/src/ai-registry/equivalence.clickhouse.e2e.test.ts b/packages/domain/src/ai-registry/equivalence.clickhouse.e2e.test.ts new file mode 100644 index 000000000..b2d166f47 --- /dev/null +++ b/packages/domain/src/ai-registry/equivalence.clickhouse.e2e.test.ts @@ -0,0 +1,297 @@ +// Rust↔SQL differential: the compiled registry, evaluated over the rows ingest wrote. +// +// `./compile-sql.clickhouse.e2e.test.ts` proves the generated SQL parses and type-checks. +// This suite proves it *means the same thing* as the Rust classifier in `apps/ingest`. +// +// The input is `__fixtures__/equivalence-spans.jsonl`: adversarial synthetic spans driven +// through `encode_traces` — the real row writer — by +// `apps/ingest/src/ai_equivalence_fixtures.rs`, each record carrying the exact NDJSON row +// the writer produced. Those rows already carry the Rust verdict in `ai_vendor` / +// `ai_session_key_state`, so the differential needs no join key and no second source of +// truth: it is `WHERE computed != stored` over the real `traces` schema, after replaying +// the rows through the real INSERT statement. +// +// bun ch:up +// CLICKHOUSE_E2E=1 bun run --cwd packages/domain test -- equivalence.clickhouse.e2e +// +// Scope note: this proves Rust↔SQL. trace-capture's reference evaluator +// (`scripts/verify-seed.ts`) is a third implementation with a different kvlist/bytes +// canonicalization; it is out of this loop by construction, because SQL reads the string +// the row writer already produced. See the fixture README. + +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { compileAiRegistrySql, compilePredicateSql, renderAiRegistrySelect } from "./compile-sql" +import { + ANALYZER_STRICTNESS, + applyRealMigrations, + clickhouseE2eEnabled, + clickhouseSelect, + createDatabase, + describeRow, + dropDatabase, + dropTracesRetentionTtl, + insertTracesRows, + loadSyntheticFixtures, + rowSpanId, + uniqueDatabase, +} from "./equivalence-support" + +const database = uniqueDatabase("maple_ai_equivalence_e2e") +const orgId = "org_equivalence" +const compiled = compileAiRegistrySql() + +const fixtures = loadSyntheticFixtures() +const bySpanId = new Map(fixtures.map((record) => [rowSpanId(record), record])) + +/** + * Spans whose Rust and SQL verdicts differ, pinned to the measured SQL verdict. + * + * **Empty, and expected to stay that way.** The two engines are exact mirrors: both + * resolve a matcher's keys in the one attribute list its class names (`targetForClass` + * here, `Matcher::target` in `apps/ingest/src/ai_registry.rs`), both treat the four + * pseudo-keys as class-free columns, and both read span attributes for the class-less + * predicates (unknown-tier fingerprints, session candidates, authority predicates). + * + * Until 2026-08 twelve spans were pinned here, under two findings that were really one + * root cause: the Rust classifier resolved every key span → scope → resource regardless + * of class. Its worst consequence was that `langsmith.internal_provider` — langchain's + * *insufficient* resource matcher key, which also lies inside langchain's attr-class + * `key_prefix(langsmith.)` family — satisfied that attr matcher from the resource, and + * the attr matcher promotes, so one resource attribute classified **every span of the + * process** as langchain, plain HTTP included and the value ignored. That defeated plan + * §1's sufficiency gate. Rust is now class-directed; the fallback survives only in + * trace-capture's single-seed `scripts/verify-seed.ts`, and no capture-corpus span + * distinguishes the two rules. + * + * A new entry here needs a written rationale for why a *deliberate* divergence is + * correct. The default reading of a mismatch is a bug on one side. + */ +interface PinnedDivergence { + readonly vendor: string + readonly sessionState: number + readonly why: string +} + +const PINNED_DIVERGENCES: Readonly> = {} + +interface DifferentialRow { + readonly SpanId: string + readonly AiVendor: string + readonly AiVendorComputed: string + readonly AiSessionKeyState: number + readonly AiSessionKeyStateComputed: number +} + +const DIFFERENTIAL_COLUMNS = ["SpanId", "AiVendor", "AiSessionKeyState"] as const + +/** Every row with its stored (Rust) and computed (SQL) verdict side by side. */ +const differentialSql = (): string => + `SELECT * FROM (\n${renderAiRegistrySelect(compiled, "traces", { + passthrough: [...DIFFERENTIAL_COLUMNS], + })}\n)` + +const report = (rows: ReadonlyArray): string => + rows + .map((row) => { + const record = bySpanId.get(row.SpanId) + return [ + `- ${record?.id ?? row.SpanId} [${record?.category ?? "?"}] ${record?.note ?? ""}`, + ` rust = ${JSON.stringify(row.AiVendor)}/${row.AiSessionKeyState} sql = ${JSON.stringify(row.AiVendorComputed)}/${row.AiSessionKeyStateComputed}`, + record === undefined ? "" : describeRow(record.row), + ] + .filter((line) => line.length > 0) + .join("\n") + }) + .join("\n\n") + +describe.skipIf(!clickhouseE2eEnabled)("Rust↔SQL span classification equivalence", () => { + let differential: ReadonlyArray = [] + + beforeAll(async () => { + await createDatabase(database) + await applyRealMigrations(database) + await dropTracesRetentionTtl(database) + const inserted = await insertTracesRows( + database, + orgId, + fixtures.map((record) => record.row), + ) + expect(inserted).toBe(fixtures.length) + differential = await clickhouseSelect( + differentialSql(), + database, + ANALYZER_STRICTNESS, + ) + }, 180_000) + + afterAll(async () => { + await dropDatabase(database) + }, 30_000) + + it("round-trips every fixture row through the real INSERT unchanged", async () => { + expect(fixtures.length).toBeGreaterThan(250) + const stored = await clickhouseSelect<{ + readonly SpanId: string + readonly AiVendor: string + readonly AiSessionKeyState: number + readonly Hash: string + readonly AiRulesVersion: number + }>( + "SELECT SpanId, AiVendor, AiSessionKeyState, toString(AiSessionKeyHash) AS Hash, AiRulesVersion FROM traces", + database, + ) + expect(stored).toHaveLength(fixtures.length) + for (const row of stored) { + const record = bySpanId.get(row.SpanId) + expect(record, `no fixture for span ${row.SpanId}`).toBeDefined() + // The stored columns must still be exactly what Rust wrote — in particular the + // UInt64 hash, which is the value the hash-alignment suite compares against. + expect({ id: record?.id, ...row }).toEqual({ + id: record?.id, + SpanId: row.SpanId, + AiVendor: record?.rust?.vendor, + AiSessionKeyState: record?.rust?.session_state, + Hash: record?.rust?.session_key_hash, + AiRulesVersion: record?.rust?.rules_version, + }) + } + }) + + it("computes the same vendor and session-key state as the Rust writer for every span", () => { + expect(differential).toHaveLength(fixtures.length) + const mismatches = differential.filter( + (row) => + row.AiVendorComputed !== row.AiVendor || + row.AiSessionKeyStateComputed !== row.AiSessionKeyState, + ) + const unexpected = mismatches.filter((row) => { + const record = bySpanId.get(row.SpanId) + return record === undefined || PINNED_DIVERGENCES[record.id] === undefined + }) + expect(unexpected.length, `Rust/SQL verdicts differ:\n\n${report(unexpected)}\n`).toBe(0) + }) + + it("diverges on exactly the spans PINNED_DIVERGENCES lists, and nothing else", () => { + const mismatches = new Map( + differential + .filter( + (row) => + row.AiVendorComputed !== row.AiVendor || + row.AiSessionKeyStateComputed !== row.AiSessionKeyState, + ) + .map((row) => [bySpanId.get(row.SpanId)?.id ?? row.SpanId, row]), + ) + for (const [id, pinned] of Object.entries(PINNED_DIVERGENCES)) { + const row = mismatches.get(id) + expect( + row, + `${id} no longer diverges — remove it from PINNED_DIVERGENCES (${pinned.why})`, + ).toBeDefined() + expect({ vendor: row?.AiVendorComputed, sessionState: row?.AiSessionKeyStateComputed }).toEqual({ + vendor: pinned.vendor, + sessionState: pinned.sessionState, + }) + } + // Nothing diverges that is not pinned — today, nothing diverges at all. + expect(Object.keys(PINNED_DIVERGENCES).sort()).toEqual([...mismatches.keys()].sort()) + }) + + it("keeps present-but-empty distinguishable from absent", () => { + // The algebra's load-bearing subtlety, asserted as an absolute value rather than + // merely "the same as Rust": `mapContains` must see a key whose value is '', where + // `!= ''` would collapse state 4 into state 3 and drop the unknown-tier fingerprint. + const verdict = (id: string): DifferentialRow => { + const spanId = fixtures.find((record) => record.id === id) + expect(spanId, `missing fixture ${id}`).toBeDefined() + const row = differential.find((candidate) => candidate.SpanId === rowSpanId(spanId as never)) + expect(row, `no differential row for ${id}`).toBeDefined() + return row as DifferentialRow + } + + expect(verdict("present_empty/unknown_genai").AiVendorComputed).toBe("unknown:genai") + expect(verdict("present_empty/unknown_openinference").AiVendorComputed).toBe("unknown:openinference") + expect(verdict("present_empty/state4_vs_state3_empty").AiSessionKeyStateComputed).toBe(4) + expect(verdict("present_empty/state4_vs_state3_absent").AiSessionKeyStateComputed).toBe(3) + // An empty authority value still satisfies a `present()` authority predicate. + expect(verdict("present_empty/authority_key_empty").AiSessionKeyStateComputed).toBe(6) + // …and cannot satisfy an `eq()` one: flue's gated candidate scores 2, and its + // ALWAYS candidate carries the reduction to 3 (key absent). + expect(verdict("present_empty/eq_authority_empty").AiSessionKeyStateComputed).toBe(3) + // `eq()` against a non-empty literal must not match an empty value. + expect(verdict("present_empty/eq_matcher_not_satisfied").AiVendorComputed).toBe("") + }) + + it("evaluates value_prefix identically to a byte compare over the same column", async () => { + // `value_prefix` (D1) is the one operator the registry does not currently use, so no + // vendor branch exercises it and the differential above cannot reach it. It is still + // part of the algebra both engines must implement, and Rust implements it as + // `value.starts_with(prefix)` over the pseudo-key's *canonical string* — the same + // string the row's column holds. So the claim is checkable without a registry rule: + // compile the predicate, evaluate it in ClickHouse over every fixture row, and compare + // against the byte compare Rust would do on the same column value. + const probes = [ + { key: "scope.name", prefix: "openinference." }, + { key: "scope.name", prefix: "com.anthropic.claude_code" }, + { key: "scope.name", prefix: "" }, + { key: "span.name", prefix: "LanguageModel." }, + { key: "span.name", prefix: "claude_code.interaction" }, + { key: "scope.version", prefix: "1.2" }, + { key: "scope.version", prefix: "2.0.0-rc" }, + { key: "scope.schema_url", prefix: "https://opentelemetry.io/" }, + // Multi-byte: the prefix ends inside a sequence of astral characters. + { key: "span.name", prefix: "LanguageModel.generateTé" }, + ] as const + const rowColumn: Readonly> = { + "scope.name": "scope_name", + "span.name": "span_name", + "scope.version": "scope_version", + "scope.schema_url": "scope_schema_url", + } + + const projections = probes + .map( + (probe, index) => + `toUInt8(${compilePredicateSql({ op: "value_prefix", key: probe.key, prefix: probe.prefix }, "span")}) AS p${index}`, + ) + .join(",\n\t") + const results = await clickhouseSelect>>( + `SELECT SpanId,\n\t${projections}\nFROM traces`, + database, + ANALYZER_STRICTNESS, + ) + expect(results).toHaveLength(fixtures.length) + + const disagreements: string[] = [] + for (const result of results) { + const record = bySpanId.get(String(result.SpanId)) + if (record === undefined) continue + const row: unknown = JSON.parse(record.row) + const fields = row as Readonly> + probes.forEach((probe, index) => { + const columnName = rowColumn[probe.key] as string + const value = fields[columnName] + const expected = typeof value === "string" && value.startsWith(probe.prefix) ? 1 : 0 + if (Number(result[`p${index}`]) !== expected) + disagreements.push( + `${record.id}: value_prefix(${probe.key}, ${JSON.stringify(probe.prefix)}) sql=${result[`p${index}`]} bytes=${expected} column=${JSON.stringify(value)}`, + ) + }) + } + expect(disagreements, disagreements.join("\n")).toEqual([]) + }) + + it("reproduces the first-occurrence-wins dedup the row writer applied", () => { + // The row Map keeps the first occurrence for registry keys only; SQL reads that Map, + // so agreement here is what makes partial dedup sound (plan §6). + const verdictFor = (id: string): DifferentialRow => { + const record = fixtures.find((candidate) => candidate.id === id) + const row = differential.find((candidate) => candidate.SpanId === rowSpanId(record as never)) + expect(row, `no differential row for ${id}`).toBeDefined() + return row as DifferentialRow + } + expect(verdictFor("duplicate/gen_ai_system_spring_first").AiVendorComputed).toBe("spring_ai") + expect(verdictFor("duplicate/gen_ai_system_strands_first").AiVendorComputed).toBe("strands") + expect(verdictFor("duplicate/session_id_valid_then_empty").AiSessionKeyStateComputed).toBe(6) + expect(verdictFor("duplicate/session_id_empty_then_valid").AiSessionKeyStateComputed).toBe(4) + }) +}) diff --git a/packages/domain/src/ai-registry/hash-alignment.clickhouse.e2e.test.ts b/packages/domain/src/ai-registry/hash-alignment.clickhouse.e2e.test.ts new file mode 100644 index 000000000..325569d7e --- /dev/null +++ b/packages/domain/src/ai-registry/hash-alignment.clickhouse.e2e.test.ts @@ -0,0 +1,123 @@ +// `AiSessionKeyHash`: the same 64 bits in Rust and in ClickHouse. +// +// The construction is `cityHash64(value)` over the winning session-key value, and the +// Rust side implements it in `apps/ingest/src/cityhash102.rs` (CityHash **1.0.2**, the +// variant ClickHouse's `cityHash64` still ships). The variant is the load-bearing part: +// CityHash 1.1 differs on inputs ≤ 32 bytes and > 64 bytes, so a crate tracking upstream +// would return different numbers for the same bytes and silently desync Rust from SQL. +// +// The chain asserted here closes on the row: the Rust generator proves +// `classification.session_key_hash() == cityhash102::city_hash64(value)` and that the +// value equals `row.ai_session_key_hash`; `./equivalence.clickhouse.e2e.test.ts` proves +// that hash survives the real INSERT into `traces.AiSessionKeyHash` unchanged; this suite +// proves ClickHouse computes the same number from the same value. +// +// Values are passed as `unhex(...)` rather than string literals so that embedded NULs, +// lone control characters and astral-plane UTF-8 reach the server as the exact bytes Rust +// hashed — a literal-escaping bug would otherwise show up as a hash mismatch and be misread +// as a variant mismatch. One ASCII vector is additionally checked as a plain literal to +// prove `unhex` is not itself the thing under test. +// +// bun ch:up +// CLICKHOUSE_E2E=1 bun run --cwd packages/domain test -- hash-alignment.clickhouse.e2e + +import { describe, expect, it } from "vitest" +import { + ANALYZER_STRICTNESS, + clickhouseE2eEnabled, + clickhouseExec, + clickhouseSelect, + loadSyntheticFixtures, +} from "./equivalence-support" + +interface HashVector { + readonly id: string + readonly valueHex: string + readonly expected: string +} + +const vectors: ReadonlyArray = loadSyntheticFixtures().flatMap((record) => { + const key = record.rust?.session_key_hex + if (key === null || key === undefined) return [] + return [ + { + id: record.id, + valueHex: key, + expected: record.rust?.session_key_hash ?? "", + }, + ] +}) + +const decode = (hex: string): string => Buffer.from(hex, "hex").toString("utf8") + +describe.skipIf(!clickhouseE2eEnabled)("AiSessionKeyHash Rust↔ClickHouse alignment", () => { + it("covers the adversarial value shapes, not just ASCII", () => { + // A guard on the guard: if the fixture ever stops producing resolved session keys + // with these shapes, the rest of this suite silently proves much less. + expect(vectors.length).toBeGreaterThan(40) + const values = vectors.map((vector) => decode(vector.valueHex)) + expect(values.some((value) => value.includes(" "))).toBe(true) + expect(values.some((value) => /[\u{10000}-\u{10FFFF}]/u.test(value))).toBe(true) + expect(values.some((value) => value.length > 60_000)).toBe(true) + expect(values.some((value) => value.includes("'") || value.includes("\\"))).toBe(true) + expect(values.some((value) => value.includes("\0"))).toBe(true) + }) + + it("computes cityHash64(value) identically to the Rust writer", async () => { + const rows = vectors + .map((vector) => `('${vector.id.replace(/'/g, "''")}', '${vector.valueHex}')`) + .join(",\n\t") + const results = await clickhouseSelect<{ readonly id: string; readonly hash: string }>( + `SELECT + id, + toString(cityHash64(unhex(value_hex))) AS hash +FROM values('id String, value_hex String', + ${rows} +)`, + "default", + ANALYZER_STRICTNESS, + ) + + expect(results).toHaveLength(vectors.length) + const byId = new Map(results.map((row) => [row.id, row.hash])) + const mismatches = vectors + .filter((vector) => byId.get(vector.id) !== vector.expected) + .map( + (vector) => + `${vector.id}: rust=${vector.expected} clickhouse=${byId.get(vector.id)} value=${JSON.stringify(decode(vector.valueHex).slice(0, 120))}`, + ) + expect(mismatches, `hash construction diverges:\n${mismatches.join("\n")}`).toEqual([]) + }) + + it("agrees when the same bytes are written as a plain SQL literal", async () => { + // `unhex` is the transport, not the claim. One pure-ASCII vector, spelled out. + const vector = vectors.find((candidate) => decode(candidate.valueHex) === "sess-claude") + expect(vector, "fixture no longer contains the ASCII control vector").toBeDefined() + const body = await clickhouseExec( + `SELECT toString(cityHash64('sess-claude')) FORMAT TabSeparated`, + "default", + ANALYZER_STRICTNESS, + ) + expect(body.trim()).toBe((vector as HashVector).expected) + }) + + it("pins the negative: multi-argument cityHash64 is a different function", async () => { + // Why any SQL that recomputes this column must pass exactly one argument. + // `cityHash64(a, b)` combines per-argument hashes rather than hashing the + // concatenation, so a rebuild written that way would produce a column that never + // matches a stored one. + const body = await clickhouseExec( + `SELECT + toString(cityHash64('ab')) AS single, + toString(cityHash64('a', 'b')) AS multi +FORMAT TabSeparated`, + "default", + ANALYZER_STRICTNESS, + ) + const [single, multi] = body.trim().split("\t") + // The same number `cityhash102.rs`'s `single_argument_form_is_the_reproducible_one` + // pins on the Rust side. + expect(single).toBe("1725057946192985918") + expect(multi).not.toBe(single) + }) +})