OUTREACH MARKETING / REPOSITORY REVIEW / 3 NOV 2026Keep voice. Build one disposable test environment.
The repository documents production voice in Docker and Laravel on host PHP-FPM. It also retains overlapping development, staging, dependency-builder, and search stacks. Their presence does not establish current usage.
CURRENTSeveral partial environments
- Root Compose: app, MySQL, Redis, Composer, voice.
- Staging Compose: app, MySQL, Redis, optional search stack.
- Separate search Compose: OpenSearch, Dashboards, Logstash.
- Builder Compose: Composer 1.7 with platform checks disabled.
- Voice production Compose: a focused service on loopback port 3100.
The app image excludes vendor dependencies, does not install them, and relies on the host bind mount. It runs the scheduler automatically.
RECOMMENDEDTwo explicit Docker purposes
- Keep the independently deployed production voice image.
- Create one test image containing the app, dependencies, compiled assets, PHP, MySQL, Node and browser tooling.
test: initialize an isolated database, run checks, export results, exit with failure when any required check fails.serve: start the same seeded app for manual browser inspection.- Run voice code against fake provider boundaries; use no live payment or calling credentials.
What makes this trustworthy
Runtime and database fidelity
Composer requires PHP 7.0.33, production deploy targets php7.0-fpm, and the old Dockerfile uses PHP 7.1. Match production first. Confirm production MySQL version and SQL mode before pinning the test database. This application has MySQL-specific triggers and procedures, so SQLite would miss meaningful behavior.
One test command must cover every suite
Include PHPUnit, six standalone PHP scripts, two standalone JavaScript scripts, voice typechecking/tests, frontend lint/build and deployment shell tests. Audit old Codeception cases for replacement or retirement. Add real browser smoke coverage for login, site selection, caller workflow and a fake payment path.
Lifecycle and isolation
Use bounded readiness checks, child-process cleanup and explicit exit status propagation. Disable the automatic scheduler by default. Build dependencies into the image; require no host PHP, Node, vendor directory, database volume or production data. Keep logs and screenshots exportable.
Search needs an explicit decision
OpenSearch client and duplicate-donor code still exist. Confirm deployment ownership before removing search infrastructure. The default image can use a defined fake boundary, but real search integration must remain a separate declared check unless OpenSearch is deliberately bundled. Do not call mocked coverage full-stack coverage.
Tradeoff: a larger image and a small amount of process orchestration buy a single reproducible lifecycle. That is reasonable for a disposable test appliance. Keep it separate from production deployment.
Evidence: root compose files; .docker/php/Dockerfile; voice/Dockerfile and production compose; deploy/environments; composer.json; phpunit.xml; tests; codeception.yml. Docker daemon unavailable; no builds, tests or remote-host inspection performed. Styling follows the existing caller-console palette.