Validation: Appointment scheduling with 24hr advance rule (#54)
Verdict: PASS
Ticket
#54 — Appointment scheduling with 24hr advance rule. Board item #1824 on board-iss.
Merged via PR #101. Commit
1f40f2b.Shipped: Appointment model with 24hr minimum advance validation, booking form at
/appointments/new, confirmation page, backward-compatible /booking redirect, ActiveStorage file attachments with content-type and size validation, and comprehensive test coverage (model + controller).Environment
Production cluster, namespace
intelligentstaffingsystems. Pod intelligentstaffingsystems-69c4f699d6-vp89s. URL: https://intelligentstaffingsystems.ai.Deployed image:
harbor.tail5b443a.ts.net/intelligentstaffingsystems/app:b46c43399b520241eece48595c114501489fc7f7 (commit b46c433, which is a descendant of merge commit 1f40f2b).Tiers Executed
Tier 1 (local tests): SKIPPED — Ruby 3.4.8 not installed on host; Docker test runner documented as hanging (#65). CI pipeline serves as Tier 1 proxy.
Tier 3 (production): EXECUTED — pod status, ArgoCD sync, route-level curl, regression checks.
Checks
| # | Criterion | How Verified | Result | Evidence |
|---|---|---|---|---|
| 1 | CI pipeline green (includes all appointment tests) | Woodpecker pipeline #188 (latest main push) | PASS | All 7 steps success: clone, database, bundle-install, lint, security, test, build-and-push. Note: pipeline #130 (PR #101 merge push) failed due to schema.rb dropping project_requests table — fixed by PR #104 (pipeline #135, success). |
| 2 | Pod running and healthy in production | <code>kubectl get pods -n intelligentstaffingsystems</code> | PASS | Pod <code>intelligentstaffingsystems-69c4f699d6-vp89s</code> — Running, 0 restarts. |
| 3 | ArgoCD application synced and healthy | <code>kubectl get application -n argocd intelligentstaffingsystems</code> | PASS | Sync: Synced, Health: Healthy. |
| 4 | Deployed image includes PR #101 changes | <code>git log --ancestry-path 1f40f2b..b46c433</code> | PASS | 7 commits between merge commit and deployed tag — PR #101 is an ancestor of the deployed image. |
| 5 | <code>/appointments/new</code> route serves (auth-gated) | <code>curl -s -o /dev/null -w "%{http_code}" https://intelligentstaffingsystems.ai/appointments/new</code> | PASS | HTTP 302 redirect to <code>/login</code> — correct behavior for authenticated route. |
| 6 | <code>/booking</code> backward-compat redirect | <code>curl -s -o /dev/null -w "%{http_code} %{redirect_url}" https://intelligentstaffingsystems.ai/booking</code> | PASS | HTTP 301 redirect to <code>https://intelligentstaffingsystems.ai/appointments/new</code>. |
| 7 | Appointments CSS asset deployed | <code>curl -s https://intelligentstaffingsystems.ai/ | grep appointments</code> | PASS | Landing page loads <code>appointments-47b56982.css</code> via asset pipeline. |
| 8 | Health endpoint responsive | <code>curl https://intelligentstaffingsystems.ai/up</code> | PASS | HTTP 200. |
| 9 | Test coverage exists for model and controller | Read test files in repo | PASS | <code>test/models/appointment_test.rb</code>: 12 tests (topic, scheduled_at, status, notes, associations). <code>test/controllers/appointments_controller_test.rb</code>: 15 tests (auth, form fields, booking, validation failures, attachments, confirmation, backward compat). |
Regression Check
All existing routes verified to still respond correctly (all return expected auth redirects or 200):
/— 200 (landing page)/about— 200/up— 200 (health)/catalog— 302 (auth redirect)/communications— 302 (auth redirect)/projects— 302 (auth redirect)/crm— 302 (auth redirect)/messages— 302 (auth redirect)/login— 302 (Keycloak redirect)
No regressions detected. The schema.rb issue from the original merge (missing project_requests table) was fixed by PR #104 before subsequent deploys.
Discovered Issues
dev.intelligentstaffingsystems.ai returns HTTP 502. This is a pre-existing condition unrelated to #54 — the dev environment may not be fully deployed. Not a regression from this PR.