{# Executive — ASI radar chart (Narrative port). 10-axis Chart.js radar of Adversarial Surface Index per category. Falls back to all-zeros so an empty/pre-run scan still renders an empty shape rather than disappearing. Mounted by executive_charts.js; offscreen mirrors values for screen readers. Payload fields consumed: - asi_rows[*].name — axis label - asi_rows[*].score_pct — radial value - asi_rows[*].code — ASI code - asi_rows[*].is_pending — drop pending rows from the live shape #} {% set _radar_rows = [] %} {% for r in asi_rows %} {% if not r.is_pending %} {% set _ = _radar_rows.append({'label': r.name, 'value': r.score_pct, 'code': r.code}) %} {% endif %} {% endfor %} {% if not _radar_rows %} {% for r in asi_rows %} {% set _ = _radar_rows.append({'label': r.name, 'value': 0, 'code': r.code}) %} {% endfor %} {% endif %} {% set _radar_payload = { 'labels': _radar_rows | map(attribute='label') | list, 'values': _radar_rows | map(attribute='value') | list, 'codes': _radar_rows | map(attribute='code') | list, } %}
{# QA-028 sub-ask 3b — FIG. 2 eyebrow removed; the serif headline alone carries the section voice on the Executive theme. #}

Adversarial Surface Index — per category

Higher is stronger. Scores below 70 indicate the agent handled fewer than 70 % of probes in that category safely. 100 = no successful exploit; 0 = every probe in this category landed.

Show data table
{% for row in _radar_rows %} {% endfor %}
Category Score
{{ row.label }} {{ row.value }} / 100