{% extends "base.html" %} {% block title %}{{ phase.key }}{% endblock %} {% block body %} {% if phase.frozen %}
frozen since {{ phase.frozen }} — approve and dispatch refuse this phase's tasks unless a task carries freeze_exception: true with a freeze_exception_reason, and planning is blocked outright. garden unfreeze {{ phase.key }} lifts it.
{% endif %} {% if closing_review %}

Closing review

{{ closing_review.stage.replace('_', ' ') }}{% if closing_review.personas %} · roles {{ closing_review.personas|join(', ') }}{% endif %}{% if closing_review.source %} · source {{ closing_review.source }}{% endif %}{% if closing_review.evidence %} · evidence {{ closing_review.evidence[:12] }}{% endif %}{% if closing_review.reason %}
{{ closing_review.reason }}{% endif %}

{% endif %}
{{ phase.product }}

{{ phase.name }}{% if phase.frozen %} frozen{% endif %}

spent ${{ '%.2f' % spent }}{% if budget %} of ${{ '%.2f' % budget }}{% if spent >= budget %} · budget exceeded, dispatch paused{% endif %}{% endif %} · default owner {{ phase.owner or 'unassigned' }} · {{ rows|selectattr('0.pr')|list|length }} PR(s) tracked · fixed brief cost ~{{ '{:,}'.format(fixed_tokens) }} tokens (head + rules + digest + product + goals){% if retro_pending %} · retro: waiting for personas ({{ retro_pending.done }} of {{ retro_pending.total }}){% endif %}

Budget $
{% if has_retro %}Retro{% endif %}BoardTrellis
{% if not has_approved %}{% include "_kickoff.html" %}{% endif %}
{% include "_retro_verdict.html" %}
Progress

Merged against scope

{{ burnup|safe }}
{% if hide_done %}show {{ hidden_count }} done {% else %}hide {{ hidden_count }} done{% endif %}
{% for t, owner, eff, st, u, brief_tok in rows %} {% else %}{% endfor %}
idstatusownerptiertitledepsprreviewcirevbrieftokenscost
{{ t.id }}{{ stage(eff, 18) }}{{ eff.replace('_',' ') }}{{ owner or 'unassigned' }}{{ priority_label(t.priority) }}{{ t.difficulty }}{{ t.title }}{{ t.depends_on|join(', ') }} {% if t.pr %}#{{ t.pr.rsplit('/', 1)[-1] }}{% if st.pr_draft %} draft{% endif %}{% endif %} {% if st.last_review %}auto: {% if st.last_review.get('verdict') %}{{ st.last_review.get('verdict').replace('_', ' ') }}{% else %}incomplete{% endif %}{% endif %}{% if st.review_decision %}{% if st.last_review %} · {% endif %}{{ st.review_decision.lower().replace('_', ' ') }}{% endif %} {{ (st.checks or '').lower() }} {{ st.revisions or '' }} ~{{ '{:,}'.format(brief_tok) }} {% if u.runs %}{{ '{:,}'.format(u.input_tokens) }} / {{ '{:,}'.format(u.cache_read_input_tokens) }} / {{ '{:,}'.format(u.output_tokens) }}{% endif %} {% if u.runs %}${{ '%.2f' % u.cost_usd }}{% endif %}
{% if hide_done and hidden_count %}all {{ hidden_count }} tasks are done{% else %}no tasks yet{% endif %}
{% if planning %}{{ planning }}{% endif %}
Persona review of the body of work:
{% if has_approved %}{% include "_kickoff.html" %}{% endif %}
New task
Goals
{{ goals_html|safe }}
{% set plate_src = plate(phase.plant) %} {% if plate_src %}
{{ sheet.info.latin }}, plate from {{ PLATE_CREDIT }}
{% else %}
{{ plant(phase.plant, 240, 360) }}
{% endif %}
{{ phase.product }} · plate {{ phase.plate }}
{{ phase.name }}
{{ sheet.info.latin }} — {{ sheet.info.common }}
{{ sheet.total }} tasks · {{ sheet.merged }} merged · {{ sheet.prs_open }} PRs open
spent ${{ '%.2f' % spent }}{% if budget %} of ${{ '%.2f' % budget }}{% endif %}{% if plate_src %}
plate: {{ PLATE_CREDIT }}{% if sheet.info.get('plate_note') %}, {{ sheet.info.plate_note }}{% endif %}{% endif %}
{{ 'complete' if sheet.complete else 'open' }}
Spend

Cost by difficulty tier

{{ tiers|safe }} {% if metrics.by_difficulty %} {% for tier in ['easy','medium','hard'] %}{% if metrics.by_difficulty.get(tier) %}{% set d = metrics.by_difficulty[tier] %}{% endif %}{% endfor %}
tiertasksdoneavg revfirst-pass
{{ tier }}{{ d.tasks }}{{ d.done }}{{ d.avg_revisions }}{% if d.first_pass_rate is not none %}{{ (d.first_pass_rate * 100)|round|int }}%{% endif %}
{% endif %}

spend over time for this phase →

{% for name, text in specs %}
{{ name }}
{{ text|md|safe }}
{% endfor %} {% for name, text in docs %}
{{ name }}
{{ text|md|safe }}
{% endfor %} {% for r in reviews %}
persona · {{ r.persona }}{% if r.score %} · {{ r.score }}{% endif %}{% if r.features %} · {{ r.features }} feature(s){% endif %}
{{ r.text|md|safe }}
{% endfor %}
{% endblock %}