Configure the smallest complete task set justified by the selected installation. Derive tasks, parameters, groups, and cadence from its TYPO3 14 runtime; never copy another site's rows.
Version gate
Require TYPO3 14.3.x. Stop on v13, pre-14.3 development releases, or v15 and re-evaluate the
APIs. TYPO3 v14 stores task type, parameters, and execution details as structured fields; an empty
tx_scheduler_task.tasktype means the v14 migration failed or remains incomplete — often a legacy
payload whose property types no longer fit its class, which also fails upgrade:run. Diagnose it
read-only and recreate the task; see legacy payloads.
Contract
- Identify one installation and report its root, TYPO3 version, application context, and database platform before changing Scheduler data.
- Inventory any system cron, hosting job, systemd timer, or container runner that invokes
vendor/bin/typo3 scheduler:run. Configuring Scheduler records does not authorize creating, enabling, changing, or removing that external runner; automatic execution is opt-in. - Inventory runtime-registered task types, active Sites, storages, cache backends, installed extensions, existing groups/tasks, failures, late tasks, and v14 storage migration defects.
- Read task-catalog.md before selecting tasks. Include every fixed Core task in the decision table, but create conditional tasks only when their applicability is proven.
- Build the complete task list first. Then create or reuse the five functional groups below and assign every enabled task; leave no unexplained task in the ungrouped section.
- Use the conservative baseline cadence. Change it only from measured runtime, queue depth, publishing latency, retention policy, storage change source, or an explicit operational need.
- Set parallel execution off. Stagger expensive work, preserve a maintenance window, and run destructive jobs against verified backups and an approved retention policy.
- Create or edit tasks through the TYPO3 v14 Scheduler form/runtime model. Do not write v12 PHP serialized task objects, copy database rows, or install a generic command/SQL scheduler helper.
- Run each new task manually once when its effect is safe and approved, then inspect its failure state and effect. Do not invoke the global due-task runner or enable external cron by inference.
- Report configured, conditional, rejected, and project-specific tasks with the evidence, effective interval, and execution mode for each.
Choose the execution mode explicitly
Default to manual-only unless the user explicitly requests automatic Scheduler execution. Creating recurring task records is separate from installing the infrastructure runner.
- Never install a DDEV cron add-on, write a host crontab, create a systemd/Kubernetes/hosting job, or add a deployment schedule merely because the user asked to configure Scheduler jobs.
- Audit an existing runner read-only. Change or remove it only when the user explicitly requests that operational change and the exact owner/target has been verified.
- In manual-only mode, verify that no external runner calls this installation. Leave the reviewed
Scheduler records available for explicit
scheduler:execute --task=<uid>use. - In automatic mode, agree the runtime owner, working directory, logging, alerting, overlap policy, and cadence before enabling the runner. The runner cadence must cover the shortest task cadence.
- A DDEV project is not an exception. Development convenience does not imply permission for unattended execution.
Workflow: audit the selected installation
Run the bundled read-only audit from the Composer project root:
php /absolute/path/to/typo3-scheduler-jobs/scripts/audit-scheduler.php --pretty
For DDEV, stream it into the project container:
ddev exec php /dev/stdin --pretty \
< /absolute/path/to/typo3-scheduler-jobs/scripts/audit-scheduler.php
Use --strict to return non-zero for broken v14 task storage, unregistered existing task types,
or recorded execution failures. The audit redacts arbitrary task parameters and exposes only
known-safe maintenance/Solr keys.
Also capture the Core view:
vendor/bin/typo3 scheduler:list
vendor/bin/typo3 scheduler:run --help
vendor/bin/typo3 scheduler:execute --help
Read discovery-and-operations.md before creating, changing, disabling, executing, or deleting a task.
Group the final task set
Create groups only after classifying all tasks. Reuse an existing group when its meaning matches.
| Sort | Group | Put these jobs here |
|---|---|---|
| 10 | Core maintenance |
Cache GC, database optimization, status reports |
| 20 | Privacy & retention |
IP anonymization, table GC, recycler, upload/redirect cleanup |
| 30 | Files & metadata |
FAL storage indexing and metadata extraction |
| 40 | Search & content quality |
Solr workers, LinkValidator |
| 50 | Project workflows |
Workspace publishing and reviewed project/extension commands |
Use task descriptions to record the applicability evidence, retention owner, selected Site/storage, and why the cadence differs from the baseline. Group disabling is an operational kill switch, not a substitute for disabling or removing an invalid task.
Apply the cadence policy
Classify frequency before choosing a cron expression:
- Very frequent: every minute or every 2 minutes. Reserve this for a measured, latency-sensitive queue. It magnifies failures and load.
- Interactive-safe middle: every 5 minutes for search/event/publishing queues; every 15–30 minutes for file discovery or extraction.
- Maintenance-safe middle: daily for low-cost privacy/status work; weekly for broad deletion, crawling, and recycler work; monthly and off-peak for measured database reorganization.
- Very infrequent: monthly, quarterly, or manual. Use this for expensive recovery and rebuild operations, not for a queue whose users expect fresh results.
Never make a task more frequent than its worst observed duration plus headroom. Keep parallel execution disabled and fix backlog/capacity before shortening the interval.
Configure the baseline
Use the detailed parameters and exceptions in task-catalog.md.
- Create daily cache GC only for selected backends that require explicit collection.
- Create daily IP anonymization for every runtime-registered IP table, with a documented retention value. Propose 30 days when no policy exists; require approval before applying it.
- Create weekly "all configured tables" GC so Core and installed extensions retain their own registered expiry periods.
- Create FAL extraction per applicable storage. Create FAL storage indexing only where files can change outside TYPO3.
- Keep database optimization conditional on MySQL/MariaDB, measured reclaimable space, and a maintenance window.
- Create conditional LinkValidator, Reports, Form, Redirects, Workspace, and extension jobs only when their installed feature and data path are in use.
Configure EXT:solr 14
If apache-solr-for-typo3/solr is installed, read solr-v14.md before
writing tasks.
Create exactly one IndexQueueWorkerTask per configured TYPO3 Site that is indexed. Select the
Site whose root page is the actual start of that website's records; EXT:solr stores this root page
UID. Default to every 5 minutes and 50 documents per run, then tune from queue age and measured
duration. Add the Event Queue Worker only for delayed monitoring (monitoringType = 1).
Do not schedule recurring forced reindexing or Solr optimize as routine maintenance. Use them as reviewed recovery/maintenance operations. EXT:solr 14 removed the forced-webroot task field; never recreate it from older installations.
Verify and hand off
- Run
scheduler:list; verify every enabled task has a group, expected frequency, and no failure. A future next execution describes the task schedule; it does not prove automatic execution. - Execute each new task by UID with
scheduler:execute --task=<uid>in a safe environment. - Verify
lastexecution_time, next execution, logs, affected rows/files, Solr queue age, and notification delivery as applicable. Run globalscheduler:runonly when the user explicitly asks to simulate or operate the due-task runner. - In automatic mode, confirm the external runner independently. In manual-only mode, confirm its absence and provide the exact explicit command for each task.
- Re-audit after one full weekly cycle only in automatic mode, and after every TYPO3/extension major update in either mode.
Deliver a table with task/group, task type, parameters, cadence, applicability evidence, manual-run result, execution mode, and keep/change/remove verdict. Never claim automatic operation while a required task is late, failed, ungrouped, or dependent on an unverified runner. A manual-only configuration may be complete when the runner is intentionally absent and that limitation is reported prominently.