Repository navigation
Read saved workflow results from chat orchestration (workflow_results) - #1607
Merged
Paul Lizer (paullizer) merged 28 commits intoOct 2, 2026
Conversation
Registers the workflow_results capability (dormant unless Use Workflow Results In Chat is on), extends the workflow planning context so a results-only turn gets the catalog, time zone and request local time, and captures the off golden on unmodified 86f3f36. VERSION 0.261.217. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…lizer-workflow-results-orchestration-capabilit # Conflicts: # application/single_app/config.py
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Adds the results instructions, repair hint, results projection, server-only notes pop and the degrade/drop branch (including workflow_planning for the degraded _normalize when results remains). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Deliverables facts and a recipe appear only while enable_chat_workflow_results is on; the adapter wrapper lazily loads the results module. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…sult aliases Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…tings Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…lizer-workflow-results-orchestration-capabilit
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…e and logging Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…and thought leak surfaces Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…nd new-attempt re-reads Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
No result card exists before 6b, so the reason now points to Ask in chat in the run history. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The reads test now removes started_at from its missing-started row, keeps it last as Cosmos DB orders an undefined sort property under DESC, and pins that such a row is still read when it is the only usable one, without a newer-run-in-progress mention. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The closed reason was read and written back unchanged. Readers already fall back through WORKFLOW_RESULTS_REASON_TEXT.get(...), so behavior is unchanged. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
… R36 R38 R39 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…4 S05 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…Review view Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Paul Lizer (paullizer)
marked this pull request as ready for review
October 2, 2026 17:29
Paul Lizer (paullizer)
merged commit Oct 2, 2026
8a802f1
into
microsoft:paullizer-react-v2-ui
11 checks passed
Paul Lizer (paullizer)
added a commit
to paullizer/simplechat
that referenced
this pull request
Oct 2, 2026
Step 9 (microsoft#1607, 0.261.217) merged first, so this branch merges V2 second with rerere disabled, as agreed: - config.py keeps VERSION 0.261.218. - release_notes.md keeps the 0.261.218 section on top, followed by the whole 0.261.217 section. - docs/_data/app_surface.yml was regenerated after the merge with scripts/build_docs_inventory.py and has no diff. - route_backend_orchestration.py, docs/admin/workflow.md, docs/admin/orchestration.md and CHAT_WORKFLOW_RESULTS_FOLLOW_UP.md merged cleanly; all 6b-1 doc lines remain. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
14 of 24 tasks
Paul Lizer (paullizer)
added a commit
that referenced
this pull request
Oct 2, 2026
…call-agent Resolves the conflicts with #1607. Both branches started from 0.261.216 and used 0.261.217. VERSION stays 0.261.221, and the release notes combine both 0.261.217 entries under one heading.
Paul Lizer (paullizer)
added a commit
to paullizer/simplechat
that referenced
this pull request
Oct 3, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
14 of 24 tasks
Paul Lizer (paullizer)
added a commit
that referenced
this pull request
Oct 3, 2026
…lows-capability Update roadmap status: #1607 and 6b-1 done, 6b-2 and 7a started
This was referenced Oct 8, 2026
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
workflow_results. In a private chat, a plan can read the stored result of one of the user's own finished personal workflow runs and answer from it. Example requests: "what did my Monday email digest workflow say this week?" or "compare yesterday's and today's run of my contract review workflow".latestorcompleted_on: YYYY-MM-DDselector (the user's local date), and an optional closedstatusfilter.metadata.workflow_result_contexts.enable_chat_workflow_results, role-aware gate) is on, together with Chat Orchestration and personal workflows.Linked issue
Refs #1546
Part of #1546 (Phase 6: post workflow results back into chat and answer follow-ups from them).
Part of #1543 (Chat Orchestration Workflows roadmap, step 9).
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 goes from0.261.216to0.261.217; the diff against V2 touches only that line.deployers/version.txtbumped, or not needed becausedeployers/was not changed.deployers/is untouched.Testing / validation
PYTHONPATH=application/single_app;functional_tests, run from the repo root.6cf036e7b(the coordinator's mutation pass; see "Review survivors" under the kill tables) added six commits:2cf793661is the only production edit (review item F), and it changes no behavior. It deletes three lines in_read_workflow_result_stepthat read the closed reason and wrote the same value back.aacdf8841: readsf341b910a: answerad165008b: capability8bec393d2: the new time-zone suite3059ac439: the new UI test6cf036e7bonly removed the unused imports and local that CodeQL reported as notes, and production code had last changed ineb19f38f7.python -O. Every result below comes from head3059ac439.python -Opython <file>and aspython -m pytest -p no:cacheprovider -q -rfEs --tb=line <file>:test_orchestration_workflow_results_{reads,answer,capability,time_zone}.pypython -m pytest -p no:cacheprovider -q -rfEs --tb=line <batch B>6cf036e7bit was 2271; the round adds 55 tests (reads 32→53, answer 7→18, capability 55→70, time_zone +8)python -m pytest -p no:cacheprovider -q functional_tests/test_orchestration_workflow_results_imports.py functional_tests/test_orchestration_workflow_run_imports.py functional_tests/test_orchestration_workflow_proposal_imports.py functional_tests/test_workflow_result_privacy_import_cycle.py functional_tests/test_orchestration_workflow_runs_admin.py functional_tests/route_tests/test_workflow_result_context_policy.pynpm --prefix application/v2_ui run build, thenpython -m pytest -p no:cacheprovider -q -rfEs --tb=line ui_tests/test_v2_orchestration_auto_open.pynpm --prefix application/v2_ui run build -- --outDir ..\..\ui_tests\artifacts\orchestration-plan-editor, thenpython -m pytest -p no:cacheprovider -q -rfEs --tb=line <plan-editor harness, 11 files listed below>6cf036e7bplus the new UI test's 5python ui_tests/test_v2_orchestration_workflow_results_input.py(the new UI test's own runner, which callspytest.main)python ui_tests/test_v2_orchestration_plan_editing.py(the file's own runner; the pytest run is under pre-existing failures)python -m pytest -p no:cacheprovider -q -rfEs --tb=line <admin and chat UI, 5 files listed below>node --test functional_tests/test_v2_orchestration_*.mjs functional_tests/test_workflow_results_clients.mjs(12 files)npm --prefix application/v2_ui run typecheck(tsc -b --noEmit)python scripts/build_docs_inventory.pydocs/_data/app_surface.ymlpython functional_tests/test_docs_app_surface_coverage.pypython functional_tests/test_docs_site_quality.pypython -m pytest -p no:cacheprovider -q functional_tests/test_docs_*.py(7 files)b5cc18ee2run_v2_guardrails.py <worktree> b5cc18ee2 HEAD step9Batch B: the 52 files. All live in
functional_tests/.test_orchestration_workflow_results_{aliases,answer,capability,off_golden,reads,time_zone}.pytest_v2_admin_workflow_parity.pytest_orchestration_plan_revision_{routes,planner,references,store}.pytest_orchestration_turn_recovery_identifiers.pytest_v2_prompt_composer_card.pytest_orchestration_services.py,test_orchestration_harness_execution.pytest_orchestration_dependency_recovery.py,test_orchestration_recovery_safety.py,test_orchestration_dependency_allowlist.pytest_orchestration_single_contract_parity.py,test_orchestration_single_contract.pytest_orchestration_registry_contract.py,test_orchestration_executor.py,test_orchestration_deliverables.pytest_orchestration_composition_metadata_recovery.pytest_orchestration_planner_failure_diagnostics.py,test_orchestration_planner_model_setting.pytest_orchestration_reference_authorizer_golden.pytest_orchestration_workflow_run_{answer,capability,adapter,approval_floor,effects,link_routes,planning_context}.pytest_orchestration_workflow_planning_context.py,test_orchestration_workflow_propose_capability.pytest_orchestration_workflow_proposal_{done_when,editor_round_trip,routes}.py,test_orchestration_workflow_proposals_admin.pytest_orchestration_workflow_runs_off_golden.py,test_orchestration_workflow_setting_off_golden.pytest_workflow_result_{chat_routes,contract,followup,masking,orchestration_lineage,reader,review_paths,routes,store}.pytest_chat_workflow_results_admin.pyPlan-editor harness: the 11 files. All live in
ui_tests/:test_v2_chat_image_uploads.py,test_v2_orchestration_{dependency_plans,generated_images,plan_editor,streaming_bubble,workflow_proposal_card,workflow_run_floor,workflow_run_links,workflow_results_input}.py,test_v2_plan_editor_references.pyandtest_v2_workflow_ask_ai_proposal.py.test_v2_orchestration_workflow_results_input.pyis new in the review round (see "Review survivors").Admin and chat UI: the 5 files. All live in
ui_tests/:test_admin_orchestration_{workflow_runs,workflow_proposals,actions}.py,test_chat_workflow_results.pyandtest_v2_workflow_alert_notices.py.Pre-existing failures, all identical on base
b5cc18ee2, which I checked in a detached worktree:test_docs_json_gem_security_fix(1)test_docs_link_integrity(3). The broken-link lists are identical on head and base, so every link this PR adds resolves.test_docs_release_notes_integrity::test_generated_pages_match_source(1). The generated release-note pages were already stale on the base, and I didn't regenerate them.test_workflow_cancellation.py(3).test_orchestration_harness_execution.py::test_real_web_scheduler_bootstrap_import_boundaries[order1-False]and[order1-True]. That's the scheduler-first import order, which the test itself marks as a pre-existingbackground_tasks→appNameError. Base gives the same 2 xfails, and this PR doesn't touch that file.python -m pytest ui_tests/test_v2_orchestration_plan_editing.py: 4 failed, 1 passed, both ways, with the same 4 tests failing on base._PAGEthat only the file'smain()sets (L334–335). Under pytest they getNoneand returnFalse, and the pytest reports functional tests that return False as passed #1572 guard turns that into a failure.ui_tests/conftest.pyare unchanged from base, and the file's own runner passes 5/5 both ways (see the table).Documentation
0.261.217section at the top ofdocs/explanation/release_notes.md. The0.261.216section and everything below it are byte-identical to V2.docs/explanation/features/CHAT_ORCHESTRATION_WORKFLOW_RESULTS.md.CHAT_WORKFLOW_RESULTS_FOLLOW_UP.md,docs/guides/ask-about-workflow-results.md,docs/reference/chat-controls.md,docs/admin/orchestration.mdanddocs/admin/workflow.md.Security checklist
@swagger_route(security=get_auth_security()). There are no new routes;route_backend_orchestration.pyonly swaps one import and the two time-zone gates.sanitize_settings_for_user(). No new settings reach a non-admin frontend; the capability reads server-side settings only.Merge base, head and version
paullizer-react-v2-uiatb5cc18ee2, which is the merge base.git -c rerere.enabled=false merge origin/paullizer-react-v2-uiin2f33c2448.b61729627(Clear the 19 py/log-injection CodeQL alerts on V2 #1597), which I merged in201494230, and99930ebce(Roadmap status: 6a done, 6b split, #1597 fixed #1601), whichb5cc18ee2already contains.3059ac4396fa164a921c17727ce9acea518a0c0c.0.261.217.git diff origin/paullizer-react-v2-ui...HEAD -- application/single_app/config.py docs/explanation/release_notes.mdshows only my lines.paullizer/simplechat. Pushing tooriginreturned a 403, which is the same route Phase 5: orchestration runs existing workflows (workflow_run, start-and-link) #1594 took.Coordinator review items → code and tests
All the tests below live in
functional_tests/test_orchestration_workflow_results_<file>.py.discover_result_aliasesskips the whole run if its storedrun.planhas aworkflow_resultsstep, or if any task result has aworkflow_resultsproducer.admitted_result_aliasesrefuses aworkflow_resultsproducer withresult_reference_untrusted.test_completed_workflow_results_run_is_never_discovered_but_compose_only_run_is,test_plan_check_excludes_even_without_read_task_result_and_when_read_is_disabled,test_producer_check_excludes_workflow_results_task_even_if_plan_step_is_missing,test_partially_executed_workflow_results_run_is_not_discovered(results step done, compose not yet),test_superseded_revision_and_retry_attempts_are_excluded,test_stored_aliases_refuse_workflow_results_refs_and_clean_aliases_resolve(admitted_result_aliases/resolve_revision_result_aliases),test_retry_new_attempt_rereads_workflow_result_and_reruns_computed_steps,test_disabled_workflow_results_read_invalidates_retained_consumers_only_for_new_attempt(a new attempt that disables or removes the read never reuses the earlier compose),test_retry_child_refuses_edits_inherited_parent_changes_and_completed_run_editsbuild_workflow_planning_contextnow returns early only when proposals, runs and results are all off. With results on, a ready proposal context gets theworkflow_resultsmarker, and the time zone if it's missing, from_with_workflow_markers. Every other case (proposals off, at quota orcontext_unavailable) reads the catalog through_with_run_catalog(..., runs=..., results=..., time_zone=...).workflow_results_projectionis a subset of the run catalog.test_results_catalog_is_reachable_with_or_without_proposals_or_runs(R, P+R, Ru+R, P+Ru+R, with subset asserts against the run catalog),test_results_catalog_is_used_when_proposals_are_at_quota_or_unavailable,test_results_off_with_no_other_workflow_capability_reads_nothing_normalizepassesworkflow_planningwhenever PROPOSE, RUN or RESULTS is still indegraded_ids.drop_workflow_results(..., drop_all=context_unavailable)drops the invalid steps and writes fixed notes.test_degraded_normalize_keeps_remaining_valid_results_with_plan_inputs,test_drop_workflow_results_removes_invalid_steps_and_writes_fixed_notes_parse_utcexplicitly handlesZ,+00:00and naive values (as UTC); unparseable rows are skipped.@lo/@hiare UTCisoformat()strings, built the same way the writers build them. See "started_at, partitioning and indexing" below.test_timestamp_parsing_day_windows_and_local_date_selection(Z,+00:00, naive, a run completed exactly at local midnight, 02:30Z → the previous day in America/New_York),test_latest_skips_unparseable_rows_missing_started_at_sorts_last_and_full_bad_page_fails_closed,test_query_shapes_are_bounded_projected_partitioned_and_errors_raise_finalizeinvoke), so I rely on the compose-time read plus two finalize re-authorizations. Onworkflow_result_changed, the published message is the fixed failure text plus non-read fixed lines only: no excerpt-derived text, and no disclosure line (workflow name or run time). The run record's at-restmessage, whichlease.updatewrites before the pre-publish re-check, is overwritten.test_pre_publish_reauthorization_failure_publishes_fixed_failure_and_overwrites_at_rest,test_run_summary_and_detail_rows_are_allowlisted_against_message_summary_and_sidecar(pins_run_summary_row/_run_detail_rowas allowlists withoutmessage,summaryor the sidecar)test_results_run_events_and_thought_shaped_payloads_do_not_contain_excerpt_markerchecks stored thoughtcontent/detail(through acosmos_thoughts_containerstub),ThoughtTracker.add_thought, and every emitted event and framesanitize_log_message. There's nostr(exc)to clients, and no excerpt, workflow name or query text in logs.test_logs_and_user_visible_failures_are_sanitizedtest_orchestration_dependency_allowlist.py, which adds'workflow_results'to the registry order list, andtest_orchestration_single_contract_parity.py, which adds"workflow_results"to theretry_on_transientset.b5cc18ee2, and VERSION is0.261.217. The tests useassert_app_version_at_least(...), never an exact version.started_at, partitioning and indexing (item 4)
Every personal run writer I found sets
started_atas UTCisoformat()when it creates the run:'started_at': started_at)'started_at': now)functions_workflow_runtime(control.get("created_at") or _now())The helpers are
functions_workflow_runner._utc_now_iso,functions_workflow_runtime._nowandfunctions_workflow_runtime_store._now, all UTC.Personal runs are partitioned by
/user_id(config.py) with default indexing. Each query passespartition_key=user_idand orders by a single property (c.started_at DESCorc.completed_at DESC), so no composite index is needed.Queries:
latest:SELECT TOP 5 c.id, c.workflow_id, c.status, c.started_at, c.completed_at FROM c WHERE c.user_id=@u AND c.workflow_id=@w AND ARRAY_CONTAINS(@statuses, c.status) ORDER BY c.started_at DESC.TOP 1 … NOT ARRAY_CONTAINS(@finished, c.status).completed_on:SELECT TOP 20 … AND c.completed_at >= @lo AND c.completed_at < @hi ORDER BY c.completed_at DESC. The window is the local day's exact UTC bounds, computed with DST-awarezoneinfoand widened by one minute on each side. An exact local-date filter is applied after parsing, and the date range is today − 366 days to today.workflow_results_unavailable; they're never reported as "no runs".unavailablerather than guessing pastTOP.What
latestdoes with a doc missingstarted_at. Under the default indexing policy, Cosmos DB'sORDER BYreturns such a doc and sorts the undefined value lowest, so it comes last underDESC. Older emulator builds exclude it instead. Either way, it never beats a run that hasstarted_at.eb19f38f7made the reads fixture genuinely omitstarted_at, and it pins this lone-row case.Kill tables (every mutation fails at least one test, plain and under
-O)Planned mutations (M1–M20):
test_results_workflow_handle_must_be_static_and_not_boundtest_runtime_access_chain_fails_closed_before_query_or_result_readtest_query_storage_errors_fail_retryably_or_safely_not_as_no_runs,test_storage_backed_query_run_errors_raise_instead_of_looking_emptytest_timestamp_parsing_day_windows_and_local_date_selectiontest_completed_run_reads_notes_context_and_uses_budget_without_evidencetest_completed_run_reads_notes_context_and_uses_budget_without_evidencetest_results_gates_are_role_aware_and_fail_closedtest_planner_keeps_proposal_instructions_off_for_a_results_only_turnTOPdroppedtest_query_shapes_are_bounded_projected_partitioned_and_errors_raisetest_query_shapes_are_bounded_projected_partitioned_and_errors_raisetest_successful_answer_uses_plural_lineage_metadata_and_safe_disclosureworkflow_resultused instead ofworkflow_result_contextstest_successful_answer_uses_plural_lineage_metadata_and_safe_disclosuretest_pre_publish_reauthorization_failure_publishes_fixed_failure_and_overwrites_at_resttest_rebuild_reauthorizes_context_and_fails_closed_for_changed_or_malformed_sidecartest_duplicate_limit_and_same_plan_run_rulesrender_fileable to bind the outputtest_only_compose_may_consume_workflow_resultstest_step_summary_and_events_never_include_excerpt_texttest_rebuild_reauthorizes_context_and_fails_closed_for_changed_or_malformed_sidecartime_zonenot plumbed when results are ontest_planner_offers_results_only_when_ready_and_projects_time_zoneCoordinator mutations:
test_producer_check_excludes_workflow_results_task_even_if_plan_step_is_missingtest_plan_check_excludes_even_without_read_task_result_and_when_read_is_disabled,test_partially_executed_workflow_results_run_is_not_discoveredtest_results_catalog_is_reachable_with_or_without_proposals_or_runs,test_results_catalog_is_used_when_proposals_are_at_quota_or_unavailabletest_pre_publish_reauthorization_failure_publishes_fixed_failure_and_overwrites_at_resttest_rebuild_reauthorizes_context_and_fails_closed_for_changed_or_malformed_sidecar, answertest_sidecar_stays_server_only_and_restore_reauthorizes_or_fails_closedtest_status_filter_is_a_closed_enumdepends_ontest_results_workflow_handle_must_be_static_and_not_boundtask_resultstest_sidecar_stays_server_only_and_restore_reauthorizes_or_fails_closedtest_step_summary_and_events_never_include_excerpt_texttest_compose_defends_against_nonce_reuse_by_requesting_another_nonceImport-lifecycle and
/stepsmutations:test_orchestration_workflow_results_imports.pytest_orchestration_workflow_results_imports.pytest_orchestration_workflow_results_imports.pytest_orchestration_workflow_results_imports.pypublic_step_recordallowlist widened withworkflow_resultstest_sidecar_stays_server_only_and_restore_reauthorizes_or_fails_closedpublic_step_recordallowlist widened witharguments(would serve the handle)test_sidecar_stays_server_only_and_restore_reauthorizes_or_fails_closedAbout the import tests:
Review survivors. These are the 30 mutants that survived the coordinator's pass at
6cf036e7b. The review round added tests only; no production behavior changed. I reapplied each mutant locally and ran the suites both ways, and every one is killed in both modes.workflow_time_zone_configuredused the proposals gate onlytest_time_zone_is_needed_for_proposals_or_results_but_not_runs_onlytest_results_only_planning_stores_local_zone_and_runs_with_it_validate_retry_contextzone fell back to the proposals-only gatetest_results_only_retry_validation_keeps_saved_zone_and_workflow_context_workflow_results_time_zonedropped the record-zone fallbacktest_saved_workflow_result_note_uses_record_zone_when_context_zone_is_absenttime_zone=Nonetest_saved_workflow_result_note_uses_planning_zone_for_local_midnight,…_uses_context_zone_when_planning_zone_is_absent,…_uses_record_zone_when_context_zone_is_absenttest_compose_fence_uses_planning_zone_before_context_zonetest_compose_fence_uses_planning_zone_before_context_zone,test_compose_fence_uses_context_zone_when_planning_zone_is_absenttest_compose_sends_only_fenced_workflow_result_notes_and_policy_to_modelworkflow_results_errorbranch was droppedtest_compose_reread_failures_keep_specific_workflow_result_failure_codes_select_completed_onwindow check droppedtest_completed_on_rejects_dates_outside_runtime_window_without_querytest_point_reads_raise_retryable_failure_for_cosmos_errors_and_not_found_is_nonepartition_key=Nonein_query_runstest_storage_backed_query_uses_user_partition_keytest_completed_on_skips_margin_rows_from_the_wrong_local_daylen(rows) >= 20became> 20test_completed_on_full_bad_page_fails_closed_but_short_bad_page_is_no_matchprobe_started < chosen_startedtest_latest_marks_only_later_in_progress_runs_as_newerclosedtest_rebuild_returns_none_when_access_has_closed_since_original_readtest_reader_storage_unavailable_fails_step_retryablysaved_inputsno longer forced ANALYSIS_ONLYtest_saved_inputs_force_analysis_only_without_retained_context_or_excerptrecheck()was removedtest_workflow_results_step_rechecks_cancellation_after_read_before_persistingtest_duplicate_workflow_result_reads_save_one_lineage_contexttest_non_read_workflow_result_outcomes_complete_without_lineage,test_mixed_read_and_no_match_workflow_results_save_only_read_lineagetest_failed_partial_workflow_results_input_does_not_create_lineage_or_changed_failureworkflow_results_unavailableremoved from the transient codestest_workflow_results_unavailable_is_transient_and_results_step_retries_oncewaitingexception for the results note was removedtest_waiting_run_with_prepared_answer_keeps_saved_workflow_results_notetest_empty_results_catalog_is_unavailable_and_not_offeredworkflow_results_notespop was removedtest_the_model_cannot_write_why_a_workflow_result_was_not_read_workflow_results_reasonplanner-truth texttest_unavailable_results_are_explained_with_closed_text. It covers the five closed reasons, plusworkflow_results_disabled, an unknown reason (feature_disabled) and a missing reason; the last three all read "turned off for this deployment".Notes on the review round:
test_orchestration_workflow_results_time_zone.py. The mutant rerun set should become CAP + READS + ANSWER + ALIASES + GOLDEN + TIME_ZONE.ui_tests/test_v2_orchestration_workflow_results_input.pydrivesOrchestrationRunView.tsxthrough the harness entry. I also applied three local TSX mutations and the test caught each one, after which the TSX was restored:planInputWorkflowsinstead ofplanInputWorkflowResults<dl>onworkflow_runstepsclosed['reason']in_read_workflow_result_step. It was a no-op, so behavior is unchanged.Leak surfaces
fence_workflow_result/new_fence_nonce). The system message lists every nonce; no IDs or handles.test_compose_inputs_refence_each_read_with_fresh_nonces_and_no_marker_outside_fences,test_compose_defends_against_nonce_reuse_by_requesting_another_nonce,test_compose_rejects_changed_or_unauthorized_result_without_exposing_excerptworkflow_id,run_id,result_sha256),sources=[],origin='generated'. The excerpt is read only inside compose, throughread_workflow_result(..., expected_sha256=..., excerpt_budget_bytes=24 KiB).test_completed_run_reads_notes_context_and_uses_budget_without_evidence; answer sidecar testresult['workflow_results']sidecartask_results.test_sidecar_stays_server_only_and_restore_reauthorizes_or_fails_closed_run_summary_row/_run_detail_roware allowlists; they never serve the run'smessage,summary,task_resultsor the sidecar.test_run_summary_and_detail_rows_are_allowlisted_against_message_summary_and_sidecar/steps(public_step_record)argumentsare dropped, and the summary is fixed text.1c1c40edf)public_execution_fieldsrun_donerun_doneis emitted only after the pre-publish re-check.message,summary,task_results)message.metadata.workflow_result_contexts, plus read-time masking when the source changes or is deleted.test_successful_answer_uses_plural_lineage_metadata_and_safe_disclosure,test_stored_answer_with_workflow_result_contexts_is_masked_when_source_changes_or_is_deleted; 6a suites/outputscomposemay bind to or depend on a results step or anything downstream of one, andfinal_responsemay select only that compose.test_only_compose_may_consume_workflow_results,test_compose_may_consume_results_and_final_response_may_select_that_composemessage_uses_workflow_resulthandling, unchanged, which also coversworkflow_result_contexts.test_workflow_result_*, re-run unchanged in batch B)functions_orchestration_context) leaves out messages withworkflow_result/workflow_result_contexts.test_workflow_result_orchestration_lineage.py(batch B)str(exc).test_logs_and_user_visible_failures_are_sanitizedDecisions made autonomously
latestis the newest finished run that matches the status filter, ordered bystarted_at.in_progressonly when no finished run matches but one is running.completed_onis the user's local date, from today − 366 days to today, in the planner's stored time zone.completed→ completed and completed_partialfailed→ failed, invalid and incompletecancelled→ cancelled and skippedTOPpage fails closed asunavailablerather than silently missing rows.analysis_only/saved_inputs) are never used in a plan. The reader identifies them, the step discards their text and retains no context, and the step gets the closedanalysis_onlyoutcome. That outcome tells the user to choose Ask in chat on the run in its workflow's run history.group_id) are rejected; this capability is personal-only.composemay consume.knowledge_basishandling is unchanged, because results are notes, not sources.workflow_result_changed, raisedfrom None.workflow_time_zone_configured), so output stays byte-identical when results are off.test_orchestration_workflow_runs_admin.pyandtest_chat_workflow_results_admin.pyweren't needed, and both pass unchanged. The new option's position and help text are pinned by capabilitytest_admin_capability_option_sits_after_workflow_run_with_the_expected_help.Overlap with 6b-1
paullizer-phase-6b-1-workflow-results-to-chat,.218) adds a status route after the links route inroute_backend_orchestration.py, plus names on thefrom functions_settings import …line.route_backend_orchestration.py:functions_orchestration_workflow_contextimport block, it addsworkflow_time_zone_configuredand drops the now-unusedworkflow_proposals_configured.time_zone) toworkflow_time_zone_configured.functions_settingsimport line and the links route untouched.Guardrails
run_v2_guardrails.py <worktree> b5cc18ee2 HEAD step9, run at head3059ac439. Its own summary: "40 changed files; app .py 15, xss surface 21, route .py 15, v2 ts/tsx 4".single_app.pyfiles compile..ts/.tsxfiles.mpr-review-step9.md) lists 1,326 keyword-marker findings across 30 files: 1,173 Important and 153 Moderate, all "Needs investigation" heuristics, none a blocker.route_backend_orchestration.pyand the admin workflow pane.conversationkeys.CodeQL
1c1c40edf: the CodeQL check passed (success) with "8 new alerts", all note-level. None was a security alert.functions_orchestration_workflow_results.py: an unused import ofWORKFLOW_RESULTS_SELECTOR_LATEST, and an unused localnamein_check_access.test_orchestration_workflow_results_capability.py: unused imports (datetime,timezone,AGENT_SETTINGS,_build_proposal_context,BOTH,BOTH_SETTINGS,NOW,PRIVATE,RUN_SETTINGS,USER_INFO).test_orchestration_workflow_results_reads.pyL96: a stub method's first parameter was namedself_innerinstead ofself.6cf036e7b, which removes all eight. Neither production edit changes behavior:_display_nameis pure, so the droppedname = _display_name(None, entry)line had no effect.WORKFLOW_RESULTS_SELECTOR_LATESTthrough this module. It's still defined and used infunctions_orchestration_registry.py.6cf036e7bI ran pyflakes over all 23 changed.pyfiles and compared the output with base. The only new hits left were:modules,wf), which the existing suites also import into test modulesrefresh, which defaults toNoneand is redefined only in itsshared_after_refreshscenario6cf036e7b: CodeQL passed with "No new alerts in code changed by this pull request" (0 annotations), and every other check passed.3059ac439. I reran the same comparison, with line numbers stripped, over the 25 changed.pyfiles. Every new hit is a pytest fixture imported into a test module and then named as a test or fixture parameter:modules,wf,real_http_harnessandresults_modulein the functional suiteseditor_assets,editor_browserandconnect_optionsin the new UI test.editor_browserrequestsconnect_options, and 14 existing UI tests import the same three under# noqa: F401.refreshhit is gone.3059ac439: CodeQL passed with "No new alerts in code changed by this pull request" (0 annotations), and all 11 checks passed.Follow-ups (out of scope)