Consolidation Robo evaluation
Outcome
Do not adopt Robo. Robo 5.1.1 is not resolvable with the root Symfony 8 components, and the current workflow does not expose a task-orchestration gap that would justify another framework. ADR 0007 is authoritative.
Reproducible compatibility check
In a new temporary directory, run:
composer require \
consolidation/robo:5.1.1 \
symfony/console:^8.0 \
symfony/event-dispatcher:^8.0 \
symfony/filesystem:^8.0 \
symfony/process:^8.0 \
--dry-run --no-interaction
On 2026-08-21 Composer rejected the set because Robo 5.1.1 requires
symfony/console ^6 || ^7 (and the same supported-major policy across its
Symfony dependencies), while k0smos requires Symfony 8. No project manifest,
lock, dependency, RoboFile.php, or vendor artifact was changed.
Current task surface
| Surface | Count | Ownership |
|---|---|---|
| Composer scripts | 24 | QA aliases, install/update hooks, app entry aliases |
| Attributed k0smos Symfony commands | 34 | Tenant/application/operator behavior |
bin/ files |
6 | Stable process entry points |
| Checked script/tool files | 11 | Bounded shell, Node and PHP orchestration/evaluation |
The exact count is a snapshot, not a ratchet. The ownership boundary matters: domain/application logic remains testable inside Symfony Console classes, while process orchestration stays outside the application container.
Representative workflow comparison
tools/local-env/bootstrap.sh and its shared guards were used as the comparison.
| Criterion | Composer + Symfony + current script | Hypothetical Robo task |
|---|---|---|
| Discoverability | composer run --list, bin/console list, ddev/lando tooling |
One additional robo list; existing surfaces still remain |
| Portability | Composer/Symfony are native; shell runs inside the supported Linux containers | PHP runner is portable, but it would still call container/shell tools |
| Testing | Symfony command unit tests, bash -n, contract tests, isolated smoke DB |
Adds Robo collection/task tests without removing existing tests |
| Error handling | set -euo pipefail, explicit guards, Symfony exit codes |
Task result objects; no observed failure currently mishandled |
| Duplication | Bootstrap/smoke already shared by three environments | Thin wrapper over the same scripts, therefore more indirection |
| Maintenance | No new package or command conventions | Robo plus Consolidation dependency family and upgrade coordination |
The workflow is sequential because migration must follow dependency/config checks and smoke must follow migration. Parallel collection semantics would not shorten the critical path safely. QA already has Composer aggregation; operator commands already have Symfony dependency injection, help, input validation and tests.
Guardrails
- Do not alias Symfony 8 as 7 or suppress Composer platform/dependency checks.
- Do not downgrade root Symfony components for a development task runner.
- Do not move migrations, queue behavior, fixtures, or domain workflows into a
RoboFile.php. - Reconsider only with explicit upstream Symfony 8 support and a measured task graph that replaces, rather than wraps, an existing orchestration surface.
Upstream references
- Robo package metadata: https://packagist.org/packages/consolidation/robo
- Robo source/releases: https://github.com/consolidation/robo
- Symfony Console commands: https://symfony.com/doc/current/console.html