{
  "jobs": [
    {
      "id": "5fd07b6b83f2",
      "name": "morning-digest",
      "prompt": "You are Hermes, Rocky's site ops agent. Sydney timezone. Deliver a morning intelligence digest to Rocky's Telegram (chat 7377499346) via send_message.\n\nGmail + Google Calendar only (do NOT check LFCS email \u2014 that's handled separately). Use the Google OAuth token at ~/.hermes/google_token.json. If the token is expired or invalid, send this message instead: \"\u26a0\ufe0f Morning digest unavailable \u2014 Google OAuth token needs re-auth. Run: python3 /usr/local/lib/hermes-agent/setup.py --auth-url\"\n\n**Format \u2014 tight bullets, deadlines first, no filler:**\n\n```\n\ud83d\uddd3 [DAY] Morning Digest \u2014 [DD MMM]\n\n## Deadlines today\n(bullets)\n\n## Action items\n(bullets)\n\n## Gmail \u2014 top 5 unread\n(bullets: sender, subject, snippet, time)\n\n## Calendar \u2014 next 7 days\n(bullets: time, event, location if any)\n\n## Waiting on (3+ days, from open follow-ups in memory)\n(read ~/.hermes/memories/MEMORY.md, find open follow-ups, include items with no reply/activity in 3+ days \u2014 if none, write \"Nothing stale\")\n```\n\nScopes to request: gmail.readonly + calendar (already in token). Max 5 email items. Keep snippets to 1 line each. If token is valid, actually fetch real data \u2014 do not fabricate emails or calendar events.",
      "skills": [
        "lfcs"
      ],
      "skill": "lfcs",
      "model": null,
      "provider": null,
      "base_url": null,
      "script": null,
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "cron",
        "expr": "0 5 * * *",
        "display": "0 5 * * *"
      },
      "schedule_display": "0 5 * * *",
      "repeat": {
        "times": null,
        "completed": 11
      },
      "enabled": true,
      "state": "scheduled",
      "paused_at": null,
      "paused_reason": null,
      "created_at": "2026-06-12T14:23:06.462993+10:00",
      "next_run_at": "2026-06-24T05:00:00+10:00",
      "last_run_at": "2026-06-23T05:01:31.396902+10:00",
      "last_status": "ok",
      "last_error": null,
      "last_delivery_error": null,
      "deliver": "telegram:7377499346",
      "origin": {
        "platform": "telegram",
        "chat_id": "7377499346",
        "chat_name": "Michael",
        "thread_id": null
      },
      "enabled_toolsets": null,
      "workdir": null
    },
    {
      "id": "9047588dd026",
      "name": "window-digest",
      "prompt": "You are Hermes, Rocky's site ops agent. Sydney timezone. It's end of day \u2014 deliver a short window digest to Rocky's Telegram (chat 7377499346) via send_message.\n\n**Purpose:** surfaces anything from today's sessions or memory flagged as needing a decision before the day closes.\n\n**Format \u2014 tight bullets, max 10 items, no preamble:**\n```\n\ud83e\ude9f End of Day Digest \u2014 [DD MMM]\n\n## Queued for decision\n(bullets \u2014 items from memory flagged as waiting on Rocky's call/decision. If nothing is queued, write \"Nothing queued for decision.\")\n\n## Open follow-ups (still waiting on others)\n(bullets from ~/.hermes/memories/MEMORY.md \u2014 open items, short status. If none, write \"All clear.\")\n```\n\nRead ~/.hermes/memories/MEMORY.md for open follow-ups. Check recent session context for anything flagged as \"needs Rocky decision\" or \"queued\". Keep it short \u2014 this is a closing snapshot, not a full report.",
      "skills": [
        "lfcs"
      ],
      "skill": "lfcs",
      "model": null,
      "provider": null,
      "base_url": null,
      "script": null,
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "cron",
        "expr": "0 18 * * 1-5",
        "display": "0 18 * * 1-5"
      },
      "schedule_display": "0 18 * * 1-5",
      "repeat": {
        "times": null,
        "completed": 8
      },
      "enabled": true,
      "state": "scheduled",
      "paused_at": null,
      "paused_reason": null,
      "created_at": "2026-06-12T14:23:19.878644+10:00",
      "next_run_at": "2026-06-24T18:00:00+10:00",
      "last_run_at": "2026-06-23T18:01:38.460538+10:00",
      "last_status": "ok",
      "last_error": null,
      "last_delivery_error": null,
      "deliver": "telegram:7377499346",
      "origin": {
        "platform": "telegram",
        "chat_id": "7377499346",
        "chat_name": "Michael",
        "thread_id": null
      },
      "enabled_toolsets": null,
      "workdir": null
    },
    {
      "id": "f481ba22c69c",
      "name": "rateright-weekly",
      "prompt": "You are Hermes, Rocky's RateRight platform agent. Sydney timezone. Deliver a weekly RateRight health check to Rocky's Telegram (chat 7377499346) via send_message.\n\n**Check:**\n1. Is the RateRight app reachable? (curl http://localhost:3000 or check if pm2 process is running)\n2. Anything in memory (~/hermes/memories/MEMORY.md) flagged as queued for RateRight action?\n3. If web access is available, scan for relevant civil construction tech news (1-2 items max).\n\n**Format \u2014 tight bullets:**\n```\n\ud83d\udcca RateRight Weekly \u2014 [DD MMM]\n\n## App status\n[reachable / down / unknown]\n\n## Queued items\n(bullets from memory \u2014 RateRight-specific items. If none, write \"Nothing queued.\")\n\n## News/competitive (if web available)\n(bullets or \"No news available\")\n```\n\nDo NOT make changes \u2014 report only.",
      "skills": [
        "rateright-operations"
      ],
      "skill": "rateright-operations",
      "model": null,
      "provider": null,
      "base_url": null,
      "script": null,
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "cron",
        "expr": "0 8 * * 6",
        "display": "0 8 * * 6"
      },
      "schedule_display": "0 8 * * 6",
      "repeat": {
        "times": null,
        "completed": 2
      },
      "enabled": true,
      "state": "scheduled",
      "paused_at": null,
      "paused_reason": null,
      "created_at": "2026-06-12T14:23:32.947072+10:00",
      "next_run_at": "2026-06-27T08:00:00+10:00",
      "last_run_at": "2026-06-20T08:04:33.055826+10:00",
      "last_status": "ok",
      "last_error": null,
      "last_delivery_error": null,
      "deliver": "telegram:7377499346",
      "origin": {
        "platform": "telegram",
        "chat_id": "7377499346",
        "chat_name": "Michael",
        "thread_id": null
      },
      "enabled_toolsets": null,
      "workdir": null
    },
    {
      "id": "74522c9d2bb7",
      "name": "self-health",
      "prompt": "You are Hermes. Sydney timezone. Deliver a self-health report to Rocky's Telegram (chat 7377499346) via send_message. Report only \u2014 change nothing.\n\n**Checks:**\n1. Stuck/hung Hermes processes: `ps aux | grep hermes | grep -v grep` \u2014 any process with etime > 1 hour?\n2. Disk: `df -h /` \u2014 usage %\n3. Systemd: `systemctl is-active hermes-gateway hermes-dashboard` \u2014 both should say \"active\"\n4. Vault git sync: check age of last commit in /home/ccuser/rateright-growth/ \u2014 `git log -1 --format=\"%H %ci\"` \u2014 is it within 1 hour?\n5. MEMORY.md budget: `wc -c ~/.hermes/memories/MEMORY.md` \u2014 what % of 2200 chars?\n\n**Format \u2014 tight bullets, no filler:**\n```\n\ud83c\udfe5 Self Health \u2014 [DD MMM]\n\n## Processes\n(bullets \u2014 any stuck processes, or \"All clear\")\n\n## Disk /dev/vda1\n[usage%]\n\n## Systemd\nhermes-gateway: [active/inactive]\nhermes-dashboard: [active/inactive]\n\n## Vault sync\n[last commit hash + age, or \"No recent commit\"]\n\n## MEMORY.md\n[char count] / 2200 ([%] used)\n```\n\nRead ~/.hermes/memories/MEMORY.md to get the char count. Use terminal tool for all system queries.",
      "skills": [
        "lfcs"
      ],
      "skill": "lfcs",
      "model": null,
      "provider": null,
      "base_url": null,
      "script": null,
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "cron",
        "expr": "0 18 * * 0",
        "display": "0 18 * * 0"
      },
      "schedule_display": "0 18 * * 0",
      "repeat": {
        "times": null,
        "completed": 2
      },
      "enabled": true,
      "state": "scheduled",
      "paused_at": null,
      "paused_reason": null,
      "created_at": "2026-06-12T14:23:48.181758+10:00",
      "next_run_at": "2026-06-28T18:00:00+10:00",
      "last_run_at": "2026-06-21T18:01:14.600069+10:00",
      "last_status": "ok",
      "last_error": null,
      "last_delivery_error": null,
      "deliver": "telegram:7377499346",
      "origin": {
        "platform": "telegram",
        "chat_id": "7377499346",
        "chat_name": "Michael",
        "thread_id": null
      },
      "enabled_toolsets": null,
      "workdir": null
    },
    {
      "id": "5c6b3bb3ede7",
      "name": "tender-watch",
      "prompt": "You are Hermes. Sydney timezone. Check NSW eTendering (tenders.nsw.gov.au) for new civil construction / bridge / structural engineering tenders posted in the last 24h. Deliver results to Rocky's Telegram (chat 7377499346) via send_message.\n\n**Search API key:** Check if ~/.hermes/config.yaml or ~/.hermes/.env contains TAVILY_API_KEY or BRAVE_SEARCH_API_KEY or SEARCH_API_KEY. If none found, send:\n\"\ud83d\udd0d Tender watch: search API key not configured. Add to Hermes dashboard \u2192 Keys page.\"\n\n**If key is present:** Use web search to find tenders matching: site:tenders.nsw.gov.au AND (civil OR bridge OR structural OR construction) AND (24h OR today OR yesterday). Parse results: title, agency, close date, link.\n\n**Format \u2014 tight bullets:**\n```\n\ud83c\udfd7 NSW Tender Watch \u2014 [DD MMM]\n\n## New tenders (last 24h)\n(bullets: title, agency, close date, link \u2014 or \"Nothing new today\")\n```\n\nIf no new tenders, send \"Nothing new today\" \u2014 that is a valid result. Do NOT fabricate tenders.",
      "skills": [
        "lfcs"
      ],
      "skill": "lfcs",
      "model": null,
      "provider": null,
      "base_url": null,
      "script": null,
      "no_agent": false,
      "context_from": null,
      "schedule": {
        "kind": "cron",
        "expr": "0 7 * * *",
        "display": "0 7 * * *"
      },
      "schedule_display": "0 7 * * *",
      "repeat": {
        "times": null,
        "completed": 0
      },
      "enabled": false,
      "state": "paused",
      "paused_at": "2026-06-12T14:24:17.629671+10:00",
      "paused_reason": null,
      "created_at": "2026-06-12T14:24:07.727878+10:00",
      "next_run_at": "2026-06-13T07:00:00+10:00",
      "last_run_at": null,
      "last_status": null,
      "last_error": null,
      "last_delivery_error": null,
      "deliver": "telegram:7377499346",
      "origin": {
        "platform": "telegram",
        "chat_id": "7377499346",
        "chat_name": "Michael",
        "thread_id": null
      },
      "enabled_toolsets": null,
      "workdir": null
    }
  ],
  "updated_at": "2026-06-23T18:01:38.461487+10:00"
}