Notes from the Implementer Seat
Standards takes written from the spectator seat are weightless — nothing happens when you're wrong. Running a live AdCP signals agent is different: the freshness gap you file becomes a merged schema field, the compliance grader that wrongly grades your perfect run becomes a P0 fix, and your wire-size data reshapes a design in review. The diligence question for any agentic vendor: show me your issues, not your deck.
On this page
Most standards commentary is written from the spectator seat. You read the spec, you form a take, you publish the take. The take is usually fine. It is also usually weightless, because nothing happens to you when you are wrong.
The implementer seat is different. I build and operate a live AdCP signals agent — the No Fluff Advisory adaptor, listed in the AAO registry, with all-pass conformance runs across the 3.0 and 3.1.0 GA suites. When the protocol has a gap, my agent fails a storyboard at 2am. When the conformance grader has a bug, my dashboard says “Degraded” in front of anyone who looks. The protocol bills me for my opinions.
This essay is what that seat has taught me — told through the actual issues and pull requests, because in standards work the receipts are the argument.
The freshness field nobody had
Run a signals agent for a while and you notice something the spec review never surfaced: a buyer agent receiving a signal record has no standard way to know how fresh it is. Is this audience definition from yesterday or from March? In a market where agents act on signals without a human sanity-check, that is not a metadata nicety. It is a trust gap.
So I filed the gap analysis (#5248) and authored the fix: a last_updated field on signal-definition (PR #5249), merged and shipping in the 3.1.0 line since rc.7.
The lesson: protocol gaps appear at runtime, not in document review. Nobody reads a schema and thinks “this lacks a freshness contract.” You only feel it when your agent has to decide whether to act on a record of unknown age.
When the grader lies
In June, a rollup regression in the compliance grader started rendering all-pass single-protocol runs as “Degraded.” My agent had a perfect run and a failing grade. For a registry-listed agent, that is not cosmetic — conformance status is the product.
I root-caused it to the exact commit that introduced it, filed it (#5429, triaged P0 by the maintainers), and authored the merged fix (PR #5444).
The lesson: the conformance tooling is part of the standard. A spec with a buggy grader is a buggy spec, operationally — because what implementers and buyers experience is the grade, not the prose. If you are evaluating an agentic vendor, ask who fixes the test harness when it is the harness that is wrong.
Deprecating politely
Earlier in the cycle, the webhook-signing guidance still carried a deprecated HMAC framing. I inventoried every place it leaked into the storyboards and SDK on-ramps (#4270) and drafted the PRs pointing the defaults at RFC 9421 (#4273, #4275). Those drafts were closed in favor of the maintainer implementation — which is exactly how it should work — and the 3.0.9 line realigned away from HMAC.
The lesson: sometimes your contribution is the case, not the commit. Standards bodies run on maintainer trust; an implementer who insists on landing their own patch over making the argument well is optimizing for credit instead of the protocol.
A test suite is only as real as its edge cases
Signals-only agents used to fail storyboards that had nothing to do with them — media-buy gating applied to agents that never buy media, error-handling tracks gated behind tasks a signals agent does not implement, envelope assertions against transport responses where the field does not exist.
Six root-caused reports later (#2916, #3350, #4009, and earlier #2535, #3999, #4065), the 3.1.0 suite skips non-applicable gating and gives signals-only agents dedicated error-handling and schema-validation storyboards.
The lesson: a standard claims to support a class of participant; the test suite decides whether that claim is true. Single-protocol agents are the canary for whether “modular” is real.
Review is where implementers earn their seat
The most consequential signals work in the current cycle — the signal-definition epistemic and provenance layer (#5017) — is maintainer-authored, not mine. My contribution was review: field-level schema notes, and one piece of data nobody writing the document could have had — actual wire sizes from a live agent. Five enriched signals weighed in at 88 KB against a 64 KB probe ceiling. That number is what drove the progressive-disclosure design.
The lesson: implementers bring evidence to review that no amount of careful reading can produce. And crediting the author accurately is not modesty — in a working group, overclaiming is how you lose the seat.
Interoperability is a crosswalk problem, not a primitive problem
A newer thread shows the same discipline from a different angle: geographic cell targeting. RFC #5969 defines geo_cells / geo_cells_exclude as the addressable unit for geo targeting — deliberately not defining what a seller does when it cannot execute on that unit natively, which is every seller today. The WG named that gap decision point X-A vs. X-B; the resolution (X-B) keeps the wire contract minimal (“MUST NOT deliver outside the declared cells”) and pushes the conversion machinery into a companion document instead of the normative surface.
Working with Nathan Woodman (@nwoodman-spec), I filed both halves of that companion: cell-to-execution conversion (#6013) and cell-grain delivery reporting (#6014). The #6014 design — cell as a fifth geo_level, inheriting the existing per-level reporting apparatus rather than a parallel array — is one I proposed on #5969; Nathan wrote the full specification.
A small confession is part of the record: an earlier comment on #5969 referenced the reporting companion by a placeholder number that never got replaced. Nathan went looking for it while writing #6013 and correctly couldn’t find it. I fixed the record once both issues existed, accepted the one sentence #5969 needed in its own normative text (binding the delivery restriction to the seller’s output footprint, not its internal representation), and added a privacy-considerations note a third contributor pushed on: a resolution floor alone doesn’t protect a sparse cell, and an audience floor alone doesn’t stop someone from drawing geometry around one household — you need both, stated together.
The lesson: a placeholder reference is a debt against your collaborator’s time, not a stylistic shortcut — fix it before someone goes looking for it. And the same interoperability argument that justifies a spatial base unit generalizes cleanly to time: my draft framing for a temporal companion proposes UTC hour-of-week as the base unit, with broadcast-day conventions as declared, versioned crosswalks onto it — never the reverse — for the same reason geo_cells doesn’t defer to administrative boundaries. It’s still a draft, posted for a gut check before it goes anywhere formal. That’s the nature of the seat: some proposals are load-bearing before you’re sure they’re right.
What I am proposing next
Three open threads, stated as proposals because that is what they are:
- Runtime attestations — verifier-signed signal-quality evidence on
check_governance(#5418; the issue is titled for 3.1, the posted RFC proposes it as a 3.2 candidate). If agents are going to act on signals, the quality evidence should travel with the signal. - A revocation primitive —
revoke_activation(#4203), because governed activation without governed un-activation is half a contract. Alongside it, a Measurement Feedback Signal (#4296). - Migration coordination — the RFC 9421 adoption telemetry and threshold work (#4205) and the JWKS adoption baseline that gates chain-of-custody work (#4206). Deprecations without adoption data are just wishes.
All of these may merge, change, or close. That is the nature of the seat.
The operator takeaway
If you are a buyer, a board, or an operator evaluating anyone’s agentic advertising story — including mine — the diligence question is simple: show me your issues, not your deck. A vendor who runs a live agent against the public conformance suite has receipts: merged PRs, root-caused bugs, review contributions with data, proposals that survived contact with maintainers. A vendor who does not will show you architecture slides.
The implementer seat is slower than the spectator seat. It is also the only seat where you find the freshness gaps, catch the grader lying, and learn what five signals actually weigh on the wire.
That discomfort is the point.
The full contribution record, with statuses validated against the public AdCP repository, lives on the AdCP protocol guide. The agent itself is documented at Building: AdCP Signals Adaptor.