Certification Protocol v1.0
Bring any model (an OpenAI-compatible endpoint or an MCP server), your own parser (exposed as a black-box MCP tool), and optionally your own harness. Certify per competency on held-out plansets, earn a verifiable OpenTakeoff Certified credential, and put it on a Hugging Face model card, GitHub README, or LinkedIn profile. Your weights, parser internals, and raw traces never leave your machine.
Free in-browser self-test — no session, no signup. Run a practice takeoff entirely in your browser (a one-click demo, or your own endpoint) against a public answer key and see a real APE score. Nothing is recorded. Open the self-test →
Proctored certification — request a session. The Academy drives your endpoint against a held-out planset you have never seen and issues a weighted, verifiable badge. Request certification →
Generalist (broad takeoff across trades) or Vertical-Specialist (deep trade suites; first live: Division 9 / flooring). Certification is per-track, so a specialist parser can earn a specialist mark without being a generalist.
Pull the public practice suite (answer keys included) and wire your model + parser (MCP) + harness with the conformance SDK. Iterate freely on your own compute, with your own keys. All practice work is fully private.
Self-Reported: run the ranked suite locally and submit the signed run-bundle (a PR to submissions/). Certified: request a proctored eval — the Academy delivers a fresh held-out batch you've never seen, drives your endpoint/MCP, and records provenance on its side.
APE / count-error / scale-error / scope-F1, plus efficiency, plus provenance sanity checks that flag gamed runs (a correct answer with zero measurement steps, superhuman speed, missing emit_quantity calls, or a planset assetHash mismatch).
If the tier threshold clears, the Academy issues a signed cert (schema/cert.schema.json) with a unique id, suite version, score vs baseline, and issue + expiry dates — mapped onto Open Badges 3.0.
Your ticket appears on the leaderboard and gets a public, verifiable cert page. Copy the badge + model-index block to your model card, the badge to your README, and an Open-Badge entry to LinkedIn.
You can't have a run that is fully private and a publicly trustworthy cert — a self-run harness can be rigged, and signing proves only what was recorded. So the Academy separates privacy of your IP from verifiability of the score.
You run the ranked suite on your own infra via the conformance SDK and submit the signed run-bundle.
The Academy runs a fresh held-out set you have never seen against your endpoint / MCP server (or your sealed container), records provenance on its side, and scores it.
Any model reachable via an OpenAI-compatible endpoint (Ollama, LM Studio, vLLM, LiteLLM, hosted APIs) or an MCP server. Built-in Academy tools handed to every agent: set_scale, measure_area, measure_length, count, identify_scope, emit_quantity.
1 · Run the public practice suite against your own model (your keys, your compute):
npx opentakeoff-academy run \
--track div9 --suite practice \
--endpoint http://localhost:11434/v1 --model my-model \
--out ./runs/my-run.bundle.json2 · Bring your own parser as a black-box MCP server:
npx opentakeoff-academy run --track div9 --suite practice \
--endpoint http://localhost:11434/v1 --model my-model \
--mcp ./my-parser.mcp.json --out ./runs/my-run.bundle.json3 · Score locally against the practice keys:
npx opentakeoff-academy score ./runs/my-run.bundle.json --track div9 --suite practiceBring your own harness? Produce a conformant bundle (adapter: "custom-bundle") with the SDK helpers, then validate it:
npx opentakeoff-academy validate ./runs/my-run.bundle.jsonSubmit for the leaderboard: open a PR adding your bundle under submissions/. CI verifies the bundle hash, scores it against hidden ground truth, and updates the leaderboard.
Always private — never leaves your machine or your black box:
Your score on Academy-controlled held-out tasks. Trace args/result for your own MCP tools may be redacted ({"$redacted": true}) — the scorer needs the produced quantities and the call graph, not your parser's internals.
Read the full protocol in PROTOCOL.md, wire up the practice suite, and open your first submission PR.