Validation: Fix dev environment: unique port + Docker bundler failure

validation-99-2026-07-26 Doc

validation pass

Verdict: PASS

Ticket

ldraney/intelligentstaffingsystems#99 (board item #1887) — Fix dev environment: change dev port from 9999 to 8888 and fix Docker bundler failure by adding bundle install to the compose command.
Merged PR: #102 — fix: dev port 9999 → 8888, fix Docker bundler failure (#99)

Environment

Production cluster (archbox), namespace intelligentstaffingsystems. Production URL: https://intelligentstaffingsystems.ai. Local repo at HEAD b46c433.

Tiers Executed

Tier 1 (local/CI) + Tier 3 (production). Tier 2 skipped (no staging environment).

Checks

# Criterion How Verified Result Evidence
1 Dev port changed from 9999 to 8888 across all config files <code>grep -rn "9999"</code> and <code>grep -rn "8888"</code> across repo PASS Zero port-9999 references in infrastructure/config files. Remaining "9999" hits are phone numbers in test fixtures and a CSS border-radius. Port 8888 consistently applied in docker-compose.yml, Makefile, config/environments/development.rb, README.md, .env.development.example, and all docs.
2 Docker bundler failure fixed Read <code>docker-compose.yml</code> command line PASS Command: <code>bash -c "bundle check || bundle install &amp;&amp; bundle exec rails server -b 0.0.0.0 -p 8888"</code>. Adds <code>bundle check || bundle install</code> before server start. Refined from original PR to skip install when gems are present.
3 Documentation updated for new port <code>grep -rn "8888"</code> in docs/ PASS docs/architecture.md, docs/local-dev-setup.md, docs/pipeline.md all reference port 8888. Keycloak redirect URIs updated to <code>http://localhost:8888/*</code>.
4 CI pipeline green for PR Woodpecker pipeline #126 (pull_request event) PASS All 6 steps passed: clone, database, bundle-install, lint, security, test.
5 Production pod healthy <code>kubectl get pods -n intelligentstaffingsystems</code> PASS Pod <code>intelligentstaffingsystems-69c4f699d6-vp89s</code>: 1/1 Running, 0 restarts, 9h uptime.
6 ArgoCD synced and healthy <code>kubectl get application -n argocd</code> PASS Status: Synced,Healthy
7 Production URL responds <code>curl -s -o /dev/null -w "%{http_code}" https://intelligentstaffingsystems.ai</code> PASS HTTP 200. Response includes proper Rails headers, session cookie, and CSP.
8 Deployed image matches HEAD <code>kubectl get pods -o jsonpath image</code> vs <code>git rev-parse HEAD</code> PASS Image tag <code>b46c43399b...</code> matches HEAD <code>b46c433</code> exactly.

Regression Check

No production-facing code was changed — only dev environment config (ports, Docker compose command) and documentation. Production pod is healthy with 0 restarts. The /about route (added in a later PR) returns HTTP 200, confirming no regression from the merge.
Push-to-main pipeline #128 shows "failure" with all steps skipped (after clone). This is the known intermittent push-event gap documented in project_push_event_gap.md. Later push pipelines (e.g., #188) succeeded, confirming the gap is not systemic.

Discovered Issues

None. The dev subdomain dev.intelligentstaffingsystems.ai returns HTTP 502, but this is expected — it requires an active Tailscale funnel from a local dev environment, not a persistent service.