Review: westsidekingsandqueens.com TLS handshake fails (re-review)
Verdict: APPROVED
Note: Both
READY and APPROVED are accepted as passing verdicts by the check-board-advance hook.Re-review of review-1614-2026-06-25. All 6 previous findings have been addressed.
Previous Findings Resolution
- Root cause misidentified -- FIXED. Issue body now correctly describes the Caddy edge-proxy to Tailscale funnel chain: DNS A record to Hetzner edge-proxy, Caddy TLS termination via Let's Encrypt, reverse-proxy to tailnet hostname. The root cause section in "What Broke" accurately identifies the missing funnel ingress for the hostname Caddy targets.
- Missing prod ingress in pal-e-deployments -- FIXED. Issue body now includes a "Scope" section covering both pal-e-platform (Caddy/Salt verification) and pal-e-deployments (prod funnel ingress). The Repo field also lists both repos.
- Multi-repo scope not documented -- FIXED. Repo field now lists
ldraney/pal-e-platformandldraney/pal-e-deployments. Scope section has separate subsections for each repo's work. - arch-tailscale note missing -- FIXED. Note
arch-tailscalenow exists in pal-e-docs (created 2026-06-26), tagged architecture, networking, tailscale. Covers public domain architecture, funnel ingress pattern, two-hop TLS, and DNS conventions. - story label wrong -- FIXED. Board item #1614 now has
story:WS-S1("As superadmin, I want to deploy platform changes via IaC so that infrastructure is reproducible and auditable") instead of WS-S9 (payment tracking). Confirmed in project-westside-basketball user-stories section under Superadmin. - Co-dependency with #1613 documented -- FIXED. Related section now references
pal-e-services#148as a co-dependency with explanation that both bugs must resolve for Sprint 4/5 auth changes to go live.
Template Completeness
- [x] Type -- Bug
- [x] Lineage -- Related to pal-e-platform#463 (Sprint 3 proxy setup)
- [x] Repo -- ldraney/pal-e-platform AND ldraney/pal-e-deployments (both listed)
- [x] What Broke -- TLS handshake fails with clear error output and accurate root cause chain
- [x] Repro Steps -- 3 curl commands provided
- [x] Expected Behavior -- stated clearly
- [x] Environment -- DNS, edge-proxy, k8s ingresses documented
- [x] Scope -- file targets for both repos listed with specific paths
- [x] Acceptance Criteria -- 5 criteria, all testable
- [x] Related -- project, original issue, co-dependency, arch note all referenced
All required bug template sections present and complete.
Traceability
- [x] story:WS-S1 label -- "As superadmin, I want to deploy platform changes via IaC so that infrastructure is reproducible and auditable" (Superadmin tier)
- [x] story note verified -- found in project-westside-basketball user-stories section under Superadmin (Lucas)
- [x] arch:tailscale label -- Tailscale networking component
- [x] arch note verified --
arch-tailscalenote exists in pal-e-docs (id: 2179, created 2026-06-26). Covers public domain architecture, funnel ingress pattern, two-hop TLS, DNS. - [x] Forgejo issue -- ldraney/pal-e-platform#464, state: open
File Targets
- [x]
salt/pillar/caddy.sls(pal-e-platform) -- verified: westside entry exists at HEAD (commit 34fd30d, PR #463) withproxy_target: westside-basketball.tail5b443a.ts.netandwww_redirect: true - [x]
salt/states/caddy/Caddyfile.j2(pal-e-platform) -- verified: template generates site blocks from pillar data, reverse-proxies to{proxy_target}:443with TLS server name header - [x]
salt/states/caddy/init.sls(pal-e-platform) -- verified: manages Caddyfile rendering via Jinja template and Caddy service lifecycle - [x]
overlays/westside-ror/dev/ingress.yaml(pal-e-deployments) -- verified: dev overlay has funnel ingress pattern withwestside-rorhostname, port 3000, tailscale.com/funnel annotation - [x]
overlays/westside-ror/prod/(pal-e-deployments) -- verified: prod overlay haskustomization.yamlanddeployment-patch.yamlonly, NO ingress file. This confirms the scope: a new ingress.yaml needs to be created here.
Additional finding (informational): A separate overlay at
overlays/westsidekingsandqueens/prod/ingress.yaml exists with hostname westsidekingsandqueens (resolves to westsidekingsandqueens.tail5b443a.ts.net). This is the "wrong hostname" funnel the issue mentions -- Caddy targets westside-basketball.tail5b443a.ts.net but this ingress serves westsidekingsandqueens.tail5b443a.ts.net. The fix should either add a matching ingress in westside-ror/prod/ with hostname westside-basketball, or update the Caddy pillar to target the existing funnel hostname. The issue's scope correctly identifies this discrepancy.Repo Placement
CORRECT. Issue is filed on
ldraney/pal-e-platform (primary repo for Caddy/Salt/DNS). Scope section explicitly documents work in ldraney/pal-e-deployments as well. A single issue covering both repos is appropriate since the fix is coordinated and small (2 points).Dependencies
- Board item #1613 (pal-e-services#148) -- Harbor pull creds bug. Also sprint:5, type:bug, story:WS-S1. Co-dependent: even if TLS/funnel fix lands, pods may be running stale code until Harbor creds are fixed. Documented in issue's Related section.
- PR #463 (merged, commit 34fd30d) -- Added Caddy pillar entry. Pillar is correct at HEAD. Salt highstate verification is in scope.
- No blockers preventing this ticket from starting. Both #1613 and #1614 can be worked in parallel.
Acceptance Criteria
5 criteria, all testable:
- AC #1 ("loads with valid TLS cert") -- verifiable:
curl -sv https://westsidekingsandqueens.com 2>&1 | grep "SSL certificate verify ok" - AC #2 ("response matches tailnet URL content") -- verifiable: diff response bodies
- AC #3 ("Caddy config verified") -- verifiable: inspect Caddyfile on edge-proxy
- AC #4 ("funnel ingress exists in k8s") -- verifiable:
kubectl get ingress -n westside-ror - AC #5 ("no regression in tailnet URL access") -- verifiable:
curl https://westside-ror.tail5b443a.ts.net
Previous review's missing AC (www redirect) was not explicitly added, but the Caddy pillar has
www_redirect: true and the template handles it. This is implicitly covered by AC #1 (the Caddy config is data-driven). Not a blocking concern.Blast Radius
Two other domains use the same Caddy edge-proxy pattern:
palinks.app-- proxy_target:palinks.tail5b443a.ts.net. No prod funnel ingress in kustomize overlay either, but palinks works because its funnel ingress is likely managed by Terraform (platform services) or was created manually. Not affected by this fix.landscaping-assistant.app-- proxy_target:landscaping-assistant.tail5b443a.ts.net. Same pattern. Not affected.
The westside-ror case is unique because it has a separate
westsidekingsandqueens overlay with a mismatched hostname. No blast radius beyond westside.Decomposition Assessment
2-3 file changes across 2 repos (ingress.yaml in pal-e-deployments, possible kustomization.yaml update, Salt highstate verification on pal-e-platform). 5 acceptance criteria. Estimated agent work under 5 minutes. No decomposition needed.
Recommendation
No action needed. All previous NEEDS_REFINEMENT findings have been addressed. Scope is solid, traceability complete (story note and arch note both verified), file targets confirmed, multi-repo scope documented, dependencies clear. Ready for todo.