Ecosystem Skill — Supports building and managing the MOVA ecosystem. Requires the
openclaw-movaplugin.
MOVA User Contract Setup
Walk the user through registering a MOVA-spec contract hosted at their own URL, setting visibility, and running it for the first time — all via MOVA plugin tools.
What this skill does
- Collects the contract's
source_urland a lightweight manifest (title, version, mode) - Registers the contract at MOVA — MOVA stores only the manifest, the contract body stays at the user's URL
- Optionally sets visibility (
private→public) - Runs the contract with test inputs and shows the result
When to trigger
Activate when the user:
- Says "register my contract", "add my contract", "I have a contract at a URL"
- Wants to run a custom contract through MOVA
- Asks about user-owned contracts or the contract registry
Before starting, say:
"Let's register your contract with MOVA. I'll need a few details — your contract JSON stays at your URL, MOVA only stores a pointer. Ready?"
Wait for confirmation.
Step 1 — Collect source_url
Ask:
"What is the HTTPS URL to your contract JSON file?"
Requirements:
- Must start with
https:// - Must be a direct link to a JSON file (not a GitHub HTML page)
If the user gives a GitHub repo page URL, help them convert it to a raw URL:
github.com/user/repo/blob/main/contract.json→raw.githubusercontent.com/user/repo/main/contract.json
Step 2 — Collect manifest fields
Ask these one at a time:
- Title — "What is the title of this contract? (e.g. Invoice Approval Agent)"
- Version — "What version is it? (e.g. 1.0.0)"
- Execution mode — "What is the execution mode?"
- Show options:
deterministic/bounded_variance/ai_assisted/human_gated - If unsure: recommend
ai_assistedfor most custom contracts
- Show options:
- Description (optional) — "Brief description of what this contract does? (press Enter to skip)"
- Visibility — "Should this contract be
private(only your org) orpublic(discoverable by all MOVA users)?"
Step 3 — Register
Call tool mova_register_contract with:
source_url: from Step 1title,version,execution_mode,description: from Step 2visibility: from Step 2
On success, show:
"✓ Contract registered. ID: [contract_id] Visibility: [visibility]
Your contract body stays at [source_url] — MOVA fetches it on each run."
If error 409 Conflict — a contract with this source_url is already registered. Show the existing contract_id and ask if they want to update visibility or run it instead.
If error 422 on source_url — the URL must use HTTPS with a valid hostname. Ask for a corrected URL.
Step 4 — Optional: change visibility
If the user wants to change visibility after registration:
Call tool mova_set_contract_visibility with:
contract_id: from Step 3visibility:privateorpublic
Step 5 — Test run
Ask:
"Want to run a test now? I'll execute the contract and show you the result. Do you have input data, or should we try with empty inputs?"
If yes — collect inputs as key-value pairs (ask one at a time if needed).
Call tool mova_run_contract with:
contract_id: from Step 3inputs: collected or{}
If status: "waiting_human" — the contract has a human gate. Show the analysis and options, then ask the user to choose. Call mova_hitl_decide with the contract_id, chosen option, and reason.
If status: "completed" — show the verdict and output.
If status: "failed" — show the error. Common causes:
- Contract JSON doesn't match MOVA spec — the user needs to fix the contract at source_url
- Required connector not registered — suggest
mova_list_connectorsto find the connector andmova_register_connectorto set up their endpoint
Step 6 — Check run status (if needed)
If the run is still in progress, call mova_run_status with the run_id to get the latest status.
After setup — show summary
CONTRACT REGISTERED
───────────────────────────────────
ID: [contract_id]
Title: [title]
Version: [version]
Mode: [execution_mode]
Visibility: [private/public]
Source URL: [source_url]
NEXT STEPS
- Run it: mova_run_contract({ contract_id: "[id]", inputs: {...} })
- Check a run: mova_run_status({ run_id: "..." })
- List yours: mova_list_my_contracts()
- Change access: mova_set_contract_visibility({ contract_id: "[id]", visibility: "public" })
- Remove it: mova_delete_contract({ contract_id: "[id]" })
Rules
- NEVER make HTTP requests manually to fetch or validate the contract — use MOVA tools only
- NEVER invent contract_id or run_id — they come from tool responses
- NEVER skip asking for source_url — it is always required
- If the user doesn't know the execution mode, recommend
ai_assistedand explain the options - If registration fails, show the exact error — do not guess or retry silently
- After a successful run, always show the full output including verdict and any audit receipt