{# T1 - FDA AI-DSF performance evidence attachment set (D4 section 2): the cover and fifteen sections through base.html's furniture. Every value comes from proofpack.render.t1's context (Number cells carry data-ref / data-kind / data-facet); every sentence is a claim of run.json rendered by proofpack.render.sentences; customer text is escaped inside .customer-text; status words only inside .status. No arithmetic here. #} {% extends "base.html" %} {% from "_criteria.html" import criteria_table %} {% from "_figures.html" import curve_figure, calibration_figure, forest_figure %} {% macro ncell(c, extra="") -%} {{ c.text }} {%- endmacro %} {% macro notes(key) -%} {% for ref in anchors[key] %}{{ margin_note(ref) }} {% endfor %} {%- endmacro %} {% macro narrative(items) -%} {% if items %}
{% for s in items %}

{{ s.html }}

{% endfor %}
{% endif %} {%- endmacro %} {% block pages %}
{{ page_header() }}

{{ template_name }}

{{ cover_note }}

{{ cover_stamps() }} {% for label, value, mono in cover_rows %} {{ value }} {% endfor %}
Cover block
Manufacturer{% if slots["CT-01"].filled %}{{ manufacturer_text("manufacturer", slots["CT-01"].text) }}{% else %}{{ placeholder(slots["CT-01"]) }}{% endif %}
Model{{ model.name }} v{{ model.version }}
{{ label }}
Guidance versions referenced{% for ref in guidance_refs %}{{ ref.label }}{% if not loop.last %}; {% endif %}{% endfor %}
Customer sections outstanding{{ outstanding }}

Device and intended use

{{ placeholder(slots["CT-02"]) }} {{ page_footer() }}
{{ page_header() }}

{{ long_form_title }}

    {% for title, body in long_form_items %}
  1. {{ title }} {{ body }}
  2. {% endfor %}
{% for ref in guidance_refs %} {% endfor %}
Guidance versions referenced in this render, labelled from the guidance map; a draft is a draft in the label and in the structured data
Internal idDocument, version or date, statusDraft
{{ ref.id }}{{ ref.label }}{% if ref.draft %}yes{% else %}no{% endif %}
{{ page_footer() }}
{{ page_header() }}

1. Scope and declarations summary

{{ notes("s1") }} {% for label, value, highlight in declaration_rows %} {% endfor %}
Table T1-1 - declarations that shape every number in the pack (all from criteria.yaml; the engine supplies no default)
{{ label }}{{ value }}

2. Data management - dataset description

{{ notes("s2") }} {{ placeholder(slots["CT-03"]) }} {% for label, value in flow_rows %} {% endfor %}
Table T1-2 - flow of rows (D4 section 5.10)
{{ label }}{{ value }}
{% for r in table1_rows %} {% endfor %}
Table T1-3 - Table 1 of the test set{% if dev_note %}; {{ dev_note }}{% endif %}
AttributeLevelTest n (%)
{{ r.attribute }}{{ r.level }}{{ r.n }} ({{ r.pct }})

3. Test-set independence and sequestration

{{ notes("s3") }} {{ placeholder(slots["CT-04"]) }} {% if overlap_note %}{{ no_data(overlap_note) }}{% endif %} {{ page_footer() }}
{{ page_header() }}

4. Site diversity

{{ notes("s4") }} {{ placeholder(slots["CT-05"]) }} {% if site_block %}

Table T1-5 is the site table of section 9 (per site, D4 section 5.3 format).

{% else %} {{ no_data("No site attribute was supplied: per-site performance is not reported.") }} {% endif %}

5. Representativeness

{{ notes("s5") }} {{ placeholder(slots["CT-06"]) }}

The distribution of each attribute in the test set is Table T1-3 (section 2); the adequacy of that distribution for the intended use is the manufacturer's judgement.

6. Reference standard

{{ notes("s6") }} {{ manufacturer_text("reference standard as declared", reference_standard.type ~ " (" ~ reference_standard.description ~ ")") }} {{ placeholder(slots["CT-07"]) }} {{ page_footer() }}
{{ page_header() }}

7. Performance validation - overall, per operating point

{{ notes("s7") }} {{ placeholder(slots["CT-08"]) }} {% for p in performance %}

Operating point {{ p.op }}

Table T1-6 - two-by-two at operating point {{ p.op }} (threshold {{ p.threshold }}, rule {{ p.rule }}); totals are the denominators of the Numbers below
Device positiveDevice negativeTotal
{{ p.two_by_two.row_pos }}{{ p.two_by_two.tp }}{{ p.two_by_two.fn }}{{ p.two_by_two.n_pos }}
{{ p.two_by_two.row_neg }}{{ p.two_by_two.fp }}{{ p.two_by_two.tn }}{{ p.two_by_two.n_neg }}
Total{{ p.two_by_two.d_pos }}{{ p.two_by_two.d_neg }}{{ p.two_by_two.total }}
{% if p.indeterminate_both_ways %}{{ no_data("Indeterminate results allocated both ways (FDA 2007): the allocation tables are not computed in this build.") }}{% endif %}
{% for r in p.rows %} {{ ncell(r.kn) }}{{ ncell(r.est) }}{{ ncell(r.ci) }} {% endfor %} {% for r in p.prev_rows %} {{ ncell(r.est) }}{{ ncell(r.ci) }} {% endfor %}
Table T1-7 - operating-point metrics at {{ p.op }}; the threshold was {{ p.provenance }}. Wilson score without continuity correction for proportions unless the Method column says otherwise
Metrick/nEstimate (% for proportions)95% CIMethod
{{ r.label }}{% if r.supplementary %} (supplementary){% endif %}{{ r.method.text }}
{{ r.label }}—{{ r.method.text }}
{{ narrative(p.sentences) }} {% endfor %}
{% for r in threshold_free %} {{ ncell(r.cell) }} {% endfor %}
Table T1-8 - threshold-free performance (AUROC, AUPRC, prevalence)
QuantityEstimate [95% CI]Method
{{ r.label }}{{ r.method.text }}
{{ narrative(auroc_sentences) }} {% if figures.f2 %}{{ curve_figure(figures.f2) }}{% else %}{{ no_data("F2 (ROC) is not drawn: the run document carries no ROC array.") }}{% endif %} {% if figures.f3 %}{{ curve_figure(figures.f3) }}{% else %}{{ no_data(figures.f3_note) }}{% endif %} {{ page_footer() }}
{{ page_header() }}

8. Calibration

{{ notes("s8") }} {{ placeholder(slots["CT-09"]) }} {% if calibration.present %}
{% for r in calibration.rows %} {{ ncell(r.cell) }} {% endfor %}
Table T1-9 - calibration of the declared probability score (D4 section 5.5){% if calibration.curve_note %}; {{ calibration.curve_note }}{% endif %}
QuantityEstimate [95% CI]Method
{{ r.label }}{{ r.method.text }}
{% if calibration.ipa_tiers or calibration.clustered %}

{% if calibration.ipa_tiers %}The IPA row's tier superscript ({{ calibration.ipa_tiers }}) is the proportion tier applied to the IPA's own interval: it states the half-width on the IPA's scale and nothing about a proportion (ProofPack reporting convention; T7, DEC-35).{% endif %}{% if calibration.ipa_tiers and calibration.clustered %} {% endif %}{% if calibration.clustered %}Under the clustered plan every interval above is a cluster-bootstrap interval; each cell keeps its tier annotation and the measured coverage of the route, including the one cell below the bar, is in T7 (DEC-18 (c), DEC-34).{% endif %}

{% endif %}
{% for d in calibration.deciles %} {{ ncell(d.observed) }} {% endfor %}
Decile table - ten equal-mass bins by score; observed k/n (%) with its interval
DecilenMean predictedObserved k/n (%) [95% CI]
{{ d.bin }}{{ d.n }}{{ d.mean_pred }}
{% if figures.f4 %}{{ calibration_figure(figures.f4) }}{% endif %} {% else %} {% if calibration.reason %}

calibration: null - reason {{ calibration.reason.reason }} (score declared {{ calibration.reason.score_type }}, {{ calibration.reason.orientation }}).

{% else %} {{ no_data("calibration: null - the run document records no reason") }} {% endif %} {% if figures.f4_note %}{{ no_data(figures.f4_note) }}{% endif %} {% endif %} {{ narrative(calibration.sentences) }} {{ page_footer() }}
{{ page_header() }}

9. Subgroup performance

{{ notes("s9") }} {% if slots["CT-10"].filled %}{{ manufacturer_text("pre-specification source of each subgroup attribute (criteria.yaml)", slots["CT-10"].text) }}{% else %}{{ placeholder(slots["CT-10"]) }}{% endif %} {% for s in subgroups %}

Attribute {{ s.attribute }}

{% for o in s.ops %}
{% for r in o.table %} {{ ncell(r.se) }}{{ ncell(r.sp) }}{{ ncell(r.auroc) }} {% endfor %} {{ ncell(o.overall.se) }}{{ ncell(o.overall.sp) }}{{ ncell(o.overall.auroc) }}
Table T1-10 - performance by {{ s.attribute }} at operating point {{ o.op }}; reference level {{ s.reference_level }} (rule {{ s.reference_rule }}); {% if s.prespecified %}pre-specified{% else %}not pre-specified, exploratory{% endif %}. Interval methods in this table: {{ o.table_methods }}; tiers are ProofPack reporting conventions
GroupnEvents{{ se_label }} k/n (%) [95% CI]{{ sp_label }} k/n (%) [95% CI]AUROC [95% CI]Pre-spec.Tier
{{ r.level }}{% if r.is_reference %} (ref){% endif %}{{ r.n }}{{ r.events }}{{ r.prespecified }}{{ r.tier }}
Overall{{ o.overall.n }}{{ o.overall.events }}—
{% if o.diffs %}
{% if o.has_criteria %}{% endif %} {% for d in o.diffs %} {{ ncell(d.se) }}{{ ncell(d.sp) }}{{ ncell(d.auroc) }}{% if o.has_criteria %}{% endif %} {% endfor %}
Table T1-11 - differences against the reference level {{ s.reference_level }} (proportions in percentage points; interval methods in this table: {{ o.diff_methods }}; differences only, from which no statement about subgroup consistency is drawn)
GroupΔ {{ se_label }} (pp) [95% CI]Δ {{ sp_label }} (pp) [95% CI]Δ AUROC [95% CI]Criterion (id) and status; max lower bound at n
{{ d.level }}{% for c in d.criteria %}{{ c.id }} (row {{ c.position }}) → {{ c.status_word }}{{ c.type_note }}; max LB {{ c.max_lb }} at n = {{ c.n }}, attainable: {{ c.attainable }}{% if not loop.last %}
{% endif %}{% endfor %}
{% endif %} {% if o.tests %}

Exploratory test of homogeneity ({{ o.route or "none" }} route): {% for t in o.tests %}{{ t.metric }} {{ t.test }} p = {{ t.p_raw }} (Holm {{ t.p_holm }}){% if t.reason %} [{{ t.reason }}]{% endif %}{% if not loop.last %}; {% endif %}{% endfor %}; {{ o.sentence }}.

{% endif %} {% endfor %} {% for f in figures.f5.get(s.attribute, []) %}{{ forest_figure(f) }}{% endfor %} {{ narrative(s.sentences) }} {% else %} {{ no_data("No subgroup attribute was tabulated in this run.") }} {% endfor %} {{ no_data("Intersectional subgroups (sex x age, race x site) are not computed in this release (v1.1).") }} {% for mark, text in tier_legend %} {% endfor %}
Tier superscripts - ProofPack reporting convention (R2 section 3.3); annotations, never suppression
{{ mark }}{{ text }}
{{ page_footer() }}
{{ page_header() }}

10. Fairness (descriptive)

{{ notes("s10") }} {% if fairness %} {{ manufacturer_text("fairness declaration (" ~ fairness.author ~ ", " ~ fairness.date ~ ")", "criterion of interest " ~ fairness.criterion_of_interest ~ " on " ~ fairness.attribute ~ "; " ~ fairness.justification) }}
{% for g in fairness.gaps %} {{ ncell(g.tpr) }}{{ ncell(g.fpr) }}{{ ncell(g.ppv) }}{{ ncell(g.npv) }}{{ ncell(g.auroc) }}{{ ncell(g.selection) }} {% endfor %}
Table T1-13 - gaps of each level against the reference level {{ fairness.reference_level }} (percentage points; AUROC on its own scale). The declared criterion of interest is the manufacturer's; every other gap is descriptive and not a target; the selection-rate gap is descriptive only
LevelOp.Δ TPR [95% CI]Δ FPR [95% CI]Δ PPV [95% CI]Δ NPV [95% CI]Δ AUROC [95% CI]Selection-rate gap (descriptive)Calibration by group
{{ g.level }}{{ g.op }}{{ g.calibration_reason or "—" }}

Impossibility statement: {{ fairness.citation }} [unverified] citation pending verification (T7).

{{ narrative(fairness.sentences) }} {% else %} {{ no_data("No fairness criterion of interest was declared: no fairness block was computed.") }} {% endif %}

11. Robustness

{{ notes("s11") }} {{ no_data("Robustness analyses (leave-one-site-out, threshold sensitivity, missingness) are not computed in this build (v1.1): the run document carries no robustness block.") }}

12. Acceptance criteria

{{ notes("s12") }} {% if has_criteria %} {{ criteria_table(criteria_rows) }} {{ narrative(criterion_sentences) }} {% else %}

No acceptance criteria were declared; estimates and intervals only.

{% endif %} {{ page_footer() }}
{{ page_header() }}

13. Performance monitoring

{{ notes("s13") }} {{ placeholder(slots["CT-11"]) }} {{ no_data("Monitoring analyses are produced by T3, which is v1.1; they are not part of this attachment set.") }}

14. Inputs for the public submission summary

{{ notes("s14") }}

Supplement only: {{ public_summary_note }}.

{% for r in public_summary %} {{ ncell(r.est) }}{{ ncell(r.ci) }} {% endfor %}
Table T1-18 - plain-language numbers (the same Numbers as Tables T1-7 and T1-8)
MetricEstimate95% CIn
{{ r.metric }}{{ r.n }}

15. Model card

{{ notes("s15") }}

Note: {{ model_card_note }}.

{{ no_data("The optional model card is not produced in this release; it is scheduled for ProofPack v1.1.") }}

Appendices

Appendix A, the methods appendix, is T7; appendix B, the run manifest, declarations, scope and disclaimer, is T8. Both are written beside this document from the same run.json.

{{ page_footer() }}
{% endblock %}