{% set prev = reports[loop.index] if not loop.last else none %}
{% if prev and r.meta and prev.meta %}
{% set cur_failed = r.meta.get("sources_failed", []) %}
{% set prev_failed = prev.meta.get("sources_failed", []) %}
{% set fixed = prev_failed|reject('in', cur_failed)|list %}
{% set broke = cur_failed|reject('in', prev_failed)|list %}
{% if fixed %}✅ 恢复: {{ fixed|join(", ") }}{% endif %}
{% if broke %}⚠ 新增失败: {{ broke|join(", ") }}{% endif %}
{% if not fixed and not broke %}与昨日相同{% endif %}
{% endif %}
{% if r.meta %}
{% for name, info in r.meta.get("projects", {}).items() %}
{% set st = info.get('status', 'unknown') %}
{% set is_starred = name in starred %}
{{ name }}{% if is_starred %} ★{% endif %}
{% if st=='ok' %} ✓{% elif st=='partial' %} ⚠{% else %} ✗{% endif %}
{% endfor %}
{% for s in r.meta.get("sources_failed", []) %}
{{ s }} ✗
{% endfor %}