Validation: Projects tab — project request and management

validation-51-2026-07-17 Doc

validation fail

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_HOST is set to PLACEHOLDER_POSTGRES_HOST. The Kubernetes secret intelligentstaffingsystems-secrets likely 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/mock not available in CI's Ruby 3.4 bundled gems — needs gem "minitest" in Gemfile or CI base image update.
  • Kubernetes secret intelligentstaffingsystems-secrets has placeholder DB host — needs real CNPG connection string.