| name | sar-report |
| description | Produce a ground-team-ready report from SAR triage findings. Use when the user asks for "the SAR report", "high-confidence hits", "what did the search turn up", "map the candidates", or "generate the report" — e.g. "render the report for incident013". Ranks findings by confidence tier, surfaces blaze-orange Stage-1 hits prominently, writes a markdown report with embedded tile thumbnails and lat/lon map links tuned to the incident profile, and writes a sibling GeoJSON for import into QGIS / Google Earth / ATAK. |
sar-report
Render the ground-team-ready SAR report.
Inputs
- Incident id — e.g.
incident013. Report reads:
runs/<incident_id>/manifest.json
runs/<incident_id>/findings.jsonl
runs/<incident_id>/profile.json (or falls back to assets/<incident_id>/incident.json)
If findings.jsonl is missing or empty, run sar-triage first.
What to do
Run the renderer:
Run from the project root (or prefix with ${CLAUDE_PROJECT_DIR}/). The script resolves runs/ from $CLAUDE_PROJECT_DIR (or its own location) by default; override with --output-root.
python3 .claude/skills/sar-report/scripts/render_report.py \
--incident-id <INCIDENT_ID>
Writes:
runs/<incident_id>/report.md — tiered markdown report
runs/<incident_id>/report.geojson — points for mapping software
Report structure
- Mission context — subject, terrain, region prior from the incident profile.
- Summary — counts by tier, tiles reviewed, Stage-1 skip counts.
- DECISIVE / BLAZE-ORANGE HITS — top of report, surfaced regardless of model verdict.
- HIGH CONFIDENCE (conf ≥ 0.75) — thumbnail, GPS, map links, bboxes, cues, description, alternative.
- PROBABLE (0.5–0.75) — same layout.
- POSSIBLE (0.25–0.5) — terse one-line entries.
- Appendix A — Stage-1 skip counts.
- Appendix B — GeoJSON pointer.
- Known Limitations — inherits modality warnings and calibration notes from the profile.
Report back to the user
- Absolute paths of
report.md and report.geojson.
- Tier summary (high / probable / possible / blaze-orange counts).
- If any
high_confidence or blaze_orange hits exist, enumerate them by frame and GPS — actionable leads for the ground team.
- If hits are zero: say so plainly. Recommend whatever the profile's
modality_warnings suggest as an alternative (e.g. thermal imagery).
Re-running
Safe to re-render any time. findings.jsonl grows monotonically; re-running after more triage always reflects the latest state. The report is a view, not a source of truth.
Debug wrappers
rank_findings.py --incident-id ID — prints the ranked JSON document without writing the report (useful for piping into jq).
render_geojson.py --incident-id ID — writes only the GeoJSON.