{% extends "base.html" %}
{% block title %}Runs · Gauntlet Console{% endblock %}
{% block body %}
Runs
{# FR-10.5: while a live process drives the worktree, name the holder and
disable launching. The console only surfaces this — the engine lock enforces. #}
{% if locked %}
⛔ Worktree is being driven by
{{ lock.slug }}{% if lock.run_id %}/{{ lock.run_id }}{% endif %}
(pid {{ lock.pid }}). Launch / Resume / Approve are disabled until it parks or finishes.
{% endif %}
{# Launch a new run as a console-owned subprocess (FR-6.1). Disabled while the
worktree lock is held (FR-10.5). control.js POSTs to /api/runs. #}
{# FR-1.2: search / status filter / sort. A plain GET form so it works without
JS; the server applies the same filters to the JSON API and this page. #}
{# The list is always rendered (live.js swaps the tbody on each SSE tick, so an
empty run root that later gains a run fills in without a manual refresh). #}