{# QA-047 (2026-06-02) — Recon findings panel. Inserted on the Overview tab between the KPI strip and the Findings-by-severity / ASI radar two-column row. Renders the recon-derived view-model assembled by ``dashboard_view.py``'s ``_assemble_recon_summary`` from the latest ``record_type=fingerprint`` line in ``memory.jsonl`` (plus any ``agent_skipped`` rows). Payload (``recon_summary``): - has_data — render-disabled flag (False ⇒ pending) - framework_family — e.g. ``"langchain"``, ``"Unknown"`` - target_model / target_ref — adapter ref (URL / module path / id) - target_mode — ``"prompt"|"code"|"http"|"framework"`` - has_tools / tool_count / tool_sample / discovered_tools (list) - has_memory / memory_keys (list) - is_multi_agent / touches_pii - inferred_goal / domain - sensitive_actions / declared_guardrails - guardrail_posture — "none"|"weak"|"moderate"|"strict"|phrase - requires_confirmation — bool|None (None ⇒ row omitted) - data_exposure — list[str] observed disclosures - behavioral_flags — list[str] behavioural observations - tool_descriptions — dict[tool -> one-line purpose] - recon_coverage — dict[band -> coverage state] - recon_probe_count — int probes fired in the audit - profile_source / profile_confidence - skipped_agents — list[{agent, asi, reason}] When ``has_data`` is False the panel renders a single pending line ("Recon agent has not finished its sweep yet.") so the operator isn't staring at empty
RECON
Recon agent has not finished its sweep yet. Capability fingerprint, declared tools, and skipped-agent reasons will populate here as soon as the recon record is written.
{% endif %}{{ tool }}{% if desc %}{{ desc }}{% endif %}
{% endfor %}
{% if recon_summary.tool_count > recon_summary.tool_sample|length %}
{# No-JS expander. The checkbox + extra chips + toggle label are
flex siblings of the sample chips above; the label is ordered
LAST in CSS so it trails the whole chip flow instead of
sitting between the sample row and the extra chips. Only the
tools NOT already in the sample are listed (no duplicates). #}
{% for tool in recon_summary.discovered_tools if tool not in recon_summary.tool_sample %}
{% set desc = recon_summary.tool_descriptions.get(tool) %}
{{ tool }}{% if desc %}{{ desc }}{% endif %}
{% endfor %}
{% endif %}
{{ action }}
{% endfor %}
{{ s.agent }}
{{ s.reason }}