Skip to content

Fix document status classification across uploads and workspaces - #1789

Merged
Paul Lizer (paullizer) merged 3 commits into
microsoft:paullizer-react-v2-uifrom
paullizer:paullizer-upload-failure-investigation
Oct 20, 2026
Merged

Paul Lizer (paullizer) merged 3 commits into
microsoft:paullizer-react-v2-uifrom
paullizer:paullizer-upload-failure-investigation

Conversation

@paullizer

@paullizer Paul Lizer (paullizer) commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Summary

A filename containing failed caused a successfully processed attachment to display Failed and stop polling. Similar substring checks could mistake filenames or intermediate processing details for completion.

  • Use aligned, bootstrap-independent terminal-status predicates across Python, React and the classic UI, checked against a shared case matrix.
  • Apply the rules to attachment polling, workspace views, processing facets, progress calculation, safe job updates and chat search-readiness checks. Preserve genuine failures, screening holds and approval restrictions.
  • Add browser, cross-runtime and SDK-backed regressions, including personal/group polling, status-only Retry, cancellation, ETags and operation guards. Re-review the affected Cosmos inventory and migrate the changed metadata test container to SDK-shaped point responses.
  • Document the fix and bump the combined application from the current base's 0.261.353 to 0.261.354. The base merges preserve incoming saved-memory resolution and SQL connection diagnostics changes alongside this fix.

No schema migration, automatic re-upload, timeout increase or authorization change. Historical stored percentages are not rewritten. No live upload or deployment was performed. External harness findings remain separate session artifacts and are not included in this PR.

Linked issue

N/A. The requester explicitly asked not to create an issue.

Release Notes & Latest Features

  • New Feature
  • Bug Fix
  • UI Enhancement
  • Breaking Change
  • Internal only

Is this visible to end users?

  • Yes
  • No

Is this admin-facing (Admin Settings, governance, deployment, config)?

  • Yes
  • No

Should this become a Latest Feature card?

  • Yes
  • No
  • Already added

Screenshot needed for the card?

  • Yes
  • No
  • Attached

Version bump

  • application/single_app/config.py VERSION third segment bumped, or not needed because this is docs-only
  • deployers/version.txt bumped, or not needed because deployers/ was not changed

Testing / validation

Backend commands used an isolated Python environment with the application's pinned Cosmos SDK 4.9.0, Flask 3.1.3 and Werkzeug 3.1.6. Interpreter paths are shown as python for portability. For the network-blocked gate, PYTHONPATH included application\single_app and functional_tests, and PYTEST_ADDOPTS=-x.

  • python -u .\scripts\check_cosmos_response_boundaries.py --run-contracts - passed before the base merge: 1,163 tests and 244 subtests; 1,067 owners, 412 doubles, zero review gaps.
  • python -m pytest .\ui_tests\test_v2_chat_upload_status.py .\ui_tests\test_document_status_classification.py .\ui_tests\test_chat_workspace_upload_progress_polling.py .\ui_tests\test_group_document_filename_xss_rendering.py -x -q --tb=short - passed: 101 tests using local assets and intercepted APIs, not live uploads.
  • python -m pytest .\ui_tests\test_v2_chat_upload_status.py::test_removing_processing_upload_cancels_tracking -q --tb=short -x - passed: 1 test, after strengthening cancellation coverage with simulated time beyond polling intervals.
  • python -m pytest .\functional_tests\test_document_processing_status.py .\functional_tests\test_v2_chat_context_picker.py .\functional_tests\test_v2_documents_explorer.py .\functional_tests\test_content_screening_read_boundaries.py::SearchBoundaryTests::test_chat_readiness_cannot_infer_clearance_from_progress -q --tb=short -x - passed: 96 tests.
  • python -m pytest .\functional_tests\route_tests\test_route_blueprint_policy_inventory.py .\functional_tests\route_tests\test_route_unauthenticated_policy_contract.py .\functional_tests\route_tests\test_route_policy_test_coverage.py -q --tb=short -x - passed: 30 tests.
  • npm --prefix .\application\v2_ui run typecheck - passed.
  • npm --prefix .\application\v2_ui run build - passed, with the existing bundle-size warning.
  • python .\functional_tests\test_docs_app_surface_coverage.py - passed: 7 checks, including inventory freshness; also passed after both base merges.
  • python .\functional_tests\test_docs_site_quality.py - passed: 6 checks; also passed after both base merges.
  • git -c core.whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol --no-pager diff --check - passed before commit.

Earlier base integration at f6a1a7e65:

  • python -m pytest -p test_support.cosmos_network_guard .\functional_tests\test_document_processing_status.py .\functional_tests\test_v2_chat_context_picker.py .\functional_tests\test_v2_documents_explorer.py .\functional_tests\test_document_search_metadata_sync.py .\functional_tests\test_orchestration_request_memory_resolution.py .\functional_tests\test_fact_memory_read_only_context.py .\functional_tests\test_orchestration_conversation_sources.py -x -q --tb=short --disable-warnings - passed: 194 tests and 5 subtests.
  • python -m pytest .\ui_tests\test_v2_chat_upload_status.py .\ui_tests\test_document_status_classification.py .\ui_tests\test_chat_workspace_upload_progress_polling.py -x -q --tb=short - passed: 27 tests.
  • python .\scripts\check_cosmos_response_boundaries.py - passed: 1,067 owners, 412 doubles, zero review gaps.

Latest base integration at 00c80b8cb, incorporating base 0ffe306d8 and resolving the version-only conflict to 0.261.354:

  • python -m pytest -p test_support.cosmos_network_guard .\functional_tests\test_document_processing_status.py .\functional_tests\test_v2_chat_context_picker.py .\functional_tests\test_v2_documents_explorer.py .\functional_tests\test_document_search_metadata_sync.py .\functional_tests\test_orchestration_request_memory_resolution.py .\functional_tests\test_fact_memory_read_only_context.py .\functional_tests\test_orchestration_conversation_sources.py .\functional_tests\test_sql_connection_diagnostics.py .\functional_tests\test_sql_connection_diagnostics_runtime.py .\functional_tests\test_plugin_routes_cosmos_contract.py -x -q --tb=short --disable-warnings - passed: 308 tests and 5 subtests, including incoming SQL diagnostics and plugin-route SDK evidence, with network access blocked.
  • python -m pytest .\ui_tests\test_v2_chat_upload_status.py .\ui_tests\test_document_status_classification.py .\ui_tests\test_chat_workspace_upload_progress_polling.py -x -q --tb=short - passed: 27 tests.
  • python .\scripts\check_cosmos_response_boundaries.py - passed: 1,067 owners, 412 doubles, zero review gaps.
  • git -c core.whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol --no-pager diff --cached --check - passed before the merge commit.

Known unrelated limitation: a broader backend run passed 339 tests before failing in test_content_screening_read_boundaries.py::SearchBoundaryTests::test_explicit_held_search_selection_errors_without_embedding_or_search. Its extracted hybrid_search namespace omits the existing current_public_chat_scope dependency. The same NameError reproduces using the original test source from HEAD against unchanged search code. That fixture repair is outside this fix; the directly affected chat-readiness test passes.

Documentation

  • Release notes updated, or not needed
  • Feature documentation updated, or not needed
  • Fix documentation updated, or not needed

Added docs/explanation/fixes/DOCUMENT_STATUS_TEXT_CLASSIFICATION_FIX.md with root cause, behavior, compatibility limits and validation. Release notes were offered but left unchanged without approval. No new feature, control or settings key was introduced.

Security checklist

  • New Flask routes include @swagger_route(security=get_auth_security())
  • Settings sent to non-admin frontends use sanitize_settings_for_user()
  • Browser JavaScript is served from local SimpleChat static assets only; no CDN-hosted JS
  • No secrets, keys, connection strings, or local-only artifacts are included

No new routes or settings payloads. Existing authorization and screening boundaries remain unchanged.

Align terminal status predicates across Python, React and classic workspace consumers so filenames and retry details cannot stop polling or force completion. Preserve failure, screening and approval behavior, add cross-runtime and SDK-backed regressions, and bump the application to 0.261.349.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve both the upload status fix and the base branch's saved-memory resolution changes. Refresh this fix's version references and verify the combined regressions, browser workflows and storage inventory.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Comment thread ui_tests/test_chat_workspace_upload_progress_polling.py
Comment thread ui_tests/test_document_status_classification.py
Comment thread ui_tests/test_document_status_classification.py
Comment thread ui_tests/test_v2_chat_upload_status.py
Preserve incoming SQL diagnostics alongside document status classification and refresh the fix's version references and integration evidence.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@paullizer
Paul Lizer (paullizer) merged commit 359c98e into microsoft:paullizer-react-v2-ui Oct 20, 2026
11 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants