{% extends "dashboard/base.html" %} {% from "partials/_macros.html" import status_pill, relative_time, empty_state, info_toggle %} {% from "partials/_list_chrome.html" import list_controls, list_pagination %} {% block page %} {% call info_toggle(key='handoffs', title="What is a handoff?") %}

A handoff is a structured note one session leaves for the next agent to pick up — title, body, and optional links. Sessions drop them at meaningful pauses (end of phase, blocking on input, before sleep) so context never lives only in one chat window.

A handoff cycles through activepickedcleared. The "Active" filter is the default; widen to "All" to see history.

{% endcall %} {{ list_controls( '/dashboard/handoffs', search_value=search_value, search_placeholder='Search title / workspace / body…', filters=[ {'name': 'status', 'label': 'Status', 'value': status_filter, 'options': [('', 'All'), ('active', 'active'), ('picked', 'picked'), ('cleared', 'cleared')]}, ], per_page=per_page, ) }}
{% if handoffs %} {% for h in handoffs %} {% endfor %} {% else %} {{ empty_state( 'No handoffs match the current filter', body='Sessions drop handoffs at meaningful pauses. Try `All` to include cleared ones.', icon_name='arrow-up-right' ) }} {% endif %}
{{ list_pagination( '/dashboard/handoffs', page=page, per_page=per_page, total=total, search_value=search_value, filters=[{'name': 'status', 'value': status_filter}], shown=handoffs|length, ) }} {% endblock %}