Standardize on the .agents/ directory (shared with project skills): phases/, user_stories/, reports/, screenshots/, validate.sh, and phase-sessions/ + pipeline.log all move to .agents/ (git mv preserves history; runtime artifacts move alongside). Updates every reference in AGENTS.md, README.md, .gitignore, app docstrings, and test story headers. Historical KB content in data/ and the runtime pipeline.log transcript are left untouched.
3.4 KiB
Phase 40 — Tuning toggle anonymous flash
Source: TODO.md L3 — "Loading the page briefly shows the 'Tuning' button in the header even when the user isn't authenticated. Only show that if the user is authenticated."
Story: .agents/user_stories/tuning-toggle-flash.md
Context: Phase 15/34 shared header (frontend/assets/header.js owns #steering-toggle / #steering-panel on all six pages; anonymous → remove() post-whoami). The admin-only nav links already ship hidden (phase-19 contract) — the flashing control is the steering toggle button labeled "Tuning", which ships visible in all six pages and is removed only after /api/whoami resolves.
Objective
Kill the anonymous flash: the tuning toggle ships hidden in every page's markup and is revealed only when whoami says admin (the exact ship-hidden / reveal-for-admin contract the nav links use), so an anonymous user never sees the "Tuning" button — not for a single frame.
Dependencies
39_configurable_brand(complete; last existing phase) — current header state: full shared bar on all six pages.19_shared_header/16_admin_auth/34_consistent_navbar(complete) — thefetchIsAdmin()gate, the ship-hidden nav contract, and the module-owned steering controls this task modifies.
Tasks
01_toggle_ships_hidden.md— addhiddento#steering-togglein all six pages and reveal-for-admin inheader.js; pin at source level.02_flash_e2e_and_regression.md— story E2E suite (never-visible-for-anonymous, admin reveal, nav-contract regression) + regression pass + commit.
Testing & Quality
- Unit: new
tests/unit/test_steering_toggle_visibility.py—hiddenpresent on#steering-togglein all six HTML pages;header.jsunhides for admin (line beforerefreshSteering()) and the anonymousremove()path is intact; any existing source-pin test asserting the exact old markup is updated (checktests/unit/test_shared_header.py,test_steering.py). - Coverage: frontend-only — the
app/>90% gate is unaffected (must stay unchanged). - E2E (mandatory, A16):
tests/e2e/test_tuning_toggle_flash.py, run in isolation.
Completion Criteria
- Anonymous load of every page: the toggle is never visible (MutationObserver records zero visible frames) and is absent from the DOM after load.
- Admin load: toggle visible, panel opens, count badge correct — admin behavior unchanged.
uv run pytestgreen;uv run pytest --cov=app --cov-report=term-missingTOTAL unchanged.uv run pytest tests/e2e/test_tuning_toggle_flash.py -v --no-covgreen in isolation.- Regression E2E suites green in isolation:
test_shared_header.py,test_global_tuning.py,test_steering.py,test_tuning_nav_link.py,test_smoke.py. uv run ruff check . && uv run pyrightclean.- UI Structure Check (AGENTS.md rule 5): no new focus targets; landmarks/contrast unchanged; no CDN.
- One
--no-gpg-signcommit; phase dir moved.agents/phases/todo/→.agents/phases/complete/.
Locked decisions
- A10 untouched — no API change; the fix is pure UI visibility off the existing
/api/whoamigate. - A11 untouched — no new assets, no CDN.
- Phase-16 contract preserved — anonymous still gets "absent, not hidden" (remove-from-DOM); this phase only removes the pre-whoami flash window.
- A16/A17 honoured — one story E2E suite, one atomic commit.