Validation: Schedule image digestion: Claude Vision OCR to WorkQueueItems (r2)

validation-204-2026-06-13-r2 Doc

validation pass

Verdict: PASS

Ticket

ldraney/landscaping-assistant#204 — Schedule image digestion: Claude Vision OCR to WorkQueueItems. Merged via PR #208.
Re-validation (r2). Previous attempt validation-204-2026-06-13 returned PARTIAL due to pending migrations causing HTTP 500s on the dev server. Migrations now applied.

Environment

Prod: landscaping-assistant namespace, pod landscaping-assistant-6dc9c869cc-xxwt6, image tag 058fa49cfa6b64a7fd05450c6aaa3356b1998999 (matches merge commit).
Dev funnel: https://landscaping-dev.tail5b443a.ts.net
Prod funnel: https://landscaping-assistant.tail5b443a.ts.net

Tier Determination

Labels: type:feature,arch:rails-app,story:schedule-upload,phase:3
Tiers: Tier 1 (CI test suite) + Tier 3 (prod health, route checks, pod verification)

Checks

# Criterion How Verified Result Evidence
1 Woodpecker CI pipeline green for merge commit Pipeline #515 (push to main) PASS All 6 steps success: clone, database, bundle-install, lint, test, build-and-push
2 Pod image tag matches merge commit kubectl get pod -n landscaping-assistant PASS Image: <code>harbor.../app:058fa49cfa6b64a7fd05450c6aaa3356b1998999</code> matches commit <code>058fa49</code>
3 Pod running, 0 restarts kubectl get pods -n landscaping-assistant PASS Phase: Running, Ready: true, RestartCount: 0
4 ArgoCD sync + health kubectl get application -n argocd PASS landscaping-assistant: Synced, Healthy
5 /up health check returns 200 curl prod + dev URLs PASS Both <code>landscaping-assistant.tail5b443a.ts.net/up</code> and <code>landscaping-dev.tail5b443a.ts.net/up</code> return HTTP 200
6 Digest routes exist in deployed app kubectl exec rails routes | grep digest PASS POST /uploads/:id/digest and POST /uploads/:id/confirm_digest routes present
7 ScheduleDigester service file deployed kubectl exec ls app/services/schedule_digester.rb PASS File exists in prod pod
8 week_start migration applied kubectl exec rails runner checking Upload.column_names PASS week_start column EXISTS on uploads table
9 anthropic gem installed kubectl exec bundle list | grep anthropic PASS anthropic (1.48.1) present
10 CI test suite passes (371 specs) Pipeline #515 test step logs PASS 371 examples, 0 failures in 5.59 seconds
11 Route-level smoke test: /today, /uploads, /weeks, /properties curl each route on prod URL PASS All return 302 (auth redirect, expected with Keycloak). No 404s or 500s.
12 /metrics endpoint healthy curl prod /metrics PASS HTTP 200

Regression Check

Verified existing routes still respond correctly:
  • /today — 302 (auth redirect, correct)
  • /weeks — 302 (auth redirect, correct)
  • /uploads — 302 (auth redirect, correct)
  • /properties — 302 (auth redirect, correct)
  • /metrics — 200 (Prometheus endpoint, correct)
  • /up — 200 (health check, correct)
  • No unexpected 500 errors on any route

Discovered Issues

None. All checks pass cleanly. The migration issue from the previous validation attempt (r1) has been resolved.