feat(learning): AdCP for Decision-Makers certification track (reasoning-only, L1–L3)#5518
feat(learning): AdCP for Decision-Makers certification track (reasoning-only, L1–L3)#5518bokelley wants to merge 2 commits into
Conversation
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>
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
There was a problem hiding this comment.
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
Lshipsbadge_type = NULL, and the specialization-track gate atserver/src/db/certification-db.ts:992filtersWHERE t.badge_type IS NOT NULL.decision_makerssetsrequires_any_track_complete = falseandrequires_credential = NULL, so completing L1–L3 awards onlydecision_makersand leaves Practitioner ineligible. The header comment at513_decision_makers_track.sql:670-674documents 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 migrationsuccess_criteriaand 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→ badgeadcp_decision_maker→ modules referencingtrack_id='L'→ credential referencingbadge_id='adcp_decision_maker'. No forward reference. - Idempotent. Four
ON CONFLICT (id) DO UPDATEupserts on the declared PKs reconcile every non-key column; the per-fileBEGIN/COMMITrunner 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-expertflagged it: L3 is configured as a regularinteractivemodule (duration 15, no capstone flag), so it inherits the 4-turn module floor rather than the 6-turn/10-min capstone floorinstructional-design.mdx:163-164reserves 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 hardeningl3_ex1_sc_decision_artifactto 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:634all repeat "not a substitute for, or an easier route to, Basics or Practitioner" — good. But thebadges.adcp_decision_makerdescription 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)
- sort_order gap. Track
Lusessort_order = 7and the credential uses8, 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.
|
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.
|
Both items addressed in the follow-up commit (39d5552): L3 capstone enforcement (was blocking) — fixed. The root issue was that the Fix: added a
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 ( Triaged by Claude Code. Session: https://claude.ai/code/session_0151DotkT11Nifaeb6St475B Generated by Claude Code |
There was a problem hiding this comment.
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
Lseedsbadge_type = NULL, andcheckCredentialEligibilityfiltersWHERE t.badge_type IS NOT NULLatserver/src/db/certification-db.ts:992— so completing L1+L2+L3 cannot count toward the Practitionerrequires_any_track_completecheck. Thedecision_makerscredential isrequires_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. (AandSalready seedbadge_type = NULLtoo — L is not a new pattern.) - Migration is idempotent. Every INSERT in
513_decision_makers_track.sqlusesON CONFLICT (id) DO UPDATEagainst the PK, updating every non-id column viaEXCLUDED.*. 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:636addsisDecisionArtifactCapstone = mod.id === 'L3'as anelse ifbetween theisBuildProject(B4/C4/D4) branch and the default — the build-project path is untouched, andmod.idis 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). Nostatic/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.
formatstaysinteractive, so L3 completes viacomplete_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 inDECISION_ARTIFACT_CAPSTONE_SUPPLEMENT— the server only checks that thel3_ex1_sc_decision_artifactcriterion 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_safetyis 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," withmediumandlowdescriptors close enough to invite inter-rater disagreement. Worth tightening themediumfloor 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)
- 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.
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.
Lwithbadge_type = NULL— so completing it does not satisfy the Practitioner credential's "any specialization track complete" check (verified below).interactive, emptysandbox_actions,tenant_idsNULL): L1 the reversed data flow → L2 your data/brand/governance as the control surface → L3 deciding & leading (capstone = a decision artifact, not a build).adcp_decision_makerbadge and the tier-1decision_makerscredential (requires only L1–L3; no prerequisite credential).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).docs/learning/overview.mdxand thedocs.jsonnav (both source version blocks; frozendist/blocks untouched).What reviewers should sanity-check
L.badge_type = NULLis load-bearing. Confirmed via the realcheckCredentialEligibility/checkAndAwardCredentialspath: completing L1+L2+L3 auto-awards onlydecision_makersand leaves Practitioner ineligible.measurement/taxonomy.mdx).Verification
test:docs-nav21/21 (all pages exist across version blocks); broken-links check passed;docs.jsonvalid JSON.Note for whoever merges
Migration 513 is free on
origin/maintoday (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