- per_app_allocation: move host port from 8001 to 28001. OrbStack reserves
8001 on macOS for vcom-tunnel which makes 'Bind: port already allocated'
the default failure mode.
- dirty_ttin_ttou: pin BASE_URL to 127.0.0.1 instead of 'localhost'. macOS
resolves 'localhost' to ::1 first; Docker Desktop / OrbStack only forward
host ports on IPv4 so the IPv6 attempt resets and the test fixture treats
the service as unhealthy.
- dirty_ttin_ttou: add setproctitle to the test image. The TTIN/TTOU tests
count workers via 'pgrep -f dirty-worker', which only matches once
gunicorn's util._setproctitle has actually renamed the processes.
- Add get_app_workers_attribute() to read workers class attribute
- Update _parse_app_specs() to check class attribute when no config override
- Add Docker-based e2e tests for per-app worker allocation
- Add test apps: HeavyModelApp (workers=2), LightweightApp
- Add unit tests for get_app_workers_attribute function
- Add integration tests for class attribute detection