Skip to content

v0.260.028 - #1337

Merged
Paul Lizer (paullizer) merged 708 commits into
mainfrom
Staging
Aug 21, 2026
Merged

v0.260.028#1337
Paul Lizer (paullizer) merged 708 commits into
mainfrom
Staging

Conversation

@paullizer

@paullizer Paul Lizer (paullizer) commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Promotes Staging into main, advancing the application from v0.250.001 to v0.260.028.
  • Carries the consolidated v0.260.001 release, the stabilization patches documented through v0.260.025, and the final v0.260.026-v0.260.028 Latest Features screenshot and publishing updates.
  • Includes 708 commits across 1,590 changed files since the previous Staging promotion.

Release highlights

  • Document understanding: enhanced extraction, figure descriptions, embedded Office image processing, optional formula extraction, and stronger tabular/mixed-source analysis.
  • Workflows and automation: ordered multi-task workflows, richer alert rules, cancellation, retries, activity tracking, and generated deliverables.
  • Agents and actions: inbound MCP, Yamcs and RocksDB integrations, broader action connection testing, action-plus-workspace-search behavior, and reliable multi-format file generation.
  • Chat and collaboration: shared-conversation file approvals, improved mentions and accessibility, conversation grounding/contents, cited-media-only galleries, completion notifications, and audio export.
  • Administration and operations: grouped Admin Settings, expanded backup/migrate/restore tooling, File Sync, Redis/Cosmos diagnostics, documentation coverage, and the v0.260 Latest Features catalog with completed screenshots.
  • Security and reliability: managed-identity endpoint allowlists, server-side action authentication enforcement, route/access-control hardening, safer documentation media handling, cache invalidation safeguards, and startup fixes.

Upgrade notes

  • Rebuild deployment images or reinstall requirements.txt so the new yamcs-client dependency is available where Yamcs actions are used.
  • Existing workflow alert configuration is migrated automatically; review the resulting rules in Staging before production promotion.
  • Deployments without Redis remain functional, but conversation and DAI cache acceleration no longer falls back to the Cosmos settings container.
  • Existing documents retain their current chunk layout until re-extracted; reprocess documents to adopt the new embedded-image placement behavior.
  • Review the full v0.260.001 rollup and release notes for detailed migration and patch history.

Known merge gate

  • The PR-level GitHub Advanced Security check currently fails with 1,401 alerts, including 15 critical, 73 high, and 459 medium security findings across this 708-commit promotion.
  • These alerts are not indicative of actual SSRF errors, the URLs are controlled by admins. We will be looking at methods to align with SSRF practices but we work across all azure clouds and local for development so we must be careful on providing a whitelist of fqdns that are allowed, which is whats being triggeed.

Paul Lizer (paullizer) and others added 30 commits August 12, 2026 09:46
…ut-contract-phase-2-intent

Phase 2: unify Analyze deliverable intent
…ut-contract-phase-3-schema

Phase 3: separate public schema from tabular lineage
…ut-contract-phase-4-correctness

Phase 4: Add tabular transformation contract
…ut-contract-phase-5-lifecycle

Phase 5: Add durable artifact-set lifecycle
…ut-contract-phase-6-ui

Phase 6: Render plural artifact sets
…ut-contract-phase-7-integration

Phase 7: Add rollout rollback controls
…e-artifact-output-contract

# Conflicts:
#	application/single_app/config.py
…ut-contract-phase-7a-stabilization

Phase 7A: stabilize Analyze artifact closure baseline
Merge Phase 7B correctness slice for #1233.
Merge Phase 7C publication slice for #1233.
Merge final Phase 7D validation documentation for #1233.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ut-contract

Complete Analyze artifact output contract
- Default tabular Analyze/Search durable-preflight parity to active (tabular_request_planner_mode, enable_tabular_search_shared_preflight, enable_tabular_analyze_durable_preflight); previously off-by-default with no admin UI toggle, so exhaustive row-by-row requests silently fell back to bounded foreground synthesis and truncated. Add SIMPLECHAT_DISABLE_TABULAR_PARITY_DURABLE_PREFLIGHT env var as the emergency rollback path instead of a UI toggle.

- Add scheduler tick/skip visibility logging (debug_print) to the tabular generated-output, file sync, and data management scheduler loops, and stop suppressing the tabular scheduler scan-result log on empty scans, to diagnose stuck background exports.

- Fix queue_tabular_generated_output_run locking output_schema to the lineage-only internal checkpoint schema before batch 1 runs whenever no public output schema is known yet (e.g. combined Analyze requests with prose-described columns). This made every batch, including batch 1, fail schema validation against a schema with none of the model's real output columns. Now defers to batch-1 discovery when public_output_schema is empty, matching the working Search/structured_export behavior.

- Add regression tests: settings defaults + env kill switch, a real (unmocked) deliverable-contract reproduction of the bug precondition, and a full end-to-end AST-extracted invocation of queue_tabular_generated_output_run itself.

Fixes truncated exhaustive tabular Analyze answers and stuck/failing combined CSV exports reported in production.
… metadata

Root cause of combined Analyze+CSV runs freezing at 'Complete' with no download button: _normalize_tabular_run_planner_metadata() rebuilt the persisted deliverable_contract from an explicit field whitelist that never included requested_artifacts. Every run sanitized through it persisted an empty expected-artifact list, so validate_analysis_artifact_set() rejected both the real Markdown and CSV artifacts as extra_artifact, permanently locking artifact_set.lifecycle_state below 'completed' with no self-heal path.

Confirmed via the 0.250.190 diagnostic log_event additions firing in production for two customer test runs (reason_codes: ['extra_artifact'], expected_artifact_ids: []).

Fix: add a bounded, sanitized requested_artifacts list to the whitelist. Verified end-to-end with a real, unmocked deliverable contract routed through the real sanitizer.

Tests updated to route real contracts through the real sanitizer (closing the gap that let this slip through originally), plus a new direct regression guard. Full related test suite re-verified with no regressions.

Version 0.250.190 -> 0.250.191.
Copilot AI and others added 29 commits August 20, 2026 09:35
Rebased onto Development, which shipped v0.260.001 and restructured the in-app
Latest Features experience into three tiers. The documentation site was a full
release behind, still presenting v0.250.001 as current.

- Mirror the application's three-tier model: v0.260.001 current, v0.250.001
  previous, v0.239.001-v0.241.007 archive.
- Add 20 feature guides for the v0.260.001 release, sourced from the end-user
  copy already written in support_menu_config.py, and publish their 60 gallery
  images.
- Track the branded 'Screenshot pending' placeholders the release ships. They
  render so cards are not broken, but they are now listed on the media status
  page with the exact paths to overwrite, so they are visible work rather than a
  silent gap.
- Use the 14 real admin settings screenshots that already existed in the
  repository. Those tab pages had been rendering 'screenshot needed'
  placeholders for images we already had. The four tabs with no capture keep
  their placeholder so genuine gaps stay visible.
- Update test_latest_release_docs_structure.py for the new tiers. Its pinned
  current-release slugs, guide titles, and image lists were still v0.250, and
  its admin screenshot assertion still pointed at the retired monolithic
  configuration page rather than the per-tab pages that now own those images.
  The assertion was verified to still fail when an image is fully orphaned.
- Fix the release notes generator, which inlined a fixed number of releases on
  its index. The consolidated v0.260.001 rollup is large enough alone to push
  the index past the maximum page size and fail generation. The inline section
  now fills by size rather than by count.
- Repoint archived release notes links at the repository, since the internal
  feature and fix note trees are intentionally unpublished.

Verified: 100 browser checks across five viewports, 33,892 internal links with
zero broken, 6/6 coverage checks, 6/6 site quality checks, the latest-release
structure test, and all three generators in sync.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…lities

Rebased onto Development at v0.260.019. The only application surface change was
Admin Settings: capabilities, actions, chat controls, app pages, and feature
surfaces are all unchanged, which scoped the work precisely.

Admin Settings moved from 18 flat tabs to a grouped architecture of 14 groups,
44 tabs, and 93 sections, now declared in a new admin_settings_nav.py.

- Rewrite the inventory extractor to read that definition. It had scraped tab
  markup out of admin_settings.html, which shrank from 12,492 lines to 620 when
  the template was split into per-tab partials, so scraping returned a single
  literal '{{ admin_tab.id }}' and admin coverage silently collapsed to one
  bogus tab. Removed the now-dead HTML tab parser.
- Rebuild the 19 admin pages as 14 group pages, each tab reachable by its own
  anchor. All 18 retired tab URLs still resolve, 13 by redirect and 5 because
  the old tab id is now a group id. Inbound links and the feature catalog's
  admin_tab values were repointed.
- Update the coverage test for the grouped structure: every group needs a page
  and every tab id must appear as an anchor on its group page.
- Add a guide for collaborating in a conversation, covering the shared file
  approvals and '@' mention Tab completion shipped in v0.260.005 and v0.260.006,
  and document the Blob Storage action's managed identity and account key
  options.

Two generator bugs surfaced and were fixed:

- Release notes pages failed the site build outright. Release notes quote
  template syntax when describing template work, and an unescaped Jinja 'block'
  tag was parsed as Liquid. Quoted syntax is now escaped and renders literally.
- Some release note entries linked to the unpublished engineering note trees.

Verified: 100 browser checks across five viewports, 32,483 internal links with
zero broken, 7/7 coverage checks, 6/6 site quality checks, the latest-release
structure test, and all three generators in sync.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CodeQL flagged js/xss-through-dom in the documentation site's click-to-enlarge
screenshot viewer. It assigned an image URL read from a data attribute in the
rendered page, so page content flowed directly into a URL sink.

The viewer now resolves the value against the document and requires a
same-origin http or https URL whose path ends in an image extension. That
rejects scheme-based payloads such as javascript: and data: URLs and any
off-site source. All documentation media is local, so no legitimate image is
affected, and the enlarge behavior is unchanged.

Adds ui_tests/test_docs_media_lightbox_source_validation.js, which executes the
real validation function against hostile and legitimate inputs so the guard
cannot be quietly removed or weakened. It covers javascript: and data: URLs,
off-site and protocol-relative sources, same-origin non-image paths, and
non-string input, alongside the local image paths that must keep working.

Verified in a browser as well as in isolation: legitimate screenshots still open
in the viewer, and a javascript: URL leaves it closed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The media lightbox regression test asserted an accepted URL by checking
result.startsWith(ORIGIN). CodeQL correctly flagged that as
js/incomplete-url-substring-sanitization: a prefix check is weak URL matching,
because a host such as microsoft.github.io.example.com shares the prefix without
sharing the origin.

The assertion now parses the result and compares the origin field. The test
still passes all 17 checks, so the guard it protects is unchanged.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Documentation site redesign: search, navigation, mobile support, and complete capability coverage
…t context

Running SimpleChat directly (python app.py) initializes Semantic Kernel at
module scope, outside any Flask request context. Loading an agent with actions
assigned called get_current_user_id() unguarded, which reads the Flask session
proxy and raised "RuntimeError: Working outside of request context", aborting
startup. Gunicorn deployments were unaffected because initialization happens in
a before_request hook.

Add get_current_user_id_or_none(), which returns None when there is no request
context, and route the five identity lookups in semantic_kernel_loader.py
through it. get_current_user_id() is left unchanged so authorization callers
keep failing loudly rather than silently degrading to no identity.

The group scope and personal endpoint lookups also short-circuit rather than
forwarding an unresolved identity, since require_active_group() and
get_user_settings() perform Cosmos reads keyed on the user id.

Fixes #1327

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
… other

Selecting an agent with actions and enabling a workspace produced answers that
never invoked any action and reported numbers absent from the cited spreadsheet.
Three independent defects combined to cause this.

The retrieval augmentation prompt instructed the model to base its answer only
on the retrieved excerpts. Agent actions were attached and available -- agents
are built with FunctionChoiceBehavior.Auto() and nothing disables tools when
documents are in scope -- but the model was told not to reach for them. Excerpts
are now framed as starting evidence, and the model is directed to call an
available action when they lack what the question needs, then reason over both.
The no-fabrication rule is preserved and strengthened.

should_run_tabular_evidence() suppressed computation whenever any narrative
source was in scope, and treated topic words such as "report" and "policy" as
evidence-type signals. Because only a truncated three-row preview of a
spreadsheet is indexed for search, skipping computation left the model deriving
totals from those preview rows. Tabular sources in scope are now computed unless
the question unambiguously names a narrative artifact, restoring parity with the
legacy path used when mixed-source search is disabled.

A skipped tabular source previously reported that processing "was not needed",
implying irrelevance. It now states the full table was never read, that indexed
excerpts are a truncated preview, and that the tabular analysis action should be
called if values are required.

No new setting is introduced; these are correctness fixes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…context-guard

Guard Semantic Kernel startup identity lookups against missing request context
Adds the issue reference to the three v0.260.023 release note entries and to the
fix documentation header, and records #1021 as the related strategic initiative
that this targeted fix does not close.

Refs #1332

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Inline galleries were built from the full retrieved citation arrays, so
every workspace or web media file returned by search became a tile inside
the message bubble even when the response never referenced it. That
presented unrelated media as though it supported the answer, consumed the
five-item gallery cap with retrieval noise, and issued enhanced-citation
fetches for documents that were never cited.

Issue #1249 already persists the exact cited subsets on each assistant
message and delivers them to the browser on every path, but no frontend
module read them. Add chat-citation-tracking.js as the browser mirror of
_message_has_citation_tracking, and feed the cited subsets to both gallery
renderers from appendMessage. The Sources disclosure keeps the complete
retrieved set.

Agent and tool galleries stay ungated because they are executed results,
and legacy messages without tracking keep prior behavior rather than being
parsed at read time.

Fixes #1329
Refs #1249

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…on-gating

Gate inline image and video galleries to cited media only
Development shipped v0.260.023 (semantic kernel startup request context) and
v0.260.024 (inline media cited-only gating) while this branch was open, so both
the version constant and the release notes collided.

Resolution:
- config.py takes 0.260.025, since 0.260.023 and 0.260.024 are both taken.
- release_notes.md keeps Development's v0.260.024 and v0.260.023 sections and
  moves this branch's three entries into a new v0.260.025 section at the top.
- Renumbered the version references in the fix documentation and in the two
  affected functional test headers.
- Registered the fix page in docs/explanation/fixes/index.md, which Development
  added while this branch was open.
- Regenerated docs/explanation/release-notes/ with
  scripts/build_release_notes_pages.py, since those pages are generated from
  release_notes.md.

Refs #1332

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…rkspace-search

Run agent actions and workspace search together instead of one or the other
…-screenshots

Capture real v0.260.001 Latest Features screenshots and publish the cards
Promote v0.260.028 from Development to Staging
@paullizer
Paul Lizer (paullizer) merged commit 929f5c6 into main Aug 21, 2026
9 of 10 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.

6 participants