Repository navigation
Show one progress indicator per V2 orchestration phase - #1654
Merged
Paul Lizer (paullizer) merged 5 commits intoOct 6, 2026
Conversation
While an approved plan ran, the V2 chat drew the generic "Thinking" streaming bubble beside the plan card's running row, so two indicators described the same work and neither said what was happening. The run borrows the chat store's shared streaming flag (Stop, composer lock, thought collection), and MessageList drew the bubble whenever it was set. - chatStore records which orchestration phase holds the streaming surface (planning or running); chat streams record none, so a chat reply sent while a run waits still shows Thinking. - executeSavedPlan takes the surface as running. The streaming bubble draws nothing while the plan card is drawing that run, until the answer arrives, and falls back to the normal bubble if the card is not. - While a turn plans, the bubble says Planning instead of Thinking. - The running card's status line comes from describeRunProgress: Starting, then "<Gathering|Reasoning|Rendering>: <step title>", then Preparing the answer; Waiting for results is unchanged. - New Node tests for the status helper and the real controller/store surface lifecycle; UI tests updated and extended; fix doc, feature doc, release notes; version 0.261.253. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
microsoft#1637 merged into paullizer-react-v2-ui as 0.261.253, the version this branch also claimed, so this fix moves one above it. Only version references change: config.py, the release notes heading, the fix and feature docs, and the version headers of the tests this branch added or updated. No behaviour changes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…icator Bring in origin/paullizer-react-v2-ui at ea0d359, the merge of microsoft#1637 (0.261.253), which this branch had also numbered 0.261.253 before it was renumbered. Only two files conflicted: - config.py keeps VERSION = "0.261.254", one above V2. - release_notes.md keeps the v0.261.254 section directly above V2's v0.261.253 section, with every section byte-exact. MessageList.tsx merged cleanly: V2's superseded-workflow-reply filter changes the thread list, and this branch changes StreamingBubble. Every other file matches the side that changed it. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
microsoft#1652 merged into paullizer-react-v2-ui as 0.261.255, above the 0.261.254 this branch had taken, so this fix moves one above it again. Only version references change: config.py, the release notes heading, the fix and feature docs, and the version headers of the tests this branch added or updated. No behaviour changes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…icator Bring in origin/paullizer-react-v2-ui at 6154f95, the merge of microsoft#1652 (0.261.255), which went above the 0.261.254 this branch had taken; the previous commit renumbers this fix to 0.261.256. Only two files conflicted: - config.py keeps VERSION = "0.261.256", one above V2. - MessageList.tsx: both sides changed the top of StreamingBubble. The resolution keeps this branch's store read (orchestrationSurface, activeConversationId) and adds V2's collaborative selector, so every hook still runs before either early return. Both early returns stay: a run shown on its plan card, and a shared conversation whose activity line stands in for the bubble. Orchestration routes only accept personal conversations, so the two cannot apply at once. chatStore.ts merged cleanly; V2's change adds no new streaming writes. For MessageList.tsx and chatStore.ts the merge adds exactly V2's change to this branch and exactly this branch's change to V2. The release notes did not conflict: microsoft#1652 left them alone, so this PR's v0.261.256 section still sits directly above V2's v0.261.253 section. Every other file matches the side that changed it. No earlier recorded resolution was applied. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Paul Lizer (paullizer)
merged commit Oct 6, 2026
4ae1df8
into
microsoft:paullizer-react-v2-ui
11 checks passed
15 of 24 tasks
Paul Lizer (paullizer)
added a commit
that referenced
this pull request
Oct 6, 2026
Paul Lizer (paullizer)
added a commit
that referenced
this pull request
Oct 6, 2026
…masked Brings in #1654, which renumbered its progress indicator fix to 0.261.256. - config.py: both sides had set 0.261.256, so git merged it silently; this fix now takes 0.261.257 so the two fixes keep separate versions. - release_notes.md: the base's v0.261.256 section stays as it is, and this fix's entries move to a new v0.261.257 section at the top. - chatStore.ts merged cleanly: the base's orchestrationSurface phase and this branch's deleted-message filter touch different code. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Paul Lizer (paullizer)
added a commit
to paullizer/simplechat
that referenced
this pull request
Oct 6, 2026
…esign to 0.261.256 The base moved to 0.261.255, and open PRs microsoft#1654 and microsoft#1638 both hold 0.261.254, so this branch takes the next free number. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
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.
Summary
Before: after Approve, a "Thinking" bubble sat above the plan card, which showed the plan's intent,
0/1, Review and a status of "Reasoning". After: only the card shows, with a status such as "Reasoning: Draft candidate names", until the answer arrives.Root cause
A run borrows the chat store's shared
streamingflag, which routes Stop to it, locks the composer and collects the run's thoughts for the answer.executeSavedPlantook it throughbeginOrchestrationTurn, andMessageListdrewStreamingBubblewheneverstreamingwas true. The store recorded only that something was streaming, not that it was the run, so the bubble couldn't step aside for the card.The bubble had nothing to add anyway. The server never streams a run's answer: it sends
orchestration_stepframes and the occasional notice thought, then the whole answer in onecontentframe just beforedone(_finalizeinfunctions_orchestration_execution.py). For the whole run, the bubble could only say "Thinking". The v0.261.204 fix removed the orchestration lane's progress card for the same reason, but left this placeholder.Approach
chatStore.tsrecords who owns the streaming flag. New stateorchestrationSurfaceis'planning','running', ornullfor a chat stream.orchestrationSurfacesgoes from aSetto aMapof conversation to phase, so leaving and reopening a conversation, and a server re-key, keep the phase.beginOrchestrationTurntakes an optional trailingphasethat defaults toplanning, so existing callers are unchanged.sendMessage,resumeChatStream,retryMessageandeditMessageset it tonull.streaming, so a chat reply can be sent while a run waits for a durable result or is being reconciled. That run is still in flight on its card, so hiding the bubble whenever a run was in flight would also hide the reply's "Thinking". A new test drives exactly that case through the real controller.executeSavedPlanclaims the surface asrunning, and the newselectActiveTurnRunInFlightis true exactly whenActiveOrchestrationCarddraws its running row.StreamingBubblesteps aside only when both hold, and shows as usual otherwise, so a run never ends up with no indicator.describeRunProgressinorchestrationPlan.tswrites the status line. That module imports only types, so the new Node test runs the shipped function directly.Notes for review
0.261.253to0.261.254, and commit 3 merges V2ea0d359fc. Two files conflicted:config.pykept the version one above V2, and the release notes put this PR's section directly above V2's v0.261.253 section, so removing either section reproduces the other side's file byte for byte.MessageList.tsxmerged cleanly.0.261.256, and commit 5 merges V26154f9599.config.pykeepsVERSION = "0.261.256", one above V2. InMessageList.tsxboth sides changed the top ofStreamingBubble. The resolution keeps this PR's store read and adds V2 shared conversations: mention pills, agent activity lines, generated documents and media (0.261.255) #1652'scollaborativeselector, so every hook still runs before either early return, and both early returns stay. They can't apply at once, because orchestration routes only accept personal conversations.chatStore.tsmerged cleanly, and V2 shared conversations: mention pills, agent activity lines, generated documents and media (0.261.255) #1652 adds no newstreamingwrites, which the ownership test confirms. The release notes didn't conflict.test_v2_reasoning_controls.pygets a one-line locator fix. Its run-correction check read the card's onlyrole="status"element. The running card now always has a status line ("Starting"), so the locator is scoped to the reasoning notice.Commits
011b17640Show one progress indicator per orchestration phase: the fix, its tests and its docs.e6c21aaf6Renumber the progress indicator fix to 0.261.254.639a5cb2aMerge V2 ea0d359 (Show a workflow's reply once in the conversation it created (0.261.253) #1637) into the orchestration progress indicator.fcde4b070Renumber the progress indicator fix to 0.261.256.054909864Merge V2 6154f95 (V2 shared conversations: mention pills, agent activity lines, generated documents and media (0.261.255) #1652) into the orchestration progress indicator.Linked issue
N/A: this came from direct feedback on the V2 orchestration UI, and no issue was filed.
Release Notes & Latest Features
Is this visible to end users?
Is this admin-facing (Admin Settings, governance, deployment, config)?
Should this become a Latest Feature card?
Screenshot needed for the card?
Version bump
application/single_app/config.pyVERSIONthird segment bumped, or not needed because this is docs-only. It is0.261.256, one above V2's0.261.255. Commit 1 used0.261.253; Show a workflow's reply once in the conversation it created (0.261.253) #1637 took that number first and V2 shared conversations: mention pills, agent activity lines, generated documents and media (0.261.255) #1652 then took0.261.255, so commits 2 and 4 renumber this fix (see Notes for review).deployers/version.txtbumped, or not needed becausedeployers/was not changed. Not needed:deployers/is unchanged.Testing / validation
At the head,
054909864, after merging #1652. These ran on the merged tree just before it was committed, and the commit contains exactly that tree.npm --prefix .\application\v2_ui run typecheck: passed.npm --prefix .\application\v2_ui run build -- --outDir ..\..\ui_tests\artifacts\orchestration-plan-editorandnpm --prefix .\application\v2_ui run build: both passed.node .\functional_tests\test_v2_orchestration_run_progress_status.mjs(new): passed, 8/8.node .\functional_tests\test_v2_orchestration_streaming_surface.mjs(new): passed, 6/6, including the check that every write takingstreamingnames its owner.node .\functional_tests\test_v2_orchestration_progress_lane.mjs: passed, 6/6.node .\functional_tests\test_v2_collaboration_ai_activity_logic.mjs,node .\functional_tests\test_v2_collaboration_mention_pills_logic.mjsandnode .\functional_tests\test_v2_drawer_media_logic.mjs(V2 shared conversations: mention pills, agent activity lines, generated documents and media (0.261.255) #1652's): all passed.python .\functional_tests\test_v2_stream_reconnect.py: passed, 10/10.python .\functional_tests\test_v2_new_chat_reset.py: passed, 6/6.python .\functional_tests\test_v2_stream_leave_without_cancel.py: passed, 15/15.python .\functional_tests\test_v2_prompt_composer_card.py: passed, 11/11, including its TypeScript checks, which callbeginOrchestrationTurnwith positional arguments.python .\functional_tests\test_v2_prompts_workbench.py: passed, 22/22.python .\functional_tests\test_collaboration_ai_activity_events.pyandpython .\functional_tests\test_collaboration_generated_documents.py(V2 shared conversations: mention pills, agent activity lines, generated documents and media (0.261.255) #1652's): passed, 6 and 5 checks.python .\functional_tests\test_v2_prompt_attachment_persistence.py: 84 passed.python .\functional_tests\test_workflow_reply_replaces_agent_posted_message.py(Show a workflow's reply once in the conversation it created (0.261.253) #1637's): passed, 10/10.python .\functional_tests\test_docs_site_quality.py: passed, 6/6.python .\functional_tests\test_docs_app_surface_coverage.py: passed, 7/7.python -m pytest .\ui_tests\test_v2_orchestration_streaming_bubble.py .\ui_tests\test_v2_new_chat_reset.py .\ui_tests\test_v2_orchestration_planning_retry.py -q: 27 passed.python -m pytest .\ui_tests\test_v2_reasoning_controls.py -q: 33 passed.python .\ui_tests\test_v2_orchestration_plan_card.py: passed, 7/7.python -m pytest .\ui_tests\test_v2_collaboration_ux.py -q(V2 shared conversations: mention pills, agent activity lines, generated documents and media (0.261.255) #1652's, which covers the shared-conversation side ofStreamingBubble): 4 passed.python .\scripts\check_xss_sinks.py --base-sha 6154f9599 --head-sha 054909864 (git diff --name-only 6154f9599 054909864 -- application): passed for all 7 files.The new browser tests catch the old behaviour: with only
application/v2_ui/srcreverted,test_v2_orchestration_streaming_bubble.pyfails 4 of 5, and only the unchanged tabular test passes.At
011b17640, before the V2 merges:python -m pytest <file> -q, all passed:test_v2_orchestration_approval_persistence.py23,test_v2_orchestration_auto_open.py5,test_v2_orchestration_conversation_context.py5,test_v2_orchestration_model_picker.py11,test_v2_orchestration_workflow_run_links.py29,test_v2_workflow_run_card.py41,test_admin_orchestration_actions.py8,test_admin_orchestration_workflow_runs.py9,test_admin_orchestration_workflow_proposals.py7,test_v2_elicitation_composer.py18,test_v2_prompt_composer_experience.py56,test_chat_streaming_thinking_placeholder.py1.python <file>, the way these runner-style files are written, all passed: orchestration composer 6/6, drawer views 3/3, elicitation 6/6, pending approval resume 5/5, plan editing 5/5, run hydration 7/7.functional_tests/test_v2_*files matching orchestration, stream or tabular parity, 19 passed;test_v2_tabular_parity.pyis below.Not passing or not run, all unrelated to this change:
python .\functional_tests\test_v2_tabular_parity.py: 13/14, still at054909864. The failing check ("Could not locate the composer submit handler") reads onlyComposer.tsx, which this PR doesn't change, so it fails the same way on V2.test_chat_saved_analysis.py,test_chat_three_document_smoke.pyandtest_chat_workflow_results.py(module 'lib' has no attribute 'GEN_EMAIL'), andtest_v2_orchestration_plan_editor_backend.pyandtest_v2_orchestration_recovery_backend.py(No module named 'content_screening').test_chat_saved_analysis.pycallsbeginOrchestrationTurnpositionally; the new parameter is optional and last, and the TypeScript checks above cover the same call shapes.test_docs_release_notes_integrity.pyandtest_docs_link_integrity.pyalready fail on V2: the generated release-notes pages lag the source by more than 180 releases, and 11 relative links and 10 site links are broken in pages this PR doesn't touch.pagefixture meets the files' own browsers. Each file passes on its own, as above.Documentation
### **(v0.261.256)**section has one Bug Fixes entry and one User Interface Enhancements entry. It sits directly above V2's v0.261.253 section (V2 shared conversations: mention pills, agent activity lines, generated documents and media (0.261.255) #1652 added no release-notes section) and is a pure 16-line insertion against V26154f9599.CHAT_ORCHESTRATION.md, "Stream events" now describes the Planning label, the run phase and the card's status line. The version header and the test table are updated too: the streaming bubble row, plus rows for the two new Node tests.docs/explanation/fixes/ORCHESTRATION_RUN_DUPLICATE_THINKING_INDICATOR_FIX.mdcovers the issue, root cause, files, tests, and before and after.ORCHESTRATION_DUPLICATE_PROGRESS_CARD_FIX.md(v0.261.204) links to it.Security checklist
@swagger_route(security=get_auth_security()). N/A: no routes are added or changed.sanitize_settings_for_user(). N/A: no settings are sent.static/v2,ui_tests/artifacts) are gitignored and not committed.