Validation: Property detail page Projects section (#176)
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 6f88f93Tier 3 (Production):
landscaping-assistant namespace, pod landscaping-assistant-6979f7644b-lsbv4, URL https://landscaping-assistant.appChecks
| # | 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 & Requests heading</code> | PASS (T1) | 59/59 property specs pass. Partial renders heading "Projects & 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><details class="service-requests-past"></code> with summary count. RSpec: <code>shows completed/declined requests in past section</code> | PASS (T1) | Uses HTML <code><details></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><p class="empty-state">No projects or requests yet</p></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-deploymentshas not been updated. Pod still runs image from commit8e5a1a0(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.