Ecosystem Skill — Supports building and managing the MOVA ecosystem. Requires the openclaw-mova plugin.
MOVA Spec Authoring
Transform a fully calibrated pre-contract into a complete MOVA contract — structured JSON with envelope, instruction profile, and episode frame — ready for execution by any MOVA-compliant runtime.
What this skill does
- 1. Parses the pre-contract — reads all sections produced by INLINECODE1
- Maps to MOVA constructs — translates each pre-contract section into the correct MOVA artifact
- Drafts each artifact — envelope (
env.*), data schema references (ds.*), instruction profile, episode frame - Human review gate — each artifact is shown to the user for approval before the final contract is assembled
- Outputs the complete MOVA contract — a single JSON document ready for submission to a MOVA runtime
Requirements
- - A completed pre-contract with
Status: VALID from INLINECODE5 - MOVA spec available at
/home/mova/.openclaw/workspace/mova-spec/ for schema validation
Pre-contract → MOVA mapping
| Pre-contract section | MOVA artifact | Notes |
|---|
| ACTOR (actor, owner, reasonnow) | INLINECODE7 | actor = sender/initiator, owner = recipient/accountable |
| CHANGE DEFINITION (changetarget, changetype, afterstate) |
verb_id in envelope | change_type maps to verb: action→create/update, state→route/record, result→analyze/publish |
| OBJECT (object
description, selectionrule) |
ds.* schema reference +
input_data_refs[] | describes what is being acted on |
| GOAL (goal
statement, verificationmethod, confirmation_owner) | Episode
result contract | defines expected
result_status and confirmation criteria |
| CONSTRAINTS (forbidden
action, invariant, unacceptableconsequence) |
ds.instruction_profile_core_v1 rules | each constraint → a
deny or
transform rule in instruction profile |
| SUCCESS/FAILURE states | Episode
result_status allowed values | success →
completed; failure →
failed/
cancelled/
partial |
| DECISION POINTS (deterministic) | Inline in episode frame or envelope verb | deterministic rules go into policy; human decisions go to human gates |
| HUMAN GATES |
ds.instruction_profile_core_v1 HITL rules |
trigger_condition maps to policy rule; pause execution and wait for human input |
| INPUTS (name, available, source) |
input_data_refs[] +
input_envelopes[] in episode | unavailable inputs → blocking dependency in instruction profile |
| DEPENDENCIES (name, type, blocking) | Instruction profile:
required_resources[] or blocking rules | blocking deps → must be resolved before execution starts |
| ASSUMPTIONS | Episode
context notes + instruction profile
on_violation | blocking assumptions → deny rule; safe assumptions → warn rule |
| TIME LIMITS (deadline, max
attempts, stopcondition) | Instruction profile
limits or episode
finished_at constraint | encode as policy constraints |
| AMBIGUITIES | Annotation in
meta.ext of the envelope | documented but not executable until resolved |
| LINEARITY CHECK | Validates that the episode frame has no hidden branches | non-linear → decision points must appear as explicit HITL gates |
Verb selection guide
| Change type from pre-contract | Verb | Use when |
|---|
| Creating something new | INLINECODE31 | afterstate is a new record or artifact |
| Modifying existing data |
update | afterstate is a changed version of an existing record |
| Making a routing/selection decision |
route | the task is choosing between options |
| Recording a fact or observation |
record | the task produces an audit entry or episode |
| Publishing to a registry |
publish | the task distributes a catalog or configuration |
| Analyzing data |
analyze | the task produces findings, scores, or risk bands |
| Planning a sequence of steps |
plan | the task produces a plan or strategy |
| Explaining a decision |
explain | the task produces a human-readable justification |
| Summarizing content |
summarize | the task condenses input into a shorter form |
Step-by-step process
Step 1 — Receive and validate the pre-contract
Ask: "Paste the pre-contract document (output of mova-intent-calibration)."
Check:
- - Status must be
VALID — if BLOCKED, stop here and tell the user to resolve the blocking items first - All required sections must be present
- No unresolved blocking ambiguities
Step 2 — Identify the core MOVA constructs
From the pre-contract, determine:
- 1. Verb — use the Verb selection guide above
- Envelope ID — format:
env.[domain]_[operation]_v1 (e.g. env.procurement_po_review_v1) - Primary data schema — format:
ds.[domain]_[object]_v1 (e.g. ds.procurement_po_v1) - Roles — map actor →
initiator, owner → accountable, confirmation_owner → INLINECODE48 - Instruction profile ID — format:
[domain]_policy_v1 (e.g. procurement_po_policy_v1)
Show the user this mapping and ask for confirmation before continuing.
Step 3 — Draft the envelope
CODEBLOCK0
Show to user. Ask to approve or edit.
Step 4 — Draft the instruction profile
CODEBLOCK1
Show to user. Ask to approve or edit.
Step 5 — Draft the episode frame
CODEBLOCK2
Show to user. Ask to approve or edit.
Step 6 — Assemble and output the complete MOVA contract
When all three artifacts are approved, output the final contract:
CODEBLOCK3
Spec reference
All schema structures are validated against:
- - INLINECODE51
- INLINECODE52
- INLINECODE53
- INLINECODE54
Use mova-spec-guide skill to look up any concept while drafting.
Rules
- - NEVER accept a pre-contract with status BLOCKED — stop and tell the user what to resolve first
- NEVER invent verb IDs, schema IDs, or policy values outside the MOVA verb catalog — read from spec
- NEVER skip the human review step for each artifact — the user must approve envelope, profile, and episode frame individually
- NEVER produce a contract with unresolved blocking ambiguities — mark it PENDING AMBIGUITY RESOLUTION
- If the pre-contract has optional sections marked notrequired — omit the corresponding MOVA fields
- Generated IDs (envelopeid, profileid, episodetype) follow MOVA naming conventions: lowercase, underscores, versioned with v1
- toolid = 0 unless the pre-contract specifies an external tool channel
生态技能 — 支持构建和管理 MOVA 生态系统。需要 openclaw-mova 插件。
MOVA 规范编写
将一个完全校准的预合约转化为完整的 MOVA 合约——包含信封、指令配置文件和片段框架的结构化 JSON——可供任何兼容 MOVA 的运行时执行。
本技能的功能
- 1. 解析预合约 — 读取 mova-intent-calibration 生成的所有部分
- 映射到 MOVA 结构 — 将每个预合约部分转换为正确的 MOVA 构件
- 起草每个构件 — 信封 (env.)、数据模式引用 (ds.)、指令配置文件、片段框架
- 人工审核关卡 — 在最终合约组装前,每个构件都会展示给用户审批
- 输出完整的 MOVA 合约 — 一个可供提交至 MOVA 运行时的单一 JSON 文档
要求
- - 来自 mova-intent-calibration 且状态为 VALID 的已完成预合约
- MOVA 规范位于 /home/mova/.openclaw/workspace/mova-spec/,用于模式验证
预合约 → MOVA 映射
| 预合约部分 | MOVA 构件 | 备注 |
|---|
| ACTOR(参与者、所有者、当前原因) | env.*.roles[] | 参与者 = 发送方/发起者,所有者 = 接收方/负责人 |
| CHANGE DEFINITION(变更目标、变更类型、变更后状态) |
信封中的 verb_id | 变更类型映射到动词:动作→创建/更新,状态→路由/记录,结果→分析/发布 |
| OBJECT(对象描述、选择规则) | ds.* 模式引用 + input
datarefs[] | 描述被操作的对象 |
| GOAL(目标陈述、验证方法、确认所有者) | 片段的 result 合约 | 定义预期的 result_status 和确认标准 |
| CONSTRAINTS(禁止动作、不变条件、不可接受后果) | ds.instruction
profilecore_v1 规则 | 每个约束 → 指令配置文件中的一条 deny 或 transform 规则 |
| SUCCESS/FAILURE 状态 | 片段 result_status 允许值 | 成功 → completed;失败 → failed/cancelled/partial |
| DECISION POINTS(确定性) | 内联在片段框架或信封动词中 | 确定性规则进入策略;人工决策进入人工关卡 |
| HUMAN GATES | ds.instruction
profilecore
v1 HITL 规则 | triggercondition 映射到策略规则;暂停执行并等待人工输入 |
| INPUTS(名称、可用性、来源) | 片段中的 input
datarefs[] + input_envelopes[] | 不可用输入 → 指令配置文件中的阻塞依赖 |
| DEPENDENCIES(名称、类型、阻塞性) | 指令配置文件:required_resources[] 或阻塞规则 | 阻塞依赖 → 必须在执行开始前解决 |
| ASSUMPTIONS | 片段 context 备注 + 指令配置文件 on_violation | 阻塞假设 → deny 规则;安全假设 → warn 规则 |
| TIME LIMITS(截止时间、最大尝试次数、停止条件) | 指令配置文件 limits 或片段 finished_at 约束 | 编码为策略约束 |
| AMBIGUITIES | 信封 meta.ext 中的注释 | 已记录但在解决前不可执行 |
| LINEARITY CHECK | 验证片段框架没有隐藏分支 | 非线性 → 决策点必须作为显式 HITL 关卡出现 |
动词选择指南
| 预合约中的变更类型 | 动词 | 使用场景 |
|---|
| 创建新内容 | create | 变更后状态是一个新记录或构件 |
| 修改现有数据 |
update | 变更后状态是现有记录的修改版本 |
| 做出路由/选择决策 | route | 任务是在选项之间进行选择 |
| 记录事实或观察 | record | 任务生成审计条目或片段 |
| 发布到注册表 | publish | 任务分发目录或配置 |
| 分析数据 | analyze | 任务生成发现、评分或风险等级 |
| 规划一系列步骤 | plan | 任务生成计划或策略 |
| 解释决策 | explain | 任务生成人类可读的理由说明 |
| 总结内容 | summarize | 任务将输入压缩为更短的形式 |
分步流程
第 1 步 — 接收并验证预合约
询问:请粘贴预合约文档(mova-intent-calibration 的输出)。
检查:
- - 状态必须为 VALID — 如果为 BLOCKED,则在此处停止并告知用户先解决阻塞项
- 所有必需部分必须存在
- 没有未解决的阻塞歧义
第 2 步 — 识别核心 MOVA 结构
从预合约中确定:
- 1. 动词 — 使用上面的动词选择指南
- 信封 ID — 格式:env.[领域][操作]v1(例如 env.procurementporeviewv1)
- 主要数据模式 — 格式:ds.[领域][对象]v1(例如 ds.procurementpov1)
- 角色 — 映射参与者 → initiator,所有者 → accountable,确认所有者 → approver
- 指令配置文件 ID — 格式:[领域]policyv1(例如 procurementpopolicyv1)
向用户展示此映射并在继续前请求确认。
第 3 步 — 起草信封
json
{
envelopeid: env.[领域][操作]_v1,
verb: [来自第 2 步的动词],
roles: {
initiator: [来自预合约的参与者],
accountable: [来自预合约的所有者],
approver: [来自预合约的确认所有者]
},
payload: {
object_ref: {
datatype: ds.[领域][对象]_v1,
description: [来自预合约的对象描述]
}
},
policyprofileid: [指令配置文件 ID],
meta: {
reason: [来自预合约的当前原因],
goal: [来自预合约的目标陈述]
}
}
展示给用户。请求批准或编辑。
第 4 步 — 起草指令配置文件
json
{
schemaid: ds.instructionprofilecorev1,
profile_id: [指令配置文件 ID],
securitymodelversion: movasecuritydefault_v1,
rules: [
// 每个预合约中的 CONSTRAINT 对应一条规则
{
ruleid: constraint[n],
description: [约束陈述],
target: {
kind: action,
verb_id: [动词]
},
effect: deny, // 对于 forbiddenaction/unacceptableconsequence 使用 deny;对于安全假设使用 warn
condition: [此规则触发条件],
rationale: [此约束存在的原因]
}
],
hitl_gates: [
// 每个预合约中的 HUMAN GATE 对应一个条目
{
gateid: gate[n],
trigger_condition: [来自预合约的触发条件],
questionforhuman: [来自预合约的向人类提出的问题],
validresolutioncriteria: [来自预合约的有效解决标准],
onnoresponse: block
}
],
on_violation: block
}
展示给用户。请求批准或编辑。
第 5 步 — 起草片段框架
json
{
schemaid: ds.movaepisodecorev1,
episodetype: execution/[领域][操作],
mova_version: 6.0.0,
verb_id: [来自第 2 步的动词],
tool_id: 0,
executor: {
role: ai_agent,
skill_id: mova-spec-authoring
},
input_envelopes: [
{ envelopetype: env.[领域][操作]_v1 }
],
inputdatarefs: [
// 每个可用的 REQUIRED INPUTS 对应一个条目
{ datatype: ds.[领域][对象]v1, dataid: [来自预合约输入] }
],
result_contract: {
success_statuses: [completed],
failure