Validation: Landing page sales pitch with App Store download CTA

validation-58-2026-07-17 Doc

validation fail

Verdict: FAIL

Re-validated 2026-07-17. Previous validation also FAIL. Root cause unchanged: CI pipeline broken, production deployment stale.

Ticket

ldraney/intelligentstaffingsystems#58 (PR #74) — Landing page rewrite: replace "Book an Appointment" CTA with App Store download badge, add target audience section, update journey steps to lead with "Download the App."
Board item #1830 on board-iss.

Environment

Production: https://intelligentstaffingsystems.ai
Validation tiers executed: Tier 1 (codebase review) + Tier 3 (production browser verification via Playwright)
Repo type: frontend

Checks

# Criterion How Verified Result Evidence
1 Landing page is public (no auth required) Playwright: opened https://intelligentstaffingsystems.ai/ PASS Page loads at root URL without authentication. Title: "Intelligence Staffing Systems — Enterprise infrastructure for small businesses"
2 ISS pitch clearly communicated: three pillars, what ISS builds, who it's for Playwright screenshot + accessibility snapshot PARTIAL Three pillars (Web Presence, Operations, Internal Tooling) visible with icons and descriptions. However, audience section ("Built for businesses like yours" — Farmers Market Vendors, Sports Programs, Local Shops) is MISSING from production. Exists in codebase at commit 035d838 but not deployed.
3 Prominent App Store download button/badge as primary CTA Playwright screenshot + snapshot FAIL Production hero shows "Book an Appointment" button (link to #book). App Store SVG badges exist in codebase (_app_store_badge.html.erb partial) but not deployed. Two App Store CTAs in template (hero + bottom) replaced by two "Book an Appointment" buttons in production.
4 App Store link opens App Store (or TestFlight during beta) Playwright: inspected CTA link hrefs FAIL Hero CTA href: <code>https://intelligentstaffingsystems.ai/#book</code>. Should be: <code>https://testflight.apple.com/join/intelligentstaffingsystems</code> (ApplicationHelper::APP_STORE_URL).
5 No login/register form on the website — auth happens in-app only Playwright: navigated to /login, took screenshot FAIL /login renders "Intelligence Staffing Systems" heading, "Sign in to continue" text, and "Sign in with Keycloak" button. Should redirect (302) to App Store URL per merged SessionsController#new.
6 Website login route redirects to App Store download (not Keycloak) Playwright: /login page stayed at /login URL FAIL No redirect occurred. URL remained at /login. Merged code has <code>redirect_to ApplicationHelper::APP_STORE_URL, allow_other_host: true, status: :found</code> but this is not deployed.
7 Responsive, mobile-first CSS review of pages.css in codebase PASS (code only) Mobile-first grid layout: 1fr default columns, <code>@media (min-width: 600px)</code> breakpoint expands to <code>repeat(3, 1fr)</code>. Cannot verify in production since deployed code differs from codebase.
8 Target audience messaging: farmers market vendors, sports programs, local businesses Playwright accessibility snapshot FAIL Audience section with "Farmers Market Vendors", "Sports Programs", "Local Shops &amp; Services" cards not present in production DOM. Section exists in codebase landing.html.erb lines 34-68.
9 Endpoint test: landing page loads (200, public) Playwright: root URL loaded successfully PASS Root URL returns 200, renders without auth redirect.
10 Endpoint test: login route redirects to App Store URL (302) Playwright: /login URL FAIL /login renders a page (200) instead of redirecting (302) to App Store URL.
11 Endpoint test: no Keycloak redirect from website login Playwright: /login page snapshot FAIL /login page contains button "Sign in with Keycloak" — direct Keycloak integration still present.
12 Woodpecker pipeline green for merge commit Woodpecker API: list_pipelines FAIL Pipeline #90 (latest on main) status: failure. Error: <code>cannot load such file -- minitest/mock (LoadError)</code>. All 5 most recent main-branch pipelines (#85-#90) show failure status.
Summary: 3 PASS, 1 PARTIAL, 8 FAIL

Codebase Verification (Tier 1)

The merged codebase is correct. All acceptance criteria are properly implemented in code:
  • app/views/pages/landing.html.erb — App Store badges, audience section, updated journey steps all present
  • app/views/shared/_app_store_badge.html.erb — SVG badge partial with dark/light variants
  • app/controllers/sessions_controller.rb#new redirects to APP_STORE_URL with status: :found
  • app/helpers/application_helper.rbAPP_STORE_URL = "https://testflight.apple.com/join/intelligentstaffingsystems"
  • test/controllers/pages_controller_test.rb — 8 tests covering all ACs (public access, three pillars, App Store CTA, no login form, audience cards)
  • test/controllers/sessions_controller_test.rb — Tests for App Store redirect from /login and no Keycloak redirect

Regression Check

The production site's existing functionality (pre-PR#74 landing page) is still operational — root URL loads with three pillars, "How it works", and offer section intact. No regressions to the currently deployed version. The stale deployment has not introduced new breakage.

Root Cause

The merged code (commit 035d838) has not been deployed to production. The CI/CD pipeline is broken:
  • CI pipeline failure: Woodpecker pipeline #90 (and all recent pipelines) fail with cannot load such file -- minitest/mock (LoadError) in the test step. This is a Ruby 3.4 gem dependency issue — minitest/mock was moved to a bundled gem and requires explicit inclusion in the Gemfile.
  • No image built: Because CI fails at the test step, the build-and-push step is skipped. No new container image is pushed to Harbor.
  • ArgoCD Image Updater has nothing to pull: Without a new image tag, the Image Updater cannot trigger a deployment.
  • Push event gap: Per project memory, Forgejo squash merges may not reliably trigger Woodpecker push events, compounding the issue.

Discovered Issues

  • CI pipeline broken — blocks ALL deployments: The minitest/mock LoadError prevents all test runs in CI. This is not specific to this ticket; it blocks deployment of every merged PR. The fix: add gem "minitest" (with mock support) to the Gemfile, or add require "minitest/mock" with proper gem resolution in test_helper.rb.
  • Production deployment drift — 8+ undeployed commits: At least commits from 035d838 through ca24329 are merged but undeployed: landing page (#74), tab bar restructure (#73), Messages fix (#76), Makefile/seed (#81), Communications tab (#82), Projects tab (#83), Catalog tab (#84), and CI blocker fix (ca24329).