Skip to content

Promote v0.260.028 from Development to Staging - #1335

Merged
Paul Lizer (paullizer) merged 708 commits into
Stagingfrom
Development
Aug 21, 2026
Merged

Promote v0.260.028 from Development to Staging#1335
Paul Lizer (paullizer) merged 708 commits into
Stagingfrom
Development

Conversation

@paullizer

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

Copy link
Copy Markdown
Contributor

Summary

  • Promotes Development into Staging, 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.

Critical merge instruction

Use Create a merge commit / gh pr merge --merge for this PR.

Do not squash or rebase merge. Preserving Development ancestry keeps future Staging promotions incremental and avoids replaying this 708-commit range.

Validation

  • git merge-base --is-ancestor origin/Staging origin/Development succeeded.
  • The working tree was clean after fetching the latest origin/Development and origin/Staging refs.
  • azd deploy for Development completed successfully, and the Development deployment was manually exercised before this promotion request.
  • Feature and fix PR validation completed before each change merged into Development; this promotion PR will run the Staging-targeted checks as the final gate.

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:25
…ut-contract-phase-1-contract

Phase 1: Add analyze deliverable contract baseline
…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.
Copilot AI and others added 27 commits August 20, 2026 10:28
…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

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

@paullizer
Paul Lizer (paullizer) merged commit dde51cd into Staging Aug 21, 2026
8 of 9 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.

7 participants