{# Status Bar #}
{% if success %} ✓ Audit Complete {% else %} ⚠ Audit Complete with Warnings {% endif %} {{ generation_date or "N/A" }} Config: {{ audit_profile or "default" }}
{# Performance Metrics #} {% if model_performance %}

Performance Metrics

{% for metric, value in model_performance.items() %} {% if metric in ['accuracy', 'roc_auc', 'pr_auc', 'f1', 'precision', 'recall'] %} {% endif %} {% endfor %} {% if calibration_ci %} {% else %} {% endif %}
Metric Value
{{ metric|replace('_', ' ')|title|replace('Roc', 'ROC')|replace('Pr', 'PR') }} {{ "%.4f"|format(value) if value is number else value }}
Calibration (ECE) {% if calibration_ci.get('ece') is not none %} {{ "%.4f"|format(calibration_ci['ece']) }} {% else %}N/A{% endif %} {% if calibration_ci.get('ece_ci') %} (95% CI: [{{ "%.3f"|format(calibration_ci['ece_ci']['ci_lower']) }}, {{ "%.3f"|format(calibration_ci['ece_ci']['ci_upper']) }}]) {% endif %}
Calibration (ECE) Not computed (binary classification with probabilities required)
{% endif %} {# Fairness Analysis #} {% if fairness_analysis and fairness_analysis['group_metrics'] %}

Fairness Analysis

{% set ns = namespace(worst_gap=0, worst_attr='', group_a='', group_b='', n_a=0, n_b=0) %} {% for attr, groups in fairness_analysis['group_metrics'].items() %} {% if groups and groups.values()|list|length > 1 %} {% set values = groups.values()|list %} {% set keys = groups.keys()|list %} {% set gap = values|max - values|min %} {% if gap > ns.worst_gap %} {% set ns.worst_gap = gap %} {% set ns.worst_attr = attr %} {% set max_idx = values.index(values|max) %} {% set min_idx = values.index(values|min) %} {% set ns.group_a = keys[max_idx] %} {% set ns.group_b = keys[min_idx] %} {# Sample sizes from data_summary if available #} {% if data_summary and data_summary.get('protected_attribute_distribution') and data_summary['protected_attribute_distribution'].get(attr) %} {% set ns.n_a = data_summary['protected_attribute_distribution'][attr].get(ns.group_a, 0) %} {% set ns.n_b = data_summary['protected_attribute_distribution'][attr].get(ns.group_b, 0) %} {% endif %} {% endif %} {% endif %} {% endfor %} {% if ns.worst_gap > 0 %}
Metric Worst Gap Groups Sample Sizes Status
{{ ns.worst_attr|replace('_', ' ')|title }} {{ "%.4f"|format(ns.worst_gap) }} {{ ns.group_a }} vs {{ ns.group_b }} n={{ "{:,}".format(ns.n_a) if ns.n_a else "?" }} vs {{ "{:,}".format(ns.n_b) if ns.n_b else "?" }} {% if ns.worst_gap < 0.05 %} {% elif ns.worst_gap < 0.10 %} {% else %} {% endif %}

Thresholds: ✓ <0.05 (pass) | ⚠ <0.10 (warning) | ✗ ≥0.10 (fail)

{% else %}

No fairness gaps detected or insufficient group data

{% endif %} {% endif %} {# Additional Fairness Analysis Features #} {% if dataset_bias or intersectional_fairness or individual_fairness or stability_analysis %}

Advanced Analysis

{% if dataset_bias %}
Dataset Bias: {% if dataset_bias.proxy_correlations %} {{ dataset_bias.proxy_correlations|length }} proxy features analyzed {% endif %}
{% endif %} {% if intersectional_fairness %}
Intersectional Fairness: {{ intersectional_fairness.keys()|list|length }} intersection(s) analyzed
{% endif %} {% if individual_fairness %}
Individual Fairness: Consistency score {{ "%.3f"|format(individual_fairness['consistency_score']) }} {% if individual_fairness['consistency_score'] >= 0.90 %} {% elif individual_fairness['consistency_score'] >= 0.75 %} {% else %} {% endif %}
{% endif %} {% if stability_analysis and stability_analysis.get('robustness_score') is not none %}
Robustness Score: {{ "%.4f"|format(stability_analysis['robustness_score']) }} {% if stability_analysis.get('gate_status') == "PASS" %} {% elif stability_analysis.get('gate_status') == "WARNING" %} {% else %} {% endif %}
{% endif %}

ℹ️ See full PDF report for detailed analysis and confidence intervals

{% endif %} {# Top Features #} {% if explanations and explanations.get('feature_importances') %}

Top 5 Important Features

{% for feature, importance in (explanations.feature_importances.items()|sort(attribute='1', reverse=True))[:5] %} {% endfor %}
Feature Importance Direction
{{ feature }} {{ "%.4f"|format(importance|abs) }} {% if importance > 0 %} {% elif importance < 0 %} {% else %} {% endif %}
{% endif %} {# Data & Lineage Badge #} {% if manifest or execution_info %}

Data & Lineage

{% if manifest.get('dataset_hash') %} data_hash: {{ manifest['dataset_hash'][:12] }}...{{ manifest['dataset_hash'][-8:] if manifest['dataset_hash']|length > 20 else manifest['dataset_hash'] }} {% endif %} {% if manifest.get('model_hash') %} | model_sha: {{ manifest['model_hash'][:12] }}...{{ manifest['model_hash'][-8:] if manifest['model_hash']|length > 20 else manifest['model_hash'] }} {% endif %} {% if manifest.get('package_versions') %} {% if manifest['package_versions'].get('sklearn') %} | sklearn {{ manifest['package_versions']['sklearn'] }} {% endif %} {% if manifest['package_versions'].get('xgboost') %} | xgboost {{ manifest['package_versions']['xgboost'] }} {% endif %} {% if manifest['package_versions'].get('lightgbm') %} | lightgbm {{ manifest['package_versions']['lightgbm'] }} {% endif %} {% endif %} {% if manifest.get('global_seed') is not none %} | seed {{ manifest['global_seed'] }} {% endif %} {% if audit_profile %} | cfg {{ audit_profile }} {% endif %}
{% endif %} {# Audit Status (Policy Gates) #}

Audit Status

{% if execution_info and execution_info['policy_gates'] %} {% set gates = execution_info['policy_gates'] %} {% set passed = gates.get('passed', 0) %} {% set warnings = gates.get('warnings', 0) %} {% set failures = gates.get('failures', 0) %}

{{ passed }} passed {{ warnings }} warning{{ 's' if warnings != 1 else '' }} {{ failures }} failure{{ 's' if failures != 1 else '' }} view details →

{% else %}

Policy gates: not configured add gates →

{% endif %} {# Metrics Glossary #}
📖 What do these metrics mean?

Performance Metrics:

  • Accuracy: Fraction of correct predictions (higher is better, target: >0.80)
  • Precision: Of positive predictions, how many were correct? (higher is better)
  • Recall: Of actual positives, how many did we find? (higher is better)
  • ROC AUC: Ability to distinguish classes (higher is better, >0.80 is good)

Fairness Metrics:

  • Demographic Parity Gap: Difference in positive prediction rates across groups (target: <0.10)
  • Equal Opportunity Gap: Difference in true positive rates across groups (target: <0.10)
  • Consistency Score: Similar individuals get similar predictions (target: >0.75)

Calibration Metrics:

  • ECE (Expected Calibration Error): Predicted probabilities match actual frequencies (target: <0.05)
  • Brier Score: Mean squared error of probability predictions (lower is better, <0.15 is good)

Status Indicators:

  • Pass: Metric within target range
  • Warning: Metric outside target but acceptable
  • Fail: Metric requires attention

Full metrics guide →

{# Footer with Export Command #}