Repository navigation
V2 parity: replace the remaining hand-offs to the legacy interface so "New UI only" loses nothing #1722
Copy link
Copy link
Open
Labels
Created By CopilotP1Priority 1: urgent, address before P2 workPriority 1: urgent, address before P2 workenhancementNew feature or requestNew feature or request
Description
Summary
The new React interface still sends people to legacy (classic) pages for some features it hasn't rebuilt yet. The legacy routing work moves the legacy interface under /legacy/... and adds a New UI only admin mode. In that mode non-admins can't open legacy pages, so every hand-off below becomes a dead end until it has a native V2 replacement.
Line numbers are from paullizer-react-v2-ui @ f60b982a0 (version 0.261.302) and will drift. Paths are relative to application/v2_ui/src unless noted.
Scope
| # | Area | Gap | What V2 does today | Evidence | Work to close |
|---|---|---|---|---|---|
| 1 | Agents | Agent catalogue | /agents is a placeholder with an "Open the agent catalogue" link to classic |
App.tsx:293-302, pages/PlaceholderPage.tsx |
Build the V2 agent catalogue |
| 2 | Chat | M365 pending-action card | Notices with m365_pending_action open classic chat, the only page that renders the card |
lib/notificationLinks.ts:361-365 |
Render pending M365 actions (approve/decline) in V2 chat; route these notices to /chat |
| 3 | Chat | Aggregate public chat | Public directory's chat action opens classic /chats?openSearch=1&scope=public |
pages/PublicDirectoryPage.tsx:52-56, 236-248 |
Add an "all public workspaces" chat scope |
| 4 | Workspaces | File sources: add/configure | "Adding and configuring a source is still done in the classic workspace" (personal; group/public via classicPath) |
pages/workspace/FileSourcesSection.tsx:150-153, lib/fileSourceWorkbench.ts:269, 556, 665 |
Create/configure flows for personal, group and public sources |
| 5 | Workspaces | Identities: add | "Adding one is still done in the classic workspace" | pages/workspace/IdentitiesSection.tsx:110-113, lib/identityWorkbench.ts:167, 307, 374 |
Identity creation in all scopes |
| 6 | Workspaces | Endpoint editor | V2 lists, enables/disables and deletes endpoints only; the connection editor (provider, API versions, auth, model list) stays in classic | pages/workspace/EndpointsSection.tsx:1-6 |
Endpoint connection editor in V2 |
| 7 | Group workspace | Document tools incl. upgrading legacy documents | "Open classic tools for group documents" | pages/workspace/DocumentsSection.tsx:61-62, pages/GroupWorkspacePage.tsx:467 |
Port document upgrade and remaining tools |
| 8 | Public workspace | Document tools incl. upgrading legacy documents | "Open classic tools to upgrade legacy public workspace documents" | pages/workspace/DocumentsSection.tsx:112-113, pages/PublicWorkspacePage.tsx:336 |
Same as #7 for public scope |
| 9 | Group workspace | Delete group | "Delete group (classic)", completed on the classic group page | pages/workspace/GroupSettingsSection.tsx:38-43, pages/GroupWorkspacePage.tsx:539 |
Deletion with prerequisite checks in V2 |
| 10 | Group workspace | Manage an inactive/unknown-status group | "Manage group (classic)" button | pages/GroupWorkspacePage.tsx:395-398 (activation redirects near :358, :437, verify) |
Status management and reactivation in V2 |
| 11 | Public workspace | Delete public workspace | Confirms, then redirects to classic /public_workspaces/<id> |
pages/PublicWorkspacePage.tsx:221-242, 326 |
Deletion in V2 |
| 12 | Public workspace | Tags section | Only documents, prompts, identities and sync are native; Tags says it is available in the classic workspace | pages/PublicWorkspacePage.tsx:155-160, 348-351, lib/workspaceContext.ts:31-33 |
Public workspace tag management |
| 13 | Workspaces | Danger-zone delete (shared settings section) | "Open classic" confirm calls onOpenClassic() |
pages/workspace/WorkspaceSettingsSection.tsx:~814-831 |
Verify which scopes reach it; implement natively (overlaps #9/#11) |
| 14 | Notifications | Full notifications list | Bell panel "View all" opens classic /notifications; there is no V2 page |
components/layout/NotificationPanel.tsx:478 |
V2 notifications page |
| 15 | Notifications | Unrecognized links | classic() fallback for any link without a V2 route |
lib/notificationLinks.ts:439 |
A V2 route for every server-emitted link type |
| 16 | Workflows | Workflow activity page | Legacy /workflow-activity has no V2 page; V2 maps only runs it can verify against the notice, otherwise falls back to classic |
lib/notificationLinks.ts:163-177, 374-377; application/single_app/route_frontend_chats.py:1080 |
V2 equivalent for the remaining cases |
| 17 | Control Center | Management section | V2 /control-center says it is being built and links to classic /admin/control-center |
pages/ControlCenterPage.tsx:42-45, components/admin/RefreshScheduleStatus.tsx:143 |
Complete the V2 Control Center |
| 18 | Admin Settings | DAI diagnostics | A classic_only related link: the diagnostics are drawn only by the classic Scale › Cosmos › DAI Metrics pane |
application/single_app/admin_settings_fields.py:8313-8319, components/admin/RelatedSectionLink.tsx:41 |
Render the diagnostics in V2; drop classic_only |
| 19 | Admin Settings | Requirement links | Falls back to classic /admin/settings#<section> when it can't navigate in-page |
components/admin/SettingsSection.tsx:193-205 |
Make every requirement target navigable in V2 |
| 20 | Admin Settings | Chat-mode notice | Says the single endpoint's address, credentials and deployment are set on the classic page (#model-endpoints) |
components/admin/ChatModeNotice.tsx:62-67 |
Verify V2 renders that configuration; link in-page |
| 21 | Admin Settings | Latest Features shortcuts | Shortcuts V2 can't follow in place open classic admin tabs | lib/latestFeatures.ts:255-258 |
Map each shortcut to a V2 section |
| 22 | Admin Settings | Fallback-scan note | Links to classic only when undeclared enable_* keys appear. Today 106 of 107 sections are declared; the remaining one (standard-citations-section) is informational text |
pages/AdminSettingsPage.tsx:2099-2102, 2412-2418 |
No action now; keep the admin-settings parity test green |
| 23 | Errors | Boot failure | BootError offers "Open the classic interface" | App.tsx:96-100 |
V2-native recovery (retry / sign out) |
| 24 | Cleanup | Dead config | classicHref: '/profile?tab=groups' / '/profile?tab=public-workspaces' are never read |
lib/workspaces.ts:68, 121, 152 |
Remove |
Legacy pages with partial or unverified V2 counterparts
| Legacy page | V2 counterpart | Status |
|---|---|---|
/conversations |
V2 chat conversation list | Verify parity (search, bulk actions, export) |
/profile tabs (stats, settings, groups, public-workspaces, feedback, violations) |
/settings tabs (stats, preferences, groups, public, feedback, violations) |
Tabs exist; verify per-feature parity, especially M365 profile settings, fact memory and stats export |
/my_feedback, /safety_violations |
/settings?tab=feedback, /settings?tab=violations |
Verify |
/agents, /notifications, /admin/control-center |
None or placeholder | #1, #14, #17 |
Pages with confirmed counterparts: chat, conversation deep links, approvals, content review, support pages, admin feedback and safety review, terms of use and access restricted.
Acceptance Criteria
- Each row above is replaced by a native V2 flow or explicitly retired
- After the routing work lands,
application/v2_ui/srchas no production hand-offs left to/legacy/... - The new UI works inside the Microsoft Teams tab (SSO token exchange,
frame-ancestors,SameSite=Nonecookies).TEAMS_SUCCESS_REDIRECT_PATH(default/chats) will follow each user's interface - The separately hosted SPA mode (
V2_UI_ALLOWED_ORIGIN) is smoke-tested with the root basename - Functional tests cover each replaced flow; the admin-settings parity test stays green
Notes
- Rows Share entire conversation with one or more people #7–Streamlining Content Processing with AI: Automated Flagging and Indexing Workflow #13 may be residual items from V2 shared workspaces: native group and public workspaces #1542 (V2 shared workspaces: native group and public workspaces). Close them there if that is the better home.
- Companion routing issue: Serve the new UI at the main URLs, move the legacy UI under /legacy, and let admins control interface access #1723 (new UI at root, legacy under
/legacy, admin interface policy).
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
Created By CopilotP1Priority 1: urgent, address before P2 workPriority 1: urgent, address before P2 workenhancementNew feature or requestNew feature or request
Type
Projects
- StatusShow more project fieldsScheduled
Activity
paullizer commentedon Oct 8, 2026
Row 1: native V2 Agent catalogue implementation complete.
The code is committed locally on
paullizer-v2-agent-catalogueas8f2aee183, version 0.261.305. No PR has been opened or merged yet. This implements row 1 only; the remaining parity gaps and the companion routing/interface-policy work in #1723 are unchanged./agentsnow renders the native React catalogue, replacing the placeholder and classic hand-off. User-facing Latest Features shortcuts to/agentsalso stay inside V2.GET /api/v2/agents/catalogapplies the chat picker's governance policy before usage or promotion annotations. Governance-restricted agents stay hidden, including promoted agents. The response is explicitly allowlisted, instructions are omitted when their display setting is off, and unexpected failures return a logged generic error rather than unchecked agents.docs/explanation/features/V2_AGENTS_CATALOG.md, with the related guide, admin reference, and existing V2 feature documentation updated. Release notes remain unchanged.Validation
npm --prefix application\v2_ui run typecheckandnpm --prefix application\v2_ui run buildpython functional_tests\test_v2_agents_catalog_endpoint.pypython functional_tests\test_v2_agents_catalog.pypython functional_tests\test_v2_support_menu.pypython -m pytest ui_tests\test_v2_agents_catalog.py ui_tests\test_v2_support_menu.py -q --browser chromium --tracing retain-on-failurePYTHONPATHTwo selected regression scripts have unchanged baseline failures, not failures introduced by this implementation:
test_agents_catalog_feature.py: 11/12; its registration check expects a directregister_route_frontend_agents(app)call, while the existing application uses Blueprint registration.test_admin_settings_sidebar_card_parity.py: 3/4; existing M365 retrieval card/sidebar mismatches and duplicate inbound-MCP card IDs. The tests and affected application/template inputs are unchanged.Deferred idea - not implemented
An optional future administrator opt-in could expose governance-restricted agents with Chat disabled and a proper agent-specific request-access/approval workflow. This implementation deliberately does not do that: restricted agents stay hidden, and no discovery flag, restricted-agent card, request button, or approval type was added.
The existing Request Access flow addresses a missing base application role, and Approvals has no agent-access request type. Any future design would need to distinguish item-level agent restrictions from feature/scope-wide policy blocks and define how approval changes access. Recording that idea here rather than creating another issue.
Preserve inherited catalogue fixture groups list
paullizer commentedon Oct 9, 2026
Gap 2 (Chat: M365 pending-action card) is implemented.
Branch
paullizer-v2-m365-pending-actions(version 0.261.307), rebased onpaullizer-react-v2-ui@ 11d8478. No PR opened yet.What changed
PendingActionCardis used by both the Approvals page and chat. The Approvals test ids are unchanged.m365_pending_actionnow route to V2/chatwith a one-shot focus parameter. The page scrolls to the card, highlights it, then strips the parameter. This replaces the classic hand-off atlib/notificationLinks.ts./api/msgraph/pending-actionsendpoints.Stop and conversation-switch handling
Heads-up for UI-test authors
The new
GET /api/msgraph/pending-actions?conversation_id=...request has to be stubbed in any strict UI harness that opens or creates a conversation. I added a shared helper (ui_tests/fixtures/v2_pending_action_stubs.py) and used it in 25 harness files, including the sharedworkspace_authoringbase andchat_context_selection.Validation
test_v2_m365_pending_actions.py: 14/14.ui_tests/test_v2_m365_pending_action_cards.py: 10/10.test_docs_app_surface_coverage.py7/7,test_docs_site_quality.py6/6.npm run typecheckclean. XSS sink scan clean (chatHrefForPendingActionallowlisted inscripts/check_xss_sinks.py).Failures I saw that this change doesn't cause
The UI ones reproduce identically on a clean export of upstream tip 11d8478. This change touches none of the files involved.
test_v2_document_provenance(3 group tests): upstream's group switch now confirms withGET /api/v2/scope, whichui_tests/fixtures/workspace_authoring.pydoesn't stub.test_v2_workflow_run_card(1): expects/profile?tab=settings#m365-connection-status, but the code links/settings?tab=preferences§ion=m365-workflow-connection(lib/m365Links.ts).test_v2_workflow_alert_notices(1 error) andtest_v2_notifications_bell(10 teardown errors): unstubbed Settings endpoints in those harnesses. The 5 bell tests I added pass.functional_tests/test_v2_notifications_bell.py::test_the_administrator_switch_and_the_preference_reach_both_sides: pins the literal"features": _build_feature_flags(...)inroute_backend_v2.py, which upstream has since refactored tofeatures = _build_feature_flags(...).test_v2_group_workspace_shell: barefrom playwright_connection import ...inv2_admin_settings.py. It passes 30/30 withPYTHONPATH=ui_tests\fixtures.semantic_kernel(broken OpenSSL/cryptography install on this machine),content_screeningimport errors in two orchestration backend tests, script-style UI tests that only run aspython ui_tests/<file>.py, and 7 skips that needSIMPLECHAT_UI_BASE_URL.Not part of this change
Workflow-activity M365 notices (they still open classic), the V2 sign-in and approval pause UIs for the
m365_sign_in_required/m365_approval_requiredstream pauses, and data-access approvals.Merge pull request #1731 from microsoft/paullizer-v2-m365-pending-act…
Build native V2 agent catalogue
Render Microsoft 365 pending-action cards in V2 chat (microsoft#1722 …
paullizer commentedon Oct 9, 2026
Row 4: file-source create/configure planning update (not implemented yet).
Investigated the current
paullizer-react-v2-uibaseline at271b30187, application version 0.261.309, in branchpaullizer-file-source-configuration.The remaining gap is primarily personal sources. Group and public workspaces already use native V2 create/edit dialogs through
GroupFileSourcesSection,FileSourceEditorDialogand their explicit scoped APIs. The three file-source adapterclassicPathproperties are unused. PersonalFileSourcesSectionstill sends configuration to classic, and the personal workbench adapter refuses create/edit/test/browse/ignore.Confirmed scope and planned approach
classicPathproperties rather than replacing them with/legacylinks.The implementation plan is prepared for approval. No application code or version has changed, no implementation validation is claimed, and row 4 should remain open.
The companion routing/interface-policy work in #1723 and every other parity row are outside this change.
paullizer commentedon Oct 9, 2026
Planning update for row 3: aggregate public chat. Implementation has not started.
Confirmed scope:
The current backend intersects public IDs with visibility in chat authorization, hybrid search, and search/source services; changing the directory link alone would still exclude hidden workspaces from All mode. The plan therefore includes a shared server-authoritative mode resolver, workspace-status checks, matching public document/tag picker reads, ordinary and orchestrated chat propagation, persisted/replayed search metadata, and explicit empty-set handling with no scope-broadening fallback.
Coverage will prove native SPA navigation with legacy pages unavailable to non-admins, All versus Visible behavior, unavailable/hidden/empty workspaces, persistence/reset/retry/edit, orchestration, and unchanged single-workspace/mixed-context behavior. Related documentation and the application version will be updated during implementation.
This work addresses row 3 only; other parity rows and companion routing issue #1723 remain outside this change. No completion checkboxes have been marked.
paullizer commentedon Oct 9, 2026
Planning row 6: personal workspace endpoint editor only. No implementation or validation has run yet.
Confirmed scope:
Group endpoint editing already has a native V2 implementation; group/admin behavior and public workspace scope are unchanged. Other rows in this issue and the routing work in #1723 remain separate. Root-basename/Teams deployment qualification will need to follow the routing work; synthetic UI coverage will not be represented as live-service qualification.
paullizer commentedon Oct 9, 2026
Row 5: native workspace identity authoring planning update. Implementation has not started.
Inspected baseline
1447daae7, application version 0.261.314, on branchpaullizer-v2-identity-creation.The remaining creation gap is personal scope. Group/public workspaces already have native V2 create/edit dialogs and strict scoped identity APIs. Personal
IdentitiesSectionstill links creation to classic and its adapter refuses create/edit. The three identity adapterclassicPathproperties are unused.Confirmed scope
/api/user/identities, preserving the existing classic personal API contracts.Planned approach
classicPathproperties.expected_etag; missing/stale tokens are refused without falling back to an unversioned endpoint.Global/admin identity authoring, model-endpoint identity capabilities, inline creation in connector editors, legacy routing/admin-mode implementation, and deployers are out of scope. No implementation validation has been run yet. This closes only row 5 when implemented; it does not close the umbrella issue.