Review: Configure Caddy reverse proxy for landscaping-assistant.app on edge-proxy

review-1463-2026-06-14 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Template Completeness

  • [x] Type -- Feature
  • [x] Summary -- present
  • [x] User Story -- present, well-formed
  • [x] Context -- present, references related issues
  • [x] Lineage -- present (Parent: none, Story: custom-domain)
  • [x] Repo -- pal-e-platform
  • [x] Scope -- present, 4 items
  • [ ] File Targets -- WEAK: says "Salt states for edge-proxy Caddy config" but gives no concrete paths. Should specify salt/states/caddy/init.sls and salt/states/caddy/Caddyfile.j2 (to be created, mirroring #425 pattern)
  • [x] Feature Flag -- None (correct, infrastructure work)
  • [x] Test Expectations -- present, 2 items
  • [x] Acceptance Criteria -- present, 4 items
  • [x] Constraints -- present, 2 items
  • [x] Checklist -- present, 3 items
  • [x] Related -- present, references #425 and DNS dependency

Traceability

  • [x] story:custom-domain label -- present on board item
  • [ ] story note MISSING -- custom-domain is NOT listed in the project-landscaping-assistant user-stories table. [SCOPE] Create user story entry for custom-domain on project-landscaping-assistant user-stories section.
  • [x] arch:pal-e-platform label -- present on board item
  • [ ] arch note MISSING -- no arch-pal-e-platform note found in pal-e-docs. [SCOPE] Create architecture note arch-pal-e-platform for the pal-e-platform component.
  • [x] Forgejo issue -- pal-e-platform#434, state: open

File Targets

  • [ ] "Salt states for edge-proxy Caddy config" -- ISSUE: No concrete file paths given. The salt/states/caddy/ directory does not exist yet in pal-e-platform. Issue #425 (palinks.app) establishes the pattern by creating salt/states/caddy/init.sls. This ticket should explicitly list:

Repo Placement

OK. Issue filed on pal-e-platform, work is in pal-e-platform salt states. Single repo scope is correct.

Dependencies

  • pal-e-platform#435 (DNS A record via godaddy-tofu) -- state: open. This ticket explicitly depends on DNS being configured. Correct dependency documented in Related section ("Depends on: DNS A record for landscaping-assistant.app").
  • pal-e-platform#425 (palinks.app Caddy config) -- state: open. This ticket mirrors #425. If #425 creates the salt/states/caddy/ directory and Salt state structure, this ticket adds to it. Implicit ordering dependency: #425 should land first to establish the pattern.
  • pal-e-platform#424 (Hetzner edge provisioning) -- state: closed. Prerequisite satisfied.
  • Board item #1461 (landscaping-assistant#224, story:custom-domain) and #1460 (landscaping-assistant#223, story:custom-domain) -- related custom-domain items on the same board. No blocking relationship.

Acceptance Criteria

4 AC items, all verifiable by an agent:
  • "Caddy config includes landscaping-assistant.app block" -- verifiable by reading Caddyfile
  • "Traffic proxied to correct k3s service" -- verifiable after deploy with curl, but needs the Tailscale mesh address specified. Issue #425 uses palinks.tail5b443a.ts.net:443 pattern. This ticket should specify the target address (e.g., landscaping-assistant.tail5b443a.ts.net:443 or the actual k3s service address).
  • "TLS certificate auto-provisioned" -- verifiable with curl -I after deploy
  • "Salt state applied to Hetzner edge" -- verifiable by running salt state
Missing: no AC for www.landscaping-assistant.app redirect (the palinks.app mirror #425 includes www redirect).

Blast Radius

Low. Additive change to Caddy config. Constraint "Must not break palinks.app routing" is explicitly stated. The Salt state approach ensures reproducibility. No downstream consumers beyond the landscaping-assistant app itself.

Decomposition Assessment

No decomposition needed. Single repo, 1-2 file targets, 4 AC items, estimated agent work under 5 minutes. This is a straightforward additive config change mirroring #425.

Recommendations

  • [BODY] Specify concrete file targets: salt/states/caddy/init.sls (extend with landscaping-assistant.app block) and optionally salt/states/caddy/Caddyfile.j2. Current "Salt states for edge-proxy Caddy config" is too vague for agent consumption.
  • [BODY] Specify the Tailscale mesh proxy target address in AC #2 (e.g., landscaping-assistant.tail5b443a.ts.net:443).
  • [BODY] Add AC for www.landscaping-assistant.app redirect to landscaping-assistant.app (mirrors #425 pattern).
  • [BODY] Note ordering dependency on #425 (palinks.app Caddy config should land first to establish salt/states/caddy/ structure).
  • [SCOPE] Create user story entry for custom-domain on project-landscaping-assistant user-stories section.
  • [SCOPE] Create architecture note arch-pal-e-platform for the pal-e-platform component.