{% extends "base.html" %} {% import "_empty.html" as empty %} {% block title %}Review{% endblock %} {% block topbar_main %}

Review

Proposals waiting on a decision, and what people said {% endblock %} {% block topbar_actions %}
{% endblock %} {% block content %}
{% if rows %}
PlanProjectWaitingState
{% for row in rows %}
{{ row.plan_file.name }}.md {{ row.project.name if row.project else '—' }} {{ row.pending | length }} {# Two different pills because they are two different things. A teammate's comment was signed by a device in this mesh; a note from outside could not be. Counting them together would erase the one distinction this page exists to keep. #} {% if row.comments %} {{ row.comments }} note{{ '' if row.comments == 1 else 's' }} {% endif %} {% if row.outside %} +{{ row.outside | length }} {% endif %} {% if row.conflicted %}contested {% elif row.pending %}open {% elif row.outside %}outside review {% elif row.comments %}commented {% else %}settled{% endif %} {# Whether a decision here would bind anybody. Shown next to the state rather than instead of it, because the two are different facts: what the review says, and whether it is an authorization. #} {% if row.renew %} renew to count approvals {% endif %} {% if not row.enforced %} advisory {% endif %}
{% endfor %} {% include "_pager.html" %}
{% elif q %} {% call empty.state('search', 'Nothing matches that') %}

No plan waiting on a decision matches “{{ q }}”. Show everything waiting.

{% endcall %} {% else %} {% call empty.state('clear', 'Nothing is waiting') %}

No plan here has an open proposal. This page fills in when somebody proposes a revision, whether they are on this machine or another one.

{% endcall %} {% endif %}

Deciding from here

Accept or reject at the command line, where this machine's key signs the decision.

Reviewing is a signed record, not a form post, so it happens at the command line where this machine's key lives. A browser session cannot sign anything — that separation is what stops a page on the internet accepting a plan on your behalf.

flanner review status <plan>

Then flanner review decide <plan> --accept or --reject. The decision syncs to your peers like any other version.

{# These were three footnotes running the full width of the page, lines far too long to read. They explain the marks in the table, so they are one explainer now, at the same width as the one above. #}

What the marks mean

Notes, +n, advisory, and where review decisions go.

n notes are comments from the mesh, each signed by a teammate's device. A +n counts notes returned in a review packet by somebody outside the team; those are unsigned, so they are recorded as received rather than authored. Neither kind moves a plan's accepted baseline — pointing at a paragraph is not the same as deciding about it.

advisory marks a project whose roles are local to this machine. Review still runs and every decision is still signed, but the role map is editable by whoever holds this device, so accepting a plan records a decision rather than authorizing one. Roles become enforced once the project joins a workspace and this device holds a valid entitlement.

Review decisions never reach the control plane. It holds accounts, devices and access; what anyone thinks of a plan stays on the machines that hold the plan. How syncing works.

{% endblock %}