From e228b61e7976da9f16c28d4a7b6e1b1e5550c062 Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Sat, 27 Jun 2026 17:31:06 -0400 Subject: [PATCH 1/2] fix(dashboard): derive per-project setup URL from live origin --- headroom/dashboard/templates/dashboard.html | 2 +- tests/test_dashboard_cache_ttl_playwright.py | 25 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/headroom/dashboard/templates/dashboard.html b/headroom/dashboard/templates/dashboard.html index 168fa73e2..1aa01f8cb 100644 --- a/headroom/dashboard/templates/dashboard.html +++ b/headroom/dashboard/templates/dashboard.html @@ -1180,7 +1180,7 @@

HEADROOM

No per-project data yet.
Add to each project's .claude/settings.local.json:
- ANTHROPIC_BASE_URL: http://127.0.0.1:8787/p/<project-name> +
diff --git a/tests/test_dashboard_cache_ttl_playwright.py b/tests/test_dashboard_cache_ttl_playwright.py index 7144aa55b..b9cfa4097 100644 --- a/tests/test_dashboard_cache_ttl_playwright.py +++ b/tests/test_dashboard_cache_ttl_playwright.py @@ -187,6 +187,31 @@ def handler(route) -> None: # type: ignore[no-untyped-def] page.route("**/*", handler) +def test_dashboard_per_project_setup_url_uses_current_origin() -> None: + with sync_playwright() as pw: + browser = pw.chromium.launch() + page = browser.new_page(viewport={"width": 1720, "height": 1400}, color_scheme="dark") + _install_dashboard_routes(page) + + page.goto("http://127.0.0.1:8788/dashboard", wait_until="load") + expect( + page.get_by_text("ANTHROPIC_BASE_URL: http://127.0.0.1:8788/p/", exact=True) + ).to_be_visible() + expect( + page.get_by_text("ANTHROPIC_BASE_URL: http://127.0.0.1:8787/p/", exact=True) + ).to_have_count(0) + + page.goto("http://headroom.local:9393/dashboard", wait_until="load") + expect( + page.get_by_text("ANTHROPIC_BASE_URL: http://headroom.local:9393/p/", exact=True) + ).to_be_visible() + expect( + page.get_by_text("ANTHROPIC_BASE_URL: http://127.0.0.1:8787/p/", exact=True) + ).to_have_count(0) + + browser.close() + + def test_dashboard_renders_observed_ttl_metrics_and_can_capture_screenshot() -> None: artifact_dir = os.environ.get("HEADROOM_PLAYWRIGHT_ARTIFACT_DIR") From 3e487d09a765c0eef649b91267e5767cb7b315ca Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Sat, 27 Jun 2026 17:42:15 -0400 Subject: [PATCH 2/2] fix(dashboard): satisfy CI formatting gate for origin hint proof --- tests/test_dashboard_cache_ttl_playwright.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/test_dashboard_cache_ttl_playwright.py b/tests/test_dashboard_cache_ttl_playwright.py index b9cfa4097..a2ae2ad88 100644 --- a/tests/test_dashboard_cache_ttl_playwright.py +++ b/tests/test_dashboard_cache_ttl_playwright.py @@ -195,18 +195,26 @@ def test_dashboard_per_project_setup_url_uses_current_origin() -> None: page.goto("http://127.0.0.1:8788/dashboard", wait_until="load") expect( - page.get_by_text("ANTHROPIC_BASE_URL: http://127.0.0.1:8788/p/", exact=True) + page.get_by_text( + "ANTHROPIC_BASE_URL: http://127.0.0.1:8788/p/", exact=True + ) ).to_be_visible() expect( - page.get_by_text("ANTHROPIC_BASE_URL: http://127.0.0.1:8787/p/", exact=True) + page.get_by_text( + "ANTHROPIC_BASE_URL: http://127.0.0.1:8787/p/", exact=True + ) ).to_have_count(0) page.goto("http://headroom.local:9393/dashboard", wait_until="load") expect( - page.get_by_text("ANTHROPIC_BASE_URL: http://headroom.local:9393/p/", exact=True) + page.get_by_text( + "ANTHROPIC_BASE_URL: http://headroom.local:9393/p/", exact=True + ) ).to_be_visible() expect( - page.get_by_text("ANTHROPIC_BASE_URL: http://127.0.0.1:8787/p/", exact=True) + page.get_by_text( + "ANTHROPIC_BASE_URL: http://127.0.0.1:8787/p/", exact=True + ) ).to_have_count(0) browser.close()