{% from '_partials/badge.html' import badge %}
About this page

Types: {{ badge('gap') }} = spec-reality divergence (present tense), {{ badge('risk') }} = forward-looking concern (future tense).

Risk scoring: Likelihood (1-5) × Impact (1-5) = Score (1-25).
Ranking: {{ badge('low') }} 1-4, {{ badge('medium') }} 5-9, {{ badge('high') }} 10-16, {{ badge('urgent') }} 17-25.

Data source: .context/project/concerns.yaml

Watching
{{ total_watching }}
Active concerns being monitored
Closed
{{ total_closed }}
Resolved · {{ total_gaps }} gaps + {{ total_risks }} risks
Controls
{{ total_controls }}
{{ controls_active }} active · {{ controls_blocking }} blocking

Watching ({{ watching | length }})

{% if watching %} {% for c in watching %}
{{ c.id }} — {{ c.title }} {{ badge(c.type | default('gap')) }} {{ badge(c.severity | default('low')) }}

{{ c.description }}

{% if c.type == 'risk' and c.score %}

Score: {{ c.likelihood }} × {{ c.impact }} = {{ c.score }} {% if c.controls %} | Controls: {{ c.controls | join(', ') }}{% endif %}

{% endif %} {% if c.residual_notes %}

Residual: {{ c.residual_notes }}

{% endif %} {% if c.decision_trigger %}

Trigger: {{ c.decision_trigger }}

{% endif %}
{% endfor %} {% else %}

No concerns being watched.

{% endif %} {% if risks %}

Risk Heatmap (Likelihood × Impact)

{% for l in [5, 4, 3, 2, 1] %} {% for i in [1, 2, 3, 4, 5] %} {% set score = l * i %} {% set cell_class = 'cell-urgent' if score >= 17 else ('cell-high' if score >= 10 else ('cell-medium' if score >= 5 else 'cell-low')) %} {% set count = [] %} {% for r in risks %} {% if r.get('likelihood', 0) == l and r.get('impact', 0) == i %} {% if count.append(1) %}{% endif %} {% endif %} {% endfor %} {% endfor %} {% endfor %}
1 Negligible 2 Minor 3 Moderate 4 Major 5 Severe
{{ l }}{% if l == 5 %} Certain{% elif l == 4 %} Likely{% elif l == 3 %} Possible{% elif l == 2 %} Unlikely{% else %} Rare{% endif %} {% if count | length > 0 %} {{ count | length }} {% endif %}
{% endif %} {% if controls %}

Controls ({{ total_controls }})

Enforcement mechanisms. See Enforcement page for hook status.

{% for ctype, count in control_by_type | dictsort %}
{{ ctype | replace('_', ' ') | capitalize }} {{ count }}
{% endfor %}
{% for c in controls %} {% endfor %}
ID Control Type Blocking Mitigates Status
{{ c.id }} {{ c.name }} {{ c.type | replace('_', ' ') }} {% if c.blocking %}{{ badge('gate', '#e67e22') }} {% else %}{{ badge('warn', '#6c757d') }} {% endif %} {{ c.mitigates | join(', ') if c.mitigates else 'None' }} {{ badge(c.status | default('active')) }}
{% endif %}
Closed Concerns ({{ closed | length }})
{% for c in closed %} {% endfor %}
ID Type Concern Severity Resolution
{{ c.id }} {{ badge(c.type | default('gap')) }} {{ c.title }} {{ badge(c.severity | default('low')) }} {{ c.resolution | default('See task') | truncate(100) }}