{% extends "base.html" %} {% block title %}{{ task.id }}{% endblock %} {% block body %}
{% if return_to %}{% endif %}
{{ task.product }} / {{ task.phase }} · {{ task.id }}

{{ task.title }}

{{ stage(eff, 24) }}{{ eff.replace('_',' ') }} {{ stage_word(eff) }}priority {{ priority_label(task.priority) }} · {{ task.difficulty }} · owner {{ owner or 'unassigned' }}{% if owner_source != 'unassigned' %} ({{ owner_source }}){% endif %}{% if task.estimate %} · {{ task.estimate }}{% endif %}{% if task.pr %} · PR ↗{% endif %}

Brief{% if latest_run %}Latest run{% endif %}
{% if decision_card %}{% set card_task = task %}{% include "_decision_card.html" %}{% endif %} {% if phase_hold %}
Held by {{ phase_hold_kind }}
{% if phase_hold_kind == 'sequential phase order' %}

This task remains {{ task.status.value.replace('_', ' ') }}; it will not start, revise, review, or rebase while {{ phase_hold }}. Work already in flight may finish and publish.

{% else %}

This task remains {{ task.status.value.replace('_', ' ') }}; it will not start, revise, review, rebase, or merge while {{ phase_hold }}.

{% endif %}
{% endif %} {% if task.status.value == 'awaiting_triage' %}
Draft PR: your first look

Skim the PR{% if state.last_review and state.last_review.get('verdict') %}; the automated review said {{ state.last_review.get('verdict').replace('_',' ') }}: {{ state.last_review.get('summary', '') }}{% elif state.last_review %}; the automated review did not finish with a verdict{% endif %}. Mark it ready for a full review, or send it back with what to change.

Open PR ↗
{% endif %} {% if later_deps %}
Dependency in a later phase

This task depends on {% for d in later_deps %}{{ d }}{% if not loop.last %}, {% endif %}{% endfor %}, which {{ 'sits' if later_deps|length == 1 else 'sit' }} in a later phase of this product. It can never become ready here until {{ 'that dependency moves' if later_deps|length == 1 else 'those dependencies move' }} to this phase or earlier.

{% endif %} {% if completion %}
Current completion · {{ completion.kind }}

{{ completion.source }}{% if completion.at %} · {{ completion.at[:16] }}{% endif %}
{{ completion.reason }}

{% endif %} {% set ssh_tmux_session = latest_run and (latest_run.env_snapshot or {}).get('ssh_tmux_session') %} {% if ssh_tmux_session %}

Watch on {{ latest_run.host }}: tmux attach-session -r -t {{ ssh_tmux_session }}. Detach with Ctrl-b d.

{% endif %} {% if brief_gaps %}
Fix the brief before approving

{% for gap in brief_gaps %}{{ gap }}{% if not loop.last %}; {% endif %}{% endfor %}

{% endif %} {% if state.harness_hold and task.status.value == 'ready' %}
Waiting for {{ state.harness_hold }} to resume

This task is ready and will return to the dispatch queue automatically when the harness probe succeeds.

{% endif %} {% if manual_reservation %}
Manual mode

Reserved by {{ manual_reservation.actor.replace('_', ' ') }}{% if manual_reservation.note %}: {{ manual_reservation.note }}{% endif %}. Garden observes active work, PRs, and checks but starts no automatic lifecycle action.

{% if latest_run and latest_run.status in ('requested','preparing','running') %}

Active work {{ latest_run.run_id }} continues to its safe boundary; this reservation does not stop or cancel it.

{% endif %}
{% endif %} {% if state.operator_scope and state.operator_scope.steps %}
Operator-owned configuration

This prerequisite is outside the worker checkout. Verify it as an operator; the worker will receive only checkout-owned work.

{% endif %}
{% if not manual_reservation and not task.status.terminal %}{% endif %} {% if task.status.value == 'draft' %}{% if brief_gaps %}Fix the brief before approving{% endif %}
Approve into {{ task.phase }} {% endif %} {% if task.status.value == 'ready' %}
{% endif %} {% if not phase_hold and task.status.value in ('ready','changes_requested') and (not manual_runner or not manual_take_reason) %}
{% endif %} {% if (not state.ssh_recovery_hold or task.status.value == 'failed') and (task.status.value in ('failed','cancelled','changes_requested') or (state.needs_human and not task.status.terminal)) %}
{% endif %} {% if state.revisions %}
{% endif %} {% if not phase_hold and task.pr and task.status.value in ('in_review','awaiting_triage','changes_requested') and not state.review_run %}
{% endif %} {% if not phase_hold and (task.pr or task.branch) %}{% endif %}
{% if task.status.value != 'draft' and move_phases|length > 1 %}
{% endif %} {% if not phase_hold and has_pending and task.status.value != 'running' and not edit_running %}
{% endif %} {% if not task.status.terminal and not state.investigation %}{% endif %} {% set trial_again = task.pr and state.trial and state.trial.status in ('done', 'inconclusive') %} {% if not phase_hold and ((task.status.value in ('ready','draft','failed') and not task.pr) or trial_again) %}{% endif %} {% if task.status.value in ('running','in_review','awaiting_triage','changes_requested') and not (manual_runner and task.status.value == 'running') %}
{% endif %} {% if not task.status.terminal %}
{% endif %}
{% if not task.status.terminal and not state.investigation %}{% endif %} {% if state.investigation %}{% set publication = state.investigation.get('publication', {}) %}
Deep dive · {{ state.investigation.status }}

{{ state.investigation.reason }}

{% if state.investigation.get('run_id') %}Investigation run{% endif %}{% if state.investigation.get('report_paths') %}Read HTML reportMarkdown source{% endif %}{% if publication.get('status') == 'failed' %}

Publication failed: {{ publication.error }}

{% elif publication.get('commit') %}

Published {{ publication.markdown }} and {{ publication.html }} at {{ publication.commit[:12] }}.

{% endif %}
{% endif %} {% if not manual_reservation and not task.status.terminal %}{% endif %} {% if manual_take_reason %}

{{ manual_take_reason }}

{% endif %} {% if manual_runner and task.status.value == 'running' and latest_run and latest_run.runner == 'manual' %}
Manual session claimed

This task packet is assigned to this manual session. Complete the work, then submit its result to finish the session.

Open assigned packet
{% endif %} {% if not phase_hold %}{% endif %} {% if not phase_hold %} {% endif %} {% if usage.runs %}
${{ '%.2f' % usage.cost_usd }}
cost across {{ usage.runs }} run{{ 's' if usage.runs != 1 else '' }}
{{ '{:,}'.format(usage.input_tokens) }}
input tokens
{{ '{:,}'.format(usage.output_tokens) }}
output tokens
{{ '{:,}'.format(usage.cache_read_input_tokens) }}
cache reads · {{ usage.minutes }} min
{% endif %}
{{ body_html|safe }}
{% if criteria_rows %}
Acceptance criteria
{% for c in criteria_rows %} {% endfor %}
criterionworker evidencereview
{{ c.criterion }} {% if c.not_done %}not done {{ c.worker_reason or 'no reason given' }}{% elif c.evidence %} {{ c.evidence }}{% elif c.has_worker %}no evidence{% else %}{% endif %} {% if c.met is true %}met{% elif c.met is false %}not met{% else %}{% endif %}{% if c.review_reason %} {{ c.review_reason }}{% endif %}
{% endif %} {% if evidence_rows %}
Required evidence
    {% for item in evidence_rows %}
  • {{ item.state }} {{ item.label }}
  • {% endfor %}
{% endif %} {% if state.ci_status %}
exact-head CI

{{ state.ci_status.provider }} · {{ state.ci_status.state }}{% if state.ci_status.queried_sha %} for {{ state.ci_status.queried_sha }}{% endif %}{% if state.ci_status.stale %} stale{% endif %}

{% endif %} {% if suggestions %}
Suggestions{% if edit_running %} · integrating…{% endif %}
    {% for sg in suggestions %}
  • {{ 'integrated' if sg.integrated else 'pending' }} {% if sg.applies_to %}{{ sg.applies_to }} {% endif %}{{ sg.text }} — {{ sg.author }}{% if sg.date %}, {{ sg.date }}{% endif %}
  • {% endfor %}
{% if edit_diff %}
What integration changed
{{ edit_diff }}
{% endif %}
{% endif %} {% if friction_text %}
Friction
{{ friction_text|md|safe }}
{% endif %} {% if state.stashes %}
Stashed changes

Leftover edits from a killed run, set aside so a fresh dispatch could start clean. Recover with git stash apply <sha> in the task's worktree.

    {% for s in state.stashes %}
  • {{ s.sha[:12] }} {{ s.name }}{% if s.at %} — {{ s.at[:16] }}{% endif %}
  • {% endfor %}
{% endif %} {% if state.pending_feedback and not task.status.terminal %}
Pending feedback for the next revise run
{{ state.pending_feedback|md|safe }}
{% endif %} {% if completion and review_history %}
Historical automated reviews
{% for review in review_history %}

{{ review.at[:16] if review.at else 'date unavailable' }} · review run{% if review.head %} · source {{ review.head[:12] }}{% endif %}

{{ review.markdown|md|safe }}
{% endfor %}
{% elif state.last_review %}
Last automated review
{{ review_md|md|safe }}
{% endif %} {% if state.qa %}
Questions and answers
{% for item in state.qa %}

Q: {{ item.q }}
A: {{ item.a }}

{% endfor %}
{% endif %} {% if design_files.changed %}
Design files in this PR
{% endif %} {% if design_files.shared %}
Relevant shared design files
{% endif %} {% if prior_trials %}
Trial history
{% for tr, md in prior_trials %}
{{ md|md|safe }}
{% endfor %}
{% endif %} {% if discovered %}
Discovered work
    {% for d in discovered %}
  • {{ d.id }} {{ d.title }} {{ d.status.value }}
  • {% endfor %}
{% endif %} {% if usage.by_mode %}
Usage by run mode
{% for mode, m in usage.by_mode.items()|sort %}{% endfor %}
moderunsinputcache-readoutputcost
{{ mode }}{{ m.runs }}{{ '{:,}'.format(m.input_tokens) }}{{ '{:,}'.format(m.cache_read_input_tokens) }}{{ '{:,}'.format(m.output_tokens) }}${{ '%.2f' % m.cost_usd }}
{% endif %} {% if task.status.value == 'running' %}
Live output
{% with events=initial_stdout %}{% include "_stdout.html" %}{% endwith %}
{% endif %}
Runs
{% include "_runs.html" %}
{% if events %}
Timeline
    {% for e in events %}
  • {{ e.at[5:16] }}{{ e.kind }}{% if e.kind == 'transition' %}{{ e['from'] }} → {{ e.to }}: {{ e.note }}{% elif e.kind == 'dispatch' %}{{ e.mode }} {{ e.model }} {% if e.resumed %}(resumed){% endif %} base {{ e.base }}{% elif e.kind == 'run_finished' %}{{ e.mode }} {{ e.status }}{% if e.cost_usd %} ${{ '%.2f' % e.cost_usd }}{% endif %}{% elif e.kind == 'review' %}{{ e.verdict }}: {{ e.summary }}{% elif e.kind == 'waiting_human' %}{{ e.question }}{% elif e.kind == 'answer' %}{{ e.answer }}{% elif e.kind == 'discovered' %}{{ e.new_task }} {{ e.title }}{% elif e.kind == 'stall' %}{{ e.reason }}{% elif e.kind == 'conflict' %}vs {{ e.base }}: {% if e.resolved %}rebased and force-pushed{% else %}conflicts in {{ e.files|join(', ') or 'unknown files' }}; revise run queued{% endif %}{% elif e.kind == 'restacked' %}onto {{ e.base }}{% if e.conflict %} (conflict){% endif %}{% elif e.kind == 'stacked' %}on {{ e.parent }} ({{ e.base }}){% elif e.kind == 'pr_opened' %}{{ e.pr }}{% if e.draft %} (draft){% endif %}{% elif e.kind == 'triaged' %}{{ e.decision or 'ready' }} by {{ e.by }}{% elif e.kind == 'check' %}{{ e.stage }} {{ e.name }}: {{ e.status }}{% elif e.kind == 'suggestion' %}{{ e.author }}{% if e.applies_to %} ({{ e.applies_to }}){% endif %}: {{ e.text }}{% elif e.kind == 'integrated' %}integrated {{ e.count }} suggestion(s){% elif e.kind == 'moved' %}{{ e['from'] }} → {{ e.to }}{% elif e.kind == 'stashed' %}{{ e.sha[:12] }} {{ e.name }}{% elif e.kind == 'rebase' %}{% if e.how == 'mechanical' %}rebased onto {{ e.base }} mechanically — no model, no cost{% elif e.how == 'agent' %}conflict on {{ e.base }}{% if e.files %} in {{ e.files|join(', ') }}{% endif %} — a rebase agent will resolve it{% elif e.verdict_kept %}rebased; diff unchanged; verdict kept{% else %}rebased; diff changed; re-reviewing{% endif %}{% elif e.kind == 'merge_head' %}{% if e.left %}left the merge queue: {{ e.reason }}{% else %}merge queue head — {{ e.reason }}{% endif %}{% elif e.kind == 'feedback_ignored' %}ignored feedback from {{ e.author }}{% if e.reason %} ({{ e.reason }}){% endif %}{% elif e.kind == 'rebased_stale_base' %}{% if e.resolved %}base {{ e.base }} moved and recovered; rebased onto it, checks pass{% else %}still failing after a rebase onto {{ e.base }}{% endif %}{% else %}{{ e.reason or e.note or e.persona or '' }}{% endif %}
  • {% endfor %}
{% endif %} {% if log_lines %}
Log
{% for l in log_lines %}{{ l }} {% endfor %}
{% endif %}
file
{{ rel }}
{% if task.discovered_from %}
discovered by
{{ task.discovered_from }}
{% endif %} {% if state.stack_parent %}
stacked on
{{ state.stack_parent }} (PR targets {{ state.pr_base }})
{% endif %} {% if eff == 'merged_into_parent' %}
waiting on
merged into {% if state.merged_into_parent.parent %}{{ state.merged_into_parent.parent }}{% else %}{{ state.merged_into_parent.branch }}{% endif %}'s branch; done once it reaches the base
{% endif %} {% if trial_view %}
trial
{{ trial_view.get('status', '').replace('_', ' ') }}{% if trial_view.get('winner') %} · winner {{ trial_view.get('winner') }}{% elif trial_view.get('kept') %} · kept {{ trial_view.get('kept') }}{% else %} · no verdict yet{% endif %}{% if trial_view.get('wait_reason') %}
{{ trial_view.get('wait_reason') }}{% endif %}
{% for c in trial_view.get('contenders', []) %}{{ c.get('label', 'unknown contender') }} {{ c.get('model', '') }} · {{ c.get('status', 'unknown') }}{% if c.get('run_id') %} · run{% endif %}{% if c.get('elapsed') is not none %} · {{ '%.1f' % c.get('elapsed') }} min elapsed{% endif %}{% if c.get('kind') %} ({{ c.get('kind') }}){% endif %}{% if c.get('cost') is not none %} · ${{ '%.2f' % c.get('cost') }}{% endif %}{% if c.get('score') is not none %} · {{ c.get('score') }}/10{% endif %}{% if c.get('pr') %} · PR{% endif %}{% if c.get('note') %} · {{ c.get('note') }}{% endif %}
{% endfor %}
{% endif %}
depends on
{% for d in task.depends_on %}{{ d }} (after {{ dependency_after(d) }}){% if d in blockers %} (open){% endif %} {% else %}{% endfor %}
unblocks
{% for d in dependents %}{{ d }} {% else %}{% endfor %}
reading
{% for r in task.reading %}{{ r }}
{% else %}{% endfor %}
branch
{{ task.branch or '—' }}
PR
{% if task.pr %}{{ task.pr }}{% if state.pr_draft %} draft{% endif %}{% else %}{% endif %}
{% if state.review_decision or state.checks %}
review / CI
{{ state.review_decision or '—' }} / {{ state.checks or '—' }}{% if state.failed_checks %} ({{ state.failed_checks|join(', ') }}){% endif %}
{% endif %} {% if state.ci_status %}
exact-head CI
{{ state.ci_status.provider }} · {{ state.ci_status.state }} · {{ state.ci_status.queried_sha[:12] or 'head unavailable' }}{% if state.ci_status.stale %} · stale{% endif %}{% if not state.ci_status.exists_for_sha %} · absent for SHA{% endif %}{% if state.ci_status.evidence_url %} · evidence{% endif %}
{% endif %} {% if state.last_review %}
auto review
{% if state.last_review.get('verdict') %}{{ state.last_review.get('verdict').replace('_',' ') }}{% else %}incomplete{% endif %} ({{ state.review_rounds }} round{{ 's' if state.review_rounds != 1 else '' }}){% if state.review_run %} · running{% endif %}
{% endif %} {% if state.automerge_blocked and not task.status.terminal %}
automerge
held: {{ state.automerge_blocked }}
{% endif %} {% if state.automerged %}
automerge
merged by the garden ({{ state.automerged.method }}, {{ state.automerged.review_rounds }} review round{{ 's' if state.automerged.review_rounds != 1 else '' }})
{% endif %}
attempts
{{ task.attempts }}{% if state.revisions %} · {{ state.revisions }} revision(s){% endif %}
runner
{{ task.runner or 'default' }} / {{ task.harness or 'default harness' }}{% if task.model %} / {{ task.model }}{% endif %}
updated
{{ task.updated[:16] }}
{% endblock %}