{
  "schemaVersion": "1.0",
  "item": {
    "slug": "did-you-know",
    "name": "Did you know?",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/jonathandeamer/did-you-know",
    "canonicalUrl": "https://clawhub.ai/jonathandeamer/did-you-know",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/did-you-know",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=did-you-know",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "references/commands.md",
      "references/tags.csv",
      "references/tagging-guide.md",
      "scripts/dyk.py",
      "scripts/write_tags.py",
      "scripts/serve_hook.py"
    ],
    "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/did-you-know"
    },
    "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/did-you-know",
    "agentPageUrl": "https://openagent3.xyz/skills/did-you-know/agent",
    "manifestUrl": "https://openagent3.xyz/skills/did-you-know/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/did-you-know/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": "Did You Know",
        "body": "Wikipedia's Did You Know? section highlights well-sourced facts from recently created or expanded articles. It's curated and refreshed at least daily by volunteers.\n\nUse this skill when the user asks for an interesting fact, wants daily trivia delivered automatically, or wants to customise which kinds of facts they see.\n\nAgent: Do not show bash commands or technical details to the user unless they explicitly ask. Run all commands silently. The user experience is conversational — facts, questions, and natural follow-ups. Keep your tone direct and natural; avoid empty compliments like \"Great taste!\" or \"Excellent choice!\" when responding to preferences."
      },
      {
        "title": "What users might want",
        "body": "If the user wants…Do thisA factServe one (see Serving a fact)To customise which facts they seeWalk through preferences (see Managing preferences)Facts delivered automaticallyHelp them set up a schedule (see Scheduling fact delivery)The fact queue refreshedFollow the Refresh workflow"
      },
      {
        "title": "Is any setup required?",
        "body": "Facts work immediately — no setup needed. Just serve one.\n\nPreferences are optional but recommended. If the user wants to tune which topics come up (more history, less science, etc.), you can set those up in a minute or two. Preferences need the refresh workflow running so that new facts get tagged before they're scored.\n\nScheduled refresh is only needed if preferences are active. Without preferences, the skill fetches and caches facts automatically as needed. With preferences, set up both a delivery schedule (to serve facts) and a refresh schedule (to tag new facts so preference scoring works).\n\nIf a user asks whether any setup is required, a good response is: \"You can get facts right now — no setup needed. If you'd like to tune which topics come up, or get a fact delivered automatically each day, we can set either of those up in a few minutes. Want to?\""
      },
      {
        "title": "Serving a fact",
        "body": "Agent: run this silently — do not show the command.\n\npython3 {baseDir}/scripts/dyk.py\n\nReturn the output to the user verbatim.\n\nFact served:\n\nDid you know that heavy-metal guitarist Kiki Wong played drums for Taylor Swift before joining the Smashing Pumpkins?\n\nhttps://en.wikipedia.org/wiki/Kiki_Wong\n\nNo facts remaining:\n\nNo more facts to share today; check back tomorrow!\n\nError:\n\nSomething went wrong with the fact-fetching; please try again later.\n\nAfter serving a fact, check whether ~/.openclaw/dyk-prefs.json exists. If it does not exist, the user is new — follow up: \"Would you like to tune which topics you see (more music, less science, etc.), or get a fact delivered automatically each day?\" If the file exists, or if you already set up preferences or delivery earlier in this conversation, say nothing."
      },
      {
        "title": "Managing preferences",
        "body": "Facts are scored and ranked using user preferences. Liked tags increase the score; disliked tags reduce it. Recency and variety bonuses apply automatically."
      },
      {
        "title": "Have the conversation first",
        "body": "Before running any commands, understand what the user enjoys. If they've already told you (e.g. \"I love dark historical stories but not sports\"), map their words directly to tags — don't ask them to repeat themselves. Only ask follow-up questions if their intent is unclear. Two dimensions are available:\n\ndomain — topic area (e.g. history, science, music)\ntone — style or mood (e.g. quirky, inspiring, dark)\n\nDon't list every tag upfront — just ask what they like in natural terms and map their answers. For example: \"I love dark historical stories\" maps to domain: history (like), tone: dark (like).\n\nWhen opening the preferences conversation, mention that you'll also set up automatic refresh alongside — this is what actually applies preferences to new facts as they arrive. Keep it light: something like \"I'll also set up automatic refresh in the background so new facts get tagged and scored against your preferences.\" The user doesn't need to understand the mechanics, but they should know the full setup is happening."
      },
      {
        "title": "Setting preferences",
        "body": "Once you know what they want:\n\nCheck if the prefs file exists. If not, initialise it first (prefs.py init).\nSet each preference (prefs.py set).\nSummarise in plain language what's been set and how it will affect the facts they see.\n\nIf they want to see their current preferences at any point, run prefs.py list and present the results readably — not as raw output.\n\nAgent: run preference commands silently — do not show them.\n\npython3 {baseDir}/scripts/prefs.py init                     # Create prefs file with neutral defaults. Fails if already exists.\npython3 {baseDir}/scripts/prefs.py list                     # Show all current preferences\npython3 {baseDir}/scripts/prefs.py get domain science       # Get a single preference\npython3 {baseDir}/scripts/prefs.py set domain science like  # Set a preference: like | neutral | dislike"
      },
      {
        "title": "Tags",
        "body": "domain: animals · economics_business · film · history · journalism · language_linguistics · literature · medicine_health · military_history · music · mythology_folklore · nature · performing_arts · places · religion · science · sports · technology · television · visual_art\n\ntone: dark · dramatic · inspiring · poignant · provocative · quirky · straight · surprising · whimsical"
      },
      {
        "title": "After setting preferences",
        "body": "Once preferences are saved, run the Refresh workflow immediately — existing cached hooks are all untagged, so preferences can't score anything until they've been tagged. Don't wait for the scheduled cron; do it now, inline. Then set up the refresh schedule so future facts get tagged automatically as they arrive. Say something like: \"I'll tag your existing facts now so preferences apply straight away, and set up automatic refresh in the background for new ones.\"\n\nAlso offer scheduled delivery if they haven't already set it up."
      },
      {
        "title": "Scheduling fact delivery",
        "body": "When the user wants to receive facts automatically, prompt a cadence conversation before setting anything up:\n\nHow often would they like a fact? Once a day is a nice ritual — over breakfast, on the commute, at the end of the day. A few times spread throughout the day also works.\nBear in mind: the more frequently facts are served, the further into lower-preference territory the queue will go.\n\nOnce they've chosen, set up an OpenClaw cron job for delivery. Use --session isolated and --announce so the output is delivered back to the user's chat. Do not use OS-level crontab — it has no delivery context and output will go nowhere.\n\nAgent: before running this command, determine the current channel platform and chat ID from your session context. Use them for --channel and --to. Run the command silently — do not show it.\n\nopenclaw cron add \\\n  --name \"DYK delivery\" \\\n  --cron \"<schedule>\" \\\n  --session isolated \\\n  --message \"Share a Did You Know fact\" \\\n  --announce \\\n  --channel <platform> \\\n  --to <platform>:<id>\n\nReplace <schedule> with a 5-field cron expression matching the user's chosen cadence (e.g. 57 7 * * * for ~8am). Avoid exact :00 minutes — nudge a few minutes either side. Replace <platform> and <id> with the current channel's platform and chat ID (e.g. --channel telegram --to telegram:1234567890).\n\nIf preferences are active (or the user wants to set them up), also set up automated refresh — without it, new facts won't be tagged and preference scoring won't apply to them. Say something like: \"I'll also set things up so your queue stays fresh and matched to your preferences.\" Then follow Setting up automated refresh below.\n\nIf preferences are not active and the user hasn't expressed interest in them, you can skip the refresh setup — the skill handles basic cache refresh automatically."
      },
      {
        "title": "Setting up automated refresh",
        "body": "Wikipedia's DYK template is updated by volunteers at approximately 00:00 UTC and again around 12:00 UTC. Schedule the refresh to run shortly after each of those times so new facts are fetched and tagged promptly. Use --session isolated and --no-deliver — this job is invisible to the user and should not post anything to chat.\n\nAgent: run this silently — do not show the command.\n\nopenclaw cron add \\\n  --name \"DYK refresh\" \\\n  --cron \"7 0,12 * * *\" \\\n  --session isolated \\\n  --message \"Refresh the DYK cache and tag new hooks\" \\\n  --no-deliver\n\nThe cron agent will follow the Refresh workflow each time it fires."
      },
      {
        "title": "Refresh workflow",
        "body": "When asked to refresh the DYK facts cache and tag new hooks:\n\nRun: python3 {baseDir}/scripts/fetch_hooks.py\nThis fetches the latest hooks and stores them in ~/.openclaw/dyk-facts.json with \"tags\": null for new entries.\nIf it exits non-zero, stop and report the error. Do not continue.\n\n\nRead ~/.openclaw/dyk-facts.json and find all hooks where \"tags\" is null.\nIf there are none, stop — nothing to tag.\n\n\nAssign tags for all untagged hooks at once — do not loop across multiple turns or tool calls. For each hook, assign tags using:\n\nTagging guide: {baseDir}/references/tagging-guide.md\nVocabulary: {baseDir}/references/tags.csv\n\nOutput requirements:\n\nUse only tag values defined in tags.csv\nIf tagging confidence is low, set \"low_confidence\": true.\nWrite valid JSON only — no comments or explanations\nCollect results into a single JSON array\nWrite the array to a temporary file such as /tmp/dyk-tags.json\n\n# Example array written to /tmp/dyk-tags.json\n[\n  {\"url\": \"https://en.wikipedia.org/wiki/Kiki_Wong\",\n   \"domain\": [\"music\"], \"tone\": \"surprising\", \"low_confidence\": false}\n]\n\n\n\nRun: python3 {baseDir}/scripts/write_tags.py --json-file /tmp/dyk-tags.json\nIf it exits non-zero, report the error.\n\n\nDo not message the user unless there is an error.\n\nFor the full command reference, see {baseDir}/references/commands.md."
      }
    ],
    "body": "Did You Know\n\nWikipedia's Did You Know? section highlights well-sourced facts from recently created or expanded articles. It's curated and refreshed at least daily by volunteers.\n\nUse this skill when the user asks for an interesting fact, wants daily trivia delivered automatically, or wants to customise which kinds of facts they see.\n\nAgent: Do not show bash commands or technical details to the user unless they explicitly ask. Run all commands silently. The user experience is conversational — facts, questions, and natural follow-ups. Keep your tone direct and natural; avoid empty compliments like \"Great taste!\" or \"Excellent choice!\" when responding to preferences.\n\nWhat users might want\nIf the user wants…\tDo this\nA fact\tServe one (see Serving a fact)\nTo customise which facts they see\tWalk through preferences (see Managing preferences)\nFacts delivered automatically\tHelp them set up a schedule (see Scheduling fact delivery)\nThe fact queue refreshed\tFollow the Refresh workflow\nIs any setup required?\n\nFacts work immediately — no setup needed. Just serve one.\n\nPreferences are optional but recommended. If the user wants to tune which topics come up (more history, less science, etc.), you can set those up in a minute or two. Preferences need the refresh workflow running so that new facts get tagged before they're scored.\n\nScheduled refresh is only needed if preferences are active. Without preferences, the skill fetches and caches facts automatically as needed. With preferences, set up both a delivery schedule (to serve facts) and a refresh schedule (to tag new facts so preference scoring works).\n\nIf a user asks whether any setup is required, a good response is: \"You can get facts right now — no setup needed. If you'd like to tune which topics come up, or get a fact delivered automatically each day, we can set either of those up in a few minutes. Want to?\"\n\nServing a fact\n\nAgent: run this silently — do not show the command.\n\npython3 {baseDir}/scripts/dyk.py\n\n\nReturn the output to the user verbatim.\n\nFact served:\n\nDid you know that heavy-metal guitarist Kiki Wong played drums for Taylor Swift before joining the Smashing Pumpkins?\n\nhttps://en.wikipedia.org/wiki/Kiki_Wong\n\n\nNo facts remaining:\n\nNo more facts to share today; check back tomorrow!\n\n\nError:\n\nSomething went wrong with the fact-fetching; please try again later.\n\n\nAfter serving a fact, check whether ~/.openclaw/dyk-prefs.json exists. If it does not exist, the user is new — follow up: \"Would you like to tune which topics you see (more music, less science, etc.), or get a fact delivered automatically each day?\" If the file exists, or if you already set up preferences or delivery earlier in this conversation, say nothing.\n\nManaging preferences\n\nFacts are scored and ranked using user preferences. Liked tags increase the score; disliked tags reduce it. Recency and variety bonuses apply automatically.\n\nHave the conversation first\n\nBefore running any commands, understand what the user enjoys. If they've already told you (e.g. \"I love dark historical stories but not sports\"), map their words directly to tags — don't ask them to repeat themselves. Only ask follow-up questions if their intent is unclear. Two dimensions are available:\n\ndomain — topic area (e.g. history, science, music)\ntone — style or mood (e.g. quirky, inspiring, dark)\n\nDon't list every tag upfront — just ask what they like in natural terms and map their answers. For example: \"I love dark historical stories\" maps to domain: history (like), tone: dark (like).\n\nWhen opening the preferences conversation, mention that you'll also set up automatic refresh alongside — this is what actually applies preferences to new facts as they arrive. Keep it light: something like \"I'll also set up automatic refresh in the background so new facts get tagged and scored against your preferences.\" The user doesn't need to understand the mechanics, but they should know the full setup is happening.\n\nSetting preferences\n\nOnce you know what they want:\n\nCheck if the prefs file exists. If not, initialise it first (prefs.py init).\nSet each preference (prefs.py set).\nSummarise in plain language what's been set and how it will affect the facts they see.\n\nIf they want to see their current preferences at any point, run prefs.py list and present the results readably — not as raw output.\n\nAgent: run preference commands silently — do not show them.\n\npython3 {baseDir}/scripts/prefs.py init                     # Create prefs file with neutral defaults. Fails if already exists.\npython3 {baseDir}/scripts/prefs.py list                     # Show all current preferences\npython3 {baseDir}/scripts/prefs.py get domain science       # Get a single preference\npython3 {baseDir}/scripts/prefs.py set domain science like  # Set a preference: like | neutral | dislike\n\nTags\n\ndomain: animals · economics_business · film · history · journalism · language_linguistics · literature · medicine_health · military_history · music · mythology_folklore · nature · performing_arts · places · religion · science · sports · technology · television · visual_art\n\ntone: dark · dramatic · inspiring · poignant · provocative · quirky · straight · surprising · whimsical\n\nAfter setting preferences\n\nOnce preferences are saved, run the Refresh workflow immediately — existing cached hooks are all untagged, so preferences can't score anything until they've been tagged. Don't wait for the scheduled cron; do it now, inline. Then set up the refresh schedule so future facts get tagged automatically as they arrive. Say something like: \"I'll tag your existing facts now so preferences apply straight away, and set up automatic refresh in the background for new ones.\"\n\nAlso offer scheduled delivery if they haven't already set it up.\n\nScheduling fact delivery\n\nWhen the user wants to receive facts automatically, prompt a cadence conversation before setting anything up:\n\nHow often would they like a fact? Once a day is a nice ritual — over breakfast, on the commute, at the end of the day. A few times spread throughout the day also works.\nBear in mind: the more frequently facts are served, the further into lower-preference territory the queue will go.\n\nOnce they've chosen, set up an OpenClaw cron job for delivery. Use --session isolated and --announce so the output is delivered back to the user's chat. Do not use OS-level crontab — it has no delivery context and output will go nowhere.\n\nAgent: before running this command, determine the current channel platform and chat ID from your session context. Use them for --channel and --to. Run the command silently — do not show it.\n\nopenclaw cron add \\\n  --name \"DYK delivery\" \\\n  --cron \"<schedule>\" \\\n  --session isolated \\\n  --message \"Share a Did You Know fact\" \\\n  --announce \\\n  --channel <platform> \\\n  --to <platform>:<id>\n\n\nReplace <schedule> with a 5-field cron expression matching the user's chosen cadence (e.g. 57 7 * * * for ~8am). Avoid exact :00 minutes — nudge a few minutes either side. Replace <platform> and <id> with the current channel's platform and chat ID (e.g. --channel telegram --to telegram:1234567890).\n\nIf preferences are active (or the user wants to set them up), also set up automated refresh — without it, new facts won't be tagged and preference scoring won't apply to them. Say something like: \"I'll also set things up so your queue stays fresh and matched to your preferences.\" Then follow Setting up automated refresh below.\n\nIf preferences are not active and the user hasn't expressed interest in them, you can skip the refresh setup — the skill handles basic cache refresh automatically.\n\nSetting up automated refresh\n\nWikipedia's DYK template is updated by volunteers at approximately 00:00 UTC and again around 12:00 UTC. Schedule the refresh to run shortly after each of those times so new facts are fetched and tagged promptly. Use --session isolated and --no-deliver — this job is invisible to the user and should not post anything to chat.\n\nAgent: run this silently — do not show the command.\n\nopenclaw cron add \\\n  --name \"DYK refresh\" \\\n  --cron \"7 0,12 * * *\" \\\n  --session isolated \\\n  --message \"Refresh the DYK cache and tag new hooks\" \\\n  --no-deliver\n\n\nThe cron agent will follow the Refresh workflow each time it fires.\n\nRefresh workflow\n\nWhen asked to refresh the DYK facts cache and tag new hooks:\n\nRun: python3 {baseDir}/scripts/fetch_hooks.py\n\nThis fetches the latest hooks and stores them in ~/.openclaw/dyk-facts.json with \"tags\": null for new entries.\n\nIf it exits non-zero, stop and report the error. Do not continue.\n\nRead ~/.openclaw/dyk-facts.json and find all hooks where \"tags\" is null.\n\nIf there are none, stop — nothing to tag.\n\nAssign tags for all untagged hooks at once — do not loop across multiple turns or tool calls. For each hook, assign tags using:\n\nTagging guide: {baseDir}/references/tagging-guide.md\nVocabulary: {baseDir}/references/tags.csv\n\nOutput requirements:\n\nUse only tag values defined in tags.csv\nIf tagging confidence is low, set \"low_confidence\": true.\nWrite valid JSON only — no comments or explanations\nCollect results into a single JSON array\nWrite the array to a temporary file such as /tmp/dyk-tags.json\n# Example array written to /tmp/dyk-tags.json\n[\n  {\"url\": \"https://en.wikipedia.org/wiki/Kiki_Wong\",\n   \"domain\": [\"music\"], \"tone\": \"surprising\", \"low_confidence\": false}\n]\n\n\nRun: python3 {baseDir}/scripts/write_tags.py --json-file /tmp/dyk-tags.json\n\nIf it exits non-zero, report the error.\n\nDo not message the user unless there is an error.\n\nFor the full command reference, see {baseDir}/references/commands.md."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/jonathandeamer/did-you-know",
    "publisherUrl": "https://clawhub.ai/jonathandeamer/did-you-know",
    "owner": "jonathandeamer",
    "version": "0.2.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/did-you-know",
    "downloadUrl": "https://openagent3.xyz/downloads/did-you-know",
    "agentUrl": "https://openagent3.xyz/skills/did-you-know/agent",
    "manifestUrl": "https://openagent3.xyz/skills/did-you-know/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/did-you-know/agent.md"
  }
}