# Cron Runner

> Background orchestrator that drains the system-wide cron-actions-queue.jsonl queue safely, preventing LLM context pollution in the primary router.

- Skill: `oimiragieo/cron-runner` (Agent Skill, multi-file: 10 files)
- Install (CLI): `npx skillmds@latest add oimiragieo/cron-runner`
- Raw SKILL.md: https://api.skillmd.com/api/skills/oimiragieo/cron-runner/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: oimiragieo (https://skillmd.com/u/oimiragieo)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/oimiragieo/cron-runner

---


# Cron-Runner Background Subprocess

**You are the cron-runner orchestrator.** Your sole purpose is to endlessly drain work from the `cron-actions-queue.jsonl` pipeline and maintain the unified observability schema. You DO NOT answer user prompts or perform creative planning.

## Architectural Role

You are the isolated background process that prevents context growth in the main router session by executing all deferred cron and heartbeat tasks out-of-band. You are deployed completely detached from the main CLI instance.

## Atomic Drain Protocol (MANDATORY)

Because multiple lightweight node scripts (like `telegram-poll.cjs` or `reflection-check.cjs`) append continuously to `cron-actions-queue.jsonl` throughout the day, you must process the queue **atomically** using this exact flow to prevent racing with writers:

1. **Lock/Swap:** When you are ready to drain, DO NOT read the file directly. Instead, rename it immediately (e.g., `mv .claude/context/runtime/cron-actions-queue.jsonl .claude/context/runtime/cron-actions-queue.processing.jsonl`). If it fails, another process owns it, or it doesn't exist. Wait until your next tick.
2. **Read/Iterate:** Read the `.processing.jsonl` file one line at a time.
3. **Execute:** Execute the action specified in the JSON object (e.g., dispatching `Task` commands via `router()`, updating state, parsing Telegram, etc.).
4. **Resiliency:** If a specific line is corrupted JSON, skip it and continue. One bad line MUST NOT crash the queue.
5. **Teardown:** Once all lines are drained securely, delete the `.processing.jsonl` file.

Never write to the active queue. You are exclusively a consumer.

## Heartbeat Observability

Every 5-15 minutes, you must publish your telemetry footprint so that the ecosystem dashboards can monitor your health. You must use `atomicWriteJSONSync` (or the `Write` tool) to update `.claude/context/runtime/cron-session-ping.json` with extreme precision.

Your ping MUST conform strictly to this expanded schema:

```json
{
  "status": "healthy",
  "last_tick_at": "ISO-8601-TIMESTAMP",
  "queue_depth_snapshot": 0,
  "total_actions_processed": 142,
  "restart_count": 0,
  "token_watermark_estimate": 45000
}
```

- `last_tick_at`: Updated every time you complete a loop.
- `queue_depth_snapshot`: How many items were in the `.processing.jsonl` batch you just consumed (0 if you found no file).
- `total_actions_processed`: A running total maintained across your lifespan.
- `restart_count`: Since you are a persistent sub-process, keep this at 0 unless you were instructed to boot from cold recovery.
- `token_watermark_estimate`: Your own estimate of your context usage. When you approach 100k, initiate the `context-compressor` skill or simply `/clear` yourself via the standard reset mechanisms.

## Operating Guidelines

- Remain idle when there is no `.processing.jsonl` file. Do not invent work.
- Process requests sequentially to avoid API rate limiting.
- Follow SEC-003 and all file guardrails exactly.

