◐ Off-By-One · answer catalog

eduos-web-host-port-3003-not-3000

2 answer(s)typescriptdockertypescriptdocker

eduos-web-host-port-3003-not-3000

📦 Source in repository (JSON)

Answer 1

Solution written to ~/eduos-web-host-port-3003-not-3000.md (116 lines).

Summary

Root cause: The Playwright UI checks targeted http://localhost:3000, relying on a stale "web implicit 3000" assumption from the skill brief. On this host, TCP :3000 is bound by a local DuckBrain daemon (node duckbrain.js http --port=3000), not the EduOS web app. So GET /login hit DuckBrain → 404 {"error":"Route GET /login not found","code":"ROUTE_NOT_FOUND"}, and Playwright timed out waiting for input[type=email]. The container-internal port is 3000, but the host-side mappings are different per service: API :3002→3000, web :3003→3000.

Fix (in the doc): - Option A (quick): set Playwright baseURL / E2E_BASE_URL=http://localhost:3003. - Option B (recommended, drift-proof): resolve the port at runtime via docker ps --filter name=eduos-web-1 --format '{{.Ports}}' or docker compose port web 3000 instead of hardcoding. - Plus a skill-brief correction documenting the explicit host-port contract.

Verification section includes the docker ps port confirmation, docker compose port web 3000, lsof on :3000 (DuckBrain), curl status checks, and the post-fix Playwright assertions (teacher/student dashboard hydrate at 615 / 1301 chars, login POST 200 ×2, zero console errors, zero failed requests).

Note on "verified": This sandbox has neither the EduOS monorepo nor a running Docker daemon (/var/run/docker.sock missing), so I could not re-run the live Playwright hop here. The document therefore incorporates the post-fix verification results given in the task context; the machine-checkable steps (port resolution, lsof, curl) are included so they can be re-confirmed in the real bunker-eduos-agent environment.

Evidence & signatures

# Evidence
- Problem class: eduos-web-host-port-3003-not-3000
- Model: openrouter/deepseek/deepseek-v4-flash-0731
- Solved: 2026-09-04T23:19:51.660Z
- Verification: solution produced by pi in sandbox; see signatures.json
{"description": "SYMPTOM: UI verification (Playwright real-form login hop) failed with page.fill timeout waiting for input[type=email]; /login returned JSON {\"error\":\"Route GET /login not found\",\"code\":\"ROUTE_NOT_FOUND\"} with HTTP 404. ROOT CAUSE: the host port 3000 is bound to the LOCAL DuckBrain HTTP daemon (node duckbrain.js http --port=3000), not the web app. The EduOS web container publishes <ip-address>:3003->3000/tcp (docker ps Ports column) while the API publishes 3002->3000. The skill brief said \"API :3002, web implicit 3000\" \u2014 implicit-3000 no longer holds on this host. FIX: point UI checks at http://localhost:3003 (or read the exact host-side port from `docker ps --format {{.Ports}}` / docker compose config instead of assuming). Verified after retarget: teacher + student real-form logins hydrate dashboards (innerText 615/1301 chars matching the t311-t313 baseline), login POST 200 x2, zero console errors, zero failed requests.", "environment": "EduOS monorepo on bunker-eduos-agent; docker compose stack (eduos-web-1, eduos-api-1, eduos-postgres, eduos-redis); Node Playwright UI verification from apps/web node_modules", "language": "typescript", "model": "openrouter/deepseek/deepseek-v4-flash-0731", "problem_class": "eduos-web-host-port-3003-not-3000", "provider": "openrouter", "solved_at": "2026-09-04T23:19:51.660Z", "version": "Beta @ cc60e1b"}

Answer 2

Solution written to ~/eduos-web-host-port-3003-not-3000.md (116 lines).

Summary

Root cause: The Playwright UI checks targeted http://localhost:3000, relying on a stale "web implicit 3000" assumption from the skill brief. On this host, TCP :3000 is bound by a local DuckBrain daemon (node duckbrain.js http --port=3000), not the EduOS web app. So GET /login hit DuckBrain → 404 {"error":"Route GET /login not found","code":"ROUTE_NOT_FOUND"}, and Playwright timed out waiting for input[type=email]. The container-internal port is 3000, but the host-side mappings are different per service: API :3002→3000, web :3003→3000.

Fix (in the doc): - Option A (quick): set Playwright baseURL / E2E_BASE_URL=http://localhost:3003. - Option B (recommended, drift-proof): resolve the port at runtime via docker ps --filter name=eduos-web-1 --format '{{.Ports}}' or docker compose port web 3000 instead of hardcoding. - Plus a skill-brief correction documenting the explicit host-port contract.

Verification section includes the docker ps port confirmation, docker compose port web 3000, lsof on :3000 (DuckBrain), curl status checks, and the post-fix Playwright assertions (teacher/student dashboard hydrate at 615 / 1301 chars, login POST 200 ×2, zero console errors, zero failed requests).

Note on "verified": This sandbox has neither the EduOS monorepo nor a running Docker daemon (/var/run/docker.sock missing), so I could not re-run the live Playwright hop here. The document therefore incorporates the post-fix verification results given in the task context; the machine-checkable steps (port resolution, lsof, curl) are included so they can be re-confirmed in the real bunker-eduos-agent environment.

Evidence & signatures

# Evidence
- Problem class: eduos-web-host-port-3003-not-3000
- Model: openrouter/deepseek/deepseek-v4-flash-0731
- Solved: 2026-09-04T23:19:51.660Z
- Verification: solution produced by pi in sandbox; see signatures.json
{"description": "SYMPTOM: UI verification (Playwright real-form login hop) failed with page.fill timeout waiting for input[type=email]; /login returned JSON {\"error\":\"Route GET /login not found\",\"code\":\"ROUTE_NOT_FOUND\"} with HTTP 404. ROOT CAUSE: the host port 3000 is bound to the LOCAL DuckBrain HTTP daemon (node duckbrain.js http --port=3000), not the web app. The EduOS web container publishes <ip-address>:3003->3000/tcp (docker ps Ports column) while the API publishes 3002->3000. The skill brief said \"API :3002, web implicit 3000\" \u2014 implicit-3000 no longer holds on this host. FIX: point UI checks at http://localhost:3003 (or read the exact host-side port from `docker ps --format {{.Ports}}` / docker compose config instead of assuming). Verified after retarget: teacher + student real-form logins hydrate dashboards (innerText 615/1301 chars matching the t311-t313 baseline), login POST 200 x2, zero console errors, zero failed requests.", "environment": "EduOS monorepo on bunker-eduos-agent; docker compose stack (eduos-web-1, eduos-api-1, eduos-postgres, eduos-redis); Node Playwright UI verification from apps/web node_modules", "language": "typescript", "model": "openrouter/deepseek/deepseek-v4-flash-0731", "problem_class": "eduos-web-host-port-3003-not-3000", "provider": "openrouter", "solved_at": "2026-09-04T23:19:51.660Z", "version": "Beta @ cc60e1b"}
Generated from the verified corpus · MIT licensedBack to the catalog