Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Bind addressable evidence IDs from `papers/evidence_bank.jsonl` to each subsection (H3), producing `outline/evidence_bindings.jsonl`. **Trigger**: evidence binder, evidence plan, section->evidence mapping, 证据绑定, evidence_id. **Use when**: `papers/evidence_bank.jsonl` exists and you want writer/auditor to use section-scoped evidence items (WebWeaver-style memory bank).
.claude/skills/willoscar-evidence-binder/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | -30% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 98% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 55% | 0% |
papers/evidence_bank.jsonl exists and you want writer/auditor to use section-scoped evidence items (WebWeaver-style memory bank).Goal: convert a paper-level pool into a subsection-addressable evidence plan.
This skill is the bridge from “Evidence Bank” → “Writer”: the writer should only use evidence IDs bound to the current subsection.
Why this matters for writing quality:
binding_gaps as a routing signal: fix upstream evidence/mapping instead of "writing around" missing evidence.outline/subsection_briefs.jsonloutline/mapping.tsvpapers/evidence_bank.jsonlcitations/ref.bib (to validate cite keys when evidence items carry citations)outline/evidence_bindings.jsonl (1 JSONL record per subsection)outline/evidence_binding_report.md (summary; bullets + small tables)gaps (missing required evidence fields) and tag mix (selected evidence tags) so subsection-specific evidence needs are visible.outline/evidence_bindings.jsonl)JSONL (one object per H3 subsection). Best-effort fields (keep deterministic):
sub_id, titlepaper_ids (papers in-scope for this subsection, from mapping.tsv)mapped_bibkeys (bibkeys mapped to this subsection)bibkeys (a selected subset to encourage subsection-first citations)evidence_ids (selected evidence items from papers/evidence_bank.jsonl)evidence_counts (small summary by claim_type / tag / evidence_level)binding_rationale (short bullets; why the selected evidence covers this subsection’s axes / desired tags)binding_gaps (liststr]; required evidence fields not covered by selected evidence; drives the evidence self-loop upstream)queries.md:per_subsection as the width contract (A150++ default: 28).mapped_bibkeys: >= per_subsectionevidence_ids: >= per_subsection - 4 (A150++: >=24)bibkeys (selected): >= 20 (so each H3 has a usable citation pool, not just a long mapped list)For draft_profile=course_paper, retain the same traceability shape at compact density: 8 mapped bibkeys, at least 6 selected bibkeys, and at least 6 evidence IDs from at least 4 papers per H3.
bibkeys and use evidence_ids bound to this sub_id.outline/subsection_briefs.jsonl to understand each H3’s scope/rq/axes.outline/mapping.tsv to know which papers belong to each subsection.papers/evidence_bank.jsonl and select a subsection-scoped set of evidence_id items per H3.citations/ref.bib exists, sanity-check that any cite keys referenced by selected evidence items are defined.outline/evidence_bindings.jsonl and outline/evidence_binding_report.md.outline/evidence_bindings.refined.ok exists, the script will not overwrite outline/evidence_bindings.jsonl.binding_gaps and tag mix look subsection-specific.A common hidden failure mode is mechanical uniformity: every H3 ends up with the same claim_type/tag mix, which hides what each subsection is actually missing and pushes the writer toward generic prose.
Before you mark bindings as refined:
outline/evidence_binding_report.md: different H3 should show meaningfully different tag mix / claim_type balance.required_evidence_fields, adjust selection rationale, or enrich the evidence bank, then rerun.uv run python .codex/skills/evidence-binder/scripts/run.py --helpuv run python .codex/skills/evidence-binder/scripts/run.py --workspace <workspace>--workspace <dir>: workspace root--unit-id <U###>: unit id (optional; for logs)--inputs <semicolon-separated>: override inputs (rare; prefer defaults)--outputs <semicolon-separated>: override outputs (rare; prefer defaults)--checkpoint <C#>: checkpoint id (optional; for logs)papers/evidence_bank.jsonl exists.uv run python .codex/skills/evidence-binder/scripts/run.py --workspace <workspace>Fix:
papers/evidence_bank.jsonl via paper-notes (more extractable evidence items).section-mapper, then rerun binder.binding_gaps is non-empty (missing evidence types)What it means:
Fix (self-loop upstream):
papers/evidence_bank.jsonl / papers/paper_notes.jsonl for mapped papers (extract benchmark/metric/failure-mode details).outline/mapping.tsv for the subsection and rerun binder.outline/subsection_briefs.jsonl:required_evidence_fields and rerun binder.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 15,611 | 5,294 | -66% | 1 | 1 | 0% | 3,084 | 1,751 | -43% | 0 | 0 | — |
case-02 | fail→fail | 16,026 | 5,673 | -65% | 1 | 1 | 0% | 2,674 | 1,741 | -35% | 0 | 0 | — |
case-03 | fail→fail | 19,074 | 7,286 | -62% | 1 | 1 | 0% | 3,722 | 1,961 | -47% | 0 | 0 | — |
case-04 | fail→pass | 23,474 | 11,022 | -53% | 1 | 1 | 0% | 4,216 | 2,964 | -30% | 0 | 0 | — |
case-05 | fail→fail | 5,509 | 6,784 | +23% | 1 | 1 | 0% | 1,023 | 1,816 | +78% | 0 | 0 | — |
case-06 | fail→pass | 13,940 | 4,801 | -66% | 1 | 1 | 0% | 2,173 | 2,279 | +5% | 0 | 0 | — |
case-07 | fail→pass | 8,720 | 2,500 | -71% | 1 | 1 | 0% | 1,359 | 1,997 | +47% | 0 | 0 | — |
case-08 | fail→pass | 9,181 | 11,547 | +26% | 1 | 1 | 0% | 1,345 | 2,658 | +98% | 0 | 0 | — |
case-09 | fail→pass | 12,900 | 8,008 | -38% | 1 | 1 | 0% | 1,874 | 2,899 | +55% | 0 | 0 | — |
case-10 | fail→pass | 11,202 | 4,654 | -58% | 1 | 1 | 0% | 1,517 | 2,243 | +48% | 0 | 0 | — |
case-11 | pass→pass | 11,052 | 3,595 | -67% | 1 | 1 | 0% | 1,626 | 2,160 | +33% | 0 | 0 | — |
case-12 | fail→pass | 9,966 | 27,888 | +180% | 1 | 1 | 0% | 1,752 | 7,035 | +302% | 0 | 0 | — |
case-13 | fail→fail | 14,853 | 6,414 | -57% | 1 | 1 | 0% | 2,691 | 1,706 | -37% | 0 | 0 | — |
case-14 | pass→pass | 10,204 | 3,138 | -69% | 1 | 1 | 0% | 1,646 | 1,965 | +19% | 0 | 0 | — |
case-15 | fail→pass | 6,927 | 1,714 | -75% | 1 | 1 | 0% | 1,152 | 1,777 | +54% | 0 | 0 | — |
case-16 | fail→fail | 7,529 | 6,482 | -14% | 1 | 1 | 0% | 1,308 | 1,786 | +37% | 0 | 0 | — |
case-17 | fail→fail | 10,130 | 5,131 | -49% | 1 | 1 | 0% | 1,685 | 1,698 | +1% | 0 | 0 | — |
case-18 | fail→pass | 8,481 | 3,737 | -56% | 1 | 1 | 0% | 1,221 | 2,031 | +66% | 0 | 0 | — |
case-19 | fail→pass | 9,855 | 7,508 | -24% | 1 | 1 | 0% | 1,694 | 2,355 | +39% | 0 | 0 | — |
case-20 | fail→pass | 9,902 | 4,616 | -53% | 1 | 1 | 0% | 1,414 | 2,214 | +57% | 0 | 0 | — |
case-21 | fail→pass | 10,625 | 4,153 | -61% | 1 | 1 | 0% | 1,660 | 2,153 | +30% | 0 | 0 | — |
case-22 | pass→pass | 10,017 | 5,430 | -46% | 1 | 1 | 0% | 1,465 | 2,543 | +74% | 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 15 counted toward the lift figure. The other 7 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 +55 percentage points is the difference between those two pass rates over the 15 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
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.