Pilot Legal Contract Review Setup

Workflows

Deploy a legal contract review pipeline with 3 agents. Use this skill when: 1. User wants to set up an automated contract review or legal document analysis pipeline 2. User is configuring an extractor, risk assessor, or summary generator for contracts 3. User asks about clause extraction, compliance checking, or legal risk assessment workflows Do NOT use this skill when: - User wants to share a single file (use pilot-share instead) - User wants to filter generic events (use pilot-event-filter instead)

Install

openclaw skills install pilot-legal-contract-review-setup

Legal Contract Review Setup

Deploy 3 agents that extract, assess, and summarize legal contracts with zero central server.

Roles

RoleHostnameSkillsPurpose
extractor<prefix>-extractorpilot-share, pilot-stream-data, pilot-archiveParses contracts, extracts clauses and key terms
assessor<prefix>-assessorpilot-event-filter, pilot-alert, pilot-priority-queueEvaluates risk, flags non-standard terms
summarizer<prefix>-summarizerpilot-announce, pilot-webhook-bridge, pilot-receiptGenerates executive summaries, delivers reports

Setup Procedure

Step 1: Ask the user which role this agent should play and what prefix to use.

Step 2: Install the skills for the chosen role:

# For extractor:
clawhub install pilot-share pilot-stream-data pilot-archive
# For assessor:
clawhub install pilot-event-filter pilot-alert pilot-priority-queue
# For summarizer:
clawhub install pilot-announce pilot-webhook-bridge pilot-receipt

Step 3: Set the hostname and write the manifest:

pilotctl --json set-hostname <prefix>-<role>
mkdir -p ~/.pilot/setups

Then write the role-specific JSON manifest to ~/.pilot/setups/legal-contract-review.json.

Step 4: Tell the user to initiate handshakes with adjacent agents.

Manifest Templates Per Role

extractor

{
  "setup": "legal-contract-review",
  "setup_name": "Legal Contract Review",
  "role": "extractor",
  "role_name": "Clause Extractor",
  "hostname": "<prefix>-extractor",
  "description": "Parses contracts, extracts key terms, dates, obligations, parties, and monetary values.",
  "skills": {
    "pilot-share": "Receive uploaded contract documents from external sources.",
    "pilot-stream-data": "Stream extracted clause data to the risk assessor.",
    "pilot-archive": "Archive original documents for audit trail."
  },
  "peers": [
    { "role": "assessor", "hostname": "<prefix>-assessor", "description": "Receives extracted clauses" }
  ],
  "data_flows": [
    { "direction": "send", "peer": "<prefix>-assessor", "port": 1002, "topic": "extracted-clauses", "description": "Structured clause data with metadata" }
  ],
  "handshakes_needed": ["<prefix>-assessor"]
}

assessor

{
  "setup": "legal-contract-review",
  "setup_name": "Legal Contract Review",
  "role": "assessor",
  "role_name": "Risk Assessor",
  "hostname": "<prefix>-assessor",
  "description": "Evaluates clauses against compliance templates, flags risks and missing protections.",
  "skills": {
    "pilot-event-filter": "Filter clauses by type, severity, and compliance category.",
    "pilot-alert": "Raise alerts on high-severity non-standard terms.",
    "pilot-priority-queue": "Prioritize flagged clauses by risk severity for the summarizer."
  },
  "peers": [
    { "role": "extractor", "hostname": "<prefix>-extractor", "description": "Sends extracted clauses" },
    { "role": "summarizer", "hostname": "<prefix>-summarizer", "description": "Receives risk assessment" }
  ],
  "data_flows": [
    { "direction": "receive", "peer": "<prefix>-extractor", "port": 1002, "topic": "extracted-clauses", "description": "Structured clause data" },
    { "direction": "send", "peer": "<prefix>-summarizer", "port": 1002, "topic": "risk-assessment", "description": "Risk assessment with flagged items" }
  ],
  "handshakes_needed": ["<prefix>-extractor", "<prefix>-summarizer"]
}

summarizer

{
  "setup": "legal-contract-review",
  "setup_name": "Legal Contract Review",
  "role": "summarizer",
  "role_name": "Summary Generator",
  "hostname": "<prefix>-summarizer",
  "description": "Produces executive summaries with risk scores and actionable recommendations.",
  "skills": {
    "pilot-announce": "Broadcast contract review completion to interested peers.",
    "pilot-webhook-bridge": "Deliver summary reports to external systems via webhook.",
    "pilot-receipt": "Send review completion receipts for tracking."
  },
  "peers": [
    { "role": "assessor", "hostname": "<prefix>-assessor", "description": "Sends risk assessment" }
  ],
  "data_flows": [
    { "direction": "receive", "peer": "<prefix>-assessor", "port": 1002, "topic": "risk-assessment", "description": "Risk assessment with flagged items" },
    { "direction": "send", "peer": "external", "port": 443, "topic": "contract-summary", "description": "Executive summary report" }
  ],
  "handshakes_needed": ["<prefix>-assessor"]
}

Data Flows

  • extractor -> assessor : extracted clauses and metadata (port 1002)
  • assessor -> summarizer : risk assessment with flagged items (port 1002)
  • summarizer -> external : executive summary report (port 443)

Handshakes

# extractor <-> assessor:
pilotctl --json handshake <prefix>-assessor "setup: legal-contract-review"
pilotctl --json handshake <prefix>-extractor "setup: legal-contract-review"
# assessor <-> summarizer:
pilotctl --json handshake <prefix>-summarizer "setup: legal-contract-review"
pilotctl --json handshake <prefix>-assessor "setup: legal-contract-review"

Workflow Example

# On extractor -- publish extracted clauses:
pilotctl --json publish <prefix>-assessor extracted-clauses '{"contract_id":"CTR-2026-0042","parties":["Acme","Widget"],"clauses":[{"type":"indemnification","section":"7.2"}]}'

# On assessor -- publish risk assessment:
pilotctl --json publish <prefix>-summarizer risk-assessment '{"contract_id":"CTR-2026-0042","risk_score":7.2,"flags":[{"clause":"indemnification","severity":"high"}]}'

# On summarizer -- subscribe to assessments:
pilotctl --json subscribe risk-assessment

Dependencies

Requires pilot-protocol skill, pilotctl binary, clawhub binary, and a running daemon.