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