macp-runtime 0.6.0

MACP reference runtime: a coordination kernel and gRPC server enforcing session boundaries, message validation, append-only history, modes, and governance policy.
Documentation
#[path = "support/common.rs"]
mod common;

use common::{
    canonical_commitment_payload, canonical_start_payload, envelope, get_session_as, print_ack,
    send_as,
};
use macp_runtime::quorum_pb::{ApprovalRequestPayload, ApprovePayload};
use prost::Message;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut client = common::connect_client().await?;
    let session_id = common::new_session_id();

    println!("=== Quorum Mode Demo ===\n");

    let ack = send_as(
        &mut client,
        "coordinator",
        envelope(
            "macp.mode.quorum.v1",
            "SessionStart",
            "m0",
            &session_id,
            "coordinator",
            canonical_start_payload(
                "approve production deploy",
                &["alice", "bob", "carol"],
                60_000,
            ),
        ),
    )
    .await?;
    print_ack("session_start", &ack);

    let request = ApprovalRequestPayload {
        request_id: "deploy-v2".into(),
        action: "deploy.production".into(),
        summary: "Deploy v2.1 to production".into(),
        details: vec![],
        required_approvals: 2,
    };
    let ack = send_as(
        &mut client,
        "coordinator",
        envelope(
            "macp.mode.quorum.v1",
            "ApprovalRequest",
            "m1",
            &session_id,
            "coordinator",
            request.encode_to_vec(),
        ),
    )
    .await?;
    print_ack("approval_request", &ack);

    let approve = ApprovePayload {
        request_id: "deploy-v2".into(),
        reason: "tests pass".into(),
    };
    let ack = send_as(
        &mut client,
        "alice",
        envelope(
            "macp.mode.quorum.v1",
            "Approve",
            "m2",
            &session_id,
            "alice",
            approve.encode_to_vec(),
        ),
    )
    .await?;
    print_ack("alice_approve", &ack);

    let approve = ApprovePayload {
        request_id: "deploy-v2".into(),
        reason: "staging looks good".into(),
    };
    let ack = send_as(
        &mut client,
        "bob",
        envelope(
            "macp.mode.quorum.v1",
            "Approve",
            "m3",
            &session_id,
            "bob",
            approve.encode_to_vec(),
        ),
    )
    .await?;
    print_ack("bob_approve", &ack);

    let ack = send_as(
        &mut client,
        "coordinator",
        envelope(
            "macp.mode.quorum.v1",
            "Commitment",
            "m4",
            &session_id,
            "coordinator",
            canonical_commitment_payload(
                "c1",
                "quorum.approved",
                "release-management",
                "required approvals reached for deploy-v2",
            ),
        ),
    )
    .await?;
    print_ack("commitment", &ack);

    let session = get_session_as(&mut client, "carol", &session_id).await?;
    let meta = session.metadata.expect("metadata");
    println!("[get_session] state={} mode={}", meta.state, meta.mode);

    Ok(())
}