{% extends "base.html" %} {% block title %}Federation{% endblock %} {% block content %}

Federation

Cross-node governance federation and chain synchronization

{% if federation_status and federation_status.nodes %} {# ===== SUMMARY BAR ===== #} {% set total_nodes = federation_status.nodes|length %} {% set reachable_nodes = federation_status.nodes|selectattr('reachable')|list|length %} {% set unreachable_nodes = total_nodes - reachable_nodes %} {% set total_chain_entries = federation_status.nodes|sum(attribute='chain_length', default=0) %} {% set all_chains_intact = federation_status.nodes|rejectattr('chain_intact')|list|length == 0 %}
Total Nodes
{{ total_nodes }}
Reachable
{{ reachable_nodes }}
Unreachable
{% if unreachable_nodes > 0 %} {{ unreachable_nodes }} {% else %} 0 {% endif %}
Total Chain Entries
{{ total_chain_entries }}
Chain Status
{% if all_chains_intact %} All Chains Intact {% else %} Chain Issues Detected {% endif %}
{# ===== NODE TABLE ===== #}
Federated Nodes {{ total_nodes }}
{% for node in federation_status.nodes %} {% endfor %}
Status Alias Domain Version Chain Length Chain Integrity Last Checked
{% if node.reachable %} {% else %} {% endif %} {{ node.alias }} {{ node.get('domain', '-') }} {{ node.get('version', '-') }} {{ node.chain_length }} {% if node.chain_intact %} Intact {% else %} Broken {% endif %} {{ node.get('last_checked', '-') }}
{# ===== MERGED EVENT STREAM ===== #} {% if merged_events %}
Merged Event Stream {{ merged_events|length }}
{% for event in merged_events %} {% endfor %}
Node Event Type Timestamp Data
{{ event.get('node_alias', 'unknown') }} {% if 'identity' in event.get('event', '') %} {{ event.event }} {% elif 'governance' in event.get('event', '') or 'audit' in event.get('event', '') %} {{ event.event }} {% elif 'detected' in event.get('event', '') or 'daemon' in event.get('event', '') %} {{ event.event }} {% elif 'node' in event.get('event', '') or 'connection' in event.get('event', '') or 'federation' in event.get('event', '') %} {{ event.event }} {% else %} {{ event.get('event', '') }} {% endif %} {{ event.get('timestamp', '-') }} {% if event.get('data') %} {% for key, val in event.data.items() %} {{ key }}: {{ val }}{% if not loop.last %}, {% endif %} {% endfor %} {% else %} - {% endif %}
{% else %}
Merged Event Stream 0

No federated events yet.

Events will appear here as connected nodes sync their chains.

{% endif %} {% else %} {# ===== NO NODES CONFIGURED ===== #}

No federation nodes configured.

Federation connects multiple Charter nodes to create a shared governance network with cross-node chain verification.

To get started:

1. Run charter federation add <node-url> to add a remote node.
2. Run charter federation sync to synchronize chains.
3. Run charter federation status to check node health.

{% endif %} {% endblock %}