TL;DR — I instrumented a deterministic, content-blind AI workflow enforcer with the emerging OpenTelemetry GenAI semantic conventions. It technically worked, but pinched in six specific places — each one exposing the same hidden assumption: that a GenAI system is, by definition, a model invoker. This post catalogs the six frictions, shows the design I shipped instead, and follows one friction into a live semantic-conventions discussion.
What you'll get out of it
A concrete map of where the GenAI conventions assume a model sits at the center of every span
A reusable pattern for instrumenting orchestration / governance / policy layers that don't call models
Why "refused" must not be encoded as "errored," and how to fix that in one line






