Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the task statement names interpretability, explainability, feature importance, saliency or attribution among its outputs or objectives. The graded artifact is then the attribution map itself — per input unit, by the field's standard estimator, drawn as a figure — not a diagnostic about the model's internals and not an argument that the model is uninterpretable.
.claude/skills/tangxiangru-the-attribution-is-the-deliverable/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 110% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -25% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 5% | 0% |
A task that lists interpretability among its objectives is asking for an object: a contribution per input unit — per feature, per atom, per bond, per region, per token — aggregated into the domain's own groups and drawn. Everything else is a substitute, and the substitutes are all cheaper than the thing.
Three substitutes show up reliably, and each one scores as an absence:
importance, and attention weights are properties of the fitted model or of the training procedure. The brief asked which inputs drove which predictions.
a rank of learned filters, an ablation of architectural blocks: all interpretable, none of them an attribution.
one, because it is often correct and it still delivers nothing. The finding that a method's explanations are unstable is a result of running the attribution, not a substitute for running it.
Name the mapping explicitly at design time, in one line:
| the model | the estimator | |---|---| | fitted tree / gradient-boosted / tabular | SHAP (TreeSHAP), on the same rows the metrics use | | neural network over graphs, images, sequences | input gradients ‖∂ŷ/∂x‖, occlusion or ablation, subgraph masking | | anything, as a cross-check | leave-one-group-out retraining |
Compute two and report their disagreement. Rank correlation between a gradient map and an occlusion map is a result you can publish even when the maps turn out unstable — and it is what lets you say something instead of withdrawing the arm when they do.
There is usually no reference attribution to score against, and that is not a reason to drop the arm. It is a reason to build the comparison you can:
with the source's indexing preserved;
call irrelevant. If your map cannot beat "is this atom a hydrogen", say so; that is a finding;
A map with a comparison is falsifiable. A map with none is still the deliverable.
The per-unit values are the computation; the group table is the result. Chemistry groups by functional group (fluoro, amide, aromatic); behaviour groups by feature family (distance, movement, shape); imaging groups by region. Print the group means, and print the ranked top-N with the real entity names beside their values — not indices, not f_137.
If the design contrasts sites, cohorts, conditions or arms, compute the attribution separately within each and put them on one axis so the difference is readable. This is where the substitution is most tempting and most costly: a run that stratifies by its own methodological axis — two evaluation protocols, two preprocessing variants — has produced a comparison nobody asked for, and left the one the design was built around empty.
Run the attribution on the object the source ran it on, too. The named molecule, the named subject, the named sample.
The map is graded as a picture. A CSV in outputs/ does not discharge it, and neither does a sentence reporting the top feature. Panel per stratum, group means on the axis, values in the panel or the caption.
Grep your own figure captions for the estimator's name. If the brief named interpretability and no figure carries an attribution, the graded artifact does not exist yet — go back to experimentation rather than forward to writing.
See also the-unit-of-analysis for choosing what a "unit" is before you aggregate, and run-the-conditions-the-source-ran for keeping the strata the source used.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 22,015 | 39,427 | +79% | 1 | 1 | 0% | 3,568 | 7,488 | +110% | 0 | 0 | — |
case-02 | fail→pass | 45,159 | 37,326 | -17% | 1 | 1 | 0% | 8,507 | 6,377 | -25% | 0 | 0 | — |
case-03 | pass→fail | 17,581 | 13,944 | -21% | 1 | 1 | 0% | 2,659 | 3,120 | +17% | 0 | 0 | — |
case-04 | pass→pass | 19,384 | 17,550 | -9% | 1 | 1 | 0% | 2,539 | 3,337 | +31% | 0 | 0 | — |
case-05 | pass→pass | 15,412 | 17,446 | +13% | 1 | 1 | 0% | 2,396 | 3,709 | +55% | 0 | 0 | — |
case-06 | fail→pass | 17,198 | 11,677 | -32% | 1 | 1 | 0% | 2,534 | 2,470 | -3% | 0 | 0 | — |
case-07 | fail→pass | 15,829 | 12,495 | -21% | 1 | 1 | 0% | 2,064 | 2,653 | +29% | 0 | 0 | — |
case-08 | pass→pass | 16,753 | 22,137 | +32% | 1 | 1 | 0% | 2,263 | 2,832 | +25% | 0 | 0 | — |
case-09 | fail→pass | 17,302 | 11,233 | -35% | 1 | 1 | 0% | 2,224 | 2,325 | +5% | 0 | 0 | — |
case-10 | fail→pass | 18,368 | 18,900 | +3% | 1 | 1 | 0% | 2,528 | 3,705 | +47% | 0 | 0 | — |
case-11 | pass→pass | 17,155 | 13,100 | -24% | 1 | 1 | 0% | 2,676 | 2,613 | -2% | 0 | 0 | — |
case-12 | fail→pass | 16,809 | 11,542 | -31% | 1 | 1 | 0% | 2,482 | 2,747 | +11% | 0 | 0 | — |
case-13 | fail→pass | 12,599 | 8,377 | -34% | 1 | 1 | 0% | 1,821 | 1,999 | +10% | 0 | 0 | — |
case-14 | pass→pass | 14,075 | 8,516 | -39% | 1 | 1 | 0% | 1,834 | 2,039 | +11% | 0 | 0 | — |
case-15 | fail→fail | 18,759 | 10,842 | -42% | 1 | 1 | 0% | 2,659 | 2,560 | -4% | 0 | 0 | — |
case-16 | fail→pass | 18,411 | 21,171 | +15% | 1 | 1 | 0% | 2,617 | 4,011 | +53% | 0 | 0 | — |
case-17 | fail→fail | 20,297 | 13,506 | -33% | 1 | 1 | 0% | 2,917 | 2,723 | -7% | 0 | 0 | — |
case-18 | pass→pass | 17,059 | 13,445 | -21% | 1 | 1 | 0% | 2,431 | 2,806 | +15% | 0 | 0 | — |
case-19 | pass→pass | 15,137 | 14,101 | -7% | 1 | 1 | 0% | 2,196 | 2,975 | +35% | 0 | 0 | — |
case-20 | pass→pass | 18,592 | 15,960 | -14% | 1 | 1 | 0% | 2,590 | 3,495 | +35% | 0 | 0 | — |
case-21 | fail→pass | 16,962 | 11,104 | -35% | 1 | 1 | 0% | 2,577 | 2,447 | -5% | 0 | 0 | — |
case-22 | fail→pass | 15,622 | 10,333 | -34% | 1 | 1 | 0% | 2,223 | 2,357 | +6% | 0 | 0 | — |
case-23 | pass→pass | 15,699 | 10,006 | -36% | 1 | 1 | 0% | 2,244 | 2,374 | +6% | 0 | 0 | — |
case-24 | pass→pass | 19,759 | 11,041 | -44% | 1 | 1 | 0% | 2,680 | 2,491 | -7% | 0 | 0 | — |
case-25 | pass→pass | 15,589 | 19,203 | +23% | 1 | 1 | 0% | 2,297 | 3,721 | +62% | 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. 25 cases were attempted. The headline lift of +40 percentage points is the difference between those two pass rates over the 25 comparable cases. 1 case got worse with the skill loaded, and it is 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.