{
  "schemaVersion": "1.0",
  "item": {
    "slug": "catallax",
    "name": "Catallax",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/kai-familiar/catallax",
    "canonicalUrl": "https://clawhub.ai/kai-familiar/catallax",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/catallax",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=catallax",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/NIP-3400.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-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/catallax"
    },
    "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/catallax",
    "agentPageUrl": "https://openagent3.xyz/skills/catallax/agent",
    "manifestUrl": "https://openagent3.xyz/skills/catallax/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/catallax/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": "Catallax Skill",
        "body": "Interact with Catallax — a decentralized contract work protocol on Nostr using Lightning/Cashu payments and trusted escrow arbiters."
      },
      {
        "title": "Protocol Overview",
        "body": "Read references/NIP-3400.md for the full spec. Key concepts:\n\nPatron: Creates tasks, funds escrow, assigns workers\nArbiter: Escrow agent who judges work and handles payment\nFree Agent: Applies for tasks, delivers work, gets paid\nKinds: 33400 (arbiter service), 33401 (task proposal), 3402 (task conclusion)\nStatus flow: proposed → funded → in_progress → submitted → concluded"
      },
      {
        "title": "Querying Tasks",
        "body": "Use nak to query kind 33401 events from relays:\n\n# List all task proposals (limit 50)\nnak req -k 33401 -l 50 wss://relay.damus.io\n\n# Filter by tag (e.g. tasks tagged \"development\")\nnak req -k 33401 -t development -l 50 wss://relay.damus.io\n\n# Filter by status (open tasks only)\nnak req -k 33401 -l 100 wss://relay.damus.io | \\\n  while read -r event; do\n    status=$(echo \"$event\" | jq -r '.tags[] | select(.[0]==\"status\") | .[1]')\n    if [ \"$status\" = \"proposed\" ] || [ \"$status\" = \"funded\" ]; then\n      echo \"$event\"\n    fi\n  done\n\nParse the content field as JSON to get title, description, requirements. Parse tags for amount, status, categories."
      },
      {
        "title": "Display Format",
        "body": "When presenting tasks to the user, show:\n\nTitle (from content.title)\nBounty (from amount tag, in sats — show \"?\" if missing)\nStatus (from status tag)\nDate (from created_at)\nCategories (from t tags)\nDescription (from content.description, truncated)\nFunding type (from funding_type tag: \"patron\" or \"crowdfunding\")"
      },
      {
        "title": "Querying Arbiters",
        "body": "# List arbiter services\nnak req -k 33400 -l 50 wss://relay.damus.io\n\nParse content for name, about, policy. Parse tags for fee_type, fee_amount, min/max amounts, categories."
      },
      {
        "title": "Display Format",
        "body": "When presenting arbiters:\n\nName (from content.name)\nFee (fee_type + fee_amount — e.g. \"5%\" or \"1000 sats flat\")\nMin/Max (from min_amount/max_amount tags)\nCategories (from t tags)\nAbout (from content.about)"
      },
      {
        "title": "Creating a Task Proposal",
        "body": "To create a task as a Patron, publish a kind 33401 event:\n\n# Build and publish task proposal\nnak event -k 33401 \\\n  --tag d=\"<unique-slug>\" \\\n  --tag p=\"<your-pubkey>\" \\\n  --tag amount=\"<bounty-in-sats>\" \\\n  --tag t=\"<category>\" \\\n  --tag status=\"proposed\" \\\n  --tag funding_type=\"patron\" \\\n  -c '{\"title\":\"Task Title\",\"description\":\"Detailed description...\",\"requirements\":\"What must be delivered\"}' \\\n  --sec \"<nsec>\" \\\n  wss://relay.damus.io wss://nos.lol wss://relay.primal.net\n\nGenerate the d-tag slug from the title (lowercase, hyphenated, with random suffix for uniqueness).\n\nImportant: The content field must be valid JSON with title, description, and optionally requirements and deadline."
      },
      {
        "title": "Updating Task Status",
        "body": "Since kind 33401 is addressable replaceable, publish a new event with the same d-tag to update. Include all original tags plus changes:\n\n# Update to funded (add zap receipt reference)\nnak event -k 33401 \\\n  --tag d=\"<same-d-tag>\" \\\n  --tag status=\"funded\" \\\n  --tag e=\"<zap-receipt-event-id>\" \\\n  # ... all other original tags ...\n  --sec \"<nsec>\" \\\n  wss://relay.damus.io"
      },
      {
        "title": "Submitting Work (as Free Agent)",
        "body": "Work delivery is coordinated out-of-band per the protocol. However, agents may use kind 951 (work delivery) as a convention:\n\nnak event -k 951 \\\n  --tag e=\"<task-event-id>\" \\\n  --tag p=\"<patron-pubkey>\" \\\n  -c '{\"delivery\":\"Description of completed work\",\"evidence\":\"Link or proof\"}' \\\n  --sec \"<nsec>\" \\\n  wss://relay.damus.io"
      },
      {
        "title": "Task Conclusion (Arbiter only)",
        "body": "nak event -k 3402 \\\n  --tag e=\"<payout-zap-receipt-id>\" \\\n  --tag e=\"<task-event-id>\" \\\n  --tag p=\"<patron-pubkey>\" \\\n  --tag p=\"<arbiter-pubkey>\" \\\n  --tag p=\"<worker-pubkey>\" \\\n  --tag resolution=\"successful\" \\\n  --tag a=\"33401:<patron-pubkey>:<task-d-tag>\" \\\n  -c '{\"resolution_details\":\"Work met all requirements\"}' \\\n  --sec \"<nsec>\" \\\n  wss://relay.damus.io"
      },
      {
        "title": "Common Queries",
        "body": "User saysAction\"find bounties\" / \"show tasks\"Query kind 33401, filter status=proposed or funded\"create a task\" / \"post a bounty\"Build and publish kind 33401\"find arbiters\"Query kind 33400\"submit work\" / \"deliver\"Publish kind 951 referencing the task\"check my tasks\"Query kind 33401 filtered by user's pubkey in p-tags\"what's the status\"Fetch specific task by d-tag, report status"
      },
      {
        "title": "Reference Client",
        "body": "For visual browsing: https://catallax-reference-client.netlify.app/catallax"
      },
      {
        "title": "Key Relays",
        "body": "Query multiple relays for best coverage:\n\nwss://relay.damus.io\nwss://nos.lol\nwss://relay.primal.net\n\nNote: Some relays may not return results for nak req -k 33401 due to kind filtering. If nak returns empty results, fall back to a WebSocket script approach — open a WebSocket connection, send a REQ with {\"kinds\":[33401],\"limit\":50}, and collect EVENT responses until EOSE."
      },
      {
        "title": "Edge Cases",
        "body": "Missing amount tag: Some tasks use crowdfunding (funding_type=crowdfunding) with a NIP-75 goal tag instead of a fixed amount. Display bounty as \"crowdfunded\" in this case.\nContent format: Content should be JSON but some early tasks used plain text. Try JSON.parse first, fall back to treating content as description.\nStale tasks: Tasks with status=proposed older than 30 days may be abandoned. Note age when displaying.\nMultiple relays: Always publish to 3+ relays for discoverability. Query from multiple relays and deduplicate by event id."
      }
    ],
    "body": "Catallax Skill\n\nInteract with Catallax — a decentralized contract work protocol on Nostr using Lightning/Cashu payments and trusted escrow arbiters.\n\nProtocol Overview\n\nRead references/NIP-3400.md for the full spec. Key concepts:\n\nPatron: Creates tasks, funds escrow, assigns workers\nArbiter: Escrow agent who judges work and handles payment\nFree Agent: Applies for tasks, delivers work, gets paid\nKinds: 33400 (arbiter service), 33401 (task proposal), 3402 (task conclusion)\nStatus flow: proposed → funded → in_progress → submitted → concluded\nQuerying Tasks\n\nUse nak to query kind 33401 events from relays:\n\n# List all task proposals (limit 50)\nnak req -k 33401 -l 50 wss://relay.damus.io\n\n# Filter by tag (e.g. tasks tagged \"development\")\nnak req -k 33401 -t development -l 50 wss://relay.damus.io\n\n# Filter by status (open tasks only)\nnak req -k 33401 -l 100 wss://relay.damus.io | \\\n  while read -r event; do\n    status=$(echo \"$event\" | jq -r '.tags[] | select(.[0]==\"status\") | .[1]')\n    if [ \"$status\" = \"proposed\" ] || [ \"$status\" = \"funded\" ]; then\n      echo \"$event\"\n    fi\n  done\n\n\nParse the content field as JSON to get title, description, requirements. Parse tags for amount, status, categories.\n\nDisplay Format\n\nWhen presenting tasks to the user, show:\n\nTitle (from content.title)\nBounty (from amount tag, in sats — show \"?\" if missing)\nStatus (from status tag)\nDate (from created_at)\nCategories (from t tags)\nDescription (from content.description, truncated)\nFunding type (from funding_type tag: \"patron\" or \"crowdfunding\")\nQuerying Arbiters\n# List arbiter services\nnak req -k 33400 -l 50 wss://relay.damus.io\n\n\nParse content for name, about, policy. Parse tags for fee_type, fee_amount, min/max amounts, categories.\n\nDisplay Format\n\nWhen presenting arbiters:\n\nName (from content.name)\nFee (fee_type + fee_amount — e.g. \"5%\" or \"1000 sats flat\")\nMin/Max (from min_amount/max_amount tags)\nCategories (from t tags)\nAbout (from content.about)\nCreating a Task Proposal\n\nTo create a task as a Patron, publish a kind 33401 event:\n\n# Build and publish task proposal\nnak event -k 33401 \\\n  --tag d=\"<unique-slug>\" \\\n  --tag p=\"<your-pubkey>\" \\\n  --tag amount=\"<bounty-in-sats>\" \\\n  --tag t=\"<category>\" \\\n  --tag status=\"proposed\" \\\n  --tag funding_type=\"patron\" \\\n  -c '{\"title\":\"Task Title\",\"description\":\"Detailed description...\",\"requirements\":\"What must be delivered\"}' \\\n  --sec \"<nsec>\" \\\n  wss://relay.damus.io wss://nos.lol wss://relay.primal.net\n\n\nGenerate the d-tag slug from the title (lowercase, hyphenated, with random suffix for uniqueness).\n\nImportant: The content field must be valid JSON with title, description, and optionally requirements and deadline.\n\nUpdating Task Status\n\nSince kind 33401 is addressable replaceable, publish a new event with the same d-tag to update. Include all original tags plus changes:\n\n# Update to funded (add zap receipt reference)\nnak event -k 33401 \\\n  --tag d=\"<same-d-tag>\" \\\n  --tag status=\"funded\" \\\n  --tag e=\"<zap-receipt-event-id>\" \\\n  # ... all other original tags ...\n  --sec \"<nsec>\" \\\n  wss://relay.damus.io\n\nSubmitting Work (as Free Agent)\n\nWork delivery is coordinated out-of-band per the protocol. However, agents may use kind 951 (work delivery) as a convention:\n\nnak event -k 951 \\\n  --tag e=\"<task-event-id>\" \\\n  --tag p=\"<patron-pubkey>\" \\\n  -c '{\"delivery\":\"Description of completed work\",\"evidence\":\"Link or proof\"}' \\\n  --sec \"<nsec>\" \\\n  wss://relay.damus.io\n\nTask Conclusion (Arbiter only)\nnak event -k 3402 \\\n  --tag e=\"<payout-zap-receipt-id>\" \\\n  --tag e=\"<task-event-id>\" \\\n  --tag p=\"<patron-pubkey>\" \\\n  --tag p=\"<arbiter-pubkey>\" \\\n  --tag p=\"<worker-pubkey>\" \\\n  --tag resolution=\"successful\" \\\n  --tag a=\"33401:<patron-pubkey>:<task-d-tag>\" \\\n  -c '{\"resolution_details\":\"Work met all requirements\"}' \\\n  --sec \"<nsec>\" \\\n  wss://relay.damus.io\n\nCommon Queries\nUser says\tAction\n\"find bounties\" / \"show tasks\"\tQuery kind 33401, filter status=proposed or funded\n\"create a task\" / \"post a bounty\"\tBuild and publish kind 33401\n\"find arbiters\"\tQuery kind 33400\n\"submit work\" / \"deliver\"\tPublish kind 951 referencing the task\n\"check my tasks\"\tQuery kind 33401 filtered by user's pubkey in p-tags\n\"what's the status\"\tFetch specific task by d-tag, report status\nReference Client\n\nFor visual browsing: https://catallax-reference-client.netlify.app/catallax\n\nKey Relays\n\nQuery multiple relays for best coverage:\n\nwss://relay.damus.io\nwss://nos.lol\nwss://relay.primal.net\n\nNote: Some relays may not return results for nak req -k 33401 due to kind filtering. If nak returns empty results, fall back to a WebSocket script approach — open a WebSocket connection, send a REQ with {\"kinds\":[33401],\"limit\":50}, and collect EVENT responses until EOSE.\n\nEdge Cases\nMissing amount tag: Some tasks use crowdfunding (funding_type=crowdfunding) with a NIP-75 goal tag instead of a fixed amount. Display bounty as \"crowdfunded\" in this case.\nContent format: Content should be JSON but some early tasks used plain text. Try JSON.parse first, fall back to treating content as description.\nStale tasks: Tasks with status=proposed older than 30 days may be abandoned. Note age when displaying.\nMultiple relays: Always publish to 3+ relays for discoverability. Query from multiple relays and deduplicate by event id."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/kai-familiar/catallax",
    "publisherUrl": "https://clawhub.ai/kai-familiar/catallax",
    "owner": "kai-familiar",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/catallax",
    "downloadUrl": "https://openagent3.xyz/downloads/catallax",
    "agentUrl": "https://openagent3.xyz/skills/catallax/agent",
    "manifestUrl": "https://openagent3.xyz/skills/catallax/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/catallax/agent.md"
  }
}