{% extends "mirrorwall/base.html" %} {% from "mirrorwall/components.html" import badge, empty_state, json_viewer, table %} {% from "_macros.html" import short, trajectory_link %} {% block title %}Approvals — PromptCadence{% endblock %} {% block content %}

Approvals

Every request waiting for a person, oldest first. A grant mints the envelope the work then runs under, and a denial halts the trajectory with your reason on the record — so both answers are recorded, not just the one that let work continue.

{% if not may_approve %}

This session holds the read scope and not approve, so the buttons are not shown. Granting is deliberately a separate scope from submitting, so the identity that starts work cannot approve its own egress.

{% endif %} {% if report.pending %} {% for one in report.pending %}

{{ one.kind }} — {{ trajectory_link(one.trajectory_id) }}

{{ one.reason }}

Waiting {{ one.age_seconds | round(0) | int }} s · requested {{ one.created_at }} · expires {{ one.expires_at }} · steps {{ one.step_ids | join(", ") if one.step_ids else "—" }}

{% if one.detail %}{{ json_viewer(one.detail, label="What a grant would widen") }}{% endif %} {% if may_approve %}
{% endif %}
{% endfor %}

{{ report.row_count }} request{{ '' if report.row_count == 1 else 's' }} pending

{% else %} {{ empty_state("Nothing is waiting for a person.", "Trajectories", "/trajectories") }} {% endif %}

Resolved

{% if report.include_resolved %} {% if report.resolved %} {% set columns = [ {"label": "Request"}, {"label": "Trajectory"}, {"label": "Kind"}, {"label": "Status"}, {"label": "Approver"}, {"label": "Reason"}, {"label": "Resolved"} ] %} {% set rows = [] %} {% for one in report.resolved %} {% set _ = rows.append([ short(one.request_id), trajectory_link(one.trajectory_id), one.kind, badge(one.status, tone=outcome_tone(one.status)), one.approver_token_id or "—", one.resolution_reason or "—", one.resolved_at or "—" ]) %} {% endfor %} {{ table(columns, rows, caption="Resolved requests", complete=false, row_count=report.resolved | length) }} {% else %} {{ empty_state("No requests have been resolved yet.") }} {% endif %}

Hide resolved

{% else %}

Show resolved requests

{% endif %} {% endblock %}