Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions tests/cron/test_cronjob_schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""Tests for the cronjob tool schema shape.

Guards the description text that flags ``schedule`` (and ``prompt``) as
REQUIRED for ``action=create`` — the load-bearing fix for description-driven
models (e.g. Grok) that omit schedule when the schema only lists ``action``
in ``required[]``. See issue #32427 / PR #32448.
"""

from __future__ import annotations


def test_cronjob_schema_action_description_flags_create_requirements():
"""`action` description must state schedule + prompt are required for create."""
from tools.cronjob_tools import CRONJOB_SCHEMA

action_desc = CRONJOB_SCHEMA["parameters"]["properties"]["action"]["description"]
assert "action=create" in action_desc
assert "schedule" in action_desc
assert "REQUIRED" in action_desc


def test_cronjob_schema_schedule_description_flags_required_for_create():
"""`schedule` description must explicitly state REQUIRED for action=create."""
from tools.cronjob_tools import CRONJOB_SCHEMA

schedule_desc = CRONJOB_SCHEMA["parameters"]["properties"]["schedule"]["description"]
assert "REQUIRED" in schedule_desc
assert "action=create" in schedule_desc


def test_cronjob_schema_required_array_unchanged():
"""`required[]` stays minimal — `action` only.

The schema intentionally does NOT promote schedule/prompt into the
top-level required array because they're only mandatory for
action=create, not for list/remove/pause/etc. The description text
carries the conditional requirement instead.
"""
from tools.cronjob_tools import CRONJOB_SCHEMA

assert CRONJOB_SCHEMA["parameters"]["required"] == ["action"]
4 changes: 2 additions & 2 deletions tools/cronjob_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -706,7 +706,7 @@ def cronjob(
"properties": {
"action": {
"type": "string",
"description": "One of: create, list, update, pause, resume, remove, run"
"description": "One of: create, list, update, pause, resume, remove, run. When action=create, the 'schedule' and 'prompt' fields are REQUIRED."
},
"job_id": {
"type": "string",
Expand All @@ -718,7 +718,7 @@ def cronjob(
},
"schedule": {
"type": "string",
"description": "For create/update: '30m', 'every 2h', '0 9 * * *', or ISO timestamp"
"description": "REQUIRED for action=create. For create/update: '30m', 'every 2h', '0 9 * * *', or ISO timestamp. Examples: '30m' (every 30 minutes), 'every 2h' (every 2 hours), '0 9 * * *' (daily at 9am), '2026-06-01T09:00:00' (one-shot). You MUST include this field when action=create."
},
"name": {
"type": "string",
Expand Down
Loading