Retire this repo's tower search UI, now the service serves it - #389
Merged
Merged
Conversation
This comment has been minimized.
This comment has been minimized.
Babissimo
force-pushed
the
worktree-retire-tower-ui
branch
from
September 15, 2026 12:43
14de7a9 to
eeb47e3
Compare
This comment has been minimized.
This comment has been minimized.
Babissimo
force-pushed
the
worktree-retire-tower-ui
branch
from
September 15, 2026 13:59
eeb47e3 to
d9cf738
Compare
This comment has been minimized.
This comment has been minimized.
Babissimo
force-pushed
the
worktree-retire-tower-ui
branch
from
September 15, 2026 14:12
d9cf738 to
b9b8ecb
Compare
This comment has been minimized.
This comment has been minimized.
This was referenced Sep 15, 2026
tower-finder-service has owned the tower API since the monolith's copy was
deleted, and it now owns the UI too: it builds its own SPA and serves it from
its own edge. On 2026-09-14 the Cloudflare origin rules moved towers.retina.fm,
its staging and test counterparts and the fleet's tower-finder.retina.fm onto
port 8443, so all four names reach the service and none of them reach us.
That leaves the copy here dead rather than merely redundant. frontend/dist is
served on HOST_MAIN, HOST_MAP and HOST_TESTMAP only, and isMapDomain already
hid the tower tab on the latter two, so with HOST_MAIN flipped away the tab was
reachable on no live surface. The service's copy had also moved well ahead of
it, gaining address geocoding, rank tiers and a working frequencies parameter,
so keeping ours invited exactly the split-brain that 86capx9mv was raised to
end.
Every surface this bundle still serves is a live map, so the hostname-dependent
header goes with it and App renders one surface unconditionally. That also
settles, by deletion, the "Tower Finder" display label left open during the
rename: it named a surface that no longer ships from here. Because .map-surface
is now always set, the dark physics-tab background it used to override was dead
too, and collapses into the light rule.
Nothing about nginx changes here. Every vhost keeps forwarding /api/towers,
/api/elevation and /api/config to the service exactly as before, including the
${HOST_LEGACY_REDIRECT} vhost that carries the fleet's name. Retiring that vhost
is a separate change, deliberately held back: while it exists, deleting the
Cloudflare origin rule is still a working rollback for the fleet.
The entry chunks every map surface loads drop from 56.66 to 43.84 kB of JS
(gzip 18.04 to 14.08) and 26.45 to 19.23 kB of CSS (gzip 5.67 to 4.13).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Babissimo
force-pushed
the
worktree-retire-tower-ui
branch
from
September 15, 2026 15:36
b9b8ecb to
a20362f
Compare
|
Claude finished @Babissimo's task in 1m 17s —— View job Reviewing PR #389Todo list
ReviewThis
No issues found — this is a clean, purely subtractive change that matches its stated scope. Nothing new surfaced versus the prior review of this same commit. As before, I could not run |
Babissimo
added a commit
that referenced
this pull request
Sep 15, 2026
test_interval_gate_holds_between_passes asserts that its first maybe_run_pass runs, and under xdist that assertion fails now and then with the attempt count still 0 (2026-09-06, 2026-09-15 on #389, and twice in a row on #403, all diffs that never touched the backend). conftest turns KNOWN_LANE_MODE off for the suite so the solver worker daemons every TestClient lifespan leaks do not poll the pass, but DARK_FOLLOW_MODE keeps its "shadow" default, lanes_armed() is true when either lane is on, and maybe_run_pass returns early only when both are off. So every leaked daemon takes the pass lock, stamps the pass clock and runs an empty dark-follow pass every two seconds, and one landing between the fixture's clock reset and the test's first call leaves that call gated. DARK_FOLLOW_MODE is now off for the suite the way KNOWN_LANE_MODE is, and the known-lane fixture turns it off again per test for a daemon armed while another file had a lane on, before the reset that drains any pass in flight. Tests that exercise dark following already set the mode themselves. The fixture's clock comment is trimmed to the reason the reset stands; the ordering story it told was the first guess at this. ClickUp: 123zgec3130 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Babissimo
added a commit
that referenced
this pull request
Sep 15, 2026
test_interval_gate_holds_between_passes asserts that its first maybe_run_pass runs, and under xdist that assertion fails now and then with the attempt count still 0 (2026-09-06, 2026-09-15 on #389, and twice in a row on #403, all diffs that never touched the backend). conftest turns KNOWN_LANE_MODE off for the suite so the solver worker daemons every TestClient lifespan leaks do not poll the pass, but DARK_FOLLOW_MODE keeps its "shadow" default, lanes_armed() is true when either lane is on, and maybe_run_pass returns early only when both are off. So every leaked daemon takes the pass lock, stamps the pass clock and runs an empty dark-follow pass every two seconds, and one landing between the fixture's clock reset and the test's first call leaves that call gated. DARK_FOLLOW_MODE is now off for the suite the way KNOWN_LANE_MODE is, and the known-lane fixture turns it off again per test for a daemon armed while another file had a lane on, before the reset that drains any pass in flight. Tests that exercise dark following already set the mode themselves. The fixture's clock comment is trimmed to the reason the reset stands; the ordering story it told was the first guess at this. ClickUp: 123zgec3130 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
jehanazad
pushed a commit
that referenced
this pull request
Sep 15, 2026
…406) test_interval_gate_holds_between_passes asserts that its first maybe_run_pass runs, and under xdist that assertion fails now and then with the attempt count still 0 (2026-09-06, 2026-09-15 on #389, and twice in a row on #403, all diffs that never touched the backend). conftest turns KNOWN_LANE_MODE off for the suite so the solver worker daemons every TestClient lifespan leaks do not poll the pass, but DARK_FOLLOW_MODE keeps its "shadow" default, lanes_armed() is true when either lane is on, and maybe_run_pass returns early only when both are off. So every leaked daemon takes the pass lock, stamps the pass clock and runs an empty dark-follow pass every two seconds, and one landing between the fixture's clock reset and the test's first call leaves that call gated. DARK_FOLLOW_MODE is now off for the suite the way KNOWN_LANE_MODE is, and the known-lane fixture turns it off again per test for a daemon armed while another file had a lane on, before the reset that drains any pass in flight. Tests that exercise dark following already set the mode themselves. The fixture's clock comment is trimmed to the reason the reset stands; the ordering story it told was the first guess at this. ClickUp: 123zgec3130 Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ticket: https://app.clickup.com/t/123zgec2zw1
Split out of
86capx9mv, which covered the API dedup and is separately verified and ready to close.Scope narrowed on review. This PR was originally the UI removal and the
${HOST_LEGACY_REDIRECT}vhost removal. The vhost half has been split into a child PR because it carries a risk this one does not (see below). This PR now changes no nginx config at all.Why now
The Cloudflare origin rules moved
towers.retina.fm,staging-towers,test-towersand the fleet'stower-finder.retina.fmonto port 8443 on 2026-09-14. All four names now reach tower-finder-service's own edge, which serves its own SPA. None of them reach this repo.Why the copy here was dead, not merely redundant
frontend/distis served onHOST_MAIN,HOST_MAPandHOST_TESTMAPonly. Dash and admin servedashboard/dist, a different app.isMapDomainalready hid the tower tab on map and testmap, so onceHOST_MAINflipped away the tab was reachable on no live surface.The service's copy had also moved well ahead of ours (
SearchForm.tsx356 lines there against 212 here), gaining address geocoding, rank tiers, expected-area ranking and a workingfrequenciesparameter. Keeping ours invited exactly the split-brain86capx9mvwas raised to end.What goes
App.cssthat styled only them.fetchTowers/fetchElevationand the three tower types.Apprenders one surface unconditionally. That settles by deletion the "Tower Finder" display label left open during the rename.What does not change
No nginx, deploy or compose changes. Every vhost keeps forwarding
/api/towers,/api/elevationand/api/configto the service exactly as before, and the${HOST_LEGACY_REDIRECT}vhost carrying the fleet's name stays. While it stays, deleting the Cloudflare origin rule remains a working rollback for the fleet.That removal is the child PR, which should merge only once the flip is trusted enough to give that rollback up. The template declares no
default_serveron 443, so with that vhost gone an unmatchedtower-finder.retina.fmwould fall through to the first 443 block, the towers SPA, and answer a node with HTML and a 200 rather than JSON.Verification
pre-commit run --all-filespasses (ruff, ruff format, vulture, both shared-config checks).tsc --noEmitclean on src and e2e;eslintreports only the 5 pre-existingLiveAircraftMapwarnings.vite buildsucceeds.test_towers_vhost_coverage.pyandtest_nginx_rewrite_ordering.pypass (8 tests), unchanged by this PR.deploy/check-env-parity.pypasses.🤖 Generated with Claude Code