Skip to content

feat(learning): AdCP for Decision-Makers certification track (reasoning-only, L1–L3)#5518

Open
bokelley wants to merge 2 commits into
mainfrom
decision-maker-cert-path
Open

feat(learning): AdCP for Decision-Makers certification track (reasoning-only, L1–L3)#5518
bokelley wants to merge 2 commits into
mainfrom
decision-maker-cert-path

Conversation

@bokelley

Copy link
Copy Markdown
Contributor

Why

Every existing track gates on hands-on work — A1 has you query a live agent, the role tracks culminate in building one. The brand-side decision-makers in docs/learning/test-personas.md (James, F500 brand lead; Daniela, agency VP; Priya, SMB founder) evaluate, brief, and decide but delegate the building — so today they can't earn any credential, and the strong narrative docs written for them (monetizing-ai, adcp-vs-openrtb, the FAQ measurement answers) are orphaned from every learning path. This closes that gap.

What

A standalone, free, reasoning-only credential — AdCP for Decision-Makers — assessed through strategic reasoning, never code or live-agent queries.

  • Migration 513 seeds:
    • Track L with badge_type = NULL — so completing it does not satisfy the Practitioner credential's "any specialization track complete" check (verified below).
    • Modules L1/L2/L3 (free, interactive, empty sandbox_actions, tenant_ids NULL): L1 the reversed data flow → L2 your data/brand/governance as the control surface → L3 deciding & leading (capstone = a decision artifact, not a build).
    • The adcp_decision_maker badge and the tier-1 decision_makers credential (requires only L1–L3; no prerequisite credential).
    • 9 success criteria, each with a stable semantic id for targeted recertification.
  • Docs under docs/learning/decision-makers/ — overview, L1/L2/L3, and a "How to explain agentic advertising" cheat-sheet — routing the previously-orphaned narratives into the curriculum, with agency/SMB lenses, a brand-data readiness bar, decision-artifact templates, and a pilot-economics reasoning scaffold (no fabricated figures/competitor names).
  • Discovery: entries in docs/learning/overview.mdx and the docs.json nav (both source version blocks; frozen dist/ blocks untouched).

What reviewers should sanity-check

  • Practitioner isolationL.badge_type = NULL is load-bearing. Confirmed via the real checkCredentialEligibility/checkAndAwardCredentials path: completing L1+L2+L3 auto-awards only decision_makers and leaves Practitioner ineligible.
  • Reasoning, not recall, not code — every criterion is gradable by Sage through conversation; none requires running code or querying a live agent (the hard guardrail).
  • Terminology — uses "agentic advertising" (the house term), not "AI-native advertising" (a coinage that collides with "AI-native channels" in measurement/taxonomy.mdx).
  • A catalog is not required to advertise — L2 frames inputs as a control dial, not a checklist: brand identity + content standards + a goal are the levers, a catalog matters for product campaigns, and regulatory compliance is enforced automatically by governance regardless.
  • Cheat-sheet editorial line — the published page uses only publishable, attributed framings (Ben Masse's egta CEO Summit keynote; AdCP's own docs). Internal Slack one-liners were deliberately kept out of the public page.

Verification

  • Migration applies on a fresh DB in sequence and is idempotent across re-runs; dimension weights sum to 100/module; 9 criteria intact.
  • Pre-commit suite green: 4152 tests passed, typecheck 0 errors.
  • test:docs-nav 21/21 (all pages exist across version blocks); broken-links check passed; docs.json valid JSON.

Note for whoever merges

Migration 513 is free on origin/main today (latest is 512). Heads-up: parallel unmerged cert branches also claim adjacent slots (S6 → 513, S7 → 514). Whoever merges first wins the number; the rest renumber. This migration is fully idempotent and number-agnostic, so renumbering is a pure file rename — re-check the latest migration number right before merge.

🤖 Generated with Claude Code

A standalone, free, reasoning-only credential for non-technical brand
leaders, agency execs, and SMB owners who evaluate, brief, and decide on
agentic advertising but do not build agents — closing the gap that every
other track (A/B/C/D) gates on hands-on agent work those personas delegate.

- Migration 513 seeds track L (badge_type NULL, so completing it does not
  satisfy the Practitioner specialization-track requirement), modules
  L1/L2/L3 (free, interactive, empty sandbox_actions — no live-agent
  queries), the adcp_decision_maker badge, and the tier-1 decision_makers
  credential (requires only L1–L3, no prerequisite credential). Every
  success criterion has a stable semantic id for recertification;
  assessment is strategic reasoning, never code or live-agent queries.
- New docs under docs/learning/decision-makers/ (overview + L1/L2/L3 + a
  "How to explain agentic advertising" cheat-sheet) that route the
  previously-orphaned monetizing-ai, adcp-vs-openrtb, and FAQ measurement
  narratives into the curriculum, with agency/SMB lenses, a brand-data
  readiness bar, decision-artifact templates, and a pilot-economics
  reasoning scaffold (no fabricated figures).
- Discovery entries in the certification overview and docs.json nav
  (both source version blocks; frozen dist blocks untouched).

Verified: migration applies on a fresh DB and is idempotent across re-runs;
the real checkCredentialEligibility/checkAndAwardCredentials path grants
decision_makers and withholds Practitioner; cert test suite, docs-nav
(21/21), docs.json validity, and typecheck all pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mintlify

mintlify Bot commented Jun 14, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
adcp 🟢 Ready View Preview Jun 14, 2026, 12:41 PM

💡 Tip: Enable Workflows to automatically generate PRs for you.

aao-release-bot[bot]
aao-release-bot Bot previously approved these changes Jun 14, 2026

@aao-release-bot aao-release-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clean seed migration plus the learner-facing docs that route four orphaned narratives into a real credential. Approving — the load-bearing isolation invariant holds and the SQL↔MDX consistency is exact.

Things I checked

  • Practitioner isolation is real, not asserted. Track L ships badge_type = NULL, and the specialization-track gate at server/src/db/certification-db.ts:992 filters WHERE t.badge_type IS NOT NULL. decision_makers sets requires_any_track_complete = false and requires_credential = NULL, so completing L1–L3 awards only decision_makers and leaves Practitioner ineligible. The header comment at 513_decision_makers_track.sql:670-674 documents exactly this. Load-bearing and correct.
  • SQL↔MDX consistency is exact. All 9 criterion ids (l1_ex1_sc_*, l2_ex1_sc_*, l3_ex1_sc_*) appear once in the migration success_criteria and once in each module's "What you'll demonstrate" section — no orphans, no drift. Dimension weights sum to 100/module (L1 35+35+20+10, L2 35+30+25+10, L3 30+35+25+10); all thresholds 70.
  • FK order on a fresh apply is sound. Within the file: track L → badge adcp_decision_maker → modules referencing track_id='L' → credential referencing badge_id='adcp_decision_maker'. No forward reference.
  • Idempotent. Four ON CONFLICT (id) DO UPDATE upserts on the declared PKs reconcile every non-key column; the per-file BEGIN/COMMIT runner makes re-apply atomic. Apostrophe escaping inside the embedded JSON literals (buyer''s, learner''s, clients'') is correctly doubled throughout.
  • Migration 513 is free on origin/main (latest is 512) — confirmed. Your merge note about S6/S7 racing for 513/514 is the right flag; the file is number-agnostic so a rename is the whole fix.
  • `empty-frontmatter changeset is the repo convention for docs/seed-only changes — not a wire-touching PR, so no version bump is owed.

Follow-ups (non-blocking — file as issues)

  • L3 is a capstone wearing module clothes. education-expert flagged it: L3 is configured as a regular interactive module (duration 15, no capstone flag), so it inherits the 4-turn module floor rather than the 6-turn/10-min capstone floor instructional-design.mdx:163-164 reserves for capstones. "Produce a business case / agency brief" is exactly the deliverable a learner can paste pre-written. Worth either tagging L3 as a capstone for enforcement, or hardening l3_ex1_sc_decision_artifact to require the artifact be grounded in the learner's own org (captured turn 1) and defended under live follow-up — a pasted doc falls apart under Socratic challenge, a reasoned one doesn't.
  • Badge description loses its disclaimer when it travels. The overview, comparison table, credential description, and learning/overview.mdx:634 all repeat "not a substitute for, or an easier route to, Basics or Practitioner" — good. But the badges.adcp_decision_maker description string (513..._track.sql:703-705) is what surfaces standalone in the cert UI and on exported/shared credentials, stripped of surrounding context. Add the one-liner there too.

Minor nits (non-blocking)

  1. sort_order gap. Track L uses sort_order = 7 and the credential uses 8, leaving credential slot 7 empty against existing 1–6 (513..._track.sql:689,886). Cosmetic; leave it.

Approving on the strength of the verified Practitioner isolation plus exact criterion-id/weight parity between the migration and the docs. Follow-ups noted.

@geneticallymodifiedfoodforthought

Copy link
Copy Markdown

The overall design is right — closing the decision-maker credential gap is overdue and the Practitioner isolation is verified. Two things I want addressed before this merges.

L3 capstone enforcement (blocking)

L3 is functionally the capstone of this track but the migration seeds it as a standard interactive module. There's no module_type or equivalent signal that tells Sage to treat it as a capstone assessment rather than a conversational module. The risk: a learner can pass L3 on fluent reasoning alone without actually producing a decision artifact. For the specific audience this credential is targeting — executives comparing credentials and evaluating whether to stake institutional reputation on AdCP — that's a credibility problem. Either add a module_type: capstone field to the migration or open a blocking issue before merge. The design intent is right; the enforcement mechanism needs to match it.

Recertification trigger (non-blocking, but needs a documented owner)

Nine stable semantic IDs for targeted recertification is smart. What's missing is an explicit trigger: when 3.1 ships (specifically the governance changes tracking in rc.4), L2's "governance as a control dial" framing will need updating. Right now there's no mechanism that surfaces this as a recertification event. A comment in the migration or a linked issue is enough — just needs to exist so it doesn't fall through the cracks. A credential teaching outdated governance concepts to budget owners is reputational exposure, not docs debt.

Merge after L3 enforcement is addressed. The rest is solid.

…tification note

Address two reviewer concerns from PR #5518:

1. L3 capstone enforcement (was blocking): add DECISION_ARTIFACT_CAPSTONE_SUPPLEMENT
   constant to certification-tools.ts and wire it into the start_module dispatch for
   L3. Sage now receives an explicit instruction that fluent reasoning is necessary
   but not sufficient — the learner must produce a business case, agency brief, or
   phased adoption plan before complete_certification_module is accepted.

2. Recertification trigger (non-blocking): add maintenance comments to
   513_decision_makers_track.sql documenting that when AdCP 3.1 ships (specifically
   the governance changes tracked in rc.4), L2's governance framing
   (l2_ex1_sc_generation_time_brand_safety, governance_model dimension) will need
   updating. The stable semantic ids on all 9 criteria enable targeted recertification.

Migration format stays 'interactive' — L3 is not a specialist capstone/lab; the
enforcement lives in the Sage prompt layer, consistent with how B4/C4/D4 use
BUILD_PROJECT_METHODOLOGY rather than a format flag.
@bokelley

Copy link
Copy Markdown
Contributor Author

Both items addressed in the follow-up commit (39d5552):

L3 capstone enforcement (was blocking) — fixed.

The root issue was that the start_module dispatch in certification-tools.ts only has two paths: build-project modules (B4, C4, D4) get BUILD_PROJECT_METHODOLOGY, everything else gets TEACHING_METHODOLOGY. L3 fell through to the standard teaching path with no capstone signal.

Fix: added a DECISION_ARTIFACT_CAPSTONE_SUPPLEMENT constant and a new isDecisionArtifactCapstone check for mod.id === 'L3'. When L3 starts, Sage now receives TEACHING_METHODOLOGY plus the supplement, which explicitly instructs her that:

  • fluent discussion of the concepts is necessary but not sufficient
  • the learner must produce a business case, agency brief, or phased adoption plan in the conversation before complete_certification_module is accepted
  • redirect language if they try to skip: "L3 culminates in a decision artifact — walk me through your [artifact]"

format stays 'interactive' — that enum is reserved for the specialist capstone/lab flow (S1–S5 with CAPSTONE_METHODOLOGY and Practitioner gating). The enforcement mechanism here is the Sage prompt layer, consistent with how build-project capstones work.

Recertification trigger (non-blocking) — documented.

Added a maintenance comment on the L2 block in the migration naming the 3.1 governance changes (rc.4 cycle), the specific criterion and dimension affected (l2_ex1_sc_generation_time_brand_safety, governance_model), and a pointer to the 9 stable semantic ids that enable targeted recertification when the update ships. Also added a comment on L3 cross-referencing the DECISION_ARTIFACT_CAPSTONE_SUPPLEMENT so the two sides of the enforcement are findable from the migration.

Triaged by Claude Code. Session: https://claude.ai/code/session_0151DotkT11Nifaeb6St475B


Generated by Claude Code

@aao-release-bot aao-release-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving. A standalone reasoning-only credential whose "not a substitute for Practitioner" claim is enforced in the data model, not just asserted in prose — that's the right shape.

Things I checked

  • Practitioner isolation is real. Track L seeds badge_type = NULL, and checkCredentialEligibility filters WHERE t.badge_type IS NOT NULL at server/src/db/certification-db.ts:992 — so completing L1+L2+L3 cannot count toward the Practitioner requires_any_track_complete check. The decision_makers credential is requires_any_track_complete = false, requires_credential = NULL, required_modules = '{L1,L2,L3}', so it gates solely on its own three modules. Load-bearing and correct. (A and S already seed badge_type = NULL too — L is not a new pattern.)
  • Migration is idempotent. Every INSERT in 513_decision_makers_track.sql uses ON CONFLICT (id) DO UPDATE against the PK, updating every non-id column via EXCLUDED.*. Re-runs converge. Matches migration 274's pattern exactly.
  • Embedded JSON holds. Dimension weights sum to 100 per module (L1 35+35+20+10, L2 35+30+25+10, L3 30+35+25+10). Apostrophes inside JSON string values are correctly doubled (buyer''s, ''banner ads in AI apps'') — no broken JSON, no SQL string break. FK order is satisfied: badge before credential, track before modules.
  • L3 wiring is contained. certification-tools.ts:636 adds isDecisionArtifactCapstone = mod.id === 'L3' as an else if between the isBuildProject (B4/C4/D4) branch and the default — the build-project path is untouched, and mod.id is the DB-stored uppercase 'L3', so no casing bug. Template-literal backtick escaping is correct.
  • Changeset matches convention. Empty ---/--- frontmatter (no version bump) is the established form for non-spec server changes here (cf. 2303-policy-attribution-pattern.md). No static/schemas/source/** touched, so no bump is the right call.
  • Migration number. 513 is free on main (latest is 512), matching the PR's own heads-up.

Follow-ups (non-blocking — file as issues)

  • L3's "capstone" rigor is prompt-layer, not server-gated. format stays interactive, so L3 completes via complete_certification_module (4 turns / 5 min minimums), not the specialist capstone gate (6 turns / 10 min). The "artifact must be produced, not described" rule lives entirely in DECISION_ARTIFACT_CAPSTONE_SUPPLEMENT — the server only checks that the l3_ex1_sc_decision_artifact criterion id is marked verified, not that an artifact was produced. Defensible (the supplement is unambiguous to Sage, and the migration comment is honest about it), but "the capstone" reads as more rigorous than the S1–S5 capstones that are server-gated. Either align the label or give L3 a server-checkable signal.
  • l2_ex1_sc_generation_time_brand_safety is the criterion most exposed to grading drift. It asks a non-technical learner to thread "different control, not categorically better" + "only workable mechanism on-platform" + "not a blocklist," with medium and low descriptors close enough to invite inter-rater disagreement. Worth tightening the medium floor and watching in calibration data.
  • Aggregate vs per-dimension 70%. L1–L3 pass on a weighted aggregate; the specialist capstones require 70% per dimension. A learner could fail the 35%-weighted "executive communication" dimension and still pass L1 — for a credential whose pitch is "can explain it to a CMO," confirm the aggregate behavior is intended or add a floor on the communication/paradigm dimensions.

Minor nits (non-blocking)

  1. The drift coupling is now documented, which means it's now load-bearing. The migration carries two hand-sync obligations in comments — L1's paradigm framing must track A1 (migration 274), and L2's governance framing must track the AdCP 3.1 cycle. Both are correctly flagged with the exact criterion ids to revisit; just note that "update both or they drift" is a standing maintenance cost three modules now carry.

code-reviewer: ready to push, no blockers. education-expert: pedagogically sound, ships safely, no High — the two items above are its MEDIUMs, both follow-ups.

LGTM. Follow-ups noted below.

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.

3 participants