OUTREACH MARKETING / REPOSITORY REVIEW / 3 NOV 2026

Keep 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.

CURRENT

Several 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.

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.