Scheduled Tasks
FennoAI can run AI tasks on a schedule. This is useful for daily summaries, recurring code checks, knowledge base maintenance, and other routine workflows.
You can create scheduled tasks in two ways:
- console: create and manage tasks manually in the console
- In-repo config: declare
schedule:tasks in.fennoai.ymlon the default branch
Good Use Cases
- Generate a daily summary of issues or PRs
- Check TODOs, failing tests, or stale dependencies on a schedule
- Maintain docs or internal knowledge bases regularly
- Run recurring analysis without waiting for a manual comment
Option 1: Create Tasks in the console
On the console Scheduled page, you can create a task directly. The current form exposes these fields:
Task Name: unique task name within the same repositoryRepository: an optional repository and branchRuntime:codexorclaudecodeTimezone: IANA timezone used by the cron scheduleCron Expression: 5-field cron expressionPrompt: instructions for the AI agent
Example:
Task Name: Daily review summary
Repository: acme/platform@main
Runtime: codex
Timezone: Asia/Shanghai
Cron Expression: 0 9 * * *
Prompt: Summarize the last 24 hours of merged PRs and open issues, then draft a short engineering update.After creation, the console lets you:
- view tasks
- trigger a run immediately
- inspect run history
- inspect CMA DeploymentRuns, Session status, and live Events
- edit, pause, or archive manually created tasks
Option 2: Declare Tasks in .fennoai.yml
If you want scheduled rules to live with the repository, add a .fennoai.yml file on the default branch:
default_runtime: claudecode
schedule:
- name: Daily issue triage
cron: "0 9 * * *"
timezone: Asia/Shanghai
prompt: "Review newly opened issues in the last 24 hours, group them by theme, and draft a triage summary."
- name: Weekly dependency check
cron: "0 10 * * 1"
runtime: codex
repositories:
- repository: acme/platform
branch: main
prompt: "Check dependency updates merged in the last 7 days and summarize any follow-up work needed."Each schedule item supports:
name: required, unique within the repositorycron: required 5-field cron expressionprompt: required task promptruntime: optional, falls back todefault_runtimetimezone: optional, falls back to the service default timezonerepositories: optional single-repository list; when omitted, uses the current repository and itsbranchor default branch
Within schedule: entries, the legacy provider, agent and default_ai_provider fields remain readable during migration. New schedule entries should use runtime and cannot select a model. Outside schedule:, default_ai_provider and the per-provider model field are still the current repository configuration — see Repository Config.
Supported Config Paths
.fennoai.yml is the recommended filename. FennoAI also supports these legacy paths:
.fennoai.yml.xgopilot.yml.github/fennoai.yml.github/xgopilot.yml
FennoAI reads the first file it finds according to path priority.
Cron Rules
- Uses a standard 5-field cron format:
minute hour day month weekday - Minimum interval is 1 hour
- Second-level cron expressions are not supported
Common examples:
0 9 * * * Every day at 09:00
0 */6 * * * Every 6 hours
0 10 * * 1 Every Monday at 10:00
0 9 1 * * The 1st day of each month at 09:00Sync and Activation Behavior
Tasks created in the console take effect as soon as you save them.
In-repo schedule: tasks work differently:
- FennoAI reloads scheduled-task config only after a push to the default branch of a non-fork repository. Forks cannot automatically register or restore
schedule:tasks; manually created console tasks are unaffected - after adding or updating
schedule, you need to commit that change to the default branch - removing a
scheduleentry removes the corresponding in-repo task
If you only change the config on a feature branch, production scheduled tasks will not update yet.
console vs In-Repo Ownership
Tasks created from .fennoai.yml can be viewed and triggered from the console, but they cannot be:
- edited
- paused or resumed
- deleted
Their source of truth is always the repository config file.
Repository-defined schedules are managed by configuration on the default branch. Edit that source rather than trying to change the generated task in the console.
Limits and Notes
- up to
20scheduletasks per repository - at most one repository per scheduled task
- task names can be at most
200characters runtimemust be a configured scheduled runtime- keep
.fennoai.ymllimited to model and scheduling config, not API keys or other secrets
FAQ
Why did my .fennoai.yml change not take effect immediately?
Because schedule: tasks are synchronized after a push to the default branch. Make sure the config change has landed on the default branch and that a new push event has happened.
Why can’t I edit some tasks in the console?
Those tasks come from .fennoai.yml. The console only provides visibility and manual triggering for them.
Which approach should I use?
- Use the console when you want faster setup and centralized task management
- Use
.fennoai.ymlwhen you want scheduled rules versioned with the repository