[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N062W1EE9MAN53KWRNREGH":3,"skill-same:01M6N062W1EE9MAN53KWRNREGH":77},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":6,"ownerHtmlUrl":60,"ownerBlogUrl":61,"ownerDescription":62,"updatedAt":63,"install":64,"resources":76},"01M6N062W1EE9MAN53KWRNREGH","cron-scheduler",null,"Schedule management with staggering, quiet hours, and wake-up override.\nValidates schedules, prevents collisions, and gates delivery during quiet hours.","garrytan\u002Fgbrain","garrytan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F19957?v=4","01M6DJCCDDG53MTYYRTXAXFG17","Garry Tan","01M6MZQZCEN3RRMD33E1X9ZZR9",32847,"MIT","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fplugin\u002Fskills\u002Fcron-scheduler\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"scheduler","cron","cron scheduler","when","schedules","schedule management","running","jobs","management","delivery","wake","with","gates","schedule","use","true","up","search","page","get","2026-11-10 10:12:30",false,"---\nname: cron-scheduler\nversion: 1.0.0\ndescription: |\n  Schedule management with staggering, quiet hours, and wake-up override.\n  Validates schedules, prevents collisions, and gates delivery during quiet hours.\ntriggers:\n  - \"schedule a job\"\n  - \"cron\"\n  - \"quiet hours\"\n  - \"what jobs are running\"\ntools:\n  - search\n  - get_page\n  - put_page\nmutating: true\nwhen_to_use: \"Use when the user asks: \\\"schedule a job\\\", \\\"cron\\\", \\\"quiet hours\\\", \\\"what jobs are running\\\".\"\n---\n\n# Cron Scheduler\n\n> **Convention:** See `skills\u002Fconventions\u002Ftest-before-bulk.md` — test every cron job on 3-5 items first.\n\n## Contract\n\nThis skill guarantees:\n- Schedule staggering: max 1 job per 5-minute slot, no collisions\n- Quiet hours gating: timezone-aware, with user-awake override\n- Thin job prompts: jobs say \"Read skills\u002FX\u002FSKILL.md and run it\" (no inline 3000-word prompts)\n- Idempotency: jobs can run twice without duplicate side effects\n- Results saved as reports: `reports\u002F{job-name}\u002F{YYYY-MM-DD-HHMM}.md`\n- One entry point: every job, workspace script and hook calls gbrain through\n  one wrapper that sets `GBRAIN_HOME` and keeps stderr and the exit code\n  ([the wrapper](https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fdocs\u002Fguides\u002Fcron-schedule.md#calling-gbrain-unattended))\n\n## Phases\n\n1. **Define job.** Name, schedule (cron expression), skill to run, timeout.\n2. **Validate schedule.** Check no collision with existing jobs (5-minute offset rule).\n   - Slots: :05, :10, :15, :20, :25, :30, :35, :40, :45, :50\n   - If collision detected, suggest the next available slot\n3. **Check quiet hours.** Default: 11 PM - 8 AM local time.\n   - Override: user-awake flag (if user is active, quiet hours suspended)\n   - During quiet hours: save output to held queue\n   - Morning contact releases the backlog\n4. **Register with host scheduler.** OpenClaw cron, Railway cron, crontab, or process manager. **Each registered entry should execute via Minions, not `agentTurn`.** See `skills\u002Fconventions\u002Fcron-via-minions.md` for the rewrite pattern (PGLite uses `--follow`, Postgres uses fire-and-forget + `--idempotency-key` on the cycle slot). GBrain's v0.11.0 migration auto-rewrites entries for built-in handlers; host-specific handlers need a code-level registration per `docs\u002Fguides\u002Fplugin-handlers.md`.\n5. **Write thin prompt.** Job prompt is one line: \"Read skills\u002F{name}\u002FSKILL.md and run it.\"\n6. **Call gbrain through the wrapper.** Cron runs with another `HOME` and\n   environment than your shell, so a bare `gbrain` (or `bun run src\u002Fcli.ts`)\n   can find no database (every lookup silently empty) or act as a second host\n   (`refresh_not_owner`). Register `gbrain-run \u003Cargs>`, the wrapper in\n   [cron-schedule.md](https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fdocs\u002Fguides\u002Fcron-schedule.md#calling-gbrain-unattended):\n   it sets `GBRAIN_HOME` (never `HOME`), loads the brain's env file and runs\n   the installed binary. Log stderr to a file, check the exit code, keep hook\n   output off stdout, and give each call a timeout of at least 10 s.\n   The lines below write `gbrain-run`; doctor prints the bare command.\n   `gbrain doctor --only cron_gbrain_home` warns about any crontab line or\n   script that runs `src\u002Fcli.ts` directly or calls gbrain without the brain's\n   `GBRAIN_HOME`.\n\n## Idempotency Requirement\n\nEvery cron job MUST be idempotent:\n- Running the same job twice produces the same result (no duplicate pages, no duplicate timeline entries)\n- Use checkpoint state files to track progress and resume interrupted runs\n- Check for existing output before creating new output\n\n## Output Format\n\nJob configuration saved. Report: \"Job '{name}' scheduled at {cron expression}. Next run: {time}.\"\n\n## Multi-source brains: use `sync --all`, not per-source entries\n\nWhen the brain has 2+ active sources (anything `gbrain sources list` shows\nwith a non-null `local_path` that isn't archived), use one consolidated\ncron line instead of N per-source entries.\n\n**Preferred (multi-source)**:\n\n```cron\n*\u002F5 * * * * gbrain-run sync --all --parallel 4 --workers 4 --skip-failed >> \u002Ftmp\u002Fgbrain-cron.log 2>&1\n```\n\nThis replaces N per-source lines AND auto-picks-up future sources without\na crontab edit. Concurrency budget: `parallel × workers × 2 ≈ 32`\nconnections during the wave (each per-file worker opens its own\n2-connection pool). Stay under your Postgres `max_connections` setting.\n\n**Avoid (legacy)**: separate `gbrain sync --source default` and\n`gbrain sync --source zion-brain` entries staggered by 5 minutes. They\nrequire manual deconfliction every time a new source is added, and a\nslow source can race a fast source on the legacy global `gbrain-sync`\nlock (v0.40.3.0+ uses per-source `gbrain-sync:\u003CsourceId>` locks but the\nper-source cron pattern doesn't benefit from the parallelism that\n`--all --parallel` actually delivers).\n\n`gbrain doctor` surfaces the recommended line as a `sync_consolidation`\ncheck whenever it detects 2+ active sources. Paste-ready from there.\n\n### Managed brain\n\nA managed brain refuses the line above: managed sync needs `--no-pull` and\nrejects `--skip-failed` (`writer_coordinator_required`). Check the mode first:\n`gbrain sources writer status --json` reports `\"mode\": \"managed\"` or\n`\"mode\": \"classic\"`, and its `bindings` name each source's owner host.\n\nOn a managed brain, install this line instead, on the host that owns the\nsources:\n\n```cron\n*\u002F15 * * * * gbrain-run sources git-reconcile >> \u002Ftmp\u002Fgbrain-cron.log 2>&1; gbrain-run sync --all --no-pull --hard-deadline 13m >> \u002Ftmp\u002Fgbrain-cron.log 2>&1\n```\n\n- `gbrain sources git-reconcile` brings every checkout on the host level with\n  its upstream; a managed checkout goes through `gbrain sources refresh` (a\n  fetch and `git merge --ff-only`, then a managed sync of its sources), the\n  only way it takes upstream commits. A level checkout costs one fetch, and\n  autopilot already runs it each tick. The `;` is deliberate: the sync still\n  runs when a reconcile refuses.\n- `refresh_diverged`: the checkout has commits its upstream lacks, so\n  something commits outside gbrain (usually a script that writes files and\n  runs `git commit` in the checkout). Fix that writer so it commits with\n  `gbrain git commit-push -- \u003Cpaths>`, then reconcile as the refusal says\n  (`gbrain git commit-push --push-only --keep-checkout`, after the user\n  agrees); never force the checkout\n  ([scripts and the managed checkout](https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fdocs\u002Fguides\u002Fshared-checkout-git.md#scripts-and-the-managed-checkout)).\n- `--hard-deadline 13m` stays under the 15-minute interval. Managed sync takes\n  no per-source lock, so a run that outlives the interval would overlap the\n  next tick. A run stopped at its deadline ends `resumable` and the next tick\n  continues it. Sources drain one at a time, so `--parallel` does not apply.\n- `owner_unavailable` for a source: read its `detail`. `unbound_source` on a\n  classic Postgres brain is normal and does not stop classic sync; keep the\n  sync line. Any other detail means another host owns the source: install a\n  per-source line on that host (`gbrain sync --source \u003Cid> --no-pull\n  --hard-deadline 13m`, plus its refresh) instead of claiming it here.\n- Failed files: after fixing the files and committing them, rerun the plain\n  `gbrain sync --source \u003Cid> --no-pull …` with the failed run's options; the\n  next sync retries what the last one recorded. Never add `--skip-failed`\n  (`--retry-failed` is a deprecated alias of the plain sync on a managed\n  brain).\n\n`gbrain doctor` prints this managed line in `sync_consolidation` on a managed\nbrain with 2+ active sources.\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- A scheduled `gbrain sync` hits `sync_in_progress` \u002F `lock_busy`: an earlier tick still runs. Widen the interval or stagger the job; never add a second overlapping schedule.\n- Doctor reports a stale source after the cron change: check `gbrain sources status \u003Cid>` for held items or errors before changing the schedule again.\n- `checkpoint_validation_timeout` in a sync log: run the retry command the error prints; do not cancel the request.\n- `writer_coordinator_required` from a scheduled sync: the brain is managed. Replace the line with the [managed brain](#managed-brain) recipe; never retry with `--skip-failed` or without `--no-pull`.\n- `sync_in_progress` from `gbrain sources refresh`: a managed sync cursor is unfinished, and the refresh never waits on it. Run the `gbrain sync --source \u003Cid> --no-pull …` command the refusal prints; the next tick's refresh then runs.\n- `worktree_refreshing` from a sync: a refresh is draining or merging that checkout. Leave it; the next tick syncs it. A page write answered `pending` (exit 10) during a refresh is waiting behind it: poll its receipt, never resubmit.\n- A job's lookups all come back empty, or its log shows `no_brain` or `GBRAIN_DB_ACCESS no_url`: the job runs without the brain's config. Call gbrain through the wrapper; an empty result from a job whose stderr went to `\u002Fdev\u002Fnull` is not evidence of \"no notes\".\n- `refresh_not_owner` from cron while the same refresh works by hand: the job resolves another gbrain home, so it is another host. The refusal names the identity file, `HOME` and `GBRAIN_HOME` it read; set the owner's `GBRAIN_HOME` in the wrapper. Never copy or delete a `host.json`.\n- A `--json` caller fails to parse gbrain's output: something the wrapper runs prints to stdout. Send that hook's output to a log file.\n- Calls time out in the job but finish by hand: a cold start takes seconds. Raise the timeout to at least 10 s in both the shell and the runtime that spawns it, and use the [warm CLI socket](https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fdocs\u002Fguides\u002Fcli-socket.md).\n- Exit 10 from a scheduled write: it was accepted and is still pending, not lost or \"not found\". Poll `gbrain write-request \u003Crequest_id>` before retrying or reporting it.\n\n## Anti-Patterns\n\n- Scheduling jobs at the same minute (:00 for everything)\n- Inline 3000-word prompts in cron jobs (use skill file references)\n- Running cron jobs without testing on 3-5 items first\n- Jobs that produce different output on re-run (not idempotent)\n- Sending notifications during quiet hours (save to held queue instead)\n- A bare `gbrain` or `bun run src\u002Fcli.ts` in a cron line, script or hook\n  instead of the wrapper; a wrapper that sets `HOME` instead of `GBRAIN_HOME`\n- `2>\u002Fdev\u002Fnull` on a gbrain call, or ignoring its exit code\n- A script that writes files and runs plain `git commit` in a managed checkout\n  instead of `gbrain git commit-push -- \u003Cpaths>`\n- Printing `env` or a process environment into a log or transcript while\n  debugging (it holds the database URL and keys)\n- Separate per-source `gbrain sync --source \u003Cid>` cron entries when\n  `gbrain sync --all --parallel N --workers N` would replace them with\n  one line that auto-picks-up future sources.\n","# Cron Scheduler\n\n> **Convention:** See `skills\u002Fconventions\u002Ftest-before-bulk.md` — test every cron job on 3-5 items first.\n\n## Contract\n\nThis skill guarantees:\n- Schedule staggering: max 1 job per 5-minute slot, no collisions\n- Quiet hours gating: timezone-aware, with user-awake override\n- Thin job prompts: jobs say \"Read skills\u002FX\u002FSKILL.md and run it\" (no inline 3000-word prompts)\n- Idempotency: jobs can run twice without duplicate side effects\n- Results saved as reports: `reports\u002F{job-name}\u002F{YYYY-MM-DD-HHMM}.md`\n- One entry point: every job, workspace script and hook calls gbrain through\n  one wrapper that sets `GBRAIN_HOME` and keeps stderr and the exit code\n  ([the wrapper](https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fdocs\u002Fguides\u002Fcron-schedule.md#calling-gbrain-unattended))\n\n## Phases\n\n1. **Define job.** Name, schedule (cron expression), skill to run, timeout.\n2. **Validate schedule.** Check no collision with existing jobs (5-minute offset rule).\n   - Slots: :05, :10, :15, :20, :25, :30, :35, :40, :45, :50\n   - If collision detected, suggest the next available slot\n3. **Check quiet hours.** Default: 11 PM - 8 AM local time.\n   - Override: user-awake flag (if user is active, quiet hours suspended)\n   - During quiet hours: save output to held queue\n   - Morning contact releases the backlog\n4. **Register with host scheduler.** OpenClaw cron, Railway cron, crontab, or process manager. **Each registered entry should execute via Minions, not `agentTurn`.** See `skills\u002Fconventions\u002Fcron-via-minions.md` for the rewrite pattern (PGLite uses `--follow`, Postgres uses fire-and-forget + `--idempotency-key` on the cycle slot). GBrain's v0.11.0 migration auto-rewrites entries for built-in handlers; host-specific handlers need a code-level registration per `docs\u002Fguides\u002Fplugin-handlers.md`.\n5. **Write thin prompt.** Job prompt is one line: \"Read skills\u002F{name}\u002FSKILL.md and run it.\"\n6. **Call gbrain through the wrapper.** Cron runs with another `HOME` and\n   environment than your shell, so a bare `gbrain` (or `bun run src\u002Fcli.ts`)\n   can find no database (every lookup silently empty) or act as a second host\n   (`refresh_not_owner`). Register `gbrain-run \u003Cargs>`, the wrapper in\n   [cron-schedule.md](https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fdocs\u002Fguides\u002Fcron-schedule.md#calling-gbrain-unattended):\n   it sets `GBRAIN_HOME` (never `HOME`), loads the brain's env file and runs\n   the installed binary. Log stderr to a file, check the exit code, keep hook\n   output off stdout, and give each call a timeout of at least 10 s.\n   The lines below write `gbrain-run`; doctor prints the bare command.\n   `gbrain doctor --only cron_gbrain_home` warns about any crontab line or\n   script that runs `src\u002Fcli.ts` directly or calls gbrain without the brain's\n   `GBRAIN_HOME`.\n\n## Idempotency Requirement\n\nEvery cron job MUST be idempotent:\n- Running the same job twice produces the same result (no duplicate pages, no duplicate timeline entries)\n- Use checkpoint state files to track progress and resume interrupted runs\n- Check for existing output before creating new output\n\n## Output Format\n\nJob configuration saved. Report: \"Job '{name}' scheduled at {cron expression}. Next run: {time}.\"\n\n## Multi-source brains: use `sync --all`, not per-source entries\n\nWhen the brain has 2+ active sources (anything `gbrain sources list` shows\nwith a non-null `local_path` that isn't archived), use one consolidated\ncron line instead of N per-source entries.\n\n**Preferred (multi-source)**:\n\n```cron\n*\u002F5 * * * * gbrain-run sync --all --parallel 4 --workers 4 --skip-failed >> \u002Ftmp\u002Fgbrain-cron.log 2>&1\n```\n\nThis replaces N per-source lines AND auto-picks-up future sources without\na crontab edit. Concurrency budget: `parallel × workers × 2 ≈ 32`\nconnections during the wave (each per-file worker opens its own\n2-connection pool). Stay under your Postgres `max_connections` setting.\n\n**Avoid (legacy)**: separate `gbrain sync --source default` and\n`gbrain sync --source zion-brain` entries staggered by 5 minutes. They\nrequire manual deconfliction every time a new source is added, and a\nslow source can race a fast source on the legacy global `gbrain-sync`\nlock (v0.40.3.0+ uses per-source `gbrain-sync:\u003CsourceId>` locks but the\nper-source cron pattern doesn't benefit from the parallelism that\n`--all --parallel` actually delivers).\n\n`gbrain doctor` surfaces the recommended line as a `sync_consolidation`\ncheck whenever it detects 2+ active sources. Paste-ready from there.\n\n### Managed brain\n\nA managed brain refuses the line above: managed sync needs `--no-pull` and\nrejects `--skip-failed` (`writer_coordinator_required`). Check the mode first:\n`gbrain sources writer status --json` reports `\"mode\": \"managed\"` or\n`\"mode\": \"classic\"`, and its `bindings` name each source's owner host.\n\nOn a managed brain, install this line instead, on the host that owns the\nsources:\n\n```cron\n*\u002F15 * * * * gbrain-run sources git-reconcile >> \u002Ftmp\u002Fgbrain-cron.log 2>&1; gbrain-run sync --all --no-pull --hard-deadline 13m >> \u002Ftmp\u002Fgbrain-cron.log 2>&1\n```\n\n- `gbrain sources git-reconcile` brings every checkout on the host level with\n  its upstream; a managed checkout goes through `gbrain sources refresh` (a\n  fetch and `git merge --ff-only`, then a managed sync of its sources), the\n  only way it takes upstream commits. A level checkout costs one fetch, and\n  autopilot already runs it each tick. The `;` is deliberate: the sync still\n  runs when a reconcile refuses.\n- `refresh_diverged`: the checkout has commits its upstream lacks, so\n  something commits outside gbrain (usually a script that writes files and\n  runs `git commit` in the checkout). Fix that writer so it commits with\n  `gbrain git commit-push -- \u003Cpaths>`, then reconcile as the refusal says\n  (`gbrain git commit-push --push-only --keep-checkout`, after the user\n  agrees); never force the checkout\n  ([scripts and the managed checkout](https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fdocs\u002Fguides\u002Fshared-checkout-git.md#scripts-and-the-managed-checkout)).\n- `--hard-deadline 13m` stays under the 15-minute interval. Managed sync takes\n  no per-source lock, so a run that outlives the interval would overlap the\n  next tick. A run stopped at its deadline ends `resumable` and the next tick\n  continues it. Sources drain one at a time, so `--parallel` does not apply.\n- `owner_unavailable` for a source: read its `detail`. `unbound_source` on a\n  classic Postgres brain is normal and does not stop classic sync; keep the\n  sync line. Any other detail means another host owns the source: install a\n  per-source line on that host (`gbrain sync --source \u003Cid> --no-pull\n  --hard-deadline 13m`, plus its refresh) instead of claiming it here.\n- Failed files: after fixing the files and committing them, rerun the plain\n  `gbrain sync --source \u003Cid> --no-pull …` with the failed run's options; the\n  next sync retries what the last one recorded. Never add `--skip-failed`\n  (`--retry-failed` is a deprecated alias of the plain sync on a managed\n  brain).\n\n`gbrain doctor` prints this managed line in `sync_consolidation` on a managed\nbrain with 2+ active sources.\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- A scheduled `gbrain sync` hits `sync_in_progress` \u002F `lock_busy`: an earlier tick still runs. Widen the interval or stagger the job; never add a second overlapping schedule.\n- Doctor reports a stale source after the cron change: check `gbrain sources status \u003Cid>` for held items or errors before changing the schedule again.\n- `checkpoint_validation_timeout` in a sync log: run the retry command the error prints; do not cancel the request.\n- `writer_coordinator_required` from a scheduled sync: the brain is managed. Replace the line with the [managed brain](#managed-brain) recipe; never retry with `--skip-failed` or without `--no-pull`.\n- `sync_in_progress` from `gbrain sources refresh`: a managed sync cursor is unfinished, and the refresh never waits on it. Run the `gbrain sync --source \u003Cid> --no-pull …` command the refusal prints; the next tick's refresh then runs.\n- `worktree_refreshing` from a sync: a refresh is draining or merging that checkout. Leave it; the next tick syncs it. A page write answered `pending` (exit 10) during a refresh is waiting behind it: poll its receipt, never resubmit.\n- A job's lookups all come back empty, or its log shows `no_brain` or `GBRAIN_DB_ACCESS no_url`: the job runs without the brain's config. Call gbrain through the wrapper; an empty result from a job whose stderr went to `\u002Fdev\u002Fnull` is not evidence of \"no notes\".\n- `refresh_not_owner` from cron while the same refresh works by hand: the job resolves another gbrain home, so it is another host. The refusal names the identity file, `HOME` and `GBRAIN_HOME` it read; set the owner's `GBRAIN_HOME` in the wrapper. Never copy or delete a `host.json`.\n- A `--json` caller fails to parse gbrain's output: something the wrapper runs prints to stdout. Send that hook's output to a log file.\n- Calls time out in the job but finish by hand: a cold start takes seconds. Raise the timeout to at least 10 s in both the shell and the runtime that spawns it, and use the [warm CLI socket](https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fdocs\u002Fguides\u002Fcli-socket.md).\n- Exit 10 from a scheduled write: it was accepted and is still pending, not lost or \"not found\". Poll `gbrain write-request \u003Crequest_id>` before retrying or reporting it.\n\n## Anti-Patterns\n\n- Scheduling jobs at the same minute (:00 for everything)\n- Inline 3000-word prompts in cron jobs (use skill file references)\n- Running cron jobs without testing on 3-5 items first\n- Jobs that produce different output on re-run (not idempotent)\n- Sending notifications during quiet hours (save to held queue instead)\n- A bare `gbrain` or `bun run src\u002Fcli.ts` in a cron line, script or hook\n  instead of the wrapper; a wrapper that sets `HOME` instead of `GBRAIN_HOME`\n- `2>\u002Fdev\u002Fnull` on a gbrain call, or ignoring its exit code\n- A script that writes files and runs plain `git commit` in a managed checkout\n  instead of `gbrain git commit-push -- \u003Cpaths>`\n- Printing `env` or a process environment into a log or transcript while\n  debugging (it holds the database URL and keys)\n- Separate per-source `gbrain sync --source \u003Cid>` cron entries when\n  `gbrain sync --all --parallel N --workers N` would replace them with\n  one line that auto-picks-up future sources.\n",{"name":5,"tools":44,"version":47,"mutating":48,"triggers":49,"description":53,"when_to_use":54},[36,45,46],"get_page","put_page","1.0.0",true,[50,20,51,52],"schedule a job","quiet hours","what jobs are running","Schedule management with staggering, quiet hours, and wake-up override.\nValidates schedules, prevents collisions, and gates delivery during quiet hours.\n","Use when the user asks: \"schedule a job\", \"cron\", \"quiet hours\", \"what jobs are running\".","master","dbf51462356df95812156de4529af97a11e40f59","plugin\u002Fskills\u002Fcron-scheduler",4902,"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain","https:\u002F\u002Fgithub.com\u002Fgarrytan","https:\u002F\u002Fblog.garrytan.com","Writes software, dreams. ","2026-11-14 04:11:30",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":48},[66,69,72],{"tool":67,"command":68},"npx","npx skills add garrytan\u002Fgbrain --skill cron-scheduler",{"tool":70,"command":71},"bunx","bunx skills add garrytan\u002Fgbrain --skill cron-scheduler",{"tool":73,"command":74},"pnpm","pnpm dlx skills add garrytan\u002Fgbrain --skill cron-scheduler","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fplugin\u002Fskills\u002Fcron-scheduler\u002FSKILL.md",[],[78,89,95,115,142,156],{"skillNo":79,"name":80,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":39},"01M6N109FNGH1PK49T734PZXGB","query-helper","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fquery-helper\u002FSKILL.md",[],[84,85,86,36,37,87,88],"query helper","helper","query","find","false",{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":39},"01M6N108A23GW6NGQEQ0E7GV0A","broken","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbroken\u002FSKILL.md",[],[91],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":39},"01M6N105E88C5K2H03H0CC79G1","brain-ops","Read, enrich, and write brain pages with source attribution.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbrain-ops\u002FSKILL.md",[],[102,103,104,34,105,37,106,107,35,108,86,109,110,30,111,112,113,114,36],"brain ops","brain","ops","attribution","read","write","look","pages","people","enrich","web","path","source",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":126,"publishedAt":39},"01M6N102GRMF22TVCNT6RK5MRD","meeting-prep","Build a briefing before you meet someone, from their recent threads, open loops and what they care about.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fmeeting-prep\u002FSKILL.md",[121],{"categoryNo":122,"categoryName":123,"taxonomyType":124,"taxonomyTypeDesc":125},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[127,128,129,130,131,36,132,133,134,86,88,135,136,137,138,139,140,141],"meeting","prep","meeting prep","me","prepare","brief","open","build","loops","about","you","briefing","threads","for","Meet",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":39},"01M6N1005QK7REHX5KGMNR5PF0","inbox-zero","Triage the inbox into replies, delegations and archives.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Finbox-zero\u002FSKILL.md",[],[149,150,151,36,152,88,153,154,155],"inbox zero","ZeRO","inbox","clear","replies","my","triage",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":39},"01M6N0ZXQ8RRRW71PNV61T57GP","deal-memo","Draft an investment memo from the deal pages and the founder history already in the brain.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fdeal-memo\u002FSKILL.md",[],[163,164,165,109,103,166,167,107,168,34,36,169],"deal memo","deal","memo","draft","investment","history","founder"]