v0.260.028 - #1337
Merged
Merged
Conversation
…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.
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
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>
…agement admin screenshots
…rkspace-search Run agent actions and workspace search together instead of one or the other
…creenshots for v0.260.001
… drop uncapturable admin screenshots
…-screenshots Capture real v0.260.001 Latest Features screenshots and publish the cards
Promote v0.260.028 from Development to Staging
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
Stagingintomain, advancing the application from v0.250.001 to v0.260.028.Release highlights
Upgrade notes
requirements.txtso the newyamcs-clientdependency is available where Yamcs actions are used.Known merge gate