feat(epic): folder-tree breadcrumb redesign — WebView2 breadcrumb UI backed by a live folder-hierarchy provider#357
Merged
drmoisan merged 30 commits intoJul 18, 2026
Conversation
Epic-planner manifest for the WebView2 breadcrumb redesign. Three children: 9101 live folder-hierarchy provider (wave 0, C3); 9102 EfcViewer WebView2 breadcrumb (wave 1, C4); 9103 QuickFiler WebView2 breadcrumb (wave 1, C4). issue_num values are provisional placeholders back-filled at promotion. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018s32dQa8QYDzJaCo3GuQ3z
Preparation-mode outputs for epic folder-tree-breadcrumb-redesign child feature 9101 (wave 0, complexity C3): promotion (issue #350), research, spec.md, user-story.md, and the preflight-cleared atomic plan. Scope: 9101 adds the IFolderHierarchyProvider contract, FolderBreadcrumbSegment DTO, a pure FolderTreeSnapshotQueries.GetAncestorChain helper, and a thin OutlookFolderHierarchyProvider facade over the existing IOutlookFolderTreeService seam (no new live-COM seam). It does not delete FolderSuggestionTree.BuildFromRows or FolderHierarchyBuilder.Build or rewire their UI callers, so it stays independently mergeable; removal/rewire is executed by consumers 9102/9103. Scoring/ranking and the feature 324 probability plumbing are unchanged. Atomic execution, PR authoring, and CI monitoring are out of scope for this preparation run and are executed later by epic-orchestrator. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018s32dQa8QYDzJaCo3GuQ3z
…hema Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018s32dQa8QYDzJaCo3GuQ3z
…9102) Preparation-mode outputs for epic child 9102 (folder-tree-breadcrumb-redesign, wave 1, band C4, depends_on 9101): promoted potential entry, active feature folder (issue.md, spec.md, user-story.md), task-researcher findings, and the preflight-cleared atomic plan (plan.2026-07-16T21-52.md). Behavioral WebView2 conversion targets the live EfcViewer + EfcFormController only; EfcViewer3 is dead code and receives a mechanical Designer-only swap. Consumes the 9101 live folder-hierarchy provider contract. Atomic execution, PR authoring, CI, and feature review are out of scope (executed later by epic-orchestrator). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018s32dQa8QYDzJaCo3GuQ3z
…h, spec, plan) Preparation-mode outputs for epic folder-tree-breadcrumb-redesign child feature #351 (wave 1, C4), fanned into the integration branch: - Promotion: issue #351 (full-feature), active folder docs/features/active/2026-07-16-quickfiler-breadcrumb-webview2-351/ - Research: re-verified ItemViewer is the single live QuickFiler viewer variant; documented CboFolders surface, the existing WebView2 message-body pattern, the new JS<->.NET bridge (none exists today), the 9101 provider contract (ASSUMED-PENDING-9101-MERGE), the percentage-obscuring defect hypothesis, and testability seams. - spec.md / user-story.md: full-feature documents (FR-1..FR-7, AC-1..AC-13, US-1..US-8), scope decision ItemViewer-only, 9101 dependency cited. - plan.2026-07-16T21-53.md: 8-phase atomic plan; MCP plan validator pass; atomic-executor preflight PREFLIGHT: ALL CLEAR. Atomic execution, PR authoring, and CI monitoring are out of scope for this preparation run and are executed later by epic-orchestrator. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018s32dQa8QYDzJaCo3GuQ3z
Back-fill folder-tree-breadcrumb-redesign manifest placeholders 9101/9102/9103 with the real promoted issue numbers 350/349/351 and resolved active feature folders. Add the epic-orchestrator kickoff artifact. All three child preparations are fanned in with PREFLIGHT: ALL CLEAR. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018s32dQa8QYDzJaCo3GuQ3z
Introduce the epic's shared upstream contract for the folder-tree breadcrumb redesign (wave 0): - IFolderHierarchyProvider: ancestor-chain, immediate-subfolders, and path-resolution queries returning breadcrumb segments. - FolderBreadcrumbSegment: immutable, net48-safe, probability-free DTO. - OutlookFolderHierarchyProvider: host-neutral facade over the reused IOutlookFolderTreeService seam (no new COM code, not coverage-exempt). - FolderTreeSnapshotQueries.GetAncestorChain: pure root-to-leaf walk with a defensive cycle guard and documented invariants. Adds the provider without deleting the legacy prefix-matching methods or rewiring their UI callers, preserving wave-0 mergeability. Scoring and feature-324 probability plumbing are unchanged. MSTest + Moq + FluentAssertions; new production code coverage 96.92% (>= 90%), no repo floor regression. Toolchain green (csharpier, analyzers, nullable, tests). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
All three audits PASS with zero blocking findings; combined blocking_count 0, READY-TO-MERGE. Wave-0 mergeability boundary confirmed intact and new-code coverage 96.92%. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…rovider-350 feat(350): live Outlook folder-hierarchy provider contract
…trol Single-line breadcrumb per suggestion via WebView2 (HTML/CSS/JS) with JS<->.NET bridge; consumes the #350 IFolderHierarchyProvider contract for real subfolder listing; CSS flex fix keeps prediction percent always visible. Adds host-neutral row model/state machine, message codec, HTML renderer, bridge router with pre-init outbound queue, and 97 MSTest tests (new modules >= 90% line coverage). EfcViewer3 gets the mechanical Designer-only swap. Includes plan check-off, evidence artifacts, and AC updates. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…bview2-349 feat(349): replace EfcViewer folder tree with WebView2 breadcrumb control
…vior verified in child 349 Preserves the orchestrator agent-memory refinement from the epic child 349 run (PR #355): collect_pr_context writes pr_context.* to the session root even when workspace_root targets the agent worktree, and the portable SubagentStop gate is authoritative on integration-based branches. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…contract evidence Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…lysis Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…ovider shape for the breadcrumb consumer Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…Projection with unit tests Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…selection map with unit tests Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
… bridge coordinator with tests Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…ewer; reroute keyboard, theme, and controller surfaces Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…fication evidence Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…fact, delta verification, AC check-offs, evidence audit Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
… — blocking_count 0 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…e onto integration tip Sibling feature #349 (EfcViewer breadcrumb) introduced BreadcrumbRow and QuickFiler.Controllers.BreadcrumbBridgeRouter into the shared namespaces. Rename this feature's types to remove CS0101/CS0104 collisions: - BreadcrumbRow (inner row type of BreadcrumbStateModel) -> BreadcrumbStateRow - UtilitiesCS BreadcrumbBridgeRouter -> FolderBreadcrumbBridgeRouter (file moved, csproj updated) Identifier renames only; no behavior change. Full toolchain green in a single pass after rebase: csharpier clean, analyzer build 0 errors, nullable build 0 warnings, vstest 5049/5049 passed with coverage. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…ebview2-351 feat(351): QuickFiler WebView2 breadcrumb replaces CboFolders (epic: folder-tree-breadcrumb-redesign)
…ern from child 351 Preserves the orchestrator agent-memory entry written during the epic child 351 run (PR #356): sibling features executing in parallel against the same integration base can introduce colliding type names; resolve by renaming the later feature's own types during rebase, never editing sibling-owned files. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147fAkr46FBRGMUuyUbzQ9V
…dcrumb-redesign-integration
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
feat(epic): folder-tree breadcrumb redesign — WebView2 breadcrumb UI backed by a live folder-hierarchy provider
Summary
CboFoldersComboBox with a single-line breadcrumb control (Folder → SubFolder → Leaf) hosted in WebView2, with per-segment collapse, a leaf-anchored expand affordance listing real Outlook subfolders, and an always-visible prediction percentage.IFolderHierarchyProvider,FolderBreadcrumbSegment,OutlookFolderHierarchyProvider,FolderTreeSnapshotQueries.GetAncestorChain) behind an injectable seam, consumed by both UI surfaces (Feature: folder-hierarchy-live-provider #350).origin/main(dependabot package updates, includingMicrosoft.Web.WebView2 1.0.4078.44) merged into the integration branch before this PR so CI runs against current main.Why
The EfcViewer matching-folders control renders folder suggestions as an indented multi-row tree, which forces users to decode hierarchy from indentation and can push the prediction percentage out of view at small window sizes; the QuickFiler folder ComboBox gives no hierarchy context at all. Rendering each suggestion as a single-line breadcrumb anchored at the predicted leaf lets a user read the full filing location at a glance, expand a segment to reach subfolders that never ranked among the top suggestions, and always see the model's confidence. Hosting the control in WebView2 preserves the UI investment across the planned VSTO migration.
What Changed
Core feature — shared provider (#350)
IFolderHierarchyProvider(shared contract),FolderBreadcrumbSegment(immutable, net48-safe DTO),OutlookFolderHierarchyProvider(host-neutral facade over the reusedIOutlookFolderTreeServiceseam), and pureFolderTreeSnapshotQueries.GetAncestorChainwith cycle guard.Core feature — EfcViewer breadcrumb (#349)
Core feature — QuickFiler breadcrumb (#351)
CboFolderswith the WebView2 breadcrumb in the live ItemViewer; adds a breadcrumb bridge protocol, async message router, selection map, host-neutralBreadcrumbStateModel/BreadcrumbRenderProjection, WebView2 messenger seam, and breadcrumb page resource; reroutes keyboard, theme, and controller surfaces; 114 new tests.BreadcrumbRow→BreadcrumbStateRow;BreadcrumbBridgeRouter→FolderBreadcrumbBridgeRouter).Docs / evidence
docs/features/epics/folder-tree-breadcrumb-redesign/.Dependency updates (merged from main)
origin/mainmerge, includingMicrosoft.Web.WebView2 1.0.4078.44and test-framework/package updates acrossVBFunctionsandQuickFiler.Test.Diff scale: 171 files changed, +16,549/−740 (65
.cs, 4.csproj, 1.html, 1.resx, 100.md).Architecture / How It Fits Together
OutlookFolderHierarchyProviderimplementsIFolderHierarchyProviderover the existingIOutlookFolderTreeServiceseam, exposing breadcrumb segments and live subfolder listings without new COM surface. Both UI consumers depend only on the contract: the EfcViewer suggestion form (#349) and the QuickFiler ItemViewer (#351) each host a WebView2 control whose page resource renders the breadcrumb; a bridge protocol with an async message router carries state and selection between the managed host and the web page. Pure state modeling (BreadcrumbStateModel, render projections, ancestor-chain queries) is host-neutral and unit-tested; WebView2 and Outlook I/O sit behind seams.Verification
Completed (from context and child evidence)
TreatWarningsAsErrorsbuild 0 warnings; vstest green with coverage (final pass 5049/5049 after the Feature: quickfiler-breadcrumb-webview2 #351 rebase onto the integration tip containing Feature: efcviewer-breadcrumb-webview2 #349).docs/features/active/<feature>/evidence/(QA gates, regression testing, coverage deltas).Recommended
csharpier .;msbuild TaskMaster.sln /t:Build /p:Configuration=Debug /p:Platform="Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true; nullable build;vstest.console.exe <test assemblies> /EnableCodeCoverage.Backward Compatibility / Migration Notes
FolderSuggestionTree.BuildFromRows/FolderHierarchyBuilder.Buildwere kept intact through wave 0 and rewired per-consumer in Feature: efcviewer-breadcrumb-webview2 #349/Feature: quickfiler-breadcrumb-webview2 #351; the QuickFilerCboFolderscontrol is decommissioned (seecbofolders-decommission-verificationevidence).Microsoft.Web.WebView2 1.0.4078.44); machines require the WebView2 Evergreen runtime.Risks and Mitigations
MANUAL-VERIFICATION-REQUIRED. Mitigation: maintainer runtime QA pass in live Outlook; unit/bridge tests pin the delivered behavior.DECISION: EAGER-RETAINED-PENDING-RUNTIME-OBSERVATION); if live cost is prohibitive, lazy-init is a prepared follow-up.ci.ymldoes not trigger on PRs to the integration branch); this PR tomainis the first CI execution of the combined tree. Mitigation: merge only on green CI here; rollback is a revert of this single merge commit.Review Guide
IFolderHierarchyProvider,FolderBreadcrumbSegment,OutlookFolderHierarchyProvider,FolderTreeSnapshotQueries(Feature: folder-hierarchy-live-provider #350, commit158ccb84).be6f38d1): control replacement and provider wiring.84180cf0..33ac6a3f): state model → bridge protocol/router → messenger seam/page resource → live ItemViewer rewire; then the rebase collision-rename commit8e4e896d.origin/mainmerge commit (16671d6a) is mechanical dependency alignment.Follow-ups
GitHub Auto-close