From 02c76ad328e2fe28a6b7d42f50ea40c1f1820dfb Mon Sep 17 00:00:00 2001 From: ducoterra Date: Thu, 27 Aug 2026 18:25:53 -0400 Subject: [PATCH] =?UTF-8?q?chore(agent):=20phase=20roadmap=20from=20TODO.m?= =?UTF-8?q?d=20=E2=80=94=208=20phases=20(40=E2=80=9347),=2024=20tasks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Converts the 9 TODO items into an executable phase roadmap (Protocol B, appended after phase 39): - 40 tuning toggle anonymous flash (TODO L3) - 41 sync fail-fast + modal when a model is down (TODO L4) - 42 no reply autoscroll (TODO L5) - 43 thinking scroll back — user scroll + gated autoscroll (TODO L7) - 44 markdown tables (TODO L6) - 45 agent unlimited tool calls behind BOR_AGENT_MAX_ROUNDS (TODO L8) - 46 mobile hamburger nav (TODO L9) - 47 quadlet + jinja import formats, A9 revision (TODO L10–L11) Each phase carries a user story, a dedicated Playwright E2E suite plan, and owner-locked decisions (R1 A9 format extension, R2 phase-37 budget revision, A1–A5 scope decisions) confirmed 2026-08-27. Also records the completed phases 30–39 todo/ -> complete/ moves that were pending in the working tree. TODO.md is cleared (items now live in .agent/phases/todo/). --- .../30_document_summaries/00_phase.md | 0 .../30_document_summaries/06_mock_and_e2e.md | 0 .../31_kb_overview_prompt/00_phase.md | 0 .../31_kb_overview_prompt/05_mock_and_e2e.md | 0 .../32_admin_sync_button/00_phase.md | 0 .../32_admin_sync_button/03_e2e_and_docs.md | 0 .../33_cache_busting/00_phase.md | 0 .../33_cache_busting/03_e2e_and_docs.md | 0 .../34_consistent_navbar/00_phase.md | 0 .../01_steering_moves_to_module.md | 0 .../02_sync_and_chat_moves_to_module.md | 0 .../03_full_header_all_pages.md | 0 .../04_viewer_titlebar_styles.md | 0 .../05_e2e_and_contract_update.md | 0 .../35_git_sources_admin/00_phase.md | 0 .../01_model_and_migration.md | 0 .../02_git_sources_api.md | 0 .../03_sync_and_importer_use_db.md | 0 .../35_git_sources_admin/04_admin_page.md | 0 .../35_git_sources_admin/05_nav_link.md | 0 .../35_git_sources_admin/06_e2e_and_docs.md | 0 .../36_summary_in_viewer/00_phase.md | 0 .../01_content_api_summary_field.md | 0 .../02_viewer_summary_panel.md | 0 .../03_e2e_and_regression.md | 0 .../39_configurable_brand/00_phase.md | 0 .../03_e2e_docs_commit.md | 0 .../todo/40_tuning_toggle_flash/00_phase.md | 37 ++++++ .../01_toggle_ships_hidden.md | 26 +++++ .../02_flash_e2e_and_regression.md | 26 +++++ .../todo/41_sync_fail_fast_models/00_phase.md | 38 ++++++ .../01_model_probe_fail_fast.md | 37 ++++++ .../02_sync_error_modal.md | 29 +++++ .../03_model_down_e2e_and_commit.md | 28 +++++ .../todo/42_no_reply_autoscroll/00_phase.md | 36 ++++++ .../01_remove_autofollow.md | 35 ++++++ .../02_no_autoscroll_e2e_and_commit.md | 27 +++++ .../todo/43_thinking_scroll_back/00_phase.md | 38 ++++++ .../01_window_user_scrollable.md | 28 +++++ .../02_gated_bottom_pin.md | 59 ++++++++++ .../03_thinking_scroll_e2e_and_commit.md | 28 +++++ .../todo/44_markdown_tables/00_phase.md | 39 +++++++ .../01_table_renderer_and_styles.md | 40 +++++++ .../02_mock_table_trigger.md | 40 +++++++ .../03_tables_e2e_and_commit.md | 28 +++++ .../todo/45_agent_unlimited_tools/00_phase.md | 42 +++++++ .../01_config_round_cap.md | 52 +++++++++ .../02_mock_multi_read_flow.md | 27 +++++ .../03_unlimited_tools_e2e_and_commit.md | 39 +++++++ .../todo/46_mobile_hamburger_nav/00_phase.md | 40 +++++++ .../01_hamburger_markup_all_pages.md | 42 +++++++ .../02_toggle_behavior.md | 63 ++++++++++ .../03_hamburger_e2e_and_commit.md | 28 +++++ .../todo/47_quadlet_jinja_import/00_phase.md | 42 +++++++ .../01_config_formats.md | 29 +++++ .../02_chunker_dispatch_fixtures.md | 39 +++++++ .../03_importer_integration.md | 30 +++++ .../04_quadlet_e2e_and_docs_commit.md | 30 +++++ .agent/user_stories/agent-unlimited-tools.md | 103 ++++++++++++++++ .agent/user_stories/markdown-tables.md | 100 ++++++++++++++++ .agent/user_stories/mobile-hamburger-nav.md | 110 ++++++++++++++++++ .agent/user_stories/no-reply-autoscroll.md | 91 +++++++++++++++ .agent/user_stories/quadlet-jinja-import.md | 98 ++++++++++++++++ .agent/user_stories/sync-model-fail-fast.md | 97 +++++++++++++++ .agent/user_stories/thinking-scroll-back.md | 98 ++++++++++++++++ .agent/user_stories/tuning-toggle-flash.md | 87 ++++++++++++++ 66 files changed, 1906 insertions(+) rename .agent/phases/{todo => complete}/30_document_summaries/00_phase.md (100%) rename .agent/phases/{todo => complete}/30_document_summaries/06_mock_and_e2e.md (100%) rename .agent/phases/{todo => complete}/31_kb_overview_prompt/00_phase.md (100%) rename .agent/phases/{todo => complete}/31_kb_overview_prompt/05_mock_and_e2e.md (100%) rename .agent/phases/{todo => complete}/32_admin_sync_button/00_phase.md (100%) rename .agent/phases/{todo => complete}/32_admin_sync_button/03_e2e_and_docs.md (100%) rename .agent/phases/{todo => complete}/33_cache_busting/00_phase.md (100%) rename .agent/phases/{todo => complete}/33_cache_busting/03_e2e_and_docs.md (100%) rename .agent/phases/{todo => complete}/34_consistent_navbar/00_phase.md (100%) rename .agent/phases/{todo => complete}/34_consistent_navbar/01_steering_moves_to_module.md (100%) rename .agent/phases/{todo => complete}/34_consistent_navbar/02_sync_and_chat_moves_to_module.md (100%) rename .agent/phases/{todo => complete}/34_consistent_navbar/03_full_header_all_pages.md (100%) rename .agent/phases/{todo => complete}/34_consistent_navbar/04_viewer_titlebar_styles.md (100%) rename .agent/phases/{todo => complete}/34_consistent_navbar/05_e2e_and_contract_update.md (100%) rename .agent/phases/{todo => complete}/35_git_sources_admin/00_phase.md (100%) rename .agent/phases/{todo => complete}/35_git_sources_admin/01_model_and_migration.md (100%) rename .agent/phases/{todo => complete}/35_git_sources_admin/02_git_sources_api.md (100%) rename .agent/phases/{todo => complete}/35_git_sources_admin/03_sync_and_importer_use_db.md (100%) rename .agent/phases/{todo => complete}/35_git_sources_admin/04_admin_page.md (100%) rename .agent/phases/{todo => complete}/35_git_sources_admin/05_nav_link.md (100%) rename .agent/phases/{todo => complete}/35_git_sources_admin/06_e2e_and_docs.md (100%) rename .agent/phases/{todo => complete}/36_summary_in_viewer/00_phase.md (100%) rename .agent/phases/{todo => complete}/36_summary_in_viewer/01_content_api_summary_field.md (100%) rename .agent/phases/{todo => complete}/36_summary_in_viewer/02_viewer_summary_panel.md (100%) rename .agent/phases/{todo => complete}/36_summary_in_viewer/03_e2e_and_regression.md (100%) rename .agent/phases/{todo => complete}/39_configurable_brand/00_phase.md (100%) rename .agent/phases/{todo => complete}/39_configurable_brand/03_e2e_docs_commit.md (100%) create mode 100644 .agent/phases/todo/40_tuning_toggle_flash/00_phase.md create mode 100644 .agent/phases/todo/40_tuning_toggle_flash/01_toggle_ships_hidden.md create mode 100644 .agent/phases/todo/40_tuning_toggle_flash/02_flash_e2e_and_regression.md create mode 100644 .agent/phases/todo/41_sync_fail_fast_models/00_phase.md create mode 100644 .agent/phases/todo/41_sync_fail_fast_models/01_model_probe_fail_fast.md create mode 100644 .agent/phases/todo/41_sync_fail_fast_models/02_sync_error_modal.md create mode 100644 .agent/phases/todo/41_sync_fail_fast_models/03_model_down_e2e_and_commit.md create mode 100644 .agent/phases/todo/42_no_reply_autoscroll/00_phase.md create mode 100644 .agent/phases/todo/42_no_reply_autoscroll/01_remove_autofollow.md create mode 100644 .agent/phases/todo/42_no_reply_autoscroll/02_no_autoscroll_e2e_and_commit.md create mode 100644 .agent/phases/todo/43_thinking_scroll_back/00_phase.md create mode 100644 .agent/phases/todo/43_thinking_scroll_back/01_window_user_scrollable.md create mode 100644 .agent/phases/todo/43_thinking_scroll_back/02_gated_bottom_pin.md create mode 100644 .agent/phases/todo/43_thinking_scroll_back/03_thinking_scroll_e2e_and_commit.md create mode 100644 .agent/phases/todo/44_markdown_tables/00_phase.md create mode 100644 .agent/phases/todo/44_markdown_tables/01_table_renderer_and_styles.md create mode 100644 .agent/phases/todo/44_markdown_tables/02_mock_table_trigger.md create mode 100644 .agent/phases/todo/44_markdown_tables/03_tables_e2e_and_commit.md create mode 100644 .agent/phases/todo/45_agent_unlimited_tools/00_phase.md create mode 100644 .agent/phases/todo/45_agent_unlimited_tools/01_config_round_cap.md create mode 100644 .agent/phases/todo/45_agent_unlimited_tools/02_mock_multi_read_flow.md create mode 100644 .agent/phases/todo/45_agent_unlimited_tools/03_unlimited_tools_e2e_and_commit.md create mode 100644 .agent/phases/todo/46_mobile_hamburger_nav/00_phase.md create mode 100644 .agent/phases/todo/46_mobile_hamburger_nav/01_hamburger_markup_all_pages.md create mode 100644 .agent/phases/todo/46_mobile_hamburger_nav/02_toggle_behavior.md create mode 100644 .agent/phases/todo/46_mobile_hamburger_nav/03_hamburger_e2e_and_commit.md create mode 100644 .agent/phases/todo/47_quadlet_jinja_import/00_phase.md create mode 100644 .agent/phases/todo/47_quadlet_jinja_import/01_config_formats.md create mode 100644 .agent/phases/todo/47_quadlet_jinja_import/02_chunker_dispatch_fixtures.md create mode 100644 .agent/phases/todo/47_quadlet_jinja_import/03_importer_integration.md create mode 100644 .agent/phases/todo/47_quadlet_jinja_import/04_quadlet_e2e_and_docs_commit.md create mode 100644 .agent/user_stories/agent-unlimited-tools.md create mode 100644 .agent/user_stories/markdown-tables.md create mode 100644 .agent/user_stories/mobile-hamburger-nav.md create mode 100644 .agent/user_stories/no-reply-autoscroll.md create mode 100644 .agent/user_stories/quadlet-jinja-import.md create mode 100644 .agent/user_stories/sync-model-fail-fast.md create mode 100644 .agent/user_stories/thinking-scroll-back.md create mode 100644 .agent/user_stories/tuning-toggle-flash.md 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` `