Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Vet the concrete third-party model a study will be built on — this repository, this revision, this checkpoint — not the architecture family. Records a model dossier (source and version pin, licence and the file it was read from, intended use, pretrained-weight provenance, model task vs study task, reported validation, what the model was developed on, your evaluation arms) and gates it deterministically. Catches what a licence check and a citation count cannot: an evaluation arm sitting on the be
.claude/skills/aperivue-model-sourcing/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 74% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 110% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 92% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 51% | 0% |
/architecture-zoo answers a literature question — which family of model suits this task. That question has a stable answer. The next question does not: which concrete artifact do I run? A repository, a revision, a checkpoint. That is a provenance question, and the two facts a careful researcher usually checks are the two that cannot answer it.
The licence tells you whether you may use it. The citation count tells you whether others did. Neither tells you whether the number you are about to report means what you will say it means.
The failure this skill exists for is the quietest one in the lane. A method developed and tuned against a benchmark family gets evaluated by the next person on that same family, and the resulting figure reads like validation while sitting much closer to a training-set score. Nothing in the repository says so. The licence is clean, the paper is peer-reviewed and highly cited, the task matches, the code runs on your GPU. The conflict lives in the relationship between two facts that are documented in different places — what the model was developed on, and what you are about to evaluate it on — and it becomes visible only when they are written down side by side.
Writing them down side by side is what the dossier is for.
weights) and are about to build a study on it.
reviewer asking what it was trained on.
/architecture-zoo (archetypes and the task-to-architecturelogic; deliberately not a live leaderboard).
/model-scaffold. Designing the validation study →/model-validation. Computing held-out metrics → /model-evaluation.
/model-card (Model Card + Datasheet)./profile-imaging./mllm-eval (which ownspretraining-contamination of public benchmarks for that setting).
One JSON file recording what is known, with unknowns left unstated rather than guessed:
json{ "model": "OrganSeg-3D v2.5.1", "source": {"kind": "github", "url": "...", "version": "v2.5.1", "commit": "abc1234"}, "licence": {"spdx": "Apache-2.0", "verified_from": "LICENSE at commit abc1234"}, "intended_use": "research", "weights": {"pretrained": false}, "task": {"model": "3d_ct_organ_segmentation", "study": "3d_ct_organ_segmentation"}, "reported_validation": [{"dataset": "ExampleBench", "metric": "Dice", "source": "J Ex 2021"}], "developed_on": ["ExampleBench"], "evaluation_arms": [{"name": "external", "dataset": "OtherCohort-2026"}], "hardware": {"claimed": "any CUDA GPU", "verified_on": "GTX 1080 Ti", "verified": true} }
Each field is read from the artifact, not from memory: the licence from the LICENSE file at the pinned commit (a README badge is not the licence), developed_on from the paper's own account of where the method was built and tuned, hardware.verified only after it has actually run.
developed_on is the field people skip, and it is the one the gate needs. A method that won a challenge was tuned on that challenge.
bashpython3 scripts/check_model_provenance.py --dossier model_dossier.json \ --out qc/model_provenance.json --strict
Stdlib-only, network-free — no repository is fetched and no licence resolved online, so the audit re-runs anywhere the JSON travels. Verdicts:
| Verdict | Severity | Fires when | |---|---|---| | BENCHMARK_PROVENANCE_CONFLICT | Major | an evaluation arm uses a dataset the model was developed or tuned on | | EVAL_DATA_IN_TRAINING | Major | an evaluation arm's dataset is inside the pretraining corpus | | LICENCE_UNSTATED | Major | no licence recorded — which is not the same as a permissive one | | LICENCE_INCOMPATIBLE | Major | a non-commercial / research-only licence under commercial or deployment intent | | WEIGHTS_PROVENANCE_UNKNOWN | Major | pretrained weights whose training corpus is not stated | | TASK_MISMATCH | Minor | the model's task is not the study's task | | NO_VERSION_PIN | Minor | no commit, tag or revision | | VALIDATION_UNREPORTED | Minor | no reported validation (dataset + metric + source) | | HARDWARE_UNVERIFIED | Minor | hardware support claimed but never executed | | LICENCE_UNVERIFIED | Minor | a licence is named but the file it was read from is not |
The gate flags a relationship, not a reputation. A dossier that declares developed_on: ExampleBench passes cleanly as long as no evaluation arm uses ExampleBench. Being developed on a benchmark is not a defect; evaluating on it and calling that independent is. The clean fixture exists to prove exactly that distinction.
Dataset names are matched as token sequences with a small family-alias table, so MSD Task09 Spleen matches MSD and MS Cohort 2026 does not. Matching never falls back to substring search.
A BENCHMARK_PROVENANCE_CONFLICT is rarely a reason to abandon the model — it is usually the best-engineered option precisely because it was tuned hard. It is a reason to change what the arm is claimed to establish:
method works.
An EVAL_DATA_IN_TRAINING is different in kind: that arm produces a training-set score and cannot be reported as validation at all.
Carry the dossier forward — /model-validation (arm design), /model-evaluation (what each arm may claim), /model-card (provenance section), /write-paper (Methods + Limitations).
model_dossier.json — the provenance record downstream skills and the Methods section read.qc/model_provenance.json — deterministic audit with verdicts.LICENCE_UNSTATED,never "probably MIT"; an unstated pretraining corpus is a Major finding, never an assumption.
file at the pinned revision, and record which file that was.
actually runs is a different claim; a CUDA capability the compiler accepts may still be refused by a compiler in the same stack.
gate say so.
scripts/check_model_provenance.py — 10 verdicts by set arithmetic over the dossier, stdlib-only and network-free. Reproducible challenge: bash ${CLAUDE_SKILL_DIR}/scripts/check_model_provenance_challenge/verify.sh. Regression suite: bash ${CLAUDE_SKILL_DIR}/tests/test_model_provenance.sh.
architecture-zoo (which family?) -> model-sourcing (this skill: which artifact, and what may its
numbers claim?) -> profile-imaging / preprocess-imaging -> model-scaffold -> model-validation
-> model-evaluation -> model-card -> write-paper| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | pass→fail | 24,341 | 11,962 | -51% | 1 | 1 | 0% | 4,731 | 4,456 | -6% | 0 | 0 | — |
case-01 | fail→fail | 21,770 | 15,117 | -31% | 1 | 1 | 0% | 4,221 | 2,532 | -40% | 0 | 0 | — |
case-02 | fail→fail | 16,662 | 4,646 | -72% | 1 | 1 | 0% | 3,107 | 2,306 | -26% | 0 | 0 | — |
case-03 | fail→fail | 25,147 | 5,318 | -79% | 1 | 1 | 0% | 5,265 | 2,314 | -56% | 0 | 0 | — |
case-04 | pass→pass | 21,929 | 17,003 | -22% | 1 | 1 | 0% | 3,274 | 4,814 | +47% | 0 | 0 | — |
case-05 | pass→pass | 23,478 | 6,970 | -70% | 1 | 1 | 0% | 3,871 | 3,081 | -20% | 0 | 0 | — |
case-07 | fail→pass | 13,359 | 8,767 | -34% | 1 | 1 | 0% | 2,118 | 3,681 | +74% | 0 | 0 | — |
case-08 | pass→pass | 24,509 | 3,240 | -87% | 1 | 1 | 0% | 1,964 | 2,550 | +30% | 0 | 0 | — |
case-09 | fail→pass | 11,975 | 3,710 | -69% | 1 | 1 | 0% | 1,812 | 2,687 | +48% | 0 | 0 | — |
case-10 | fail→fail | 10,489 | 4,604 | -56% | 1 | 1 | 0% | 814 | 2,907 | +257% | 0 | 0 | — |
case-11 | fail→pass | 8,746 | 5,402 | -38% | 1 | 1 | 0% | 1,380 | 2,900 | +110% | 0 | 0 | — |
case-12 | fail→pass | 9,047 | 4,779 | -47% | 1 | 1 | 0% | 1,504 | 2,886 | +92% | 0 | 0 | — |
case-13 | fail→pass | 18,520 | 3,391 | -82% | 1 | 1 | 0% | 1,717 | 2,591 | +51% | 0 | 0 | — |
case-14 | fail→pass | 8,864 | 3,092 | -65% | 1 | 1 | 0% | 1,440 | 2,603 | +81% | 0 | 0 | — |
case-15 | fail→pass | 9,560 | 5,048 | -47% | 1 | 1 | 0% | 1,494 | 2,915 | +95% | 0 | 0 | — |
case-16 | fail→pass | 9,195 | 2,508 | -73% | 1 | 1 | 0% | 1,468 | 2,439 | +66% | 0 | 0 | — |
case-17 | fail→pass | 13,624 | 5,833 | -57% | 1 | 1 | 0% | 2,293 | 3,127 | +36% | 0 | 0 | — |
case-18 | pass→pass | 15,691 | 9,795 | -38% | 1 | 1 | 0% | 2,588 | 3,690 | +43% | 0 | 0 | — |
case-19 | fail→pass | 16,636 | 7,570 | -54% | 1 | 1 | 0% | 2,510 | 3,320 | +32% | 0 | 0 | — |
case-20 | fail→pass | 11,221 | 6,705 | -40% | 1 | 1 | 0% | 1,734 | 3,250 | +87% | 0 | 0 | — |
case-21 | fail→pass | 8,910 | 3,787 | -57% | 1 | 1 | 0% | 1,507 | 2,795 | +85% | 0 | 0 | — |
case-22 | pass→pass | 16,994 | 3,599 | -79% | 1 | 1 | 0% | 3,094 | 2,609 | -16% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 19 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.