{% from '_rule_block.html' import pin_block, pin_new, pins_above_stated, rule_mark with context %} {% from '_own_lines.html' import own_lines with context %} {# the node, not the section: three leaf tabs open at once should be tellable apart #} {% set page_title = node.name %} {% include '_header.html' %}
{# The same band as the dashboard — a deep breadcrumb and an ellipsed title — minus the parts a detail page has no business showing: it is not polled, so it carries no freshness stamp, and it has nothing to filter. #} {% include '_page_band.html' %} {% include '_said.html' %}

{{ node.name }}

{% if node.description %}

{{ node.description | markdown_inline }}

{% endif %} {#- What the node is lives in the band, folded, as on every view of it; this card says how it is. -#}
{#- What an admin's pin on this node would cover, as its editor's first sentence says it (ADR-0104 decision 3). A node whose lines can be pinned one by one counts them, because that is the choice the admin is making; prose is one condition in several sentences. -#} {%- set pin = node.maintenance_entry %} {#- A pin above this node silences it with everything else beneath that node (ADR-0041), so a pin of its own is for the day that one ends. -#} {%- set above = pins_above | length %} {%- set node_covers %} {%- if above -%} It stays silenced when the {{ 'pin' if above == 1 else 'pins' }} above it {{ 'ends' if above == 1 else 'end' }}; the check keeps running and counts again when every pin on it has cleared. {%- elif node.members and node.reasons | length > 1 -%} Silences all {{ node.reasons | length }} lines and any that appear; the check keeps running and counts again when the pin clears. {%- elif node.members and node.reasons -%} Silences its one line and any that appear; the check keeps running and counts again when the pin clears. {%- else -%} It will not alarm before the pin expires; the check keeps running and counts again when the pin clears. {%- endif -%} {%- endset %} {#- The status line: how the node is, and what is about the node rather than about one finding. The `node.actions` slot (ADR-0034, second slot) is the same action as the card head's, on the page where the node is the subject; it sits with the status rather than with the reason lines, because that is precisely the distinction it exists for (ADR-0036). An admin's *Set maintenance* is the one control that sets the node's pin, and it opens its editor here, where the pin's block will stand (ADR-0104 decision 3); a pinned node has *Edit* and *Clear* in that block instead. -#}
{#- "maintenance · error" rather than a bare "maintenance": naming what is being silenced is the transform being made visible (ADR-0032 rule 5), and before the keystone the reading it names was not merely hidden but overwritten. -#} Status: {{ node.code.name.lower() }}{% if node.own_code.name == 'MAINTENANCE' and node.reported_code.name not in ('MAINTENANCE', 'UNDEFINED') %} · {{ node.reported_code.name.lower() }}{% endif %} {{ slot('node.actions', node=node, surface='check') }} {%- if is_admin and not pin %}
{{ rule_mark('maintenance') }}Set maintenance {{ pin_new('node', node_covers, branch, '', 'node-maintenance') }}
{%- endif %}
{#- The node's pin (ADR-0104 decisions 1, 2 and 8): one block at the top of the card, heading a frame that runs round every line the pin covers. The head is a **list** — the rules acting on this node, of which maintenance is the first kind — so a second rule is a second row here and not a second place to look. A pin set on a node above this one is such a row too, outermost first and without buttons, since it is edited where it stands; the node's own pin, under one, is *also silenced on its own*, as a line's is under its node's (ADR-0104 decision 2). -#} {%- if pin or above %}
    {{ pins_above_stated(pins_above, 'above-maintenance-', tag='li') }} {%- if pin %} {{ pin_block(pin, 'node', branch, '', 'node-maintenance', is_admin, tag='li', also=above > 0) }} {%- endif %}
{%- endif %} {#- Its lines, in full, with the record under each and for an admin the pin control at its end (`_own_lines.html`) — the one block a branch's own page lists its lines with too. -#} {{ own_lines(node, branch, is_admin, focus, focus_orphan, covered=above) }} {%- if pin or above %}
{%- endif %} {%- if node.damping %} {#- The counter, in words rather than as a number nobody can place: what this node shows, how far the count has got, and what its parent is counting meanwhile. The leaf is honest from the first failure (backlog #38 B) — what waits is only the claim that everything above is broken. -#}
Showing {{ node.damping.pending.name.lower() }} — {{ node.damping.seen }} of {{ node.damping.needed }} consecutive readings before this escalates{% if node.contribution and node.contribution.code %}, so the level above still counts {{ node.contribution.code.name.lower() }}{% endif %}.
{%- endif %} {#- Observed, the Time card's word (ADR-0099 decision 3): a node the instance re-asserts on its own tick goes stale too, and nothing checks it. -#} {% if node.stale %}
Stale — last observed {{ node.age_seconds | elapsed }} ago.
{% endif %}
{#- Time, report and configuration — the shared node-facts block (_node_facts.html), which the branch page now renders too, so a container and a leaf say the same things in the same shapes (ADR-0044 decision 8). Directly under the status and the reasons: the node's document is its Copy view's, a tab in the band above, and this page carries none (ADR-0115 decision 7). -#} {% include '_node_facts.html' %}
{% include '_page_end.html' %}