Review: Landing page: sales pitch with App Store download CTA (re-review)
Verdict: READY
Re-review of board item #1830. Previous review (
review-1830-2026-07-17) returned NEEDS_REFINEMENT with two recommendations. Both have been addressed.Previous Issues — Resolved
- [x]
[BODY]File path corrected:app/views/pages/home.html.erbupdated toapp/views/pages/landing.html.erbin issue body. Verified: file exists (188 lines). - [x]
[SCOPE]Architecture note created:arch-frontend-iss("Frontend Architecture: ISS", note_type: architecture, status: active, project: iss). Verified via search.
Template Completeness
- [x] Type
- [x] Lineage
- [x] Repo
- [x] User Story
- [x] Context
- [x] File Targets
- [x] Feature Flag
- [x] Acceptance Criteria
- [x] Test Expectations
- [x] Constraints
- [x] Checklist
- [x] Related
Traceability
- [x] story:landing-page label — Epic 1 (US-1.1), Visitor role
- [x] story note verified — found in project-iss user-stories section (key: landing-page, success metric: "Landing page renders publicly, mobile-first")
- [x] arch:frontend label — frontend component
- [x] arch note verified —
arch-frontend-issnote exists in pal-e-docs (type: architecture, status: active, project: iss) - [x] Forgejo issue — ldraney/intelligentstaffingsystems#58, open
File Targets
- [x]
app/views/pages/landing.html.erb— verified: exists (188 lines), contains hero section with "Book an Appointment" CTA, three pillar cards, journey steps, offer section, bottom CTA. This is the file where the App Store download button replaces the current booking CTA. - [x]
app/assets/stylesheets/pages.css— verified: exists (351 lines), contains CTA section styling (.cta-section, .btn classes), responsive breakpoint at 600px. Uses design tokens from application.css :root. - [x]
app/controllers/sessions_controller.rb— verified: exists (116 lines),newaction currently renders sessions/new.html.erb (Keycloak sign-in button). This action will be changed to redirect to App Store URL. - [x]
config/routes.rb— verified: exists (46 lines), line 30 maps GET /login to sessions#new. Root route at line 45 ispages#landing.
Repo Placement
OK — issue filed on ldraney/intelligentstaffingsystems, all file targets are in the same repo. Single-repo change.
Dependencies
- #7 (Landing page, sprint:2) — in done. This ticket updates scope of #7 (CTA changes from login to App Store download). No blocker.
- #59 (board item 1831, sprint:A, arch:auth, story:registration) — related. In-app registration flow that follows the App Store download. In backlog. Not a blocker for this ticket, but the two tickets form a pair: this one sends visitors to the App Store, #59 handles what happens after they open the app.
- #49 (board item 1829, sprint:A, arch:frontend, story:navigation) — same sprint, both touch frontend. In backlog. Minimal file overlap (tab bar vs landing page). No blocker.
- No items in in_progress or next_up block this ticket.
Acceptance Criteria
8 criteria listed. Assessment of testability:
- AC1 (public landing page) — testable via endpoint test. Already satisfied: PagesController skips auth, root route is public.
- AC2 (ISS pitch, three pillars) — testable via content assertions. Already satisfied: landing.html.erb has hero section, three pillar cards, journey steps, offer section.
- AC3 (App Store download button) — testable via presence check in rendered HTML. New work.
- AC4 (App Store link opens store) — testable via link href check. New work.
- AC5 (no login form on website) — testable: verify sessions/new.html.erb is removed or redirects. New work. Currently renders "Sign in with Keycloak" button.
- AC6 (login route redirects to App Store) — testable via endpoint test (302). New work. Currently GET /login renders sessions/new.html.erb.
- AC7 (responsive, mobile-first) — testable via CSS assertions. Already satisfied: pages.css has mobile-first layout with 600px breakpoint.
- AC8 (target audience messaging) — testable via content check. Already partially satisfied.
Net-new work covers 4 criteria (AC3-6); 4 criteria verify existing behavior. All are testable by an agent.
Blast Radius
- Auth redirect chain:
application_controller.rb:59redirects unauthenticated users tologin_path. Under this ticket,login_pathwould redirect to the App Store URL (302). This means ANY unauthenticated request to an authenticated route (dashboard, messages, catalog, profile) will ultimately redirect to the App Store. This is the intended behavior per the issue scope ("auth happens in-app only"), but the implementing agent should be aware of this global behavior change. - sessions/new.html.erb: Currently renders a "Sign in with Keycloak" button (6 lines). Must be removed or replaced. The tab bar (shared/_tab_bar.html.erb) is only rendered for authenticated users, so no impact there.
- OmniAuth callback: The OmniAuth callback route (
/auth/keycloak/callback) must remain functional — the iOS app's Turbo Native shell uses it for in-app Keycloak login. Only the website's direct login entry point changes; the callback endpoint stays.
Decomposition Assessment
4 file targets across 1 repo (under threshold). 8 acceptance criteria total but only 4 net-new (under the >5 threshold for new work). Estimated agent work: ~4 minutes. No decomposition needed.
Recommendations
No action needed.