{% from '_partials/inline_select.html' import inline_select %} {% if task.arc_id %} {% endif %} {% if task.date_finished %} {% endif %}
Status {{ inline_select(task_id, 'status', status_options, task.status, hx_target='#status-result', form_class='inline-flex-center gap-md') }}
Owner {{ inline_select(task_id, 'owner', ['human','claude-code'], task.owner, hx_target='#owner-result', form_class='inline-flex-center gap-md') }}
Horizon {{ inline_select(task_id, 'horizon', ['now','next','later'], task.horizon, hx_target='#horizon-result', form_class='inline-flex-center gap-md') }}
Workflow Type {{ inline_select(task_id, 'type', ['build','test','refactor','specification','design','decommission','inception'], task.workflow_type, hx_target='#type-result', form_class='inline-flex-center gap-md') }}
Arc {{ task.arc_id }} {% if arc_name %}{{ arc_name }}{% endif %}
Created{{ task.created or '' }}
Last Update{{ task.last_update or '' }}
Finished{{ task.date_finished }}
{# T-1584: Recommendation + Reviewer Verdict cards — cross-surface parity with /review (T-1575/T-1583) and /approvals (T-1531/T-1569). The agent's Recommendation and the reviewer agent's mechanical verdict were previously only visible inside the collapsed raw-markdown
at the bottom. #} {% if rec_complete %}

Recommendation{% if verdict and verdict != '?' %} — {{ verdict }}{% endif %}

{% if rec_rationale_html %}

Rationale

{{ rec_rationale_html | safe }}
{% endif %} {% if rec_evidence_html %}

Evidence

{{ rec_evidence_html | safe }}
{% endif %}
{% elif verdict and verdict != '?' %}

Recommendation — {{ verdict }}

⚠ Verdict recorded as {{ verdict }} but the rationale is missing. A recommendation without a rationale cannot be acted on — ask the agent to fill the **Rationale:** line in the ## Recommendation section.
{% elif rec_state == 'NO-REC' %}

Recommendation — NO-REC

The agent has not yet written a ## Recommendation block for this task. Ask the agent to add a recommendation (GO / NO-GO / DEFER) with rationale and evidence before deciding.
{% endif %} {% if reviewer and reviewer.overall %}

Reviewer — {{ reviewer.overall }}{% if reviewer.needs_human %}needs human{% endif %}

{% if reviewer.findings == 0 %}No findings.{% else %}{{ reviewer.findings }} finding{{ 's' if reviewer.findings != 1 else '' }} — see Reviewer Verdict block in raw body below.{% endif %}
{% endif %} {# T-1980: BVP block — parity with /bvp scatter and /arcs/ constituent table. Uses the same _compute_bvp / _compute_cost helpers, so numbers cannot drift. #}

BVP {% if bvp.mode == 'confirmed' %} Confirmed {% elif bvp.mode == 'proposed' %} Proposed* {% else %} No scores {% endif %} View on /bvp →

{% if bvp.mode == 'none' %}

No BVP scores yet. The estimator worker proposes scores periodically (see /bvp); humans confirm via fw bvp confirm {{ task_id }}.

{% else %}

Per-driver scores

{% for d, s in bvp.scores.items() %} {% endfor %}
DriverScoreWeight
{{ d }} {% if bvp.driver_names.get(d) %}{{ bvp.driver_names[d] }}{% endif %} {% if bvp.mode == 'proposed' %}{{ s }}*{% else %}{{ s }}{% endif %} {{ bvp.weights.get(d, '—') }}

Composite

BVP_norm {% if bvp.mode == 'proposed' %}{{ '%.3f'|format(bvp.bvp_norm) }}*{% else %}{{ '%.3f'|format(bvp.bvp_norm) }}{% endif %}
BVP_raw{{ bvp.bvp_raw }}
Cost {% if bvp.cost is not none %} {% if bvp.mode == 'proposed' %}{{ '%.3f'|format(bvp.cost) }}*{% else %}{{ '%.3f'|format(bvp.cost) }}{% endif %} ({{ bvp.cost_source }}) {% else %}{% endif %}
{% if bvp.mode == 'proposed' %}

* Estimator-proposed (not yet human-confirmed). Confirm via fw bvp confirm {{ task_id }}.

{% endif %} {% endif %} {# T-1982: arc-scoped drivers — surface the gap T-1981 will resolve. These have weights from the arc YAML but no per-task scores yet, so _compute_bvp silently excludes them. Show them explicitly with their weight + "no score" muted indicator so the gap is visible, not silent. #} {% if arc_scoped_drivers %}
Arc-scoped drivers ({{ arc_scoped_drivers|length }} weighted but unscored on this task — see T-1981) {% for sd in arc_scoped_drivers %} {% endfor %}
DriverScoreWeightRationale
{{ sd.get('name', '?') }} — (no score) {{ sd.get('weight', '—') }} {{ sd.get('rationale', '')|truncate(80, True) }}

These drivers contribute weight from the arc YAML but no per-task scores exist yet, so they're excluded from the BVP calculation above. Design question parked at T-1981 (extend estimator, manual scoring, or rollup-only).

{% endif %}
{% if artifacts %}
Research Artifacts ({{ artifacts|length }})
{% endif %} {% if task.description %}
Description

{{ task.description }}

{% endif %} {% if ac_items %} {% set checked_count = ac_items | selectattr('checked') | list | length %} {% set agent_acs = ac_items | selectattr('section', 'equalto', 'agent') | list %} {% set human_acs = ac_items | selectattr('section', 'equalto', 'human') | list %} {% set general_acs = ac_items | selectattr('section', 'equalto', 'general') | list %} {% set has_sections = (agent_acs | length > 0) or (human_acs | length > 0) %}
Acceptance Criteria ({{ checked_count }}/{{ ac_items|length }}) {% if has_sections %} {# ── Agent ACs (toggleable checkboxes) ─────────────── #} {% if agent_acs %} {% set agent_checked = agent_acs | selectattr('checked') | list | length %}
    {% for ac in agent_acs %}
  • {{ ac.text }}
  • {% endfor %}
{% endif %} {# ── Human ACs (structured cards) ──────────────────── #} {% if human_acs %} {% set human_checked = human_acs | selectattr('checked') | list | length %} {% for ac in human_acs %}
{% if ac.confidence == 'review' %} Review {% elif ac.confidence == 'rubber-stamp' %} Rubber-stamp {% endif %} {{ ac.text }}
{% if ac.steps or ac.expected or ac.if_not %}
{% if ac.steps %}
Steps
    {% for step in ac.steps %}
  1. {{ step }}
  2. {% endfor %}
{% endif %} {% if ac.expected %}
Expected

{{ ac.expected }}

{% endif %} {% if ac.if_not %}
If not

{{ ac.if_not }}

{% endif %}
{% elif ac.body %}
{{ ac.body }}
{% endif %}
{% endfor %} {% endif %} {% else %} {# ── No sections: flat list (backward compatible) ──── #}
    {% for ac in ac_items %}
  • {{ ac.text }}
  • {% endfor %}
{% endif %}
{% endif %}
{% if can_complete %}
{% endif %}
{% if episodic %}
Episodic Summary {% if episodic.summary %}

{{ episodic.summary }}

{% endif %} {% if episodic.outcomes %}
Outcomes
    {% for o in episodic.outcomes %}
  • {{ o }}
  • {% endfor %}
{% endif %} {% if episodic.decisions %}
Decisions
    {% for d in episodic.decisions %}
  • {{ d.decision }} — {{ d.rationale or '' }}
  • {% endfor %}
{% endif %} {% if episodic.challenges %}
Challenges
    {% for c in episodic.challenges %}
  • {{ c.description }}{% if c.resolution %} — {{ c.resolution }}{% endif %}
  • {% endfor %}
{% endif %} {% if episodic.artifacts %}
Artifacts
{% if episodic.artifacts.created %}

Created:

    {% for a in episodic.artifacts.created %}
  • {{ a }}
  • {% endfor %}
{% endif %} {% if episodic.artifacts.modified %}

Modified:

    {% for a in episodic.artifacts.modified %}
  • {{ a }}
  • {% endfor %}
{% endif %} {% endif %} {% if episodic.related_tasks %}
Related Tasks
    {% for edge_type, tasks_list in episodic.related_tasks.items() %} {% if tasks_list %}
  • {{ edge_type }}: {% if tasks_list is string %} {% set task_id = tasks_list.split(' ')[0].split('(')[0].strip() %} {{ tasks_list }} {% else %} {% for rt in tasks_list %} {{ rt }}{% if not loop.last %}, {% endif %} {% endfor %} {% endif %}
  • {% endif %} {% endfor %}
{% endif %} {% if episodic.tags %}
Tags

{% for tag in episodic.tags %} {{ tag }} {% endfor %}

{% endif %}
{% endif %} {% if task_content %}
Task Body
{{ task_content }}
{% endif %}