Commit Graph

3 Commits

Author SHA1 Message Date
Jordan Ritter 7831d61f52 fix(showcase/bin): nil-guard all diff_services accessors 2026-06-04 10:16:14 -07:00
Jordan Ritter 0907492e32 fix(showcase/bin): correct rollback target selection relative to current deploy
find_previous_deployment returned the second-newest SUCCESS regardless of the
head deploy's status. When the head deploy FAILED/CRASHED (precisely when
rollback is invoked) the newest SUCCESS is the last-known-good target, but the
old code skipped it and rolled back one good deploy too far. Now select the
newest SUCCESS strictly older than the current head (drop head, first SUCCESS
in the remainder), and fail loud when the fetched window is saturated and no
target is found — directing the operator to pass --to explicitly rather than
silently returning nil.

Also guard the one unguarded accessor in EnvDiffCommand#diff_services with
`|| []` so a snapshot lacking "services" hits the documented exit-2 path
instead of a raw NoMethodError.

Renumber the ivar-lint allowlist to track the added lines in bin/railway.
2026-06-04 10:10:31 -07:00
Jordan Ritter 863b6920ea fix(showcase/bin): harden rollback deployment ordering and make env-diff honest
Two pre-existing bin/railway bugs surfaced by code review:

1. RollbackCommand#find_previous_deployment selected "the second SUCCESS in
   reverse-chronological order" but never sorted the deployments — it trusted
   Railway's arbitrary GraphQL connection order, so the wrong deploy could be
   chosen as the rollback target. Now sort by createdAt descending before
   selecting, mirroring the sibling fetch_latest_staging_deployments which
   documents and guards against this exact hazard.

2. EnvDiffCommand advertised behavior it never implemented:
   - The banner claimed it compares "custom domains", but run() only diffed
     digest/startCommand/env_keys. custom_domains was captured in the snapshot
     yet never compared. FIX: extract a pure diff_services helper and add a
     custom-domain set comparison (both directions).
   - --ignore-env-scoped was parsed into options[:ignore_env_scoped] but never
     read, and the env_scoped? helper (+ ENV_SCOPED_URL_MARKERS) it relied on
     was defined but never called. The flag had nothing meaningful to act on:
     env-diff only compares env-var KEY names (snapshots never carry values),
     and custom domains are compared as exact sets (silently dropping
     "env-scoped" domains would defeat the comparison). DECISION: remove the
     dead flag, the unused env_scoped? helper, and the now-orphan
     ENV_SCOPED_URL_MARKERS constant rather than leave false advertising.

Tests: TDD red->green for both. test_rollback_sort feeds deployments in
non-chronological edge order (with a newer FAILED deploy as a decoy) and
asserts the true second-newest SUCCESS is returned. test_env_diff exercises
diff_services directly for identical and differing custom_domains. The
snapshot-ivar lint allowlist is renumbered (numbers only) to track the line
shifts from removing the dead code and adding the rollback comment.
2026-06-04 09:53:32 -07:00