{% import "_macros.html" as ui %} {# ---------- 1. Header ---------- #}

Instrument Review

{{ review.filename }}
Reviewed {{ review.timestamp.strftime("%Y-%m-%d %H:%M") }} · Model: {{ review.parameters.model }} · Categories: {{ review.parameters.category_rubric_version }} · Review ID: {{ review.review_id }}
{# ---------- 2. Score panel ---------- #}
{{ '%.0f'|format(review.overall_score) }}
Overall defense score / 100
{{ '%.0f'|format(review.completion_likelihood) }}
Bot completion likelihood / 100
lower is better
{{ review.categories|length }}
Categories reviewed
{% set failed_cats = review.categories | selectattr("error") | list %} {% if failed_cats %}
Note: {{ failed_cats|length }} categor{{ 'ies' if failed_cats|length != 1 else 'y' }} did not complete and {{ 'were' if failed_cats|length != 1 else 'was' }} weighted at zero in the overall score.
{% endif %} {# ---------- 3. Bot-resistance assessment ---------- #} {% if review.overall_feedback and review.overall_feedback.headline %}

Bot-resistance assessment

{{ review.overall_feedback.headline }}

{% for para in review.overall_feedback.paragraphs %}

{{ para }}

{% endfor %}
{% endif %} {# ---------- 4. Methods statement ---------- #}

Methods statement for your paper

Paste this into the Methods section of your manuscript to signal the instrument was reviewed for non-human-response resistance.
{# ---------- 5. Survey at a glance ---------- #}

Survey at a glance

Title{{ survey.name }}
Questions{{ review.parsed_summary.n_questions }}
Blocks{{ review.parsed_summary.n_blocks }}
Force-response{{ review.parsed_summary.force_response_pct }}% of questions
Question types {% for t, n in review.parsed_summary.type_histogram.items() -%} {{ t }}: {{ n }}{% if not loop.last %} · {% endif %} {%- endfor %}
{# ---------- 6. Per-category cards ---------- #}

Per-category review

{% for c in review.categories %}

{{ category_display(c.category) }}

{{ '%.0f'|format(c.score) }} / 100
{% if c.error %}

Reviewer error: {{ c.error }}

{% else %}

{{ c.summary }}

{% if c.findings %}
{{ c.findings|length }} finding{% if c.findings|length != 1 %}s{% endif %} {% for f in c.findings %}
{{ ui.severity_class(f.severity) }} {% if f.locator %} {{ f.locator }} {% endif %}
{{ f.rationale }}
{% if f.excerpt %}
"{{ f.excerpt }}"
{% endif %} {% if f.suggested_fix %}
→ {{ f.suggested_fix }}
{% endif %} {% if f.contributing_categories %}
Flagged by: {{ f.contributing_categories | map(attribute='value') | map('replace', '-', ' ') | join(', ') }}
{% endif %}
{% endfor %}
{% endif %} {% endif %}
{% endfor %} {# ---------- 7. Top recommendations ---------- #}

Top recommendations

{% if review.recommendations %}
    {% for r in review.recommendations %}
  1. {{ r.title }}
    {{ r.detail }}
    Surfaced by: {{ r.related_categories | map(attribute='value') | map('replace', '-', ' ') | join(', ') }}
  2. {% endfor %}
{% else %}

No actionable recommendations — every reviewer either passed cleanly or returned only low-impact findings.

{% endif %} {# ---------- 8. Narrative summary ---------- #}

Narrative summary

{{ review.narrative_summary }}
{# ---------- 9. Evidence appendix ---------- #}

Evidence appendix

{% for q in survey.questions %}
{{ q.qid }} · {{ q.type }}{% if q.subtype %}/{{ q.subtype }}{% endif %} · {{ q.text[:80] }}{% if q.text|length > 80 %}…{% endif %}
{{ q.text }}
{% if q.choices %}
Choices: {{ q.choices|join(' | ') }}
{% endif %} {% if q.force_response %}
force_response: ON
{% endif %} {% if q.hidden %}
hidden
{% endif %} {% if findings_by_qid.get(q.qid) %}
Flagged by: {% for cat_name, f in findings_by_qid[q.qid] -%} {{ cat_name }}{% if not loop.last %}, {% endif %} {%- endfor %}
{% endif %}
{% endfor %}
{# ---------- 10. Citation block ---------- #}

Cite Survey Shield

APA
{{ citation.apa }}
BibTeX
{{ citation.bibtex }}
{# ---------- 11. Footer ---------- #} {{ ui.copy_button_script() }}