TYPO3 Scheduler jobs
Source: https://github.com/dirnbauer/typo3-skills
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.
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 global scheduler:run only 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.
1---2name: typo3-scheduler-jobs3description: Audits, plans, configures, groups, and verifies TYPO3 14.3 Scheduler tasks for a specific installation, including Core cache/table/privacy/FAL maintenance, LinkValidator, Reports, Form and Workspace cleanup, extension-provided commands, and EXT:solr Index Queue workers per Site root. Use for missing or overdue cron jobs, Scheduler backend setup, task groups, safe execution intervals, deciding which recurring jobs an installed TYPO3 project needs, or repairing tx_scheduler_task rows with an empty tasktype after a v14 update to JSON storage.4---56# TYPO3 Scheduler jobs78> Source: https://github.com/dirnbauer/typo3-skills910Configure the smallest complete task set justified by the selected installation. Derive tasks,11parameters, groups, and cadence from its TYPO3 14 runtime; never copy another site's rows.1213## Version gate1415Require TYPO3 **14.3.x**. Stop on v13, pre-14.3 development releases, or v15 and re-evaluate the16APIs. TYPO3 v14 stores task type, parameters, and execution details as structured fields; an empty17`tx_scheduler_task.tasktype` means the v14 migration failed or remains incomplete.1819## Contract20211. Identify one installation and report its root, TYPO3 version, application context, and database22 platform before changing Scheduler data.232. Inventory any system cron, hosting job, systemd timer, or container runner that invokes24 `vendor/bin/typo3 scheduler:run`. Configuring Scheduler records does **not** authorize creating,25 enabling, changing, or removing that external runner; automatic execution is opt-in.263. Inventory runtime-registered task types, active Sites, storages, cache backends, installed27 extensions, existing groups/tasks, failures, late tasks, and v14 storage migration defects.284. Read [task-catalog.md](references/task-catalog.md) before selecting tasks. Include every fixed29 Core task in the decision table, but create conditional tasks only when their applicability is30 proven.315. Build the complete task list first. Then create or reuse the five functional groups below and32 assign every enabled task; leave no unexplained task in the ungrouped section.336. Use the conservative baseline cadence. Change it only from measured runtime, queue depth,34 publishing latency, retention policy, storage change source, or an explicit operational need.357. Set parallel execution off. Stagger expensive work, preserve a maintenance window, and run36 destructive jobs against verified backups and an approved retention policy.378. Create or edit tasks through the TYPO3 v14 Scheduler form/runtime model. Do not write v12 PHP38 serialized task objects, copy database rows, or install a generic command/SQL scheduler helper.399. Run each new task manually once when its effect is safe and approved, then inspect its failure40 state and effect. Do not invoke the global due-task runner or enable external cron by inference.4110. Report configured, conditional, rejected, and project-specific tasks with the evidence,42 effective interval, and execution mode for each.4344## Choose the execution mode explicitly4546Default to **manual-only** unless the user explicitly requests automatic Scheduler execution.47Creating recurring task records is separate from installing the infrastructure runner.4849- Never install a DDEV cron add-on, write a host crontab, create a systemd/Kubernetes/hosting job,50 or add a deployment schedule merely because the user asked to configure Scheduler jobs.51- Audit an existing runner read-only. Change or remove it only when the user explicitly requests52 that operational change and the exact owner/target has been verified.53- In manual-only mode, verify that no external runner calls this installation. Leave the reviewed54 Scheduler records available for explicit `scheduler:execute --task=<uid>` use.55- In automatic mode, agree the runtime owner, working directory, logging, alerting, overlap policy,56 and cadence before enabling the runner. The runner cadence must cover the shortest task cadence.57- A DDEV project is not an exception. Development convenience does not imply permission for58 unattended execution.5960## Workflow: audit the selected installation6162Run the bundled read-only audit from the Composer project root:6364```bash65php /absolute/path/to/typo3-scheduler-jobs/scripts/audit-scheduler.php --pretty66```6768For DDEV, stream it into the project container:6970```bash71ddev exec php /dev/stdin --pretty \72 < /absolute/path/to/typo3-scheduler-jobs/scripts/audit-scheduler.php73```7475Use `--strict` to return non-zero for broken v14 task storage, unregistered existing task types,76or recorded execution failures. The audit redacts arbitrary task parameters and exposes only77known-safe maintenance/Solr keys.7879Also capture the Core view:8081```bash82vendor/bin/typo3 scheduler:list83vendor/bin/typo3 scheduler:run --help84vendor/bin/typo3 scheduler:execute --help85```8687Read [discovery-and-operations.md](references/discovery-and-operations.md) before creating,88changing, disabling, executing, or deleting a task.8990## Group the final task set9192Create groups only after classifying all tasks. Reuse an existing group when its meaning matches.9394| Sort | Group | Put these jobs here |95|---:|---|---|96| 10 | `Core maintenance` | Cache GC, database optimization, status reports |97| 20 | `Privacy & retention` | IP anonymization, table GC, recycler, upload/redirect cleanup |98| 30 | `Files & metadata` | FAL storage indexing and metadata extraction |99| 40 | `Search & content quality` | Solr workers, LinkValidator |100| 50 | `Project workflows` | Workspace publishing and reviewed project/extension commands |101102Use task descriptions to record the applicability evidence, retention owner, selected Site/storage,103and why the cadence differs from the baseline. Group disabling is an operational kill switch, not104a substitute for disabling or removing an invalid task.105106## Apply the cadence policy107108Classify frequency before choosing a cron expression:109110- **Very frequent:** every minute or every 2 minutes. Reserve this for a measured, latency-sensitive111 queue. It magnifies failures and load.112- **Interactive-safe middle:** every 5 minutes for search/event/publishing queues; every 15–30113 minutes for file discovery or extraction.114- **Maintenance-safe middle:** daily for low-cost privacy/status work; weekly for broad deletion,115 crawling, and recycler work; monthly and off-peak for measured database reorganization.116- **Very infrequent:** monthly, quarterly, or manual. Use this for expensive recovery and rebuild117 operations, not for a queue whose users expect fresh results.118119Never make a task more frequent than its worst observed duration plus headroom. Keep parallel120execution disabled and fix backlog/capacity before shortening the interval.121122## Configure the baseline123124Use the detailed parameters and exceptions in [task-catalog.md](references/task-catalog.md).125126- Create daily cache GC only for selected backends that require explicit collection.127- Create daily IP anonymization for every runtime-registered IP table, with a documented retention128 value. Propose 30 days when no policy exists; require approval before applying it.129- Create weekly "all configured tables" GC so Core and installed extensions retain their own130 registered expiry periods.131- Create FAL extraction per applicable storage. Create FAL storage indexing only where files can132 change outside TYPO3.133- Keep database optimization conditional on MySQL/MariaDB, measured reclaimable space, and a134 maintenance window.135- Create conditional LinkValidator, Reports, Form, Redirects, Workspace, and extension jobs only136 when their installed feature and data path are in use.137138## Configure EXT:solr 14139140If `apache-solr-for-typo3/solr` is installed, read [solr-v14.md](references/solr-v14.md) before141writing tasks.142143Create exactly one `IndexQueueWorkerTask` per configured TYPO3 Site that is indexed. Select the144Site whose root page is the actual start of that website's records; EXT:solr stores this root page145UID. Default to every 5 minutes and 50 documents per run, then tune from queue age and measured146duration. Add the Event Queue Worker only for delayed monitoring (`monitoringType = 1`).147148Do not schedule recurring forced reindexing or Solr optimize as routine maintenance. Use them as149reviewed recovery/maintenance operations. EXT:solr 14 removed the forced-webroot task field; never150recreate it from older installations.151152## Verify and hand off1531541. Run `scheduler:list`; verify every enabled task has a group, expected frequency, and no failure.155 A future next execution describes the task schedule; it does not prove automatic execution.1562. Execute each new task by UID with `scheduler:execute --task=<uid>` in a safe environment.1573. Verify `lastexecution_time`, next execution, logs, affected rows/files, Solr queue age, and158 notification delivery as applicable. Run global `scheduler:run` only when the user explicitly159 asks to simulate or operate the due-task runner.1604. In automatic mode, confirm the external runner independently. In manual-only mode, confirm its161 absence and provide the exact explicit command for each task.1625. Re-audit after one full weekly cycle only in automatic mode, and after every TYPO3/extension163 major update in either mode.164165Deliver a table with task/group, task type, parameters, cadence, applicability evidence, manual-run166result, execution mode, and keep/change/remove verdict. Never claim automatic operation while a167required task is late, failed, ungrouped, or dependent on an unverified runner. A manual-only168configuration may be complete when the runner is intentionally absent and that limitation is169reported prominently.