diff --git a/.agent/phases/todo/30_document_summaries/00_phase.md b/.agent/phases/complete/30_document_summaries/00_phase.md similarity index 100% rename from .agent/phases/todo/30_document_summaries/00_phase.md rename to .agent/phases/complete/30_document_summaries/00_phase.md diff --git a/.agent/phases/todo/30_document_summaries/06_mock_and_e2e.md b/.agent/phases/complete/30_document_summaries/06_mock_and_e2e.md similarity index 100% rename from .agent/phases/todo/30_document_summaries/06_mock_and_e2e.md rename to .agent/phases/complete/30_document_summaries/06_mock_and_e2e.md diff --git a/.agent/phases/todo/31_kb_overview_prompt/00_phase.md b/.agent/phases/complete/31_kb_overview_prompt/00_phase.md similarity index 100% rename from .agent/phases/todo/31_kb_overview_prompt/00_phase.md rename to .agent/phases/complete/31_kb_overview_prompt/00_phase.md diff --git a/.agent/phases/todo/31_kb_overview_prompt/05_mock_and_e2e.md b/.agent/phases/complete/31_kb_overview_prompt/05_mock_and_e2e.md similarity index 100% rename from .agent/phases/todo/31_kb_overview_prompt/05_mock_and_e2e.md rename to .agent/phases/complete/31_kb_overview_prompt/05_mock_and_e2e.md diff --git a/.agent/phases/todo/32_admin_sync_button/00_phase.md b/.agent/phases/complete/32_admin_sync_button/00_phase.md similarity index 100% rename from .agent/phases/todo/32_admin_sync_button/00_phase.md rename to .agent/phases/complete/32_admin_sync_button/00_phase.md diff --git a/.agent/phases/todo/32_admin_sync_button/03_e2e_and_docs.md b/.agent/phases/complete/32_admin_sync_button/03_e2e_and_docs.md similarity index 100% rename from .agent/phases/todo/32_admin_sync_button/03_e2e_and_docs.md rename to .agent/phases/complete/32_admin_sync_button/03_e2e_and_docs.md diff --git a/.agent/phases/todo/33_cache_busting/00_phase.md b/.agent/phases/complete/33_cache_busting/00_phase.md similarity index 100% rename from .agent/phases/todo/33_cache_busting/00_phase.md rename to .agent/phases/complete/33_cache_busting/00_phase.md diff --git a/.agent/phases/todo/33_cache_busting/03_e2e_and_docs.md b/.agent/phases/complete/33_cache_busting/03_e2e_and_docs.md similarity index 100% rename from .agent/phases/todo/33_cache_busting/03_e2e_and_docs.md rename to .agent/phases/complete/33_cache_busting/03_e2e_and_docs.md diff --git a/.agent/phases/todo/34_consistent_navbar/00_phase.md b/.agent/phases/complete/34_consistent_navbar/00_phase.md similarity index 100% rename from .agent/phases/todo/34_consistent_navbar/00_phase.md rename to .agent/phases/complete/34_consistent_navbar/00_phase.md diff --git a/.agent/phases/todo/34_consistent_navbar/01_steering_moves_to_module.md b/.agent/phases/complete/34_consistent_navbar/01_steering_moves_to_module.md similarity index 100% rename from .agent/phases/todo/34_consistent_navbar/01_steering_moves_to_module.md rename to .agent/phases/complete/34_consistent_navbar/01_steering_moves_to_module.md diff --git a/.agent/phases/todo/34_consistent_navbar/02_sync_and_chat_moves_to_module.md b/.agent/phases/complete/34_consistent_navbar/02_sync_and_chat_moves_to_module.md similarity index 100% rename from .agent/phases/todo/34_consistent_navbar/02_sync_and_chat_moves_to_module.md rename to .agent/phases/complete/34_consistent_navbar/02_sync_and_chat_moves_to_module.md diff --git a/.agent/phases/todo/34_consistent_navbar/03_full_header_all_pages.md b/.agent/phases/complete/34_consistent_navbar/03_full_header_all_pages.md similarity index 100% rename from .agent/phases/todo/34_consistent_navbar/03_full_header_all_pages.md rename to .agent/phases/complete/34_consistent_navbar/03_full_header_all_pages.md diff --git a/.agent/phases/todo/34_consistent_navbar/04_viewer_titlebar_styles.md b/.agent/phases/complete/34_consistent_navbar/04_viewer_titlebar_styles.md similarity index 100% rename from .agent/phases/todo/34_consistent_navbar/04_viewer_titlebar_styles.md rename to .agent/phases/complete/34_consistent_navbar/04_viewer_titlebar_styles.md diff --git a/.agent/phases/todo/34_consistent_navbar/05_e2e_and_contract_update.md b/.agent/phases/complete/34_consistent_navbar/05_e2e_and_contract_update.md similarity index 100% rename from .agent/phases/todo/34_consistent_navbar/05_e2e_and_contract_update.md rename to .agent/phases/complete/34_consistent_navbar/05_e2e_and_contract_update.md diff --git a/.agent/phases/todo/35_git_sources_admin/00_phase.md b/.agent/phases/complete/35_git_sources_admin/00_phase.md similarity index 100% rename from .agent/phases/todo/35_git_sources_admin/00_phase.md rename to .agent/phases/complete/35_git_sources_admin/00_phase.md diff --git a/.agent/phases/todo/35_git_sources_admin/01_model_and_migration.md b/.agent/phases/complete/35_git_sources_admin/01_model_and_migration.md similarity index 100% rename from .agent/phases/todo/35_git_sources_admin/01_model_and_migration.md rename to .agent/phases/complete/35_git_sources_admin/01_model_and_migration.md diff --git a/.agent/phases/todo/35_git_sources_admin/02_git_sources_api.md b/.agent/phases/complete/35_git_sources_admin/02_git_sources_api.md similarity index 100% rename from .agent/phases/todo/35_git_sources_admin/02_git_sources_api.md rename to .agent/phases/complete/35_git_sources_admin/02_git_sources_api.md diff --git a/.agent/phases/todo/35_git_sources_admin/03_sync_and_importer_use_db.md b/.agent/phases/complete/35_git_sources_admin/03_sync_and_importer_use_db.md similarity index 100% rename from .agent/phases/todo/35_git_sources_admin/03_sync_and_importer_use_db.md rename to .agent/phases/complete/35_git_sources_admin/03_sync_and_importer_use_db.md diff --git a/.agent/phases/todo/35_git_sources_admin/04_admin_page.md b/.agent/phases/complete/35_git_sources_admin/04_admin_page.md similarity index 100% rename from .agent/phases/todo/35_git_sources_admin/04_admin_page.md rename to .agent/phases/complete/35_git_sources_admin/04_admin_page.md diff --git a/.agent/phases/todo/35_git_sources_admin/05_nav_link.md b/.agent/phases/complete/35_git_sources_admin/05_nav_link.md similarity index 100% rename from .agent/phases/todo/35_git_sources_admin/05_nav_link.md rename to .agent/phases/complete/35_git_sources_admin/05_nav_link.md diff --git a/.agent/phases/todo/35_git_sources_admin/06_e2e_and_docs.md b/.agent/phases/complete/35_git_sources_admin/06_e2e_and_docs.md similarity index 100% rename from .agent/phases/todo/35_git_sources_admin/06_e2e_and_docs.md rename to .agent/phases/complete/35_git_sources_admin/06_e2e_and_docs.md diff --git a/.agent/phases/todo/36_summary_in_viewer/00_phase.md b/.agent/phases/complete/36_summary_in_viewer/00_phase.md similarity index 100% rename from .agent/phases/todo/36_summary_in_viewer/00_phase.md rename to .agent/phases/complete/36_summary_in_viewer/00_phase.md diff --git a/.agent/phases/todo/36_summary_in_viewer/01_content_api_summary_field.md b/.agent/phases/complete/36_summary_in_viewer/01_content_api_summary_field.md similarity index 100% rename from .agent/phases/todo/36_summary_in_viewer/01_content_api_summary_field.md rename to .agent/phases/complete/36_summary_in_viewer/01_content_api_summary_field.md diff --git a/.agent/phases/todo/36_summary_in_viewer/02_viewer_summary_panel.md b/.agent/phases/complete/36_summary_in_viewer/02_viewer_summary_panel.md similarity index 100% rename from .agent/phases/todo/36_summary_in_viewer/02_viewer_summary_panel.md rename to .agent/phases/complete/36_summary_in_viewer/02_viewer_summary_panel.md diff --git a/.agent/phases/todo/36_summary_in_viewer/03_e2e_and_regression.md b/.agent/phases/complete/36_summary_in_viewer/03_e2e_and_regression.md similarity index 100% rename from .agent/phases/todo/36_summary_in_viewer/03_e2e_and_regression.md rename to .agent/phases/complete/36_summary_in_viewer/03_e2e_and_regression.md diff --git a/.agent/phases/todo/39_configurable_brand/00_phase.md b/.agent/phases/complete/39_configurable_brand/00_phase.md similarity index 100% rename from .agent/phases/todo/39_configurable_brand/00_phase.md rename to .agent/phases/complete/39_configurable_brand/00_phase.md diff --git a/.agent/phases/todo/39_configurable_brand/03_e2e_docs_commit.md b/.agent/phases/complete/39_configurable_brand/03_e2e_docs_commit.md similarity index 100% rename from .agent/phases/todo/39_configurable_brand/03_e2e_docs_commit.md rename to .agent/phases/complete/39_configurable_brand/03_e2e_docs_commit.md diff --git a/.agent/phases/todo/40_tuning_toggle_flash/00_phase.md b/.agent/phases/todo/40_tuning_toggle_flash/00_phase.md new file mode 100644 index 0000000..e84d255 --- /dev/null +++ b/.agent/phases/todo/40_tuning_toggle_flash/00_phase.md @@ -0,0 +1,37 @@ +# 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:** `.agent/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) — the `fetchIsAdmin()` gate, the ship-hidden nav contract, and the module-owned steering controls this task modifies. + +## Tasks +1. `01_toggle_ships_hidden.md` — add `hidden` to `#steering-toggle` in all six pages and reveal-for-admin in `header.js`; pin at source level. +2. `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` — `hidden` present on `#steering-toggle` in all six HTML pages; `header.js` unhides for admin (line before `refreshSteering()`) and the anonymous `remove()` path is intact; any existing source-pin test asserting the exact old markup is updated (check `tests/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 pytest` green; `uv run pytest --cov=app --cov-report=term-missing` TOTAL unchanged. +- [ ] `uv run pytest tests/e2e/test_tuning_toggle_flash.py -v --no-cov` green 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 pyright` clean. +- [ ] UI Structure Check (AGENTS.md rule 5): no new focus targets; landmarks/contrast unchanged; no CDN. +- [ ] One `--no-gpg-sign` commit; phase dir moved `.agent/phases/todo/` → `.agent/phases/complete/`. + +## Locked decisions +- **A10 untouched** — no API change; the fix is pure UI visibility off the existing `/api/whoami` gate. +- **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. diff --git a/.agent/phases/todo/40_tuning_toggle_flash/01_toggle_ships_hidden.md b/.agent/phases/todo/40_tuning_toggle_flash/01_toggle_ships_hidden.md new file mode 100644 index 0000000..2b1fdc7 --- /dev/null +++ b/.agent/phases/todo/40_tuning_toggle_flash/01_toggle_ships_hidden.md @@ -0,0 +1,26 @@ +# Task 01 — Toggle ships hidden, admin-only reveal + +**Phase:** `40_tuning_toggle_flash` · **Source:** `TODO.md:3` — "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:** `.agent/user_stories/tuning-toggle-flash.md` + +## Objective +Ship `#steering-toggle` `hidden` in all six pages and unhide it in `header.js` only when whoami says admin — zero flash for anonymous, identical admin UX. + +## Work +1. `frontend/index.html`, `frontend/sources.html`, `frontend/document.html`, `frontend/git-sources.html`, `frontend/login.html`, `frontend/tuning.html` — add the `hidden` attribute to the existing `#steering-toggle` `