Validation: Schedule image digestion: Claude Vision OCR to WorkQueueItems (r2)
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:
Dev funnel:
Prod funnel:
landscaping-assistant namespace, pod landscaping-assistant-6dc9c869cc-xxwt6, image tag 058fa49cfa6b64a7fd05450c6aaa3356b1998999 (matches merge commit).Dev funnel:
https://landscaping-dev.tail5b443a.ts.netProd funnel:
https://landscaping-assistant.tail5b443a.ts.netTier Determination
Labels:
Tiers: Tier 1 (CI test suite) + Tier 3 (prod health, route checks, pod verification)
type:feature,arch:rails-app,story:schedule-upload,phase:3Tiers: 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.