{
  "version": 1,
  "jobs": [
    {
      "id": "doc-jon-eod-synthesis",
      "name": "Doc Jon — End-of-day synthesis",
      "schedule": {
        "expr": "0 18 * * *",
        "tz": "Asia/Bangkok",
        "kind": "cron"
      },
      "stagger": "30s",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549740994822338"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nUse the read tool to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. If the file does not exist, create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), write '## EoD Synthesis\\n_No session activity logged today._' and stop. If the file exists: in <=200 words, summarize only what is actually written in the file — what shipped, what is still open, top 3 priorities for tomorrow. Do NOT invent activities not recorded in the file. Append the summary under an '## EoD Synthesis' heading. Do not read other agents' workspaces or the knowledge/ directory.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "doc-jon",
      "state": {}
    },
    {
      "id": "sonia-eod-synthesis",
      "name": "Sonia — End-of-day synthesis",
      "schedule": {
        "expr": "0 18 * * *",
        "tz": "Asia/Bangkok",
        "kind": "cron"
      },
      "stagger": "2m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549829826117702"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nUse the read tool to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. If the file does not exist, create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), write '## EoD Synthesis\\n_No session activity logged today._' and stop. If the file exists: in <=200 words, summarize only what is actually written in the file — architecture decisions made, design tasks progressed, open design questions, top 3 architecture priorities for tomorrow. Do NOT invent activities not recorded in the file. Append the summary under an '## EoD Synthesis' heading. Do not read other agents' workspaces or the knowledge/ directory.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "sonia",
      "state": {}
    },
    {
      "id": "jelink-eod-synthesis",
      "name": "Jelink — End-of-day synthesis",
      "schedule": {
        "expr": "0 18 * * *",
        "tz": "Asia/Bangkok",
        "kind": "cron"
      },
      "stagger": "4m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549875279663114"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nUse the read tool to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. If the file does not exist, create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), write '## EoD Synthesis\\n_No session activity logged today._' and stop. If the file exists: in <=200 words, summarize only what is actually written in the file — code tasks completed or progressed, PRs opened/reviewed/merged, blockers encountered, top 3 implementation priorities for tomorrow. Do NOT invent activities not recorded in the file. Append the summary under an '## EoD Synthesis' heading. Do not read other agents' workspaces or the knowledge/ directory.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "jelink",
      "state": {}
    },
    {
      "id": "thinker-eod-synthesis",
      "name": "Thinker — End-of-day synthesis",
      "schedule": {
        "expr": "0 18 * * *",
        "tz": "Asia/Bangkok",
        "kind": "cron"
      },
      "stagger": "6m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549891922919485"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nUse the read tool to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. If the file does not exist, create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), write '## EoD Synthesis\\n_No session activity logged today._' and stop. If the file exists: in <=200 words, summarize only what is actually written in the file — test runs reviewed, bugs or regressions found, quality gate decisions made, top 3 QA priorities for tomorrow. Do NOT invent activities not recorded in the file. Append the summary under an '## EoD Synthesis' heading. Do not read other agents' workspaces or the knowledge/ directory.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "thinker",
      "state": {}
    },
    {
      "id": "miegyver-eod-synthesis",
      "name": "Miegyver — End-of-day synthesis",
      "schedule": {
        "expr": "0 18 * * *",
        "tz": "Asia/Bangkok",
        "kind": "cron"
      },
      "stagger": "8m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549914886602752"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nUse the read tool to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. If the file does not exist, create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), write '## EoD Synthesis\\n_No session activity logged today._' and stop. If the file exists: in <=200 words, summarize only what is actually written in the file — infra changes made, incidents handled, cost events noted, top 3 DevOps priorities for tomorrow. Do NOT invent activities not recorded in the file. Append the summary under an '## EoD Synthesis' heading. Do not read other agents' workspaces or the knowledge/ directory.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "miegyver",
      "state": {}
    },
    {
      "id": "doc-jon-memory-flush",
      "name": "Doc Jon — Periodic memory checkpoint",
      "schedule": {
        "kind": "cron",
        "expr": "0 11,23 * * *",
        "tz": "Asia/Bangkok"
      },
      "stagger": "0s",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549740994822338"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nNEW — Daily bulletin: use the read tool to open agents-knowledge/daily/<today>_doc-jon.md (substitute today's date for <today> in YYYY-MM-DD format — do NOT use literal YYYY-MM-DD). If the file does not exist, create it. Append a \"## HH:MM\" section (use current time) with max 3 bullet points: (1) what you are working on, (2) any blockers, (3) any open items for Doc Jon. Then proceed to: Step 1: use ONLY the `read` tool (NOT search, NOT memory_search) to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. Step 2a — if the file does not exist: create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), then use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/tasks/_registry.md, scan for rows where owner=doc-jon and status is ready or in-progress, list those task IDs and titles in a '## HH:MM SOD' block — do NOT search for individual task files. Step 2b — if the file already exists: use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/_index.md; if there are notable decisions, blockers, or open items not yet captured, append a '## HH:MM checkpoint' with a brief summary (under 100 words); otherwise reply NO_REPLY. Do not call the message tool.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "doc-jon",
      "state": {}
    },
    {
      "id": "sonia-memory-flush",
      "name": "Sonia — Periodic memory checkpoint",
      "schedule": {
        "kind": "cron",
        "expr": "10 11,23 * * *",
        "tz": "Asia/Bangkok"
      },
      "stagger": "2m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549829826117702"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nNEW — Daily bulletin: use the read tool to open agents-knowledge/daily/<today>_sonia.md (substitute today's date for <today> in YYYY-MM-DD format — do NOT use literal YYYY-MM-DD). If the file does not exist, create it. Append a \"## HH:MM\" section (use current time) with max 3 bullet points: (1) what you are working on, (2) any blockers, (3) any open items for Doc Jon. Then proceed to: Step 1: use ONLY the `read` tool (NOT search, NOT memory_search) to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. Step 2a — if the file does not exist: create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), then use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/tasks/_registry.md, scan for rows where owner=sonia and status is ready or in-progress, list those task IDs and titles in a '## HH:MM SOD' block — do NOT search for individual task files. Step 2b — if the file already exists: use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/_index.md; if there are architecture decisions, design notes, or open design questions not yet captured, append a '## HH:MM checkpoint' with a brief summary (under 100 words); otherwise reply NO_REPLY. Do not call the message tool.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "sonia",
      "state": {}
    },
    {
      "id": "jelink-memory-flush",
      "name": "Jelink — Periodic memory checkpoint",
      "schedule": {
        "kind": "cron",
        "expr": "20 11,23 * * *",
        "tz": "Asia/Bangkok"
      },
      "stagger": "4m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549875279663114"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nNEW — Daily bulletin: use the read tool to open agents-knowledge/daily/<today>_jelink.md (substitute today's date for <today> in YYYY-MM-DD format — do NOT use literal YYYY-MM-DD). If the file does not exist, create it. Append a \"## HH:MM\" section (use current time) with max 3 bullet points: (1) what you are working on, (2) any blockers, (3) any open items for Doc Jon. Then proceed to: Step 1: use ONLY the `read` tool (NOT search, NOT memory_search) to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. Step 2a — if the file does not exist: create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), then use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/tasks/_registry.md, scan for rows where owner=jelink and status is ready or in-progress, list those task IDs and titles in a '## HH:MM SOD' block — do NOT search for individual task files. Step 2b — if the file already exists: use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/_index.md; if there are implementation notes, edge cases, or architectural concerns not yet captured, append a '## HH:MM checkpoint' with a brief summary (under 100 words); otherwise reply NO_REPLY. Do not call the message tool.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "jelink",
      "state": {}
    },
    {
      "id": "thinker-memory-flush",
      "name": "Thinker — Periodic memory checkpoint",
      "schedule": {
        "kind": "cron",
        "expr": "30 11,23 * * *",
        "tz": "Asia/Bangkok"
      },
      "stagger": "6m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549891922919485"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nNEW — Daily bulletin: use the read tool to open agents-knowledge/daily/<today>_thinker.md (substitute today's date for <today> in YYYY-MM-DD format — do NOT use literal YYYY-MM-DD). If the file does not exist, create it. Append a \"## HH:MM\" section (use current time) with max 3 bullet points: (1) what you are working on, (2) any blockers, (3) any open items for Doc Jon. Then proceed to: Step 1: use ONLY the `read` tool (NOT search, NOT memory_search) to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. Step 2a — if the file does not exist: create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), then use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/tasks/_registry.md, scan for rows where owner=thinker and status is ready or in-progress, list those task IDs and titles in a '## HH:MM SOD' block — do NOT search for individual task files. Step 2b — if the file already exists: use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/_index.md; if there are test findings, flaky tests, quality gate decisions, or open bug reports not yet captured, append a '## HH:MM checkpoint' with a brief summary (under 100 words); otherwise reply NO_REPLY. Do not call the message tool.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "thinker",
      "state": {}
    },
    {
      "id": "miegyver-memory-flush",
      "name": "Miegyver — Periodic memory checkpoint",
      "schedule": {
        "kind": "cron",
        "expr": "40 11,23 * * *",
        "tz": "Asia/Bangkok"
      },
      "stagger": "8m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549914886602752"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nNEW — Daily bulletin: use the read tool to open agents-knowledge/daily/<today>_miegyver.md (substitute today's date for <today> in YYYY-MM-DD format — do NOT use literal YYYY-MM-DD). If the file does not exist, create it. Append a \"## HH:MM\" section (use current time) with max 3 bullet points: (1) what you are working on, (2) any blockers, (3) any open items for Doc Jon. Then proceed to: Step 1: use ONLY the `read` tool (NOT search, NOT memory_search) to open memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. Step 2a — if the file does not exist: create it with a heading with today's date in '# YYYY-MM-DD' format (substitute the actual date — do NOT use literal YYYY-MM-DD), then use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/tasks/_registry.md, scan for rows where owner=miegyver and status is ready or in-progress, list those task IDs and titles in a '## HH:MM SOD' block — do NOT search for individual task files. Step 2b — if the file already exists: use ONLY the `read` tool (NOT search, NOT memory_search) to open agents-knowledge/_index.md; if there are infra changes, deployment events, cost anomalies, or operational decisions not yet captured, append a '## HH:MM checkpoint' with a brief summary (under 100 words); otherwise reply NO_REPLY. Do not call the message tool.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "miegyver",
      "state": {}
    },
    {
      "id": "doc-jon-morning-brief-mcp",
      "name": "Doc Jon — Morning brief with GitHub + Grafana MCP",
      "schedule": {
        "kind": "cron",
        "expr": "0 9 * * 1-5",
        "tz": "Asia/Bangkok"
      },
      "stagger": "0s",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549740994822338"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nProduce the morning brief. Use GitHub MCP: call list_pull_requests to get open PRs, then list_check_runs for each to get CI status. Use Grafana MCP: call list_alert_groups for firing alerts, then query_prometheus with datasourceUid='grafanacloud-prom' and expr='bridge_up' queryType='instant' to confirm bridge status. If yesterday's memory file exists (memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format for yesterday's date), use the read tool to open it for recent context — if it does not exist, skip this step. Brief format: (1) Blockers — PRs stuck >24h or failing CI, (2) Alerts — any firing Grafana alerts or bridge_up=0, (3) Top 3 priorities today. Max 300 words. Only post if there are blockers or active alerts. Reply NO_REPLY if everything is green.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "doc-jon",
      "state": {}
    },
    {
      "id": "jelink-github-pr-sweep",
      "name": "Jelink — Open PR status sweep",
      "schedule": {
        "kind": "cron",
        "expr": "0 10,15 * * 1-5",
        "tz": "Asia/Bangkok"
      },
      "stagger": "3m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549875279663114"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "Use the GitHub MCP to list all open pull requests. For each: check CI status via list_check_runs. Flag any PR with: (1) failing checks, (2) no reviewer after 24h, (3) merge conflicts. Post a concise table to #code. If all PRs are green and reviewed, reply NO_REPLY.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "jelink",
      "state": {}
    },
    {
      "id": "thinker-ci-regression",
      "name": "Thinker — Nightly CI regression audit",
      "schedule": {
        "kind": "cron",
        "expr": "0 3 * * *",
        "tz": "Asia/Bangkok"
      },
      "stagger": "5m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549891922919485"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nUse the GitHub MCP to: (1) list all check runs across open PRs that failed or were cancelled in the last 24h. (2) List agents-knowledge/qa/ — if files exist, use the read tool to open recent reports and cross-reference for known flaky patterns; if no files exist, skip cross-reference. Append findings to memory/<today>.md — compute today's date from the system prompt's currentDate field and substitute into YYYY-MM-DD format. Only notify #qa if new flaky tests or regressions appear that are not already tracked in qa/ files. Reply NO_REPLY if nothing new. Do NOT invent CI results — only report what GitHub MCP returns.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "thinker",
      "state": {}
    },
    {
      "id": "miegyver-grafana-sweep",
      "name": "Miegyver — Grafana alert + bridge health sweep",
      "schedule": {
        "kind": "cron",
        "expr": "0 */6 * * *",
        "tz": "Asia/Bangkok"
      },
      "stagger": "2m",
      "delivery": {
        "channel": "discord",
        "to": "channel:1500507989486993598"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "Use the Grafana MCP to run these checks: (1) call list_alert_groups — note any firing alerts; (2) call query_prometheus with datasourceUid='grafanacloud-prom', expr='bridge_up', queryType='instant' — confirm value is 1; (3) call query_prometheus with expr='rate(bridge_agent_invocations_total[2h])', queryType='instant' — note the rate; (4) call query_prometheus with expr='increase(bridge_ws_reconnections_total[2h])', queryType='instant' — flag if >3 reconnections. Only post to #ops if: a firing alert exists, bridge_up=0, or ws reconnections >3 in 2h. Reply NO_REPLY otherwise.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "miegyver",
      "state": {}
    },
    {
      "id": "doc-jon-weekly-rollup",
      "name": "Doc Jon — Weekly rollup (consolidate daily bulletins)",
      "schedule": {
        "expr": "0 2 * * 0",
        "tz": "Asia/Bangkok",
        "kind": "cron"
      },
      "stagger": "0s",
      "delivery": {
        "channel": "discord",
        "to": "channel:1498549740994822338"
      },
      "sessionTarget": "isolated",
      "payload": {
        "kind": "agentTurn",
        "message": "DATE SUBSTITUTION RULE: The placeholder \"YYYY-MM-DD\" must ALWAYS be replaced with the actual current date from the system prompt. Never create files with literal \"YYYY-MM-DD\" in the filename.\n\nWeekly rollup. (1) List agents-knowledge/daily/ — use the read tool to open every YYYY-MM-DD_*.md file from the last 7 days. Skip any dates with no files. (2) Consolidate all bulletins into a single summary organized by agent: key work done, blockers encountered, open items for Doc Jon. Keep it scannable — bullet points, not prose. (3) Save to agents-knowledge/documents/<today>_weekly-consolidate.md where <today> is today's date in YYYY-MM-DD format (substitute actual date — do NOT use literal YYYY-MM-DD). (4) PERMANENTLY DELETE files from disk — run this bash command: find agents-knowledge/daily/ -name \"*.md\" -type f -delete. This physically removes the files. Do NOT comment, annotate, or mark files — they must be gone from the filesystem. Only .gitkeep remains. (5) Post one-line confirmation to #standup: 'Weekly rollup complete — N files summarized and pruned (permanently deleted from daily/).' (replace N with actual count of bulletins processed). Do NOT produce a long summary in Discord — just the one-line confirmation.",
        "model": "ollama/gpt-oss:20b-cloud"
      },
      "enabled": true,
      "agentId": "doc-jon",
      "state": {}
    }
  ]
}