{{ review.overall_feedback.headline }}
{% for para in review.overall_feedback.paragraphs %}{{ para }}
{% endfor %}
All reviewer calls are single-shot API calls via the LangChain
{{ "ChatGoogleGenerativeAI" if review.parameters.provider == "google" else "ChatOpenAI" }}
client with a Pydantic structured-output schema (no multi-turn chat,
no fine-tuned model, stateless between calls). Sampling parameters:
temperature={{ review.parameters.temperature }},
seed={{ review.parameters.seed }}.
No system instructions are used; all reviewer guidance is in the user prompt. Each per-category reviewer runs in parallel against the same survey-blob prefix; a separate consolidation call merges cross-category findings.
Exact prompt templates and the rubric definitions are versioned in the
Survey Shield package
(surveyshield/review/dimensions.py at rubric version
{{ review.parameters.category_rubric_version }}; canonical
text on
GitHub).
| 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 %}
|
Reviewer error: {{ c.error }}
{% else %}{{ c.summary }}
{% if c.findings %}"{{ f.excerpt }}"{% endif %} {% if f.suggested_fix %}
No actionable recommendations — every reviewer either passed cleanly or returned only low-impact findings.
{% endif %} {# ---------- 7b. Score-lift simulator ---------- #} {% if score_lift_tiers %}| Action | Category targeted | Projected overall score | Band |
|---|---|---|---|
| No additions | — | {{ '%.0f'|format(review.overall_score) }} / 100 | {{ score_band(review.overall_score) }} |
| Add {{ t.n_added }} high-impact item{{ 's' if t.n_added != 1 else '' }} | {{ t.category }} | {{ '%.0f'|format(t.projected_score) }} / 100 (+{{ '%.1f'|format(t.delta) }}) | {{ t.band }} |
{{ cat_name }}{% if not loop.last %}, {% endif %}
{%- endfor %}