It is a Collector processor, a CLI, and a config generator for two processors that
ship with the stock Collector. Those are three different answers to "where in the pipeline", and the
design exists to make all three the same decision.
Three places it can run
The interesting part is the third one. -emit ottl prints a transform config and
-emit schema-file prints a Telemetry Schema File, so the mapping can run inside a
Collector that never heard of this binary.
The mapping travels even when the binary does not. Row C is why "you would have to run
my fork of the Collector" is not an objection: the OTTL config runs in the Collector the customer
already has.
The type model
Six dialects implement one three-method interface. A dialect scores a span before it is allowed to
parse it, and the comment on Score is the design rule: detection is a claim of
responsibility, not a guess.
Adding a dialect is one file: it registers itself from its own init, so
nothing central needs editing. raw is marked a fallback so it is only consulted when
no dialect claims the span, which keeps it from eating the winner's confidence margin.
Why one decision serves three deployments
normalize.Span does not mutate anything. It returns a description of an
edit, and the caller applies it to whatever representation it happens to be holding. That is
the hinge the whole design turns on.
Because the decision is data, the same mapping can be unit tested, golden tested,
rendered as someone else's config, and applied in two runtimes without a second implementation
drifting away from the first.
What lands on the span
Attribute
What it records
interlingua.dialect
Which emitter claimed the span
interlingua.dialect.confidence
The winner's margin over the runner-up. Zero means a tie, or a fallback that was the only thing left
interlingua.lossy
The keys this span is no longer a faithful carrier of
interlingua.lossy.count
Written even when zero, so "nothing was lost" is a fact you can query rather than an absence you have to trust
interlingua.replaced.<key>
Where a value the emitter stated was changed
interlingua.hops, .mapping
How many normalizations this span has been through, and by what
Read in source, 17 September 2026.internal/dialect/dialect.go (interface, Detect, Scores),
internal/normalize/normalize.go (Options, Result,
Span), internal/emit/, processor/genaiinterlingua/ (its own Go
module), cmd/interlingua/main.go.