diff --git a/docs/implplan/SPRINT_20260307_027_FE_zero_learning_search_surface_collapse.md b/docs/implplan/SPRINT_20260307_027_FE_zero_learning_search_surface_collapse.md index cb9bc8016..e80168372 100644 --- a/docs/implplan/SPRINT_20260307_027_FE_zero_learning_search_surface_collapse.md +++ b/docs/implplan/SPRINT_20260307_027_FE_zero_learning_search_surface_collapse.md @@ -17,7 +17,7 @@ ## Delivery Tracker ### FE-SC-101 - Collapse empty-state education -Status: TODO +Status: DONE Dependency: none Owners: Developer Task description: @@ -25,12 +25,12 @@ Task description: - Replace them with a small set of viable, page-aware search starts only when useful. Completion criteria: -- [ ] Empty-state UI does not present domain cards or "learn Stella" quick links as the main action. -- [ ] Suggestions shown in the empty state remain executable and page-aware. -- [ ] Search history remains successful-only and is visually low-emphasis. +- [x] Empty-state UI does not present domain cards or "learn Stella" quick links as the main action. +- [x] Suggestions shown in the empty state remain executable and page-aware. +- [x] Search history remains successful-only and is visually low-emphasis. ### FE-SC-102 - Simplify in-result cues -Status: TODO +Status: DONE Dependency: FE-SC-101 Owners: Developer Task description: @@ -38,12 +38,12 @@ Task description: - Stop explaining scope weighting mechanics in the main flow; show the better in-scope answer first, then overflow only when needed. Completion criteria: -- [ ] `Did you mean` is visually attached to the input. -- [ ] Scope weighting hints are removed or translated into plain operator-facing result labels. -- [ ] Overflow only appears when present and is visually secondary to the best in-scope answer. +- [x] `Did you mean` is visually attached to the input. +- [x] Scope weighting hints are removed or translated into plain operator-facing result labels. +- [x] Overflow only appears when present and is visually secondary to the best in-scope answer. ### FE-SC-103 - Harden suggestion and history behavior -Status: TODO +Status: DONE Dependency: FE-SC-102 Owners: Developer, Test Automation Task description: @@ -51,14 +51,15 @@ Task description: - Exercise user flows that previously felt broken from the empty state. Completion criteria: -- [ ] No-result queries do not reappear in rendered history. -- [ ] Suggestion clicks from the empty state remain non-dead-end flows. -- [ ] Playwright covers history, suggestions, did-you-mean placement, and overflow presentation. +- [x] No-result queries do not reappear in rendered history. +- [x] Suggestion clicks from the empty state remain non-dead-end flows. +- [x] Playwright covers history, suggestions, did-you-mean placement, and overflow presentation. ## Execution Log | Date (UTC) | Update | Owner | | --- | --- | --- | | 2026-03-07 | Sprint created from operator feedback that the search surface still teaches too much of Stella instead of simply helping. | Project Manager | +| 2026-03-07 | Removed domain-guide and quick-link empty-state panels, collapsed starters into a single executable list, kept only recent successful history plus page context, and verified with targeted Angular tests and the full search Playwright pack including live Doctor ingestion. | Developer | ## Decisions & Risks - Decision: the empty state should help the operator start, not explain Stella's information architecture. diff --git a/docs/modules/ui/search-zero-learning-primary-entry.md b/docs/modules/ui/search-zero-learning-primary-entry.md index e77ea699d..e4c2ea620 100644 --- a/docs/modules/ui/search-zero-learning-primary-entry.md +++ b/docs/modules/ui/search-zero-learning-primary-entry.md @@ -96,6 +96,8 @@ - Fail fast when corpus rebuild/readiness is missing so dead suggestions are treated as setup failures, not flaky UI tests. ## Current state -- Implemented before the corrective phases: explicit scope/mode/recovery controls were removed from the main search flow, implicit current-scope weighting and overflow contracts were added, and suggestion viability preflight now suppresses dead chips before render. +- Implemented from the corrective phases: search now opens AdvisoryAI through a shell-level drawer with no route jump, restores focus back to search when the drawer closes, and removes visible assistant mode framing. +- Implemented from the corrective phases: the empty state no longer teaches Stella taxonomy through domain guides or quick links; it now keeps only current-page context, successful recent searches, and executable starter chips. +- Implemented before and during the corrective phases: explicit scope/mode/recovery controls were removed from the main search flow, implicit current-scope weighting and overflow contracts were added, and suggestion viability preflight now suppresses dead chips before render. - Implemented before the corrective phases: the live Doctor suggestion suite now rebuilds the active corpus, fails on empty knowledge projections, iterates every surfaced suggestion, and verifies Ask-AdvisoryAI inherits the live search context. -- Still pending from the corrective phases: shell-level assistant unification, assistant de-mode-ing, empty-state collapse, broader live-page matrices, and explicit client-side telemetry opt-out. +- Still pending from the corrective phases: broader live-page matrices, stronger backend ranking/blending refinement across more domains, and explicit client-side telemetry opt-out. diff --git a/src/Web/StellaOps.Web/src/app/layout/global-search/global-search.component.ts b/src/Web/StellaOps.Web/src/app/layout/global-search/global-search.component.ts index 559b45d5c..bb87d8af5 100644 --- a/src/Web/StellaOps.Web/src/app/layout/global-search/global-search.component.ts +++ b/src/Web/StellaOps.Web/src/app/layout/global-search/global-search.component.ts @@ -45,6 +45,10 @@ type SearchQuestionView = { query: string; kind: 'page' | 'clarify' | 'recent'; }; +type SearchStarterView = { + query: string; + kind: 'question' | 'suggestion'; +}; type SearchContextPanelView = { title: string; description: string; @@ -211,14 +215,10 @@ type SearchAnswerView = { } @else if (query().trim().length >= 1 && visibleCards().length === 0) {