Validation: Property detail page Projects section (#176)

validation-176-2026-07-27 Doc

validation partial

Verdict: PARTIAL

Ticket

ldraney/landscaping-assistant#176 (board item #1403) — Added Projects & Requests section to the property detail page, displaying active and past service requests with type/status badges, price, and an empty state. Gated behind service_requests feature flag.
Merged PR: #326 (commit 6a49897)

Environment

Tier 1 (Local): docker compose test suite, branch main at commit 6f88f93
Tier 3 (Production): landscaping-assistant namespace, pod landscaping-assistant-6979f7644b-lsbv4, URL https://landscaping-assistant.app

Checks

# Criterion How Verified Result Evidence
1 Projects/Requests section visible below property details Code review: <code>show.html.erb</code> renders <code>_service_requests</code> partial inside <code>feature_enabled?(:service_requests)</code> guard. RSpec: <code>shows the Projects &amp; Requests heading</code> PASS (T1) 59/59 property specs pass. Partial renders heading "Projects &amp; Requests" between address section and comments section.
2 Active requests grouped (requested, quoted, accepted, paid, scheduled) Code review: template filters <code>active_statuses = %w[requested quoted accepted paid scheduled]</code>. RSpec: <code>displays active service requests</code> PASS (T1) Template selects by status inclusion; test creates "requested" SR and confirms it appears.
3 Completed/declined shown separately (collapsible) Code review: <code>&lt;details class="service-requests-past"&gt;</code> with summary count. RSpec: <code>shows completed/declined requests in past section</code> PASS (T1) Uses HTML <code>&lt;details&gt;</code> element; two separate tests confirm completed and declined both appear with "Past requests" label.
4 Each request displays: description, request_type badge, status badge, price Code review of partial; RSpec: <code>displays request type badge</code>, <code>displays price for quoted requests</code> PASS (T1) Template renders <code>.service-request-type</code>, <code>.service-request-status</code>, <code>.service-request-description</code>, <code>.service-request-price</code>. Price shown conditionally for quoted+ statuses.
5 Empty state: "No projects or requests yet" Code review line 10 of partial; RSpec: <code>shows empty state when no service requests exist</code> PASS (T1) <code>&lt;p class="empty-state"&gt;No projects or requests yet&lt;/p&gt;</code> rendered when <code>service_requests.empty?</code>
6 Mobile responsive (44px touch targets) CSS diff review: <code>.service-request-item { min-height: 2.75rem; padding: var(--spacing-md); }</code>; flex layout with gap; design tokens throughout PASS (T1) CSS uses <code>var(--spacing-*)</code> tokens, <code>min-height: 2.75rem</code> (44px), flex wrap for badges.
7 Feature flag gate works RSpec: <code>hides projects section when service_requests flag is off</code> PASS (T1) Test uses <code>with_feature_disabled(:service_requests)</code> and confirms section absent.
8 Pipeline green Woodpecker pipeline #888 (push to main, includes PR #326 changes): all 6 steps success PASS Pipeline #880 (PR #326 direct) failed with steps skipped. Pipeline #888 (accumulated) succeeded.
9 Deployment live: pod image matches merge commit <code>kubectl get pods -n landscaping-assistant -o jsonpath='{.items[*].spec.containers[*].image}'</code> FAIL (T3) Pod image: <code>8e5a1a0</code> (PR #323). Expected: <code>6f88f93</code> (latest main). Kustomize overlay in <code>pal-e-deployments</code> not updated.
10 Route-level smoke test Blocked by deployment gap BLOCKED Cannot verify property detail page in production — old image does not include PR #326 code.
11 Visual check Blocked by deployment gap BLOCKED Same as above.

Regression Check

All 59 property request specs pass (0 failures). Existing property detail page functionality (address display, GPS detection, comments section, multi-tenancy scoping, edit/update, resolve) all verified green. Controller eager-loads @service_requests conditionally behind feature flag — no performance impact when flag is off.

Discovered Issues

  • Deployment propagation gap: Pipelines #880 and #883 (push events for PRs #326 and #327) both failed with all steps skipped — possible Woodpecker CI transient issue. Pipeline #888 succeeded, image built and pushed to Harbor, but the kustomize tag in pal-e-deployments has not been updated. Pod still runs image from commit 8e5a1a0 (PR #323). PRs #325 through #328 are all pending deployment.
  • Local worktree artifact: Working tree has numerous staged deletions from worktree operations that revert recent PR work. Not affecting git HEAD but could confuse future local operations.