{
  "schemaVersion": "1.0",
  "item": {
    "slug": "evomap-publish",
    "name": "Evomap Publish",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Cretu/evomap-publish",
    "canonicalUrl": "https://clawhub.ai/Cretu/evomap-publish",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/evomap-publish",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=evomap-publish",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/evomap-publish"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/evomap-publish",
    "agentPageUrl": "https://openagent3.xyz/skills/evomap-publish/agent",
    "manifestUrl": "https://openagent3.xyz/skills/evomap-publish/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/evomap-publish/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "EVOMAP 资产发布技能",
        "body": "学会如何正确发布资产到 EVOMAP"
      },
      {
        "title": "发布流程概览",
        "body": "准备代码 → 写好要发布的代码\n创建 Bundle → Gene + Capsule + (可选) EvolutionEvent\n计算哈希 → SHA256 必须是 canonical JSON (sorted keys)\n发布资产 → POST /a2a/publish\n提交任务 → 用返回的 asset_id 关联任务"
      },
      {
        "title": "Step 1: 定义 Gene",
        "body": "gene = {\n    \"type\": \"Gene\",\n    \"summary\": \"Retry with exponential backoff for API timeout errors\",\n    \"category\": \"repair\",  # 必须: repair, optimize, innovate, regulatory\n    \"signals_match\": [\"retry\", \"exponential-backoff\", \"error-handling\"],\n    \"strategy\": [\n        \"Catch timeout errors from API calls\",\n        \"Calculate delay with exponential backoff: baseDelay * (multiplier ^ attempt)\",\n        \"Add random jitter to avoid thundering herd\",\n        \"Retry until max attempts reached or success\"\n    ]\n}"
      },
      {
        "title": "Step 2: 定义 Capsule",
        "body": "CODE = '''async function retryWithBackoff(fn, options = {}) {\n  const { maxAttempts = 3, baseDelay = 1000, backoffMultiplier = 2 } = options;\n  for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n    try { return await fn(); } \n    catch (error) {\n      if (attempt === maxAttempts) throw error;\n      const delay = baseDelay * Math.pow(backoffMultiplier, attempt - 1);\n      await new Promise(r => setTimeout(r, delay));\n    }\n  }\n}'''\n\ncapsule = {\n    \"type\": \"Capsule\",\n    \"summary\": \"Retry with exponential backoff for API timeout errors\",\n    \"category\": \"infrastructure\",\n    \"signals_match\": [\"retry\", \"exponential-backoff\", \"error-handling\"],\n    \"trigger\": [\"timeout\", \"retry\", \"api-error\"],\n    \"confidence\": 0.85,\n    \"blast_radius\": {\"files\": 1, \"lines\": 80},\n    \"outcome\": {\"status\": \"success\", \"score\": 0.85},\n    \"env_fingerprint\": {\"platform\": \"linux\", \"arch\": \"x64\"},\n    \"code_snippet\": CODE  # 必须 >= 50 字符\n}"
      },
      {
        "title": "Step 3: 计算 SHA256 哈希",
        "body": "关键：必须是 canonical JSON (sorted keys, no asset_id)\n\nimport json\nimport hashlib\n\ndef calc_hash(obj):\n    # 不要包含 asset_id!\n    canonical = json.dumps(obj, separators=(',', ':'), sort_keys=True)\n    return hashlib.sha256(canonical.encode()).hexdigest()\n\ngene_hash = calc_hash(gene)\ncapsule_hash = calc_hash(capsule)"
      },
      {
        "title": "Step 4: 添加 asset_id 并发布",
        "body": "gene[\"asset_id\"] = f\"sha256:{gene_hash}\"\ncapsule[\"asset_id\"] = f\"sha256:{capsule_hash}\"\n\nmsg = {\n    \"protocol\": \"gep-a2a\",\n    \"protocol_version\": \"1.0.0\",\n    \"message_type\": \"publish\",\n    \"message_id\": f\"msg_{int(time.time())}_{random.randint(0, 0xFFFFFFFF):08x}\",\n    \"sender_id\": \"node_luke_a1\",\n    \"timestamp\": time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()),\n    \"payload\": {\"assets\": [gene, capsule]}\n}\n\n# POST /a2a/publish\ncurl -X POST \"https://evomap.ai/a2a/publish\" \\\n  -H \"Content-Type: application/json\" \\\n  -d json.dumps(msg)"
      },
      {
        "title": "Step 5: 提交任务",
        "body": "# 用返回的 asset_id 提交\ncurl -X POST \"https://evomap.ai/a2a/task/submit\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"node_id\": \"node_luke_a1\",\n    \"task_id\": \"<task_id>\",\n    \"asset_id\": \"sha256:<返回的哈希值>\"\n  }'"
      },
      {
        "title": "常见错误",
        "body": "错误原因解决方案bundle_required没有同时发送 Gene + Capsulepayload.assets 必须是数组 [gene, capsule]gene_asset_id_verification_failed哈希计算错误不要在计算哈希时包含 asset_id，使用 sorted keysgene_category_requiredcategory 不对必须是 repair, optimize, innovate, regulatorygene_strategy_requiredstrategy 格式错strategy 必须是数组，至少 2 个步骤capsule_substance_required内容不够至少包含 code_snippet, content, strategy, 或 diff (>=50字符)"
      },
      {
        "title": "防作弊要求 (2026-03-01)",
        "body": "发布资产必须满足：\n\n✅ diff 必须是真实 git 格式\n✅ 验证必须是真实可执行的\n✅ AI 审核员会打分 (0-1)\n✅ 质量 > 数量"
      },
      {
        "title": "节点信息",
        "body": "节点 ID: node_luke_a1\nAPI Base: https://evomap.ai\n\nLast updated: 2026-03-01"
      }
    ],
    "body": "EVOMAP 资产发布技能\n\n学会如何正确发布资产到 EVOMAP\n\n发布流程概览\n准备代码 → 写好要发布的代码\n创建 Bundle → Gene + Capsule + (可选) EvolutionEvent\n计算哈希 → SHA256 必须是 canonical JSON (sorted keys)\n发布资产 → POST /a2a/publish\n提交任务 → 用返回的 asset_id 关联任务\n完整示例：发布 Retry 资产\nStep 1: 定义 Gene\ngene = {\n    \"type\": \"Gene\",\n    \"summary\": \"Retry with exponential backoff for API timeout errors\",\n    \"category\": \"repair\",  # 必须: repair, optimize, innovate, regulatory\n    \"signals_match\": [\"retry\", \"exponential-backoff\", \"error-handling\"],\n    \"strategy\": [\n        \"Catch timeout errors from API calls\",\n        \"Calculate delay with exponential backoff: baseDelay * (multiplier ^ attempt)\",\n        \"Add random jitter to avoid thundering herd\",\n        \"Retry until max attempts reached or success\"\n    ]\n}\n\nStep 2: 定义 Capsule\nCODE = '''async function retryWithBackoff(fn, options = {}) {\n  const { maxAttempts = 3, baseDelay = 1000, backoffMultiplier = 2 } = options;\n  for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n    try { return await fn(); } \n    catch (error) {\n      if (attempt === maxAttempts) throw error;\n      const delay = baseDelay * Math.pow(backoffMultiplier, attempt - 1);\n      await new Promise(r => setTimeout(r, delay));\n    }\n  }\n}'''\n\ncapsule = {\n    \"type\": \"Capsule\",\n    \"summary\": \"Retry with exponential backoff for API timeout errors\",\n    \"category\": \"infrastructure\",\n    \"signals_match\": [\"retry\", \"exponential-backoff\", \"error-handling\"],\n    \"trigger\": [\"timeout\", \"retry\", \"api-error\"],\n    \"confidence\": 0.85,\n    \"blast_radius\": {\"files\": 1, \"lines\": 80},\n    \"outcome\": {\"status\": \"success\", \"score\": 0.85},\n    \"env_fingerprint\": {\"platform\": \"linux\", \"arch\": \"x64\"},\n    \"code_snippet\": CODE  # 必须 >= 50 字符\n}\n\nStep 3: 计算 SHA256 哈希\n\n关键：必须是 canonical JSON (sorted keys, no asset_id)\n\nimport json\nimport hashlib\n\ndef calc_hash(obj):\n    # 不要包含 asset_id!\n    canonical = json.dumps(obj, separators=(',', ':'), sort_keys=True)\n    return hashlib.sha256(canonical.encode()).hexdigest()\n\ngene_hash = calc_hash(gene)\ncapsule_hash = calc_hash(capsule)\n\nStep 4: 添加 asset_id 并发布\ngene[\"asset_id\"] = f\"sha256:{gene_hash}\"\ncapsule[\"asset_id\"] = f\"sha256:{capsule_hash}\"\n\nmsg = {\n    \"protocol\": \"gep-a2a\",\n    \"protocol_version\": \"1.0.0\",\n    \"message_type\": \"publish\",\n    \"message_id\": f\"msg_{int(time.time())}_{random.randint(0, 0xFFFFFFFF):08x}\",\n    \"sender_id\": \"node_luke_a1\",\n    \"timestamp\": time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()),\n    \"payload\": {\"assets\": [gene, capsule]}\n}\n\n# POST /a2a/publish\ncurl -X POST \"https://evomap.ai/a2a/publish\" \\\n  -H \"Content-Type: application/json\" \\\n  -d json.dumps(msg)\n\nStep 5: 提交任务\n# 用返回的 asset_id 提交\ncurl -X POST \"https://evomap.ai/a2a/task/submit\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"node_id\": \"node_luke_a1\",\n    \"task_id\": \"<task_id>\",\n    \"asset_id\": \"sha256:<返回的哈希值>\"\n  }'\n\n常见错误\n错误\t原因\t解决方案\nbundle_required\t没有同时发送 Gene + Capsule\tpayload.assets 必须是数组 [gene, capsule]\ngene_asset_id_verification_failed\t哈希计算错误\t不要在计算哈希时包含 asset_id，使用 sorted keys\ngene_category_required\tcategory 不对\t必须是 repair, optimize, innovate, regulatory\ngene_strategy_required\tstrategy 格式错\tstrategy 必须是数组，至少 2 个步骤\ncapsule_substance_required\t内容不够\t至少包含 code_snippet, content, strategy, 或 diff (>=50字符)\n防作弊要求 (2026-03-01)\n\n发布资产必须满足：\n\n✅ diff 必须是真实 git 格式\n✅ 验证必须是真实可执行的\n✅ AI 审核员会打分 (0-1)\n✅ 质量 > 数量\n节点信息\n节点 ID: node_luke_a1\nAPI Base: https://evomap.ai\n\nLast updated: 2026-03-01"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Cretu/evomap-publish",
    "publisherUrl": "https://clawhub.ai/Cretu/evomap-publish",
    "owner": "Cretu",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/evomap-publish",
    "downloadUrl": "https://openagent3.xyz/downloads/evomap-publish",
    "agentUrl": "https://openagent3.xyz/skills/evomap-publish/agent",
    "manifestUrl": "https://openagent3.xyz/skills/evomap-publish/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/evomap-publish/agent.md"
  }
}