Skip to content

docs(aao-verified): make Live independent of Spec#3536

Merged
bokelley merged 1 commit intomainfrom
bokelley/aao-verified-orthogonal-axes
Apr 29, 2026
Merged

docs(aao-verified): make Live independent of Spec#3536
bokelley merged 1 commit intomainfrom
bokelley/aao-verified-orthogonal-axes

Conversation

@bokelley
Copy link
Copy Markdown
Contributor

Summary

The merged AAO Verified docs framed (Spec) as a prerequisite for (Live). That's wrong. A seller using `@adcp/sdk` who flows real production traffic shouldn't have to stand up a sandbox/test endpoint just to earn (Spec) before (Live) can issue.

The two axes demonstrate conformance through different evidence:

  • (Spec) — wire format, task shape, error semantics, state-machine transitions verified via storyboard simulation against a test endpoint.
  • (Live) — wire format, filters, lifecycle, scope introspection, reporting consistency verified via real-traffic observation against a real ad server over a 7–14 day rolling window.

Either is sufficient for the claims it covers. Some sellers can only earn one or the other:

Holding Common shape
(Spec) only Test agents, sandboxes, pre-production rollouts, or capabilities with no canonical-campaign path
(Live) only SDK-built agents whose wire format is guaranteed by the SDK, or production-only platforms with no test-mode surface
(Spec + Live) The strongest claim — both axes verified independently

Why this matters now

Before any seller in the ecosystem builds toward "I need (Spec) before I can earn (Live)" — which a couple of partner conversations were already heading. Forcing SDK-built agents to stand up a separate mock endpoint is busywork that proves nothing the SDK didn't already guarantee.

Files changed

  • `docs/building/aao-verified.mdx` — top-level framing, (Live) eligibility, badge-reading table, mark semantics, lifecycle (revocations no longer cascade between axes)
  • `docs/building/conformance.mdx` — containment paragraph rewritten as "both marks attest conformance via different evidence"

What did not change

The badge code already supports `verification_modes: ['live']` standalone — the prerequisite was a stated convention, never enforced. So this is a docs-only correctness fix.

`verification_modes: ['live']` (without 'spec') is already a valid wire-format value:

  • The Zod schema accepts it (`z.array(z.enum(VERIFICATION_MODES))`)
  • The DB CHECK constraint accepts it (`<@ ARRAY['spec', 'live']` plus non-empty)
  • `renderBadgeSvg` renders `(Live)` correctly when 'spec' is absent
  • JWT signing/verification rounds-trips it

Test plan

  • No code changes — existing 64 verification tests still cover the orthogonal model
  • Docs render check
  • WG soundness check on the orthogonality claim (optional but worth surfacing)

🤖 Generated with Claude Code

The prerequisite framing was wrong. A seller using @adcp/sdk who flows
real production traffic but never bothered building a sandbox shouldn't
have to stand up a mock endpoint just to earn (Spec) before (Live) can
issue. The eight observability checks already exercise wire format,
filters, lifecycle, and scope through real traffic — the simulation
pass would be redundant for that seller.

The two axes are now stated as orthogonal: each independently
demonstrates conformance through different evidence (Spec via
simulation, Live via real-traffic observation). Either is sufficient
for the claims it covers.

Updated:
- aao-verified.mdx — top-level framing, (Live) eligibility table,
  badge-reading table, mark semantics list, lifecycle (revocations
  no longer cascade between axes).
- conformance.mdx — containment paragraph rewritten as
  "both marks attest conformance via different evidence."

No code changes — verification_modes already supported ['live']
standalone; the badge issuance logic never enforced a prerequisite.
This was a docs-only correctness fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@bokelley bokelley merged commit 5740802 into main Apr 29, 2026
18 checks passed
@bokelley bokelley deleted the bokelley/aao-verified-orthogonal-axes branch April 29, 2026 23:06
bokelley added a commit that referenced this pull request Apr 29, 2026
…spec docs (#3537)

Cleans up the doc drift after PR #2153 (badge implementation + (Spec)/(Live) reframing) and PR #3536 (independence clarification). Internal contradiction in `conformance.mdx` resolved; six call-sites in `accounts/overview.mdx` qualified to (Live) where they pivot on `attestation_verifier`; three new sections in `aao-verified.mdx` (How to claim each qualifier, What AAO Verified is not, Relationship to supporting specs); changeset updated to reflect the orthogonal-axes framing.

Reporting/runner-scope split surfaced via doc Note pointing at #3561.

Pre-3.1 GA full sweep tracked in #3564.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bokelley added a commit that referenced this pull request Apr 30, 2026
Three follow-ups to #3524:

1. Docs (docs/building/aao-verified.mdx). Last updated for the
   orthogonal-axes framing in #3536; didn't mention the per-version
   model that just shipped. Added a "Per-version badges" section,
   updated the SVG/embed sections with both URL shapes (legacy
   auto-upgrade and version-pinned), added adcp_version to the JWT
   claim block with explicit verifier guidance ("verifiers MUST
   check adcp_version against the AdCP version they care about" —
   closes the cross-version replay concern from Stage 2's security
   review), and added a brand.json enrichment subsection documenting
   the badges[] array and the deprecation policy.

2. Refactor for testability. The shaping logic that builds the
   aao_verification block was a closure inside the brand.json route
   handler — unreachable from unit tests. Extracted to
   services/aao-verification-enrichment.ts as
   buildAaoVerificationBlock(badges). The route handler keeps the
   JSON traversal and assignment; the builder is pure with 14 new
   unit tests covering empty input, single-badge, multi-version
   dedupe with caller-ordering preserved, modes_by_role flattening
   (the "buyer pinned to 3.0 sees the wrong contract" footgun),
   adcp_version shape filtering (defense in depth), and the
   deprecation notice content. Code-review nit on PR #3604.

3. PROTOCOL_LABELS audit comment in dashboard-agents.html. The
   `${protocol} Agent${versionSegment}` label construction relies
   on PROTOCOL_LABELS values not ending in "Agent" — added a
   comment pinning the invariant so a future contributor adding a
   new protocol doesn't accidentally produce "Foo Agent Agent 3.1".
   DX expert nit from #3603.

No wire-format changes — brand.json output is byte-for-byte
identical to what shipped in #3604. Panel UX changes (role
grouping, "show all versions" disclosure) explicitly defer until
parallel-version badges land in production with real buyer feedback
to design against.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bokelley added a commit that referenced this pull request Apr 30, 2026
…3654)

Three follow-ups to #3524:

1. Docs (docs/building/aao-verified.mdx). Last updated for the
   orthogonal-axes framing in #3536; didn't mention the per-version
   model that just shipped. Added a "Per-version badges" section,
   updated the SVG/embed sections with both URL shapes (legacy
   auto-upgrade and version-pinned), added adcp_version to the JWT
   claim block with explicit verifier guidance ("verifiers MUST
   check adcp_version against the AdCP version they care about" —
   closes the cross-version replay concern from Stage 2's security
   review), and added a brand.json enrichment subsection documenting
   the badges[] array and the deprecation policy.

2. Refactor for testability. The shaping logic that builds the
   aao_verification block was a closure inside the brand.json route
   handler — unreachable from unit tests. Extracted to
   services/aao-verification-enrichment.ts as
   buildAaoVerificationBlock(badges). The route handler keeps the
   JSON traversal and assignment; the builder is pure with 14 new
   unit tests covering empty input, single-badge, multi-version
   dedupe with caller-ordering preserved, modes_by_role flattening
   (the "buyer pinned to 3.0 sees the wrong contract" footgun),
   adcp_version shape filtering (defense in depth), and the
   deprecation notice content. Code-review nit on PR #3604.

3. PROTOCOL_LABELS audit comment in dashboard-agents.html. The
   `${protocol} Agent${versionSegment}` label construction relies
   on PROTOCOL_LABELS values not ending in "Agent" — added a
   comment pinning the invariant so a future contributor adding a
   new protocol doesn't accidentally produce "Foo Agent Agent 3.1".
   DX expert nit from #3603.

No wire-format changes — brand.json output is byte-for-byte
identical to what shipped in #3604. Panel UX changes (role
grouping, "show all versions" disclosure) explicitly defer until
parallel-version badges land in production with real buyer feedback
to design against.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bokelley added a commit that referenced this pull request May 1, 2026
- Rename "Two marks: AdCP Conformant vs AAO Verified" section in
  aao-verified.mdx to "Naming history" — cold readers see the current
  single-mark framing, not a confusing two-marks heading
- Fix malformed 3-column table row in the same section
- Replace ⊆ containment notation in conformance.mdx with the
  independence-first phrasing established in #3536
- Update salty-wasps-cheat.md: remove "Spec is a prerequisite for
  measuring Live" (directly contradicts #3536 orthogonal-axes fix)
- Update account-authorization-and-rbac-errors.md: qualify
  attestation_verifier as binding to the AAO Verified (Live) qualifier

Item 4 of the sweep (attestation_verifier doc check conditional on
#3561) remains open on the parent issue.

Refs #3564

https://claude.ai/code/session_013WywfzRTvdv2kWUZdp7aBz

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants