Skip to content
24/48h shipping across Italy
Skip to content
Documentation navigation

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