{
  "schemaVersion": "1.0",
  "item": {
    "slug": "tardis",
    "name": "TARDIS",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/rm289/tardis",
    "canonicalUrl": "https://clawhub.ai/rm289/tardis",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/tardis",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=tardis",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "MARKETPLACE.md",
      "README.md",
      "SKILL.md",
      "WHITEPAPER.md",
      "scripts/check-webhook-services.sh",
      "scripts/meter.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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-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/tardis"
    },
    "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/tardis",
    "agentPageUrl": "https://openagent3.xyz/skills/tardis/agent",
    "manifestUrl": "https://openagent3.xyz/skills/tardis/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/tardis/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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Hour Meter (TARDIS on ClawHub)",
        "body": "Life event tracker with three modes, milestone notifications, and tamper-evident verification.\n\nClawHub Note: This skill is published as TARDIS on ClawHub after the original hour-meter listing was lost due to a repository sync issue."
      },
      {
        "title": "COUNT UP — Time since an event",
        "body": "# Quit smoking tracker\nmeter.py create smoke-free --start \"2025-06-15T08:00:00Z\" -d \"Last cigarette\"\nmeter.py milestone smoke-free -t hours -v 720 -m \"🎉 30 days smoke-free!\"\nmeter.py lock smoke-free  # → Gives you paper code to save"
      },
      {
        "title": "COUNT DOWN — Time until an event",
        "body": "# Baby due date\nmeter.py create baby --start \"2026-01-15\" --end \"2026-10-15\" --mode down -d \"Baby arriving!\"\nmeter.py milestone baby -t percent -v 33 -m \"👶 First trimester complete!\""
      },
      {
        "title": "COUNT BETWEEN — Journey from start to end",
        "body": "# Career span\nmeter.py create career --start \"1998-05-15\" --end \"2038-05-15\" -d \"40-year career\"\nmeter.py milestone career -t percent -v 50 -m \"📊 Halfway through career!\"\nmeter.py career --meter career --rate 85 --raise-pct 2.5"
      },
      {
        "title": "Tamper-Evident Persistence",
        "body": "When you lock a meter, you get a paper code — a short, checksummed code you can write on paper:\n\n╔══════════════════════════════════════════════════════════════╗\n║  PAPER CODE (write this down):                               ║\n║     318B-3229-C523-2F9C-V                                    ║\n╚══════════════════════════════════════════════════════════════╝"
      },
      {
        "title": "Four Ways to Save (Non-Technical)",
        "body": "1️⃣ PAPER — Write the code on paper/sticky note\n\n20 characters with dashes, easy to copy\nBuilt-in checksum catches typos when verifying\nKeep in wallet, safe, or taped to equipment\n\n2️⃣ PHOTO — Screenshot or photograph the lock screen\n\nStore in camera roll, cloud photos\nVisual backup, no typing required\n\n3️⃣ WITNESS FILE — Auto-saved to ~/.openclaw/meter-witness.txt\n\nAppend-only log of all locked meters\nSync folder to Dropbox/iCloud/Google Drive for cloud backup\nContains paper code + full hash + timestamp\n\n4️⃣ EMAIL TO SELF — Click the mailto: link or copy the one-liner\n\nOpens your email client with pre-filled subject and body\nOr copy the compact message: 🔒 my-meter | Code: XXXX-XXXX-XXXX-XXXX-C | Locked: 2026-02-02\nSend to yourself, search inbox later to verify\n\n5️⃣ SENDGRID EMAIL — Auto-send verification email on lock\n\n# Set your SendGrid API key\nexport SENDGRID_API_KEY=SG.xxxxx\nexport SENDGRID_FROM_EMAIL=verified@yourdomain.com\n\n# Lock and email in one command\nmeter.py lock my-meter --email you@example.com\n\nSends a beautifully formatted HTML email with paper code\nRequires a verified sender in SendGrid (see SendGrid docs)\nGreat for automated workflows"
      },
      {
        "title": "Verifying Later",
        "body": "# With paper code (catches typos!)\nmeter.py verify my-meter \"318B-3229-C523-2F9C-V\"\n\n# → ✅ VERIFIED! Paper code matches.\n# → ⚠️ CHECKSUM ERROR! (if you have a typo)\n# → ❌ MISMATCH! (if tampered)"
      },
      {
        "title": "Milestones",
        "body": "meter.py milestone <name> --type hours --value 1000 --message \"1000 hours!\"\nmeter.py milestone <name> --type percent --value 50 --message \"Halfway!\"\nmeter.py check-milestones  # JSON output for automation"
      },
      {
        "title": "Email Milestone Notifications (v1.3.0)",
        "body": "Get milestone notifications sent directly to your email:\n\n# Create meter with email notifications\nmeter.py create my-meter \\\n  --notify-email you@example.com \\\n  --from-email verified@yourdomain.com \\\n  -d \"My tracked event\"\n\n# Add milestones as usual\nmeter.py milestone my-meter -t hours -v 24 -m \"🎉 24 hours complete!\"\n\n# When check-milestones runs and a milestone fires, email is sent automatically\nmeter.py check-milestones\n# → Triggers milestone AND sends email notification\n\nEmail includes:\n\n🎯 Milestone message\n⏱️ Current elapsed time\n📝 Meter description\n\nRequires SENDGRID_API_KEY environment variable."
      },
      {
        "title": "Milestone Notifications: Heartbeat vs Cron",
        "body": "Recommended: HEARTBEAT (~30 min resolution)\n\nAdd to HEARTBEAT.md: Run meter.py check-milestones and notify triggered\nBatches with other periodic checks\nCost-efficient: shares token usage with other heartbeat tasks\nGood for most use cases (quit tracking, career milestones, etc.)"
      },
      {
        "title": "Milestone Messages",
        "body": "Milestones post their message text to the configured notification channel when triggered:\n\n# Posts the message when milestone fires\nmeter.py milestone my-meter -t hours -v 24 -m \"🎉 24 hours complete!\"\n\nConfigure in HEARTBEAT.md:\n\n- Run meter.py check-milestones and post triggered milestone messages to the configured channel\n\nAdvanced: Milestone messages prefixed with ACTION: can optionally be treated as agent instructions by your heartbeat config. This is an opt-in feature — see README.md for security considerations.\n\nAlternative: CRON (precise timing)\n\nUse when exact timing matters (e.g., countdown to event)\n⚠️ Cost warning: Cron at 1-minute intervals = 1,440 API calls/day = expensive!\nIf using cron, keep intervals ≥15 minutes to manage costs\nBest for one-shot reminders, not continuous monitoring\n\nRule of thumb: If 30-minute resolution is acceptable, use heartbeat. Save cron for precision timing."
      },
      {
        "title": "Quick Reference",
        "body": "meter.py create <name> [--start T] [--end T] [--mode up|down|between] [-d DESC]\nmeter.py lock <name>                # Seal + get paper code\nmeter.py verify <name> <code>       # Verify paper code\nmeter.py check <name>               # Status + progress\nmeter.py milestone <name> -t hours|percent -v N -m \"...\"\nmeter.py check-milestones           # All milestones (JSON)\nmeter.py witness [--show] [--path]  # Witness file\nmeter.py list                       # All meters\nmeter.py career [--meter M] [--rate R] [--raise-pct P]\nmeter.py export [name]              # JSON export"
      },
      {
        "title": "SendGrid Email Webhook Server",
        "body": "Receive real-time notifications when recipients open, click, bounce, or unsubscribe from your meter verification emails."
      },
      {
        "title": "Setup",
        "body": "# Start webhook server with Discord webhook (recommended)\npython sendgrid_webhook.py --port 8089 --discord-webhook https://discord.com/api/webhooks/xxx/yyy\n\n# Or process events manually (for agent to post)\npython sendgrid_webhook.py --process-events\npython sendgrid_webhook.py --process-events --json"
      },
      {
        "title": "Discord Webhook Setup (Recommended)",
        "body": "In your Discord channel, go to Settings > Integrations > Webhooks\nClick New Webhook, copy the URL\nPass to --discord-webhook or set DISCORD_WEBHOOK_URL env var"
      },
      {
        "title": "SendGrid Setup",
        "body": "Go to SendGrid > Settings > Mail Settings > Event Webhook\nClick \"Create new webhook\" (or edit existing)\nSet HTTP POST URL to: https://your-domain.com/webhooks/sendgrid\nSelect all event types under Actions to be posted:\n\nEngagement data: Opened, Clicked, Unsubscribed, Spam Reports, Group Unsubscribes, Group Resubscribes\nDeliverability Data: Processed, Dropped, Deferred, Bounced, Delivered\nAccount Data: Account Status Change\n\n\nClick \"Test Integration\" to verify - this fires all event types to your webhook\nImportant: Click Save to enable the webhook!\n(Optional) Enable Signed Event Webhook for security and set SENDGRID_WEBHOOK_PUBLIC_KEY"
      },
      {
        "title": "Event Types",
        "body": "EventEmojiDescriptiondelivered✅Email reached recipientopen👀Recipient opened emailclick🔗Recipient clicked a linkbounce⚠️Email bouncedunsubscribe🔕Recipient unsubscribedspamreport🚨Marked as spam"
      },
      {
        "title": "Environment Variables",
        "body": "SENDGRID_WEBHOOK_PUBLIC_KEY    # For signature verification (optional)\nSENDGRID_WEBHOOK_MAX_AGE_SECONDS  # Max timestamp age (default: 300)\nWEBHOOK_PORT                   # Server port (default: 8089)\nDISCORD_WEBHOOK_URL            # Discord webhook URL\nWEBHOOK_LOG_FILE               # Log file path"
      },
      {
        "title": "The 80,000 Hours Concept",
        "body": "Career as finite inventory: 40 years × 2,000 hrs/year = 80,000 hours.\n\nmeter.py career --hours-worked 56000 --rate 85 --raise-pct 2.5\n# → 12.3 years remaining, $2.4M earning potential"
      }
    ],
    "body": "Hour Meter (TARDIS on ClawHub)\n\nLife event tracker with three modes, milestone notifications, and tamper-evident verification.\n\nClawHub Note: This skill is published as TARDIS on ClawHub after the original hour-meter listing was lost due to a repository sync issue.\n\nThree Modes\nCOUNT UP — Time since an event\n# Quit smoking tracker\nmeter.py create smoke-free --start \"2025-06-15T08:00:00Z\" -d \"Last cigarette\"\nmeter.py milestone smoke-free -t hours -v 720 -m \"🎉 30 days smoke-free!\"\nmeter.py lock smoke-free  # → Gives you paper code to save\n\nCOUNT DOWN — Time until an event\n# Baby due date\nmeter.py create baby --start \"2026-01-15\" --end \"2026-10-15\" --mode down -d \"Baby arriving!\"\nmeter.py milestone baby -t percent -v 33 -m \"👶 First trimester complete!\"\n\nCOUNT BETWEEN — Journey from start to end\n# Career span\nmeter.py create career --start \"1998-05-15\" --end \"2038-05-15\" -d \"40-year career\"\nmeter.py milestone career -t percent -v 50 -m \"📊 Halfway through career!\"\nmeter.py career --meter career --rate 85 --raise-pct 2.5\n\nTamper-Evident Persistence\n\nWhen you lock a meter, you get a paper code — a short, checksummed code you can write on paper:\n\n╔══════════════════════════════════════════════════════════════╗\n║  PAPER CODE (write this down):                               ║\n║     318B-3229-C523-2F9C-V                                    ║\n╚══════════════════════════════════════════════════════════════╝\n\nFour Ways to Save (Non-Technical)\n\n1️⃣ PAPER — Write the code on paper/sticky note\n\n20 characters with dashes, easy to copy\nBuilt-in checksum catches typos when verifying\nKeep in wallet, safe, or taped to equipment\n\n2️⃣ PHOTO — Screenshot or photograph the lock screen\n\nStore in camera roll, cloud photos\nVisual backup, no typing required\n\n3️⃣ WITNESS FILE — Auto-saved to ~/.openclaw/meter-witness.txt\n\nAppend-only log of all locked meters\nSync folder to Dropbox/iCloud/Google Drive for cloud backup\nContains paper code + full hash + timestamp\n\n4️⃣ EMAIL TO SELF — Click the mailto: link or copy the one-liner\n\nOpens your email client with pre-filled subject and body\nOr copy the compact message: 🔒 my-meter | Code: XXXX-XXXX-XXXX-XXXX-C | Locked: 2026-02-02\nSend to yourself, search inbox later to verify\n\n5️⃣ SENDGRID EMAIL — Auto-send verification email on lock\n\n# Set your SendGrid API key\nexport SENDGRID_API_KEY=SG.xxxxx\nexport SENDGRID_FROM_EMAIL=verified@yourdomain.com\n\n# Lock and email in one command\nmeter.py lock my-meter --email you@example.com\n\nSends a beautifully formatted HTML email with paper code\nRequires a verified sender in SendGrid (see SendGrid docs)\nGreat for automated workflows\nVerifying Later\n# With paper code (catches typos!)\nmeter.py verify my-meter \"318B-3229-C523-2F9C-V\"\n\n# → ✅ VERIFIED! Paper code matches.\n# → ⚠️ CHECKSUM ERROR! (if you have a typo)\n# → ❌ MISMATCH! (if tampered)\n\nMilestones\nmeter.py milestone <name> --type hours --value 1000 --message \"1000 hours!\"\nmeter.py milestone <name> --type percent --value 50 --message \"Halfway!\"\nmeter.py check-milestones  # JSON output for automation\n\nEmail Milestone Notifications (v1.3.0)\n\nGet milestone notifications sent directly to your email:\n\n# Create meter with email notifications\nmeter.py create my-meter \\\n  --notify-email you@example.com \\\n  --from-email verified@yourdomain.com \\\n  -d \"My tracked event\"\n\n# Add milestones as usual\nmeter.py milestone my-meter -t hours -v 24 -m \"🎉 24 hours complete!\"\n\n# When check-milestones runs and a milestone fires, email is sent automatically\nmeter.py check-milestones\n# → Triggers milestone AND sends email notification\n\n\nEmail includes:\n\n🎯 Milestone message\n⏱️ Current elapsed time\n📝 Meter description\n\nRequires SENDGRID_API_KEY environment variable.\n\nMilestone Notifications: Heartbeat vs Cron\n\nRecommended: HEARTBEAT (~30 min resolution)\n\nAdd to HEARTBEAT.md: Run meter.py check-milestones and notify triggered\nBatches with other periodic checks\nCost-efficient: shares token usage with other heartbeat tasks\nGood for most use cases (quit tracking, career milestones, etc.)\nMilestone Messages\n\nMilestones post their message text to the configured notification channel when triggered:\n\n# Posts the message when milestone fires\nmeter.py milestone my-meter -t hours -v 24 -m \"🎉 24 hours complete!\"\n\n\nConfigure in HEARTBEAT.md:\n\n- Run meter.py check-milestones and post triggered milestone messages to the configured channel\n\n\nAdvanced: Milestone messages prefixed with ACTION: can optionally be treated as agent instructions by your heartbeat config. This is an opt-in feature — see README.md for security considerations.\n\nAlternative: CRON (precise timing)\n\nUse when exact timing matters (e.g., countdown to event)\n⚠️ Cost warning: Cron at 1-minute intervals = 1,440 API calls/day = expensive!\nIf using cron, keep intervals ≥15 minutes to manage costs\nBest for one-shot reminders, not continuous monitoring\n\nRule of thumb: If 30-minute resolution is acceptable, use heartbeat. Save cron for precision timing.\n\nQuick Reference\nmeter.py create <name> [--start T] [--end T] [--mode up|down|between] [-d DESC]\nmeter.py lock <name>                # Seal + get paper code\nmeter.py verify <name> <code>       # Verify paper code\nmeter.py check <name>               # Status + progress\nmeter.py milestone <name> -t hours|percent -v N -m \"...\"\nmeter.py check-milestones           # All milestones (JSON)\nmeter.py witness [--show] [--path]  # Witness file\nmeter.py list                       # All meters\nmeter.py career [--meter M] [--rate R] [--raise-pct P]\nmeter.py export [name]              # JSON export\n\nSendGrid Email Webhook Server\n\nReceive real-time notifications when recipients open, click, bounce, or unsubscribe from your meter verification emails.\n\nSetup\n# Start webhook server with Discord webhook (recommended)\npython sendgrid_webhook.py --port 8089 --discord-webhook https://discord.com/api/webhooks/xxx/yyy\n\n# Or process events manually (for agent to post)\npython sendgrid_webhook.py --process-events\npython sendgrid_webhook.py --process-events --json\n\nDiscord Webhook Setup (Recommended)\nIn your Discord channel, go to Settings > Integrations > Webhooks\nClick New Webhook, copy the URL\nPass to --discord-webhook or set DISCORD_WEBHOOK_URL env var\nSendGrid Setup\nGo to SendGrid > Settings > Mail Settings > Event Webhook\nClick \"Create new webhook\" (or edit existing)\nSet HTTP POST URL to: https://your-domain.com/webhooks/sendgrid\nSelect all event types under Actions to be posted:\nEngagement data: Opened, Clicked, Unsubscribed, Spam Reports, Group Unsubscribes, Group Resubscribes\nDeliverability Data: Processed, Dropped, Deferred, Bounced, Delivered\nAccount Data: Account Status Change\nClick \"Test Integration\" to verify - this fires all event types to your webhook\nImportant: Click Save to enable the webhook!\n(Optional) Enable Signed Event Webhook for security and set SENDGRID_WEBHOOK_PUBLIC_KEY\n\nEvent Types\nEvent\tEmoji\tDescription\ndelivered\t✅\tEmail reached recipient\nopen\t👀\tRecipient opened email\nclick\t🔗\tRecipient clicked a link\nbounce\t⚠️\tEmail bounced\nunsubscribe\t🔕\tRecipient unsubscribed\nspamreport\t🚨\tMarked as spam\nEnvironment Variables\nSENDGRID_WEBHOOK_PUBLIC_KEY    # For signature verification (optional)\nSENDGRID_WEBHOOK_MAX_AGE_SECONDS  # Max timestamp age (default: 300)\nWEBHOOK_PORT                   # Server port (default: 8089)\nDISCORD_WEBHOOK_URL            # Discord webhook URL\nWEBHOOK_LOG_FILE               # Log file path\n\nThe 80,000 Hours Concept\n\nCareer as finite inventory: 40 years × 2,000 hrs/year = 80,000 hours.\n\nmeter.py career --hours-worked 56000 --rate 85 --raise-pct 2.5\n# → 12.3 years remaining, $2.4M earning potential"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/rm289/tardis",
    "publisherUrl": "https://clawhub.ai/rm289/tardis",
    "owner": "rm289",
    "version": "1.2.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/tardis",
    "downloadUrl": "https://openagent3.xyz/downloads/tardis",
    "agentUrl": "https://openagent3.xyz/skills/tardis/agent",
    "manifestUrl": "https://openagent3.xyz/skills/tardis/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/tardis/agent.md"
  }
}