Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Phase 4 Turn 1 of disease-market-sizing-orchestration. Generates report HTML with mandatory citation anchors per fact claim. Reads contract + staging + sources/. Every drug/treatment/stat/recommendation MUST carry [pmid:.../guideline:.../nct:...] anchor that resolves to an actual file in sources/. NEVER hardcode drug names or numerical claims. Use AFTER evidence recall (phase 3), BEFORE content-verification-layer (Turn 2).
.claude/skills/ethanyoq-cite-bound-content-generator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | -9% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -63% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -8% | 0% |
> "You write report HTML for the disease/region described in the contract. Every fact claim > (drug name, brand name, dosage, number, recommendation grade, epidemiology, mechanism) > MUST carry a citation anchor in one of these forms: > [guideline:<source_id>:<locator>] / [pmid:<id>:<locator>] / [nct:<id>:<locator>]. > The source_id of every anchor MUST appear in the provided sources_summary. > Sentences without an anchor for a fact claim are forbidden — your report will be rejected."
参考完整模板:references/ifi-section-template.md.
输出 html 必须含以下结构 (composer.py _assert_ifi_structure 在 enforce_ifi=True 时强制,违者抛 ComposeError 含所有缺失项 + orchestrator retry loop 反馈给 LLM 一次性补齐):
<section data-section="..."> marker:exec-summary / epidemiology / treatment-landscape / market-sizing / competitive-dynamics / lp-framework / appendixmarket-sizing 内三 <section data-subsection="tam|sam|som"> 子段<div class="mermaid">...</div> 决策树 block ≥ 4 张\b(?:LP|策略干预点|leverage point)\b)每 cohort(基于 staging.dimensions 的 sub_cohorts)用 <sub-page slug="cohort-slug">...</sub-page> 包裹独立段:
html<sub-page slug="1l-treatment"> <section class="cohort-page" data-cohort="1l-treatment"> <h1>1L 治疗 cohort 深度分析</h1> ... </section> </sub-page>
composer._parse_sub_pages 解析后, ComposedReport.sub_pages: list[dict {slug, html}] 经 _persist_sub_pages 落盘成 output/<disease-slug>/page_<cohort-slug>.html,主报告通过 <a href="page_<slug>.html"> 链接。
compose(slug_dir, ask_llm, previous_violations=None, *, enforce_ifi=False) -> (html_path, idx_path)enforce_ifi=True (production) → 强制 IFI 结构,违者 ComposeErrorenforce_ifi=False (default, fake-LLM tests) → 只查 anchor 解析,不查结构_parse_sub_pages(raw_html) -> (main_html, sub_pages) — 抽 <sub-page slug="..."> 包裹的子页_extract_toc_anchors(html) -> list[str] — 从 main_html H2/H3 id 抽 TOC 浮动锚点ComposedReport(main_html, sub_pages, toc_anchors, claims, raw_html) — 升级输出 schema dataclasstests/test_cite_bound_content_generator.py::test_compose_p0_watchdog — grep skill source for forbidden hardcoded patterns. CI blocks on hit.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | pass→pass | 11,357 | 17,690 | +56% | 1 | 1 | 0% | 2,481 | 4,917 | +98% | 0 | 0 | — |
case-02 | fail→fail | 25,169 | 27,562 | +10% | 1 | 1 | 0% | 6,227 | 7,131 | +15% | 0 | 0 | — |
case-01 | fail→fail | 26,112 | 28,718 | +10% | 1 | 1 | 0% | 6,244 | 7,147 | +14% | 0 | 0 | — |
case-03 | fail→pass | 7,833 | 1,921 | -75% | 1 | 1 | 0% | 1,437 | 1,312 | -9% | 0 | 0 | — |
case-04 | fail→pass | 7,788 | 2,467 | -68% | 1 | 1 | 0% | 1,441 | 1,377 | -4% | 0 | 0 | — |
case-05 | fail→pass | 15,628 | 1,373 | -91% | 1 | 1 | 0% | 3,242 | 1,208 | -63% | 0 | 0 | — |
case-06 | fail→fail | 8,512 | 3,240 | -62% | 1 | 1 | 0% | 1,962 | 1,601 | -18% | 0 | 0 | — |
case-07 | fail→fail | 5,822 | 2,313 | -60% | 1 | 1 | 0% | 1,219 | 1,391 | +14% | 0 | 0 | — |
case-08 | fail→pass | 4,474 | 1,945 | -57% | 1 | 1 | 0% | 941 | 1,265 | +34% | 0 | 0 | — |
case-09 | fail→pass | 6,521 | 2,123 | -67% | 1 | 1 | 0% | 1,475 | 1,355 | -8% | 0 | 0 | — |
case-10 | fail→pass | 6,273 | 2,309 | -63% | 1 | 1 | 0% | 1,608 | 1,415 | -12% | 0 | 0 | — |
case-19 | fail→pass | 6,502 | 1,747 | -73% | 1 | 1 | 0% | 1,494 | 1,302 | -13% | 0 | 0 | — |
case-11 | fail→pass | 5,202 | 3,000 | -42% | 1 | 1 | 0% | 1,108 | 1,524 | +38% | 0 | 0 | — |
case-12 | fail→pass | 9,323 | 1,655 | -82% | 1 | 1 | 0% | 1,884 | 1,239 | -34% | 0 | 0 | — |
case-13 | fail→fail | 1,642 | 1,524 | -7% | 1 | 1 | 0% | 264 | 1,183 | +348% | 0 | 0 | — |
case-14 | fail→fail | 9,917 | 2,018 | -80% | 1 | 1 | 0% | 1,979 | 1,334 | -33% | 0 | 0 | — |
case-20 | pass→pass | 8,919 | 6,038 | -32% | 1 | 1 | 0% | 1,944 | 2,188 | +13% | 0 | 0 | — |
case-15 | fail→fail | 9,793 | 1,497 | -85% | 1 | 1 | 0% | 2,125 | 1,230 | -42% | 0 | 0 | — |
case-16 | fail→fail | 9,289 | 1,660 | -82% | 1 | 1 | 0% | 1,986 | 1,278 | -36% | 0 | 0 | — |
case-17 | pass→pass | 4,905 | 1,488 | -70% | 1 | 1 | 0% | 1,016 | 1,177 | +16% | 0 | 0 | — |
case-18 | fail→pass | 4,936 | 1,759 | -64% | 1 | 1 | 0% | 1,193 | 1,282 | +7% | 0 | 0 | — |
case-22 | pass→pass | 13,751 | 7,694 | -44% | 1 | 1 | 0% | 3,141 | 2,636 | -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. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases.
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.