{% extends "base.html" %} {% block title %}Specs{% endblock %} {% block content %}

Specs

{{ specs|length }} spec{{ '' if specs|length == 1 else 's' }} across {{ roots|length }} root{{ '' if roots|length == 1 else 's' }}. {% if allow_run %} Click a status chip to flip it. {% else %} Read-only mode — restart without --read-only to edit statuses. {% endif %}

{% if roots %}

Reading from {% for root in roots %} {{ root }}{% if not loop.last %}, {% endif %} {% endfor %}

{% endif %} {# "Ready to close?" section — server-rendered shell, populated by completion_candidates.js on page load. Hidden until the GET returns at least one candidate, so users with zero candidates see no visual clutter. Gated server-side on both feature flag AND allow_run per docs/specs/ops-specs-completion-candidates/ (Phase 2). #} {% if allow_run and specs_candidates_enabled %} {% endif %} {% if specs %} {# A3a toolbar — chip filter row, search, sort. JS in specs_refined.js handles state; default chip state is all-on EXCEPT Complete per decisions.md D1 + R1.3. URL param persistence ships in A3c. #}
Filter: {% set bucket_styles = [ ('active', 'Active', ''), ('approved-not-shipped', 'Approved-not-shipped', 'bucket-approved-not-shipped'), ('complete', 'Complete', 'bucket-complete'), ('paused', 'Paused', 'bucket-paused'), ('stale', 'Stale', 'bucket-stale'), ('draft', 'Draft', 'bucket-draft'), ] %} {% for bucket, label, color_cls in bucket_styles %} {# A3c — chip active state honors `?bucket=` URL param when present, else falls back to defaults (all on except Complete). initial_buckets is always a list — pre-parsed in dashboard.py via _parse_specs_url_state. #} {% set active = bucket in initial_buckets %} {# bucket-* class always present so chips colorize correctly after JS toggles chip-active on/off. CSS gates the color on `.chip-active.bucket-*` — inactive chips show neutral. #} {% endfor %}
{# A3c — initial_query from ?q= URL param (empty by default). #}
{# A3c — initial_sort from ?sort= URL param (default "recent"). #}
{# Compact status display: dot + 3-letter code for known statuses, truncated text + dotted underline for custom strings. Full status in title attribute (native tooltip). Click on editable pills swaps to