Validation: Projects tab — project request and management
Verdict: FAIL
Ticket
ldraney/intelligentstaffingsystems#51 (PR #83) — Projects tab with project request form and status cards. Board item #1821 on board-iss.
Environment
Production cluster, namespace
intelligentstaffingsystems. Production URL: https://intelligentstaffingsystems.ai. Tiers executed: Tier 1 (code review — Docker tests blocked per #65) + Tier 3 (prod health check).Checks
| # | Criterion | How Verified | Result | Evidence |
|---|---|---|---|---|
| 1 | Projects tab accessible to all authenticated roles (lead, client, admin) | Code review: controller inherits ApplicationController (requires auth). Tests verify lead/client/admin all get 200. | PASS (Tier 1) | projects_controller_test.rb lines 15-31 |
| 2 | "Request a Project" button prominent at top of page | Code review: index.html.erb line 19 renders btn-gold link at top. Test asserts presence. | PASS (Tier 1) | index.html.erb line 19; test line 80 |
| 3 | Request form captures: business name (pre-filled), description, target audience, inspiration | Code review: new.html.erb has all four fields. Business name is disabled/pre-filled from current_lead. | PASS (Tier 1) | new.html.erb lines 26-46 |
| 4 | Form submission creates ProjectRequest with lead_id | Code review: controller sets lead from session. Tests verify lead_id set from session, not params. | PASS (Tier 1) | projects_controller.rb lines 19-22; test lines 152-163 |
| 5 | Empty state for users with no projects | Code review: index.html.erb renders "No projects yet" heading + request button when empty. | PASS (Tier 1) | index.html.erb lines 29-40; test lines 49-59 |
| 6 | Project cards with name, status, description (submitted/active/completed) | Code review: _project_card.html.erb renders all fields. Model validates status in [submitted, active, completed]. | PASS (Tier 1) | _project_card.html.erb; project_request.rb line 4 |
| 7 | Form validation: description required, length limits | Code review: Model validates presence + max 5000. Tests cover boundary values. Controller returns 422 on invalid. | PASS (Tier 1) | project_request.rb line 9; model test lines 37-58; controller test lines 176-187 |
| 8 | Success message after submission | Code review: Controller redirects with notice "Project request submitted!". Test asserts flash-notice with /submitted/. | PASS (Tier 1) | projects_controller.rb line 24; test line 135 |
| 9 | /projects route accessible in production | curl -s -o /dev/null -w "%{http_code}" https://intelligentstaffingsystems.ai/projects | FAIL (Tier 3) | Returns HTTP 404. Code not deployed. |
| 10 | Woodpecker pipeline green for merge commit | mcp__woodpecker__list_pipelines — pipeline #89 (merge commit) status: failure | FAIL (Tier 3) | Pipeline #89 and #90 both fail at test step: <code>cannot load such file -- minitest/mock (LoadError)</code> |
| 11 | New image tag propagated to running pod | kubectl get pods — image tag 93b9a79b (commit: "fix: align pipeline push repo") — old image, not merge commit | FAIL (Tier 3) | Running pod image is from pre-Sprint-B commit. Last successful pipeline: #18. |
| 12 | Pod running and healthy | kubectl get pods — old pod Running (0 restarts), new pod Init:CrashLoopBackOff | FAIL (Tier 3) | New pod <code>intelligentstaffingsystems-8474c67bc8-nxphp</code> migrate init container fails: PLACEHOLDER_POSTGRES_HOST |
Regression Check
Root URL (/) returns 200 — base app is serving. However, /catalog returns 302 (auth redirect expected), /communications returns 404, /projects returns 404. All Sprint B routes are absent from the running production pod because it runs pre-Sprint-B code.
Discovered Issues
- CI pipeline broken (pre-existing): All pipelines since #21 have failed. The test step fails with
cannot load such file -- minitest/mock (LoadError)in Ruby 3.4. This blocks all image builds and deployments. This is a pre-existing issue not caused by this PR. - New pod CrashLoopBackOff: The migrate init container on the new deployment pod fails because
POSTGRES_HOSTis set toPLACEHOLDER_POSTGRES_HOST. The Kubernetes secretintelligentstaffingsystems-secretslikely contains placeholder values instead of real credentials. This deployment config issue prevents any new pod from starting. - All Sprint B features undeployed: Since CI has been broken since pipeline #21, none of the Sprint B merges (PRs #73, #74, #76, #81, #82, #83, #84) have been deployed to production.
Root Causes
Two independent blockers prevent deployment:
minitest/mocknot available in CI's Ruby 3.4 bundled gems — needsgem "minitest"in Gemfile or CI base image update.- Kubernetes secret
intelligentstaffingsystems-secretshas placeholder DB host — needs real CNPG connection string.