spec-led-certification

August 8, 2026 · View on GitHub

A Claude Code plugin that picks a professional certification the way you would run a procurement: write the specification first, then go to market.

Choosing a certification is normally market-led — I work in this field, here is what's on offer, this one looks well-regarded, I'll sit that. The exam's blueprint becomes your specification by default, and the criteria you would have written are recovered afterwards as reasons for a choice already made. The tell is that the answer is usually the most famous option.

This inverts the order. It interviews you first, derives a weighted scorecard from your answers alone, freezes it before anything is looked up, and only then surveys the market and scores what it finds against it.

Three ways in

The stages are the same every time; the situation you arrive in is not. Each gets its own entry point rather than a branch inside one skill.

Entry pointWhenCosts
start-searchFirst run, or a new subject~an hour, nearly all of it intake
rerun-searchIntake on file — has the market moved?Minutes plus a fresh sweep
update-profileSomething about you changedA couple of minutes

rerun-search archives the previous run to runs/<date>/ — scorecard, data and conclusion together — and its report leads with what changed: whether the earlier recommendation still holds, which scores moved and why, what entered or left. That comparison is the payoff for having written the profile down.

update-profile deliberately stops short of researching. It re-interviews only what changed and marks the scorecard stale, so the next run rebuilds it. A two-minute correction should not drag an hour of research behind it, and a market sweep should not quietly reopen questions about you that nobody asked to reconsider.

/cert-search reads the state on disk and routes to the right one.

The stages

SkillQuestion
create-workspaceWhere does this search live? Private GitHub repo from the template, cloned
scaffold-workspaceSame, but a plain local directory with no remote
define-specWhat field, and which capability areas specifically?
benchmark-meWhere are you now — read off repos, site, CV, not self-report
learning-preferencesHow do you take information in, and what has failed before?
define-objectivesWhat is the credential for, who has to believe it, what are your standing positions, by when, and what would make it not worth doing at all?
define-budgetMoney and hours, captured separately because they fail separately
build-scorecardWeighted anchored criteria and hard filters — then freeze
research-marketSurvey, filter on eligibility, price the whole route, score with sources
recommendThe answer, why the runner-up lost, where to invest, what would change it

Install

/plugin marketplace add danielrosehill/Claude-Code-Plugins
/plugin install spec-led-certification@danielrosehill

Optional: Typst for the PDF. Everything else works without it — the markdown stands on its own.

Use

/cert-search                                  # read the state and route
/cert-search "agentic AI development"         # first run, subject given
/cert-search --rerun                          # re-sweep the market, keep the profile
/cert-search --update                         # change what's stored about you
/cert-search --repo                           # force a private GitHub repo workspace
/cert-search --local --in certification       # local folder instead, in a subdirectory
/cert-search --lean                           # don't bundle the skills into the workspace

Or invoke a skill directly — "where do I stand on this", "build me a scorecard for this", "what certifications are out there for X", "why did you rank that second", "has anything changed since last time", "I've got more study time now".

What makes it different from asking an assistant for a list

The freeze. No credential is named, searched for, or considered until the scorecard says frozen: true. Three things enforce it: every criterion carries a source column naming the line in your profile it came from, the scorecard is committed before research runs, and the research subagent never sees the intake conversation — so there is no anchor available to bend toward.

Hard requirements exclude, they don't score down. A requirement that can be outweighed is not a requirement. Eligibility gates and non-negotiables filter candidates out entirely, and the excluded ones appear in the report with the filter they failed — so "why not that one?" isn't re-asked on every run.

Every claim carries its source tier. V vendor-confirmed, S secondary, I inferred, printed next to the score. Certification research has a specific bias in its material: the bodies that certify often gate their blueprints, and the sites that are not gated are mostly selling preparation. A recommendation resting on inferred scores has to say so.

Every number in the report is computed from the data. The Typst template reads the CSVs at compile time and works out the totals, the ranking and the comparison table itself; the writing step produces prose only. A report whose narrative can drift from its arithmetic is untrustworthy in exactly the respect that matters.

Where the state lives

In your working directory, as markdown and CSV — never in an agent's memory store.

profile/      spec, benchmark, learning preferences, objectives, budget
scorecard/    criteria.csv, filters.csv, methodology.md
research/     candidates.csv, scores.csv, candidates/*.md, sources.md
report/       narrative.yaml, meta.yaml, report.typ, build.sh
runs/<date>/  archived previous runs — scorecard, data and conclusion together
pdf/          the built report

By default create-workspace makes that directory a private GitHub repo from the template, so the search survives the machine and its git history shows when the scorecard was frozen relative to when the research ran. Your own defaults for that — owner, visibility, where clones land, naming — live in ~/.claude-plugins/spec-led-certification/config.yaml, outside both this plugin and the template, so they are never committed to a public repo and survive /plugin update.

Two reasons this is on disk at all, and the second matters more. You can read, correct, date and diff a profile that lives in a file. And you may run the next pass with a different assistant entirely — the directory goes with you, an agent's memory does not. By default the scaffold also drops copies of the skills into the workspace, so it stays runnable without this plugin installed.

Every profile file carries captured and review_after, and they decay at different rates: what you know is stale in a quarter, how you learn is much the same in five years. A re-run six months later re-asks the one file that expired and confirms the other four.

Relationship to the template repo

The canonical source is Spec-Led-Certification, a GitHub template repository. Clone it and the workflow runs standalone, with no plugin and no Claude Code — the skills are plain markdown procedures.

This plugin is a packaging of it, for people who would rather install once and run the workflow in any directory than clone a repo per search. The twelve skills, the three subagents and the workspace template are vendored from there verbatim:

./scripts/sync-from-template.sh --check     # report drift
./scripts/sync-from-template.sh             # refresh from upstream

Only commands/, skills/scaffold-workspace/ and .claude-plugin/ are owned here. Changes to any stage skill go upstream first, then come back through the sync — the template repo is the source, this is the generated target.

The worked example lives upstream too, in examples/worked-run/: a complete scored run with deliberately fictional credentials, whose most instructive case is the best-known credential in the set finishing last — not because it is weak, but because that spec weighted recognition at 0.05.

Architecture

This plugin follows Plugin–Workspace–Vault and is that pattern's worked example: a public plugin, a private workspace instantiated per search from a public template repo, and a vault at ~/.claude-plugins/spec-led-certification/ for your own defaults. Three parts, three lifecycles — the plugin is replaced on update, the workspace is yours and permanent, the vault survives both and is committed nowhere.

Licence

MIT