Choose which recent features are shared on the user Latest Features page. Deployment and Redis start unchecked because they are mainly admin-facing rollout and infrastructure topics.
-
- {% for feature in support_latest_feature_catalog %}
-
-
-
-
+
+
+
+
+ When enabled, user-facing Latest Features cards can show public guide buttons in addition to the direct in-app shortcuts.
+
+ {% for release_group in support_latest_feature_release_groups %}
+ {% set checklist_collapse_id = release_group.collapse_id ~ 'Checklist' %}
+
+
+
+
+
{{ release_group.label }}{% if release_group.release_version %}v{{ release_group.release_version }}{% endif %}
+
{{ release_group.description }}
+
+ {% if not release_group.default_expanded %}
+
+ {% endif %}
+
+
+
+ {% for feature in release_group.features %}
+
+
+
+
+
+
+ {% endfor %}
+
- {% endfor %}
+ {% endfor %}
@@ -2847,6 +2883,93 @@
+
+ {% for release_group in support_latest_feature_release_groups_preview %}
+ {% if release_group.id == 'previous_release' %}
+
+ These were the headline user-facing items in the earlier v{{ release_group.release_version }} release set. Keeping them here gives admins a simple N and N-1 view without mixing older items into the current release list.
+
+
+ {% for feature in release_group.features %}
+
+
+
+
+
+
{{ feature.title }}
+
{{ feature.summary }}
+
+
+ {% if settings.support_latest_features_visibility.get(feature.id, true) %}Shared with Users{% else %}Hidden from Users{% endif %}
+
+
+
{{ feature.details }}
+ {% if feature.guidance %}
+
+ {% for tip in feature.guidance %}
+
{{ tip }}
+ {% endfor %}
+
+ {% endif %}
+ {% if feature.images %}
+
+ {% for image in feature.images %}
+
+ {% endfor %}
+
Visibility still comes from General > User-Facing Latest Features, so admins can keep previous release content available without promoting every item forever.
Guided tutorial buttons are shown by default. If you want them out of the way after onboarding, use the profile shortcut above to hide or restore them for your own account.
+ {% endif %}
+ {% else %}
+
{{ feature.passive_note or 'This is mostly a behind-the-scenes improvement managed by your admins. You will usually notice it through a smoother experience rather than a new user control.' }}
+ {% endif %}
+
+
+
+
+
+
+{% endmacro %}
+
@@ -271,106 +413,45 @@
Latest Features
New
+ {% if support_latest_features or support_previous_release_feature_groups %}
{% if support_latest_features %}
{% for feature in support_latest_features %}
-
-
-
-
- {% if feature.images %}
-
- {% for image in feature.images %}
-
- {% endfor %}
-
Guided tutorial buttons are shown by default. If you want them out of the way after onboarding, use the profile shortcut above to hide or restore them for your own account.
- {% endif %}
- {% else %}
-
This is mostly a behind-the-scenes improvement managed by your admins. You will usually notice it through a smoother experience rather than a new user control.
+ {% endif %}
+
+ {% for release_group in support_previous_release_feature_groups %}
+
+
+
+
{{ release_group.label }}
+
{{ release_group.description }}
+ {% if release_group.release_version %}
+
Based on the v{{ release_group.release_version }} release.
+ {% endif %}
+
+
+
+
+
+ {% for feature in release_group.features %}
+ {{ render_support_feature_card(feature) }}
+ {% endfor %}
+
+
+
+ {% endfor %}
{% else %}
Your admins have not shared any Latest Features announcements right now.
diff --git a/application/single_app/templates/profile.html b/application/single_app/templates/profile.html
index 061eec3c..685315e7 100644
--- a/application/single_app/templates/profile.html
+++ b/application/single_app/templates/profile.html
@@ -454,7 +454,7 @@
Fact Memory
{% if app_settings.enable_retention_policy_personal %}
-
+
Retention Policy Settings
Configure how long to keep your conversations and documents. Items older than the specified period will be automatically deleted.
}
loadRetentionSettings();
+ handleProfileFeatureAction();
loadTutorialPreferences();
loadFactMemory();
loadMicrophoneSettings();
diff --git a/docs/explanation/features/v0.241.001/LATEST_FEATURES_ACTION_LINKS.md b/docs/explanation/features/v0.241.001/LATEST_FEATURES_ACTION_LINKS.md
new file mode 100644
index 00000000..c5c2ae3b
--- /dev/null
+++ b/docs/explanation/features/v0.241.001/LATEST_FEATURES_ACTION_LINKS.md
@@ -0,0 +1,61 @@
+# Latest Features Action Links (v0.241.003)
+
+## Overview
+This update turns the earlier Previous Release feature cards into direct in-app entry points. Users can now jump from Support > Latest Features into the matching Chat, Workspace, and Profile workflows instead of stopping at a descriptive card.
+
+Version Updated: 0.241.003
+
+## Dependencies
+- `application/single_app/support_menu_config.py`
+- `application/single_app/functions_settings.py`
+- `application/single_app/route_frontend_admin_settings.py`
+- `application/single_app/templates/admin_settings.html`
+- `application/single_app/static/js/chat/chat-onload.js`
+- `application/single_app/static/js/chat/chat-documents.js`
+- `application/single_app/static/js/workspace/workspace-init.js`
+- `application/single_app/static/js/workspace/workspace-tags.js`
+- `application/single_app/templates/profile.html`
+- `functional_tests/test_latest_features_action_links.py`
+- `ui_tests/test_latest_features_action_launchers.py`
+
+## Implemented in version: **0.241.003**
+
+## Technical Specifications
+
+### Action Metadata
+- Previous-release Latest Features cards now include direct in-app buttons for:
+ - conversation export
+ - retention settings
+ - workspace tag management
+ - workspace grid view
+ - chat scope management
+ - chat tag filtering
+- Public documentation guide buttons remain available through the same feature metadata, but they are now conditional.
+
+### Admin-Controlled Guide Links
+- A new General settings toggle named **Show Simple Chat Documentation Guide Links** controls whether public documentation buttons are shown on Latest Features cards.
+- The setting defaults to `False` so users see only the in-app shortcuts unless an admin explicitly enables the external guide links.
+- Admin preview cards use the same filtered action list, so the admin tab reflects what end users will actually see.
+
+### Launch Intents
+- Chat launch intents use the `feature_action` query parameter to:
+ - open the first available conversation export workflow
+ - open the multi-workspace scope selector
+ - open the chat tag-filter controls
+- Workspace launch intents use the same parameter to:
+ - open the tag-management modal
+ - switch directly into grid view
+- Profile launch intents jump to the retention settings section and focus the retention control.
+
+## Usage Instructions
+- Open **Support > Latest Features** and expand **Previous Release Features**.
+- Choose an in-app action button when you want to land directly in the related workflow.
+- Open **Admin Settings > General > User-Facing Latest Features** when you want to enable or disable the public documentation guide buttons.
+
+## Testing and Validation
+- Confirm the new admin toggle is saved and restored correctly.
+- Confirm previous-release cards still show their in-app action buttons when guide links are disabled.
+- Confirm guide buttons appear only when the new admin toggle is enabled.
+- Confirm workspace launch links open grid view or tag management directly.
+- Confirm the profile launch link scrolls to retention settings.
+- Confirm the chat launch links open grounded-search scope controls or the export workflow as expected.
\ No newline at end of file
diff --git a/docs/explanation/features/v0.241.001/LATEST_FEATURES_ADMIN_TAB.md b/docs/explanation/features/v0.241.001/LATEST_FEATURES_ADMIN_TAB.md
index 01661033..3bdf120f 100644
--- a/docs/explanation/features/v0.241.001/LATEST_FEATURES_ADMIN_TAB.md
+++ b/docs/explanation/features/v0.241.001/LATEST_FEATURES_ADMIN_TAB.md
@@ -1,130 +1,55 @@
-# Latest Features Admin Tab (v0.240.085)
+# Latest Features Release Grouping (v0.241.002)
## Overview
-This feature adds a dedicated **Latest Features** tab to Admin Settings so administrators can review the most important recent capabilities in one place and decide what to communicate to users.
+This update extends the existing **Latest Features** experience so admins and end users can see both the current release highlights and the immediately previous release highlights without merging them into one long list.
-Version Updated: 0.240.085
+Version Updated: 0.241.002
## Dependencies
-- `application/single_app/templates/admin_settings.html`
-- `application/single_app/static/js/admin/admin_settings.js`
-- `application/single_app/functions_settings.py`
+- `application/single_app/support_menu_config.py`
+- `application/single_app/route_frontend_support.py`
- `application/single_app/route_frontend_admin_settings.py`
+- `application/single_app/templates/latest_features.html`
+- `application/single_app/templates/admin_settings.html`
+- `application/single_app/templates/_sidebar_nav.html`
-## Implemented in version: **0.240.003**
+## Implemented in version: **0.241.002**
## Technical Specifications
-### Admin Settings Placement
-- The tab is added directly to the existing Admin Settings tab list.
-- It is positioned near the front of the page so administrators can review new functionality early.
-- Content is grouped into collapsible cards to keep the page readable even as additional features are added in future releases.
-
-### Feature Grouping
-The tab groups recent functionality into broader themes instead of listing every release note entry separately:
-- Release Notifications Registration
-- Guided Tutorials
-- Background Chat Completion
-- Multi-Endpoint GPT Selection
-- Tabular Data Analysis
-- Citation Improvements
-- Document Revisioning and Management
-- Conversation Summaries and Export
-- Agent and Action Operations
-- AI Transparency
-- Fact Memory
-- Deployment and Runtime Guidance
-- Redis and Key Vault
-- Send Feedback
-- Support Menu
-
-### Mirrored Settings
-Two high-impact configuration areas are mirrored in the Latest Features tab:
-- `enable_thoughts`
-- Enhanced Citations settings:
- - `enable_enhanced_citations`
- - `office_docs_authentication_type`
- - `office_docs_storage_account_url`
- - `office_docs_storage_account_blob_endpoint`
- - `tabular_preview_max_blob_size_mb`
-- Redis cache settings:
- - `enable_redis_cache`
- - `redis_url`
- - `redis_auth_type`
- - `redis_key`
-
-The mirrored controls are UI proxies only. They do not create new saved settings. JavaScript keeps them synchronized with the canonical controls in the existing tabs.
-
-### Screenshot Gallery Strategy
-Saved screenshots are rendered directly from:
-- `application/single_app/static/images/features/`
-
-Current screenshots surfaced in the admin UI:
-- `guided_tutorials_chat.png`
-- `guided_tutorials_workspace.png`
-- `background_completion_notifications-01.png`
-- `background_completion_notifications-02.png`
-- `model_selection_multi_endpoint_admin.png`
-- `agent_default_model_review_summary.png`
-- `agent_default_model_review_action.png`
-- `tabular_analysis_enhanced_citations.png`
-- `citation_improvements_history_replay.png`
-- `citation_improvements_amplified_results.png`
-- `document_revision_workspace.png`
-- `document_revision_delete_compare.png`
-- `enable_support_menu_for_end_users.png`
-- `conversation_summary_card.png`
-- `pdf_export_option.png`
-- `per_message_export_menu.png`
-- `agent_action_grid_view.png`
-- `sql_test_connection.png`
-- `thoughts_visibility.png`
-- `facts_memory_view_profile.png`
-- `fact_memory_management.png`
-- `facts_citation_and_thoughts.png`
-- `gunicorn_startup_guidance.png`
-- `redis_key_vault.png`
-- `support_menu_entry.png`
-
-Each screenshot now renders as a thumbnail in the Latest Features tab. Clicking a thumbnail opens a larger popup modal with a close button, and clicking outside the popup also dismisses it. The popup styling is tuned for both light and dark themes so the caption text, framed image surface, and modal shell remain easy to distinguish.
-
-The GPT selection, citation improvement, document revision, and Support Menu entries now use saved PNG screenshots so the admin preview matches the current product surfaces more closely.
-
-The release notifications registration explainer is intentionally text-only. It points admins to a live control that already exists at the top of Admin Settings, so no duplicate screenshot is needed.
-
-### New Feature Coverage
-- **Release Notifications Registration** explains the Registered or Unregistered badge beside the version number, clarifies that it is admin-only, and tells admins that clicking it opens the modal used to register this environment for release updates.
-- **Multi-Endpoint GPT Selection** highlights the admin workflow for enabling multiple model endpoints, configuring the default fallback model used when a request does not provide an explicit selection, and using the admin-only Agent Default Model Review modal to selectively rebind inherited or explicitly overridden agents.
-- **Citation Improvements** explains conversation history citation replay and citation amplification so admins understand why follow-up questions stay grounded even when the assistant is working from prior evidence.
-- **Document Revisioning and Management** explains that same-name uploads create versioned revision families, keep previous versions available for traceability, and carry classifications and tags forward to the newest revision.
-- **Support Menu** introduces the user-facing support surface that exposes Latest Features and Send Feedback outside the admin-only experience.
-- **User-Facing Latest Features in General Settings** gives admins a direct visual reminder that the General tab controls which latest-feature cards are shared with end users.
-- **Fact Memory** explains the new Instructions-versus-Facts model, the profile memory manager, and the dedicated memory-thought and citation visibility users now see in chat.
+### Shared Release Metadata
+- The support latest-features catalog is now grouped by release metadata instead of behaving like one flat list only.
+- The current release remains the primary `Latest Features` section.
+- A new `Previous Release Features` group preserves the earlier `v0.239.001` release highlights.
+- Visibility still uses the same per-feature setting keys, so existing admin sharing choices continue to work.
+
+### User-Facing Latest Features Page
+- The user-facing Support > Latest Features page still renders the current release cards directly.
+- Previous Release Features now appear below the current cards in a collapsed section.
+- The previous-release cards reuse the same feature-card layout, guidance, and action-card treatment as the current release items.
+- External guide links now use the public documentation site at `https://microsoft.github.io/simplechat/` for the previous release walkthroughs that already exist there.
+
+### Admin General Settings
+- `General > User-Facing Latest Features` is now grouped by release.
+- The current release checklist stays expanded.
+- The previous release checklist is collapsed by default so admins can preserve N and N-1 visibility without making the settings area too long.
+
+### Admin Latest Features Tab
+- The admin-only Latest Features tab keeps the current release cards as the primary content.
+- A new collapsed `Previous Release Features` card sits after the current release items.
+- Each previous-release item shows its summary, details, guidance, and whether it is currently shared with end users.
+- The admin sidebar submenu now includes a direct link to the Previous Release Features card.
## Usage Instructions
-- Open **Admin Settings**.
-- Select **Latest Features**.
-- Expand any card to review the feature summary and the saved screenshots.
-- Click any screenshot thumbnail to open a larger preview modal.
-- Use the Release Notifications Registration card to explain what the Registered or Unregistered badge means and where admins can update that status.
-- Use the mirrored toggles when you want to enable Processing Thoughts or Enhanced Citations directly from the overview page.
-- Use the GPT Selection card to direct admins to the AI Models tab when they need to review endpoint availability, confirm the saved default fallback model, or selectively rebind agents in the admin-only review modal.
-- Use the Citation Improvements card to explain how grounded evidence is preserved across follow-up turns.
-- Use the Document Revisioning card to explain why same-name uploads now create a new current version instead of replacing the old file in place.
-- Use the mirrored Redis cache controls when you want to review or update cache settings from the overview page without leaving Latest Features.
-- Use the deployment guidance card if you run the native Python App Service variant and need the Gunicorn startup command.
-- Use the Send Feedback card to jump directly into the admin mailto workflow for bug reports and feature requests.
-- Use the Support Menu card as a communication aid for end-user help and feedback workflows, including the General-tab checklist that controls user-facing latest-feature sharing.
+- Open **Admin Settings** and select **Latest Features** to review the current release summary cards.
+- Expand **Previous Release Features** when you want to revisit the immediately prior release set.
+- Open **General > User-Facing Latest Features** when you want to control which current and previous release items are shared to end users.
+- Open **Support > Latest Features** as an end user to verify the current release appears first and the previous release group appears below it in a collapsed section.
## Testing and Validation
-- Confirm the Latest Features tab renders in Admin Settings.
-- Confirm each card expands and collapses correctly.
-- Confirm the admin-only Release Notifications Registration card renders first and does not depend on a screenshot asset.
-- Confirm saved screenshots render as thumbnails and open in the larger preview modal.
-- Confirm the saved screenshots render for GPT Selection, including the agent review summary and modal action images, plus Citation Improvements, Document Revisioning, Support Menu, and the General-tab user-facing latest-features checklist.
-- Confirm the Fact Memory card renders with screenshots for the profile entry point, memory manager, and chat recall experience.
-- Confirm the preview modal closes from both the close button and backdrop click.
-- Confirm mirrored settings remain synchronized with the canonical controls in the existing tabs.
-- Confirm Redis mirror controls stay synchronized with the canonical settings in the Scale tab.
-- Confirm the page restores the active tab after save when Latest Features was the current tab.
-- Confirm the Send Feedback card links into the dedicated Send Feedback tab.
\ No newline at end of file
+- Confirm the support catalog exposes both current and previous release groups.
+- Confirm the user-facing Latest Features page renders the current release directly and the previous release in a collapsed section.
+- Confirm previous-release guide links open the public documentation pages when present.
+- Confirm the admin General checklist groups current and previous release items separately.
+- Confirm the admin Latest Features tab contains the collapsed Previous Release Features card.
+- Confirm the admin sidebar submenu can jump directly to the Previous Release Features card.
\ No newline at end of file
diff --git a/docs/explanation/fixes/v0.241.001/GROUP_WORKSPACE_DELETE_MODAL_FIX.md b/docs/explanation/fixes/v0.241.001/GROUP_WORKSPACE_DELETE_MODAL_FIX.md
new file mode 100644
index 00000000..80dab376
--- /dev/null
+++ b/docs/explanation/fixes/v0.241.001/GROUP_WORKSPACE_DELETE_MODAL_FIX.md
@@ -0,0 +1,46 @@
+# Group Workspace Delete Modal Fix (v0.241.004)
+
+## Overview
+Fixed the group workspace document delete flow so the revision-choice modal is always present and behaves the same way as the personal and public workspace pages.
+
+Version Updated: 0.241.004
+
+Implemented in version: **0.241.004**
+
+## Issue Description
+Deleting a document from Group Workspace could show `Delete confirmation dialog is unavailable. Refresh the page and try again.` instead of opening the revision-choice modal.
+
+## Root Cause Analysis
+The group delete modal markup had been embedded inside the `updateGroupStatusAlert()` JavaScript template instead of being rendered as standalone page markup.
+
+When the active group was in the normal active state, that alert content was hidden, so the modal never existed in the DOM. The delete flow then failed closed as designed because its modal readiness guard could not find the dialog elements.
+
+## Technical Details
+Files modified:
+- `application/single_app/templates/group_workspaces.html`
+- `application/single_app/config.py`
+- `functional_tests/test_group_document_delete_modal_wiring.py`
+- `ui_tests/test_workspace_family_document_revision_delete_modal.py`
+
+Code changes summary:
+- Moved the group delete modal into standalone template markup in the content block.
+- Removed the modal markup from the group status alert `innerHTML` template.
+- Updated the workspace-family UI regression test to verify the modal exists before the delete action is triggered.
+- Added a functional regression test that checks the group template keeps the modal outside the alert injection block.
+
+Testing approach:
+- Functional template-wiring regression coverage.
+- Workspace-family UI regression coverage for personal, group, and public delete flows.
+
+## Validation
+Test results:
+- The group delete flow now has a real page-level modal available on initial load.
+- The fail-closed path still remains in place if the modal is actually removed or missing.
+
+Before/after comparison:
+- Before: group delete could fail immediately because no delete modal existed in the DOM for active groups.
+- After: group delete opens the same revision-choice modal pattern used by the other workspace pages.
+
+User experience improvements:
+- Group document deletion is now consistent with personal and public workspaces.
+- Users can choose between deleting the current revision or all revisions instead of getting blocked by missing modal wiring.
\ No newline at end of file
diff --git a/docs/how-to/upgrade_paths.md b/docs/how-to/upgrade_paths.md
index 50d70c00..9e22ac61 100644
--- a/docs/how-to/upgrade_paths.md
+++ b/docs/how-to/upgrade_paths.md
@@ -134,8 +134,9 @@ This is an **advanced operational option**, not the default repo deployment work
### Container Upgrade References
- [AZD deployment guide](../reference/deploy/azd-cli_deploy.md)
-- [Bicep deployment guide](../../deployers/bicep/README.md)
-- [Terraform deployment guide](../../deployers/terraform/ReadMe.md)
+- [Azure CLI with PowerShell deployment guide](../reference/deploy/azurecli_powershell_deploy.md)
+- [Bicep deployment guide](../reference/deploy/bicep_deploy.md)
+- [Terraform deployment guide](../reference/deploy/terraform_deploy.md)
## Summary
diff --git a/docs/latest-release/agent-operations.md b/docs/latest-release/agent-operations.md
new file mode 100644
index 00000000..d0870612
--- /dev/null
+++ b/docs/latest-release/agent-operations.md
@@ -0,0 +1,23 @@
+---
+layout: page
+title: "Agent Operations"
+description: "How agent and action workflows are easier to browse, manage, and validate"
+section: "Latest Release"
+---
+
+Agent Operations updates improve how teams browse, manage, and reason about reusable AI assistants and their connected actions.
+
+## Why It Matters
+
+Advanced agent workflows are only useful when users can find the right assistant quickly and trust the connected tools behind it.
+
+## How to Try It
+
+1. Open **Personal Workspace** if your environment exposes per-user agents and actions.
+2. Switch between list and grid views depending on whether you want denser detail or faster scanning.
+3. Review connected actions carefully when you want to understand what an agent can do.
+
+## Notes
+
+- Availability depends on Personal Workspace, Semantic Kernel, and related agent settings in your environment.
+- Some workflows may also expose inline operational checks such as SQL connection validation.
\ No newline at end of file
diff --git a/docs/latest-release/ai-transparency.md b/docs/latest-release/ai-transparency.md
new file mode 100644
index 00000000..61b91d8d
--- /dev/null
+++ b/docs/latest-release/ai-transparency.md
@@ -0,0 +1,23 @@
+---
+layout: page
+title: "AI Transparency"
+description: "How processing-thought visibility gives users clearer feedback during response generation"
+section: "Latest Release"
+---
+
+AI Transparency adds clearer visibility into the assistant's in-flight work when your team chooses to expose it.
+
+## Why It Matters
+
+Longer responses feel less opaque when users can see progress instead of guessing whether a request stalled.
+
+## How to Try It
+
+1. Open **Chat** and send a prompt that takes long enough to show processing states.
+2. Watch for **Processing Thoughts** while the response is being generated.
+3. Compare the experience with and without the feature enabled in environments where admins control the setting.
+
+## Notes
+
+- This feature is admin-controlled, so some environments may not show it.
+- It is most noticeable on prompts that take more than a moment to complete.
\ No newline at end of file
diff --git a/docs/latest-release/background-chat.md b/docs/latest-release/background-chat.md
new file mode 100644
index 00000000..42ec7d26
--- /dev/null
+++ b/docs/latest-release/background-chat.md
@@ -0,0 +1,23 @@
+---
+layout: page
+title: "Background Chat"
+description: "How long-running chat requests can finish in the background while you keep working"
+section: "Latest Release"
+---
+
+Background Chat lets a long-running request keep working after you move away from the chat page. When the response completes, the app can notify you so you can jump back into the finished conversation.
+
+## Why It Matters
+
+This is most useful for larger uploads and heavier prompts, where waiting on one screen makes the app feel blocked.
+
+## How to Try It
+
+1. Start a longer request from **Chat** the same way you normally would.
+2. If the request takes a while, keep working elsewhere in the app.
+3. Return to the finished result when the completion notification appears.
+
+## Notes
+
+- This experience is designed for long-running requests that would otherwise keep you waiting on the chat page.
+- The notification gives users a cleaner way to return to the completed response.
\ No newline at end of file
diff --git a/docs/latest-release/citation-improvements.md b/docs/latest-release/citation-improvements.md
new file mode 100644
index 00000000..5cb1ddeb
--- /dev/null
+++ b/docs/latest-release/citation-improvements.md
@@ -0,0 +1,23 @@
+---
+layout: page
+title: "Citation Improvements"
+description: "How enhanced citations improve source traceability and follow-up grounding"
+section: "Latest Release"
+---
+
+Citation Improvements help users see where answers came from and keep grounded evidence available across follow-up questions.
+
+## Why It Matters
+
+Better citation carry-forward means fewer follow-up turns lose context or force users to rebuild the same evidence chain from scratch.
+
+## How to Try It
+
+1. Start a grounded conversation in **Chat**.
+2. Open the citations or previews when you want to inspect the source material behind an answer.
+3. Stay in the same conversation for follow-up questions so the assistant can reuse the earlier grounded evidence.
+
+## Notes
+
+- This feature is most noticeable in longer grounded conversations.
+- Users benefit most when they keep related follow-up questions in the same chat thread.
\ No newline at end of file
diff --git a/docs/latest-release/deployment.md b/docs/latest-release/deployment.md
new file mode 100644
index 00000000..423c7515
--- /dev/null
+++ b/docs/latest-release/deployment.md
@@ -0,0 +1,23 @@
+---
+layout: page
+title: "Deployment"
+description: "How deployment guidance and diagnostics improve rollout stability and operational clarity"
+section: "Latest Release"
+---
+
+Deployment updates focus on making configuration, startup validation, and operational guidance easier for admins to follow.
+
+## Why It Matters
+
+For most users this shows up as a more stable rollout of new capabilities rather than a brand-new button in the interface.
+
+## Where to Look
+
+1. Review **Admin Settings** and deployment documentation when rolling out a new environment or troubleshooting startup issues.
+2. Use the improved guidance when validating runtime configuration, especially for hosted deployments.
+3. Recheck deployment notes if a newly announced feature is not visible yet in your environment.
+
+## Notes
+
+- This is mainly an operational improvement managed by admins.
+- End users will usually notice it indirectly through smoother feature rollout and fewer environment issues.
\ No newline at end of file
diff --git a/docs/latest-release/document-versioning.md b/docs/latest-release/document-versioning.md
new file mode 100644
index 00000000..464cbade
--- /dev/null
+++ b/docs/latest-release/document-versioning.md
@@ -0,0 +1,23 @@
+---
+layout: page
+title: "Document Versioning"
+description: "How same-name uploads become revisions so users can work with the right document version"
+section: "Latest Release"
+---
+
+Document Versioning keeps same-name uploads organized as revisions so newer files become current without erasing the older record.
+
+## Why It Matters
+
+Ongoing chats and citations can stay tied to the right version while teams continue updating the same document over time.
+
+## How to Try It
+
+1. Upload an updated file with the same name as an existing document.
+2. Open the workspace document list and confirm which revision is current.
+3. Continue asking questions against the current version when you want the newest content to drive the conversation.
+
+## Notes
+
+- You do not need to delete the older file first unless you no longer want to keep its history.
+- Same-name uploads are treated as revisions rather than destructive replacements.
\ No newline at end of file
diff --git a/docs/latest-release/fact-memory.md b/docs/latest-release/fact-memory.md
new file mode 100644
index 00000000..a3d8ff43
--- /dev/null
+++ b/docs/latest-release/fact-memory.md
@@ -0,0 +1,25 @@
+---
+layout: page
+title: "Fact Memory"
+description: "How Instructions and Facts help the assistant remember durable preferences and relevant personal context"
+section: "Latest Release"
+---
+
+Fact Memory gives each user a compact profile experience for saving **Instructions** and **Facts**. Instructions act like durable response preferences, while Facts are recalled only when they are relevant to the current request.
+
+## Why It Matters
+
+Users no longer need to restate the same preferences or personal context in every conversation, and the chat experience can now show when saved instructions and facts were actually used.
+
+## How to Try It
+
+1. Open your **Profile** page and go to the Fact Memory area.
+2. Save an **Instruction** for a durable preference such as tone, brevity, or formatting.
+3. Save a **Fact** for personal context that should only be recalled when relevant.
+4. Try a chat prompt such as "tell me all about myself" to confirm what the assistant can recall.
+
+## Notes
+
+- Instructions are always applied unless the current prompt overrides them.
+- Facts are recalled only when they are relevant to the current request.
+- The chat experience can surface memory usage through dedicated thought and citation entries.
\ No newline at end of file
diff --git a/docs/latest-release/gpt-selection.md b/docs/latest-release/gpt-selection.md
new file mode 100644
index 00000000..5cc2dcb9
--- /dev/null
+++ b/docs/latest-release/gpt-selection.md
@@ -0,0 +1,23 @@
+---
+layout: page
+title: "GPT Selection"
+description: "How users can choose among available GPT models for different tasks"
+section: "Latest Release"
+---
+
+GPT Selection gives users a clearer way to choose the model that best fits a task when multiple options are available.
+
+## Why It Matters
+
+Different prompts often need different tradeoffs in speed, cost, or reasoning depth, so a visible model picker makes those choices easier.
+
+## How to Try It
+
+1. Open **Chat** and look for the model picker in the composer toolbar.
+2. Try another model when you need faster output, stronger reasoning, or a different cost profile.
+3. Compare results across models for the same prompt when you want to understand the differences in behavior.
+
+## Notes
+
+- Model availability depends on how your admins configured model endpoints and defaults.
+- Some environments may expose only one model, in which case no real selection is needed.
\ No newline at end of file
diff --git a/docs/latest-release/guided-tutorials.md b/docs/latest-release/guided-tutorials.md
new file mode 100644
index 00000000..cee53f05
--- /dev/null
+++ b/docs/latest-release/guided-tutorials.md
@@ -0,0 +1,24 @@
+---
+layout: page
+title: "Guided Tutorials"
+description: "How guided walkthroughs help users learn chat and workspace flows inside the app"
+section: "Latest Release"
+---
+
+Guided Tutorials add in-product walkthroughs so users can learn the interface in context instead of hunting through menus first. Tutorial launchers are shown by default and can be hidden or restored later from the profile page.
+
+## Why It Matters
+
+The fastest way to learn a new workflow is usually inside the workflow itself, with the right controls highlighted as you go.
+
+## How to Try It
+
+1. Start with the **Chat Tutorial** to learn message tools, uploads, prompts, and follow-up workflows.
+2. If Personal Workspace is enabled in your environment, open the **Workspace Tutorial** to learn uploads, filters, tags, prompts, agents, and actions.
+3. If you prefer a cleaner interface after onboarding, open your profile page and hide the tutorial launchers for your own account.
+
+## Notes
+
+- Tutorial buttons are visible by default.
+- Workspace tutorials depend on Personal Workspace being enabled in your environment.
+- Users can restore the tutorial buttons later from the same profile preference.
\ No newline at end of file
diff --git a/docs/latest-release/index.md b/docs/latest-release/index.md
index 5d71150c..2f559695 100644
--- a/docs/latest-release/index.md
+++ b/docs/latest-release/index.md
@@ -1,13 +1,103 @@
---
layout: page
-title: "v0.239.001 Release"
-description: "Overview of new features and improvements in v0.239.001"
+title: "Latest Release Highlights"
+description: "Current feature guides with previous release highlights kept for reference"
section: "Latest Release"
---
-This release introduces conversation export capabilities, retention policy management, enhanced workspace controls, and a comprehensive document tagging system.
+This page tracks the current set of guides behind the in-app **Latest Features** experience and keeps the earlier `v0.239.001` content available below as **Previous Release Features**.
-## New Features
+## Current Release Features
+
+These guides map to the feature set currently highlighted in the app for end users.
+
+### Guided Tutorials
+
+Step-by-step walkthroughs help users discover core chat, workspace, and onboarding flows faster, and each user can now hide the launchers when they no longer need them.
+
+[Read the full guide]({{ '/latest-release/guided-tutorials/' | relative_url }})
+
+### Background Chat
+
+Long-running chat requests can finish in the background while users continue working elsewhere in the app.
+
+[Read the full guide]({{ '/latest-release/background-chat/' | relative_url }})
+
+### GPT Selection
+
+Teams can expose better model-selection options so users can choose the best experience for a task.
+
+[Read the full guide]({{ '/latest-release/gpt-selection/' | relative_url }})
+
+### Tabular Analysis
+
+Spreadsheet and table workflows continue to improve for exploration, filtering, and grounded follow-up questions.
+
+[Read the full guide]({{ '/latest-release/tabular-analysis/' | relative_url }})
+
+### Citation Improvements
+
+Enhanced citations give users better source traceability, document previews, and history-aware grounding.
+
+[Read the full guide]({{ '/latest-release/citation-improvements/' | relative_url }})
+
+### Document Versioning
+
+Document revision visibility has improved so users can work with the right version of shared content.
+
+[Read the full guide]({{ '/latest-release/document-versioning/' | relative_url }})
+
+### Summaries and Export
+
+Conversation summaries and export workflows continue to expand for reporting and follow-up sharing.
+
+[Read the full guide]({{ '/latest-release/summaries-and-export/' | relative_url }})
+
+### Agent Operations
+
+Agent creation, organization, and operational controls keep getting smoother for advanced scenarios.
+
+[Read the full guide]({{ '/latest-release/agent-operations/' | relative_url }})
+
+### AI Transparency
+
+Thought and reasoning transparency options help users better understand what the assistant is doing.
+
+[Read the full guide]({{ '/latest-release/ai-transparency/' | relative_url }})
+
+### Fact Memory
+
+Profile-based memory now distinguishes always-on Instructions from recall-only Facts so the assistant can carry durable preferences and relevant personal context forward more cleanly.
+
+[Read the full guide]({{ '/latest-release/fact-memory/' | relative_url }})
+
+### Deployment
+
+Deployment guidance and diagnostics keep improving so admins can roll out changes with less guesswork.
+
+[Read the full guide]({{ '/latest-release/deployment/' | relative_url }})
+
+### Redis and Key Vault
+
+Caching and secret-management setup guidance has expanded for more secure and predictable operations.
+
+[Read the full guide]({{ '/latest-release/redis-and-key-vault/' | relative_url }})
+
+### Send Feedback
+
+End users can prepare bug reports and feature requests for their SimpleChat admins directly from the Support menu.
+
+[Read the full guide]({{ '/latest-release/send-feedback/' | relative_url }})
+
+### Support Menu
+
+Admins can surface a dedicated Support menu in navigation with Latest Features and Send Feedback entries for end users.
+
+[Read the full guide]({{ '/latest-release/support-menu/' | relative_url }})
+
+## Previous Release Features
+
+The earlier `v0.239.001` release guides remain available here for reference.
### Conversation Export
@@ -15,7 +105,7 @@ Export one or multiple conversations from the Chat page in JSON or Markdown form
[Read the full guide]({{ '/latest-release/export-conversation/' | relative_url }})
-### Retention Policy UI
+### Retention Policy
Configure conversation and document retention periods directly from the workspace and group management pages. Choose from preset retention periods ranging from 7 days to 10 years, use the organization default, or disable automatic deletion entirely.
@@ -55,7 +145,7 @@ Checkbox-based multi-document and multi-tag filtering in the chat interface, rep
[Read the full guide]({{ '/latest-release/tags-grid-view-chat-filtering/' | relative_url }})
-## Bug Fixes
+## Previous Release Bug Fixes
- **Citation Parsing** -- Fixed edge cases where page range references failed to generate correct clickable links when not all pages had explicit reference IDs.
- **Public Workspace Activation** -- Fixed 403 error when non-owner users tried to activate a public workspace for chat.
diff --git a/docs/latest-release/redis-and-key-vault.md b/docs/latest-release/redis-and-key-vault.md
new file mode 100644
index 00000000..94aeca59
--- /dev/null
+++ b/docs/latest-release/redis-and-key-vault.md
@@ -0,0 +1,23 @@
+---
+layout: page
+title: "Redis and Key Vault"
+description: "How cache and secret-storage guidance support more secure and predictable operations"
+section: "Latest Release"
+---
+
+Redis and Key Vault improvements make it easier for teams to configure caching and secret storage patterns correctly.
+
+## Why It Matters
+
+The practical outcome is usually reliability and performance, with fewer environment-level issues caused by cache or secret misconfiguration.
+
+## Where to Look
+
+1. Review the relevant **Admin Settings** cache configuration when enabling or adjusting Redis.
+2. Use Key Vault-backed secret storage when your environment standardizes on named secrets instead of raw keys.
+3. Revisit the configuration if repeated-access performance or secret-handling setup needs improvement.
+
+## Notes
+
+- This is primarily an admin and operations feature.
+- Users generally notice the results indirectly through better stability and smoother repeated access patterns.
\ No newline at end of file
diff --git a/docs/latest-release/send-feedback.md b/docs/latest-release/send-feedback.md
new file mode 100644
index 00000000..7c918263
--- /dev/null
+++ b/docs/latest-release/send-feedback.md
@@ -0,0 +1,25 @@
+---
+layout: page
+title: "Send Feedback"
+description: "How end users can prepare structured bug reports and feature requests for their SimpleChat admins"
+section: "Latest Release"
+---
+
+Send Feedback opens a guided, text-only email draft workflow so users can report issues or request improvements without leaving the app.
+
+## Why It Matters
+
+Structured feedback gives admins a better starting point for triage than vague messages without context or reproduction details.
+
+## How to Try It
+
+1. Open **Support > Send Feedback**.
+2. Choose **Bug Report** when something is broken, confusing, or behaving differently than expected.
+3. Choose **Feature Request** when you want a new workflow, capability, or quality-of-life improvement.
+4. Complete the guided fields and prepare the email draft addressed to the support recipient configured by your admins.
+
+## Notes
+
+- This workflow depends on admins configuring the support recipient email.
+- The content is intentionally text-only so the draft is easier to review, send, and audit.
+- This page pairs naturally with the broader [Support Menu]({{ '/latest-release/support-menu/' | relative_url }}) experience.
\ No newline at end of file
diff --git a/docs/latest-release/summaries-and-export.md b/docs/latest-release/summaries-and-export.md
new file mode 100644
index 00000000..2f616552
--- /dev/null
+++ b/docs/latest-release/summaries-and-export.md
@@ -0,0 +1,27 @@
+---
+layout: page
+title: "Summaries and Export"
+description: "How conversation summaries and export actions help users reuse and share chat content"
+section: "Latest Release"
+---
+
+Summaries and Export features make it easier to capture, reuse, and share the important parts of a chat session.
+
+## Why It Matters
+
+Long chats often need a reusable summary, a PDF handoff, or a quick per-message export into email or another workflow.
+
+## How to Try It
+
+1. Open an existing conversation with enough content to summarize.
+2. Generate or refresh the conversation summary when you want a compact recap.
+3. Use the export options when you need to share the whole conversation or reuse a single message outside the app.
+
+## Related Guides
+
+- For the earlier multi-conversation export workflow, see [Export Conversation]({{ '/latest-release/export-conversation/' | relative_url }}).
+
+## Notes
+
+- This feature set covers summaries, PDF export, and per-message reuse actions.
+- It is designed for reporting, handoff, and follow-up sharing rather than only archival export.
\ No newline at end of file
diff --git a/docs/latest-release/support-menu.md b/docs/latest-release/support-menu.md
new file mode 100644
index 00000000..b2ec7b7c
--- /dev/null
+++ b/docs/latest-release/support-menu.md
@@ -0,0 +1,28 @@
+---
+layout: page
+title: "Support Menu"
+description: "How admins can expose Latest Features and Send Feedback in one predictable support surface"
+section: "Latest Release"
+---
+
+Support Menu configuration lets admins rename the menu, choose the internal feedback recipient, and decide which user-facing feature announcements are shared.
+
+## Why It Matters
+
+New capabilities are easier to discover when help, feature announcements, and feedback all live in one predictable place.
+
+## How to Try It
+
+1. Ask an admin to enable the **Support** menu for your environment if it is not already visible.
+2. Open **Support > Latest Features** when you want a curated explanation of what changed and why it matters.
+3. Open **Support > Send Feedback** when you want to report something missing, confusing, or especially useful.
+
+## Related Guides
+
+- [Latest Release Highlights]({{ '/latest-release/' | relative_url }})
+- [Send Feedback]({{ '/latest-release/send-feedback/' | relative_url }})
+
+## Notes
+
+- Admins can share feature announcements one item at a time instead of exposing every feature guide at once.
+- The Support menu now acts as the common entry point for both discovery and feedback workflows.
\ No newline at end of file
diff --git a/docs/latest-release/tabular-analysis.md b/docs/latest-release/tabular-analysis.md
new file mode 100644
index 00000000..cc694648
--- /dev/null
+++ b/docs/latest-release/tabular-analysis.md
@@ -0,0 +1,23 @@
+---
+layout: page
+title: "Tabular Analysis"
+description: "How CSV and spreadsheet workflows support grounded exploration and follow-up analysis"
+section: "Latest Release"
+---
+
+Tabular Analysis improves how SimpleChat works with CSV and spreadsheet files for filtering, comparisons, and grounded follow-up questions.
+
+## Why It Matters
+
+You get the most value after the file is uploaded, because the assistant can reason over stored rows and columns instead of only whatever is pasted into one message.
+
+## How to Try It
+
+1. Upload your CSV or XLSX to **Personal Workspace** if it is enabled, or attach the file directly in **Chat** for a quicker one-off analysis.
+2. Ask a first question about the uploaded data.
+3. Continue with follow-up questions so the assistant can stay grounded in the stored tabular content.
+
+## Notes
+
+- Uploading a newer file with the same name creates a new revision; you do not need to delete the previous version first.
+- This works best when the tabular file is uploaded before the follow-up analysis begins.
\ No newline at end of file
diff --git a/docs/reference/deploy/azd-cli_deploy.md b/docs/reference/deploy/azd-cli_deploy.md
index 75cd8ec9..5445f946 100644
--- a/docs/reference/deploy/azd-cli_deploy.md
+++ b/docs/reference/deploy/azd-cli_deploy.md
@@ -1,3 +1,10 @@
+---
+layout: page
+title: "Azure Developer CLI Deployment"
+description: "Deploy Simple Chat with azd up"
+section: "Reference"
+---
+
# Azure Developer CLI Deployment
Azure Developer CLI (azd) provides the fastest and most automated way to deploy Simple Chat. This method handles resource provisioning, configuration, and application deployment with minimal manual steps.
@@ -10,6 +17,8 @@ Azure Developer CLI (azd) provides the fastest and most automated way to deploy
- Deploys the application code
- Sets up monitoring and logging
+This is the primary recommended deployment path for the repo.
+
## Prerequisites
### Required Software
diff --git a/docs/reference/deploy/azurecli_powershell_deploy.md b/docs/reference/deploy/azurecli_powershell_deploy.md
new file mode 100644
index 00000000..921083d4
--- /dev/null
+++ b/docs/reference/deploy/azurecli_powershell_deploy.md
@@ -0,0 +1,46 @@
+---
+layout: page
+title: "Azure CLI with PowerShell Deployment"
+description: "Use the script-driven Azure CLI + PowerShell deployer"
+section: "Reference"
+---
+
+# Azure CLI with PowerShell Deployment
+
+This deployer provisions Simple Chat with Azure CLI and PowerShell orchestration.
+
+Use it when you want a script-driven deployment flow without `azd`, or when you want more direct control over sequencing and recovery steps than the default `azd` workflow provides.
+
+## When to Choose This Path
+
+- You want a script-driven deployment flow without `azd`
+- You want more direct control over sequencing and recovery steps
+- You still want the repo's container-based App Service deployment model
+
+## Runtime Model
+
+- This deployer creates a container-based Azure App Service deployment.
+- Gunicorn is started by the container entrypoint in `application/single_app/Dockerfile`.
+- Do not add a native Python App Service startup command for this path.
+
+## Main Files
+
+- `deployers/azurecli/deploy-simplechat.ps1`
+- `deployers/azurecli/destroy-simplechat.ps1`
+
+## Quick Start
+
+1. Review the variables near the top of `deploy-simplechat.ps1`.
+2. Sign in to the target Azure cloud and subscription.
+3. Run the deployer from PowerShell or `pwsh`.
+
+```powershell
+cd deployers/azurecli
+./deploy-simplechat.ps1
+```
+
+## References
+
+- [Setup Instructions](../../setup_instructions.md)
+- [Upgrade Paths](../../how-to/upgrade_paths.md)
+- [Azure CLI deployer README](https://github.com/microsoft/simplechat/blob/main/deployers/azurecli/README.md)
\ No newline at end of file
diff --git a/docs/reference/deploy/bicep_deploy.md b/docs/reference/deploy/bicep_deploy.md
index e69de29b..d292cd3d 100644
--- a/docs/reference/deploy/bicep_deploy.md
+++ b/docs/reference/deploy/bicep_deploy.md
@@ -0,0 +1,37 @@
+---
+layout: page
+title: "Bicep Deployment"
+description: "How the repo's Bicep templates fit into the supported deployment paths"
+section: "Reference"
+---
+
+# Bicep Deployment
+
+The repo's Bicep templates are the infrastructure foundation behind the primary `azd up` deployment flow.
+
+For most teams, the best-supported Bicep experience is to use the [Azure Developer CLI deployment guide](./azd-cli_deploy.md) and let `azd` orchestrate packaging, provisioning, and deployment.
+
+## When to Choose This Path
+
+- You want to inspect or customize the Bicep templates in `deployers/bicep/`
+- You want to understand the infrastructure used by the `azd` deployment flow
+- You are troubleshooting infrastructure behavior or preparing Bicep module changes
+
+## Recommended Workflow
+
+1. Start with the [Azure Developer CLI deployment guide](./azd-cli_deploy.md).
+2. Review or modify the Bicep files under `deployers/bicep/`.
+3. Use `azd provision --preview` or `azd up` to apply those changes through the supported workflow.
+
+## Runtime Model
+
+- The repo's Bicep-based deployment path is container-based Azure App Service.
+- Gunicorn is started by the container entrypoint in `application/single_app/Dockerfile`.
+- Do not add a native Python App Service startup command unless you intentionally switch away from containers.
+
+## References
+
+- [Setup Instructions](../../setup_instructions.md)
+- [Special Deployment Scenarios](../../setup_instructions_special.md)
+- [Enterprise Networking](../../how-to/enterprise_networking.md)
+- [Bicep deployer README](https://github.com/microsoft/simplechat/blob/main/deployers/bicep/README.md)
diff --git a/docs/reference/deploy/index.md b/docs/reference/deploy/index.md
new file mode 100644
index 00000000..80ef7fd4
--- /dev/null
+++ b/docs/reference/deploy/index.md
@@ -0,0 +1,24 @@
+---
+layout: page
+title: "Deployment Reference"
+description: "Choose the right Simple Chat deployment path"
+section: "Reference"
+---
+
+# Deployment Reference
+
+Simple Chat supports multiple deployment paths. If you want the best-supported path with the most current repo guidance, start with **Azure Developer CLI** and run `azd up`.
+
+## Recommended Order
+
+1. [Azure Developer CLI (`azd up`)](./azd-cli_deploy.md)
+2. [Azure CLI with PowerShell](./azurecli_powershell_deploy.md)
+3. [Bicep](./bicep_deploy.md)
+4. [Terraform](./terraform_deploy.md)
+5. [Manual deployment notes](./manual_deploy.md)
+
+## Related Guides
+
+- [Setup Instructions](../../setup_instructions.md)
+- [Upgrade Paths](../../how-to/upgrade_paths.md)
+- [Special Deployment Scenarios](../../setup_instructions_special.md)
\ No newline at end of file
diff --git a/docs/reference/deploy/manual_deploy.md b/docs/reference/deploy/manual_deploy.md
index d8173d57..1a0e9937 100644
--- a/docs/reference/deploy/manual_deploy.md
+++ b/docs/reference/deploy/manual_deploy.md
@@ -1,3 +1,10 @@
+---
+layout: page
+title: "Manual Deployment Notes"
+description: "Use the native Python Azure App Service deployment path when container deployers are not the right fit"
+section: "Reference"
+---
+
# Manual Deployment Notes
Use this path when deploying SimpleChat to **native Python Azure App Service** instead of the repo's container-based deployers.
diff --git a/docs/reference/deploy/terraform_deploy.md b/docs/reference/deploy/terraform_deploy.md
index 8b449694..5dcb6d78 100644
--- a/docs/reference/deploy/terraform_deploy.md
+++ b/docs/reference/deploy/terraform_deploy.md
@@ -1,4 +1,21 @@
-# Terraform Deployment Notes
+---
+layout: page
+title: "Terraform Deployment"
+description: "Use the Terraform deployer for state-managed infrastructure"
+section: "Reference"
+---
+
+# Terraform Deployment
+
+Use this path when Terraform is the standard infrastructure workflow in your environment and you want the repo's container-based App Service deployment model.
+
+## When to Choose This Path
+
+- Your team standardizes on Terraform state and workflows
+- You want Terraform-managed infrastructure rather than `azd` orchestration
+- You are comfortable publishing the application image before applying infrastructure
+
+## Runtime Model
The current Terraform deployer in this repo provisions a **container-based Azure Linux Web App**.
@@ -8,6 +25,10 @@ The current Terraform deployer in this repo provisions a **container-based Azure
- Gunicorn startup is already handled by the container entrypoint in `application/single_app/Dockerfile`.
- You do **not** need to configure App Service Stack Settings Startup command for the current Terraform deployment.
+## Important Note
+
+Terraform does not build the application image for you. Publish the image to Azure Container Registry first, then point Terraform at the image tag you want App Service to run.
+
## If You Switch Terraform to Native Python Later
If you change the Terraform deployment model away from containers and into native Python App Service, deploy the `application/single_app` folder and use this Startup command:
@@ -15,3 +36,9 @@ If you change the Terraform deployment model away from containers and into nativ
```bash
python -m gunicorn -c gunicorn.conf.py app:app
```
+
+## References
+
+- [Setup Instructions](../../setup_instructions.md)
+- [Upgrade Paths](../../how-to/upgrade_paths.md)
+- [Terraform deployer README](https://github.com/microsoft/simplechat/blob/main/deployers/terraform/ReadMe.md)
diff --git a/docs/setup_instructions.md b/docs/setup_instructions.md
index 8047c176..3d463665 100644
--- a/docs/setup_instructions.md
+++ b/docs/setup_instructions.md
@@ -13,72 +13,75 @@ nav_links:
## Summary
-The deployers folder has three different IaC technologies to choose from. You will only choose one of them.
+Simple Chat supports several deployment paths, but they are not equal in automation, coverage, or current repo support.
-The options are:
+If you want the best-supported path with the most up-to-date guidance, start with **Azure Developer CLI** and run `azd up`. That workflow uses the repo's Bicep templates under the hood and is the primary deployment path reflected across the current README and deployment docs.
+
+Recommended order:
+- [Azure Developer CLI (`azd up`)](#azure-developer-cli-azd-up)
+- [Azure CLI with PowerShell](#azure-cli-with-powershell)
+- [Bicep](#bicep)
+- [Terraform](#terraform)
- [Manual Deployment](#manual-deployment)
-- [Azure CLI with Powershell](#azure-cli-with-powershell)
-- [BICEP](#bicep)
-- [Terraform](#hashicorp-terraform)
- [Upgrade Existing Deployments](#upgrade-existing-deployments)
+- [Special Deployment Scenarios](#special-deployment-scenarios)
-**Note:** Terraform is the most robust and requires the least manual post-deployment actions at this time.
+Why multiple deployment technologies?
+We want teams to be able to adopt Simple Chat using the deployment tooling that best fits their environment, while still making the most-supported default path clear.
-Why three different deployment technologies?
-We wanted to create as much flexibility with the different preferred IaC technologies as possible for quick adoption.
+## Azure Developer CLI (`azd up`)
-In addition, this section covers additional configuration items such as
-- [Special Deployment Scenarios](#special-deployment-scenarios)
+This is the primary recommended deployment path.
-## Manual Deployment
+Use it when you want the most automation, the most repo-level guidance, and the fewest manual decisions. `azd up` packages, provisions, and deploys Simple Chat through one workflow, and it uses the repo's Bicep templates behind the scenes.
-This is the step by step process required to deploy the infrastructure and configurations needed to run the Simple Chat solution. This method is discouraged in favor of any of the IaC deployment solutions, however it does contain information that may be useful in debugging configuration difficulties.
+[Azure Developer CLI deployment guide](./reference/deploy/azd-cli_deploy.md)
-[Link to manual deployment steps](./setup_instructions_manual.md)
+## Azure CLI with PowerShell
-## Upgrade Existing Deployments
+Use this path when you want a script-driven deployment flow without `azd`.
-If you already have Simple Chat deployed and only need to update the application, use the dedicated upgrade guide instead of rerunning the full setup flow.
+Azure CLI performs the Azure resource work, while PowerShell handles orchestration, sequencing, and recovery-oriented scripting. This is the next-best fit when you want more direct control than the `azd` workflow provides.
-[Link to upgrade paths](./how-to/upgrade_paths.md)
+[Azure CLI with PowerShell deployment guide](./reference/deploy/azurecli_powershell_deploy.md)
-## Azure CLI with Powershell
+## Bicep
-All Azure resource provisioning happens with Azure CLI. Powershell is used for the control flow of the script only.
+Bicep is the infrastructure layer behind the primary `azd` deployment flow.
-This script has been tested in Azure Government only, but should be compatible with other Azure platforms needing only minimal adjustments.
+Use this path when you want to inspect or customize the Bicep modules directly. For most deployments, start with **Azure Developer CLI** instead of treating Bicep as a separate first-choice workflow.
-Always make sure to follow the guidance in the comments/notes.
+[Bicep deployment guide](./reference/deploy/bicep_deploy.md)
-[Link to Powershell readme](../deployers/azurecli/README.md)
+## Terraform
-## BICEP
+Use Terraform when it is the standard infrastructure workflow in your environment.
-All Azure resource provisioning happens using BICEP.
+This path manages a container-based Azure App Service deployment, but it expects your application image to be published before you apply the infrastructure changes.
-This script has been tested in Azure Government only, but should be compatible with other Azure platforms needing only minimal adjustments.
+[Terraform deployment guide](./reference/deploy/terraform_deploy.md)
-Always make sure to follow the guidance in the comments/notes.
+## Manual Deployment
-[Link to BICEP readme](../deployers/bicep/README.md)
+This is the step-by-step process required to deploy the infrastructure and configurations needed to run Simple Chat without the repo's container-based deployers.
-## Hashicorp Terraform
+This path is useful for native Python App Service scenarios and for understanding the lower-level configuration details, but it is not the preferred starting point when one of the automated deployment paths fits your environment.
-All Azure resource provisioning happens using the latest version of HashiCorp Terraform.
+[Link to manual deployment steps](./setup_instructions_manual.md)
-This script has been tested in Azure Government only, but should be compatible with other Azure platforms needing only minimal adjustments.
+## Upgrade Existing Deployments
-Always make sure to follow the guidance in the comments/notes.
+If you already have Simple Chat deployed and only need to update the application, use the dedicated upgrade guide instead of rerunning the full setup flow.
-[Link to Terraform readme](../deployers/terraform/README.md)
+[Link to upgrade paths](./how-to/upgrade_paths.md)
## Special Deployment Scenarios
-The below sections will cover special scenarios outside of the primary solution deployment.
+The sections below cover scenarios that sit alongside the main deployment paths rather than replacing them.
This includes topics such as:
-- Azure Commericial vs Azure Government deployments
-- Managed Identitity configurations
+- Azure Commercial vs Azure Government deployments
+- Managed Identity configurations
- Enterprise Networking Requirements
[Link to special deployment configurations](./setup_instructions_special.md)
\ No newline at end of file
diff --git a/docs/setup_instructions_manual.md b/docs/setup_instructions_manual.md
index 788934ab..5bd0cd98 100644
--- a/docs/setup_instructions_manual.md
+++ b/docs/setup_instructions_manual.md
@@ -16,7 +16,7 @@
- [Using Deployment Slots (Recommended for Production/Staging)](#using-deployment-slots-recommended-for-productionstaging)
- [Using Direct Deployment to Production (Simpler, for Dev/Test or Low Impact Changes)](#using-direct-deployment-to-production-simpler-for-devtest-or-low-impact-changes)
- [Automate via CI/CD](#automate-via-cicd)
-- [Return to Main](../README.md)
+- [Return to Setup Instructions](./setup_instructions.md)
> Return to top
diff --git a/docs/setup_instructions_special.md b/docs/setup_instructions_special.md
index 81b4d4b0..9c3f7ca0 100644
--- a/docs/setup_instructions_special.md
+++ b/docs/setup_instructions_special.md
@@ -4,7 +4,7 @@
- [How to use Managed Identity](#how-to-use-managed-identity)
- [Enterprise Networking](#enterprise-networking)
-- [Return to Main](../README.md)
+- [Return to Setup Instructions](./setup_instructions.md)
## Azure Government Configuration
@@ -31,7 +31,7 @@ To run the application in Azure Government cloud:
## How to use Managed Identity
-> Return to top
+> Return to top
Using Managed Identity allows the App Service to authenticate to other Azure resources securely without needing to store secrets (like API keys or connection strings) in Application Settings.
diff --git a/docs/tutorials/getting_started.md b/docs/tutorials/getting_started.md
index 9f8cd2b7..bd100c08 100644
--- a/docs/tutorials/getting_started.md
+++ b/docs/tutorials/getting_started.md
@@ -43,7 +43,7 @@ Follow the prompts to select your subscription, region, and provide required con
### Option B: Other Deployment Methods
-For more deployment options, see our [deployment reference](../reference/deploy/).
+For more deployment options, see our [deployment reference](../reference/deploy/index.md).
## Step 2: Initial Configuration
diff --git a/functional_tests/test_admin_latest_features_tab.py b/functional_tests/test_admin_latest_features_tab.py
index a7ffb457..f9452b3b 100644
--- a/functional_tests/test_admin_latest_features_tab.py
+++ b/functional_tests/test_admin_latest_features_tab.py
@@ -2,8 +2,8 @@
# test_admin_latest_features_tab.py
"""
Functional test for admin Latest Features tab.
-Version: 0.240.085
-Implemented in: 0.240.074; 0.240.085
+Version: 0.241.002
+Implemented in: 0.240.074; 0.240.085; 0.241.002
This test ensures that the Admin Settings page exposes the Latest Features tab,
renders the expected grouped cards, uses the saved feature screenshots, and
@@ -21,7 +21,7 @@
ADMIN_TEMPLATE = os.path.join(REPO_ROOT, 'application', 'single_app', 'templates', 'admin_settings.html')
SIDEBAR_TEMPLATE = os.path.join(REPO_ROOT, 'application', 'single_app', 'templates', '_sidebar_nav.html')
ADMIN_JS = os.path.join(REPO_ROOT, 'application', 'single_app', 'static', 'js', 'admin', 'admin_settings.js')
-FEATURE_DOC = os.path.join(REPO_ROOT, 'docs', 'explanation', 'features', 'LATEST_FEATURES_ADMIN_TAB.md')
+FEATURE_DOC = os.path.join(REPO_ROOT, 'docs', 'explanation', 'features', 'v0.241.002', 'LATEST_FEATURES_ADMIN_TAB.md')
FEATURE_IMAGE_DIR = os.path.join(REPO_ROOT, 'application', 'single_app', 'static', 'images', 'features')
@@ -55,6 +55,8 @@ def test_latest_features_template_structure():
'id="latest-features-redis-card"',
'id="latest-features-send-feedback-card"',
'id="latest-features-support-menu-card"',
+ 'id="latest-features-previous-release-card"',
+ 'id="latestFeaturesPreviousRelease"',
'id="latestFeatureImageModal"',
'class="latest-feature-image-frame"',
'data-latest-feature-image-src="{{ url_for(\'static\', filename=\'images/features/guided_tutorials_chat.png\') }}"',
@@ -73,6 +75,14 @@ def test_latest_features_template_structure():
'data-latest-feature-image-src="{{ url_for(\'static\', filename=\'images/features/support_menu_entry.png\') }}"',
'data-latest-feature-image-src="{{ url_for(\'static\', filename=\'images/features/enable_support_menu_for_end_users.png\') }}"',
'Admin-only workflow:',
+ "release_group.id == 'previous_release'",
+ '{{ release_group.label }}',
+ 'Keeping them here gives admins a simple N and N-1 view',
+ 'Shared with Users',
+ 'Hidden from Users',
+ '{% if feature.images %}',
+ 'data-latest-feature-image-src="{{ url_for(\'static\', filename=image.path) }}"',
+ '{{ image.label }}',
'Review Modal Action',
'General > User-Facing Latest Features',
'General Tab Feature Sharing'
@@ -211,7 +221,8 @@ def test_latest_features_sidebar_navigation():
'data-section="latest-features-thoughts-card"',
'data-section="latest-features-fact-memory-card"',
'data-section="latest-features-deployment-card"',
- 'data-section="latest-features-support-menu-card"'
+ 'data-section="latest-features-support-menu-card"',
+ 'data-section="latest-features-previous-release-card"'
]
missing_markers = [marker for marker in required_markers if marker not in sidebar_content]
@@ -270,7 +281,8 @@ def test_latest_features_supporting_assets():
assert os.path.isdir(FEATURE_IMAGE_DIR), 'Missing placeholder image directory for Latest Features'
doc_content = read_text(FEATURE_DOC)
- assert 'Version Updated: 0.240.085' in doc_content, 'Feature documentation version header missing or incorrect'
+ assert 'Version Updated: 0.241.002' in doc_content, 'Feature documentation version header missing or incorrect'
+ assert 'Previous Release Features' in doc_content, 'Feature documentation should describe the previous release grouping'
required_images = [
'agent_default_model_review_action.png',
diff --git a/functional_tests/test_group_document_delete_modal_wiring.py b/functional_tests/test_group_document_delete_modal_wiring.py
new file mode 100644
index 00000000..71152d08
--- /dev/null
+++ b/functional_tests/test_group_document_delete_modal_wiring.py
@@ -0,0 +1,65 @@
+# test_group_document_delete_modal_wiring.py
+"""
+Functional test for group document delete modal wiring.
+Version: 0.241.004
+Implemented in: 0.241.004
+
+This test ensures the group workspace delete-choice modal is rendered as
+standalone page markup and is not injected through the dynamic status alert.
+"""
+
+import re
+import sys
+from pathlib import Path
+
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+CONFIG_FILE = REPO_ROOT / "application" / "single_app" / "config.py"
+GROUP_TEMPLATE_FILE = REPO_ROOT / "application" / "single_app" / "templates" / "group_workspaces.html"
+
+
+def read_text(path: Path) -> str:
+ return path.read_text(encoding="utf-8")
+
+
+def test_group_document_delete_modal_wiring() -> bool:
+ print("Testing group document delete modal wiring...")
+
+ config_content = read_text(CONFIG_FILE)
+ template_content = read_text(GROUP_TEMPLATE_FILE)
+ scripts_start = template_content.index("{% block scripts %}")
+ content_markup = template_content[:scripts_start]
+
+ assert 'VERSION = "0.241.004"' in config_content, "Config version marker is not current."
+
+ for marker in [
+ 'id="groupDocumentDeleteModal"',
+ 'id="groupDocumentDeleteModalLabel"',
+ 'id="groupDocumentDeleteModalBody"',
+ 'id="groupDeleteCurrentBtn"',
+ 'id="groupDeleteAllBtn"',
+ ]:
+ assert marker in content_markup, f"Missing standalone modal marker before scripts block: {marker}"
+
+ alert_assignment = re.search(r"alertBox\.innerHTML\s*=\s*`([\s\S]*?)`;", template_content)
+ assert alert_assignment is not None, "Could not locate the group status alert template assignment."
+ assert "groupDocumentDeleteModal" not in alert_assignment.group(1), (
+ "Group delete modal should not be injected through alertBox.innerHTML."
+ )
+
+ required_script_markers = [
+ 'const groupDocumentDeleteModalElement = document.getElementById(',
+ 'function isGroupDocumentDeleteModalReady()',
+ 'function promptGroupDeleteMode(documentCount = 1)',
+ 'groupDocumentDeleteModal.show();',
+ ]
+ missing_script_markers = [marker for marker in required_script_markers if marker not in template_content]
+ assert not missing_script_markers, f"Missing group delete modal script markers: {missing_script_markers}"
+
+ print("Group document delete modal wiring test passed!")
+ return True
+
+
+if __name__ == "__main__":
+ success = test_group_document_delete_modal_wiring()
+ sys.exit(0 if success else 1)
\ No newline at end of file
diff --git a/functional_tests/test_latest_features_action_links.py b/functional_tests/test_latest_features_action_links.py
new file mode 100644
index 00000000..a137ae16
--- /dev/null
+++ b/functional_tests/test_latest_features_action_links.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python3
+# test_latest_features_action_links.py
+"""
+Functional test for latest-features action links.
+Version: 0.241.003
+Implemented in: 0.241.003
+
+This test ensures the latest-features configuration exposes direct in-app
+action links, the admin-controlled documentation toggle, and the launch-intent
+handlers that open the requested Chat, Workspace, and Profile workflows.
+"""
+
+from pathlib import Path
+import sys
+
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+CONFIG_FILE = REPO_ROOT / "application" / "single_app" / "config.py"
+FUNCTIONS_SETTINGS_FILE = REPO_ROOT / "application" / "single_app" / "functions_settings.py"
+SUPPORT_MENU_CONFIG_FILE = REPO_ROOT / "application" / "single_app" / "support_menu_config.py"
+ADMIN_ROUTE_FILE = REPO_ROOT / "application" / "single_app" / "route_frontend_admin_settings.py"
+ADMIN_TEMPLATE_FILE = REPO_ROOT / "application" / "single_app" / "templates" / "admin_settings.html"
+CHAT_ONLOAD_FILE = REPO_ROOT / "application" / "single_app" / "static" / "js" / "chat" / "chat-onload.js"
+CHAT_DOCUMENTS_FILE = REPO_ROOT / "application" / "single_app" / "static" / "js" / "chat" / "chat-documents.js"
+WORKSPACE_INIT_FILE = REPO_ROOT / "application" / "single_app" / "static" / "js" / "workspace" / "workspace-init.js"
+WORKSPACE_TAGS_FILE = REPO_ROOT / "application" / "single_app" / "static" / "js" / "workspace" / "workspace-tags.js"
+PROFILE_TEMPLATE_FILE = REPO_ROOT / "application" / "single_app" / "templates" / "profile.html"
+
+
+def read_text(path: Path) -> str:
+ return path.read_text(encoding="utf-8")
+
+
+def assert_markers(file_path: Path, markers: list[str]) -> None:
+ content = read_text(file_path)
+ missing = [marker for marker in markers if marker not in content]
+ assert not missing, f"Missing markers in {file_path.name}: {missing}"
+
+
+def test_latest_features_action_links() -> bool:
+ print("Testing latest-features action links and launch intents...")
+
+ assert 'VERSION = "0.241.003"' in read_text(CONFIG_FILE), "Config version marker is not current."
+
+ assert_markers(
+ FUNCTIONS_SETTINGS_FILE,
+ [
+ "'enable_support_latest_feature_documentation_links': False",
+ ],
+ )
+
+ assert_markers(
+ SUPPORT_MENU_CONFIG_FILE,
+ [
+ "_SUPPORT_LATEST_FEATURE_DOCS_SETTING_KEY = 'enable_support_latest_feature_documentation_links'",
+ "'/chats?feature_action=conversation_export'",
+ "'/profile?feature_action=retention_policy#retention-policy-settings'",
+ "'/workspace?feature_action=document_tag_system'",
+ "'/workspace?feature_action=workspace_folder_view'",
+ "'/chats?feature_action=multi_workspace_scope_management'",
+ "'/chats?feature_action=chat_document_and_tag_filtering'",
+ "'requires_settings': [_SUPPORT_LATEST_FEATURE_DOCS_SETTING_KEY]",
+ "def get_support_latest_feature_release_groups_for_settings(settings):",
+ ],
+ )
+
+ assert_markers(
+ ADMIN_ROUTE_FILE,
+ [
+ "if 'enable_support_latest_feature_documentation_links' not in settings:",
+ "enable_support_latest_feature_documentation_links = (",
+ "support_latest_feature_release_groups_preview=get_support_latest_feature_release_groups_for_settings(settings)",
+ "'enable_support_latest_feature_documentation_links': enable_support_latest_feature_documentation_links",
+ ],
+ )
+
+ assert_markers(
+ ADMIN_TEMPLATE_FILE,
+ [
+ 'id="enable_support_latest_feature_documentation_links"',
+ 'Show Simple Chat Documentation Guide Links',
+ 'support_latest_feature_release_groups_preview',
+ ],
+ )
+
+ assert_markers(
+ CHAT_DOCUMENTS_FILE,
+ [
+ 'export async function ensureSearchDocumentsVisible()',
+ 'export function openScopeDropdown()',
+ 'export function openTagsDropdown()',
+ ],
+ )
+
+ assert_markers(
+ CHAT_ONLOAD_FILE,
+ [
+ 'function clearFeatureActionParam()',
+ 'async function handleLatestFeatureLaunch(featureAction)',
+ "case 'conversation_export':",
+ "case 'multi_workspace_scope_management':",
+ "case 'chat_document_and_tag_filtering':",
+ "const featureAction = getUrlParameter('feature_action') || ''",
+ ],
+ )
+
+ assert_markers(
+ WORKSPACE_TAGS_FILE,
+ [
+ 'export function setWorkspaceView(view)',
+ ],
+ )
+
+ assert_markers(
+ WORKSPACE_INIT_FILE,
+ [
+ 'function handleWorkspaceFeatureAction()',
+ "featureAction === 'document_tag_system'",
+ "featureAction === 'workspace_folder_view'",
+ "showTagManagementModal();",
+ "setWorkspaceView('grid');",
+ ],
+ )
+
+ assert_markers(
+ PROFILE_TEMPLATE_FILE,
+ [
+ 'id="retention-policy-settings"',
+ 'function handleProfileFeatureAction()',
+ "featureAction !== 'retention_policy'",
+ ],
+ )
+
+ print("Latest-features action link test passed!")
+ return True
+
+
+if __name__ == "__main__":
+ success = test_latest_features_action_links()
+ sys.exit(0 if success else 1)
\ No newline at end of file
diff --git a/functional_tests/test_latest_release_docs_structure.py b/functional_tests/test_latest_release_docs_structure.py
new file mode 100644
index 00000000..18d1431b
--- /dev/null
+++ b/functional_tests/test_latest_release_docs_structure.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python3
+"""
+Functional test for latest-release documentation structure.
+Version: 0.241.003
+Implemented in: 0.241.002; 0.241.003
+
+This test ensures the docs/latest-release landing page exposes current and
+previous release sections, and that the current latest-feature guides exist as
+individual markdown pages.
+"""
+
+from pathlib import Path
+import sys
+
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+CONFIG_FILE = REPO_ROOT / "application" / "single_app" / "config.py"
+LATEST_RELEASE_INDEX = REPO_ROOT / "docs" / "latest-release" / "index.md"
+LATEST_RELEASE_DIR = REPO_ROOT / "docs" / "latest-release"
+
+CURRENT_GUIDES = {
+ "guided-tutorials.md": "Guided Tutorials",
+ "background-chat.md": "Background Chat",
+ "gpt-selection.md": "GPT Selection",
+ "tabular-analysis.md": "Tabular Analysis",
+ "citation-improvements.md": "Citation Improvements",
+ "document-versioning.md": "Document Versioning",
+ "summaries-and-export.md": "Summaries and Export",
+ "agent-operations.md": "Agent Operations",
+ "ai-transparency.md": "AI Transparency",
+ "fact-memory.md": "Fact Memory",
+ "deployment.md": "Deployment",
+ "redis-and-key-vault.md": "Redis and Key Vault",
+ "send-feedback.md": "Send Feedback",
+ "support-menu.md": "Support Menu",
+}
+
+
+def read_text(path: Path) -> str:
+ return path.read_text(encoding="utf-8")
+
+
+def test_latest_release_docs_structure() -> bool:
+ print("Testing latest-release documentation structure...")
+
+ config_content = read_text(CONFIG_FILE)
+ index_content = read_text(LATEST_RELEASE_INDEX)
+
+ assert 'VERSION = "0.241.003"' in config_content, "Config version marker is not current."
+
+ required_index_markers = [
+ 'title: "Latest Release Highlights"',
+ '## Current Release Features',
+ '## Previous Release Features',
+ '## Previous Release Bug Fixes',
+ 'v0.239.001',
+ "{{ '/latest-release/guided-tutorials/' | relative_url }}",
+ "{{ '/latest-release/background-chat/' | relative_url }}",
+ "{{ '/latest-release/gpt-selection/' | relative_url }}",
+ "{{ '/latest-release/tabular-analysis/' | relative_url }}",
+ "{{ '/latest-release/citation-improvements/' | relative_url }}",
+ "{{ '/latest-release/document-versioning/' | relative_url }}",
+ "{{ '/latest-release/summaries-and-export/' | relative_url }}",
+ "{{ '/latest-release/agent-operations/' | relative_url }}",
+ "{{ '/latest-release/ai-transparency/' | relative_url }}",
+ "{{ '/latest-release/fact-memory/' | relative_url }}",
+ "{{ '/latest-release/deployment/' | relative_url }}",
+ "{{ '/latest-release/redis-and-key-vault/' | relative_url }}",
+ "{{ '/latest-release/send-feedback/' | relative_url }}",
+ "{{ '/latest-release/support-menu/' | relative_url }}",
+ "{{ '/latest-release/export-conversation/' | relative_url }}",
+ ]
+ missing_index_markers = [marker for marker in required_index_markers if marker not in index_content]
+ assert not missing_index_markers, f"Missing latest-release index markers: {missing_index_markers}"
+
+ for file_name, title in CURRENT_GUIDES.items():
+ guide_path = LATEST_RELEASE_DIR / file_name
+ assert guide_path.exists(), f"Missing latest-release guide: {file_name}"
+ guide_content = read_text(guide_path)
+ assert 'layout: page' in guide_content, f"Guide missing layout frontmatter: {file_name}"
+ assert f'title: "{title}"' in guide_content, f"Guide missing title frontmatter: {file_name}"
+ assert 'section: "Latest Release"' in guide_content, f"Guide missing Latest Release section marker: {file_name}"
+
+ print("Latest-release documentation structure test passed!")
+ return True
+
+
+if __name__ == "__main__":
+ success = test_latest_release_docs_structure()
+ sys.exit(0 if success else 1)
\ No newline at end of file
diff --git a/functional_tests/test_support_menu_user_feature.py b/functional_tests/test_support_menu_user_feature.py
index b585b15e..78bb3256 100644
--- a/functional_tests/test_support_menu_user_feature.py
+++ b/functional_tests/test_support_menu_user_feature.py
@@ -2,8 +2,8 @@
"""
Functional test for support menu sidebar visibility, access behavior, and
latest-feature image preview support.
-Version: 0.240.085
-Implemented in: 0.240.061; 0.240.085
+Version: 0.241.002
+Implemented in: 0.240.061; 0.240.085; 0.241.002
This test ensures the Support menu renders for signed-in app users when enabled,
the sidebar and top-nav templates expose the expected links, and the user-facing
@@ -79,6 +79,7 @@ def test_support_menu_settings_defaults_and_persistence():
route_markers = [
"get_support_latest_feature_catalog",
+ "get_support_latest_feature_release_groups",
"normalize_support_latest_features_visibility",
"enable_support_menu = form_data.get('enable_support_menu') == 'on'",
"support_menu_name = form_data.get('support_menu_name', 'Support').strip()",
@@ -105,6 +106,26 @@ def test_support_menu_settings_defaults_and_persistence():
"'id': 'redis_key_vault'",
"'id': 'send_feedback'",
"'id': 'support_menu'",
+ "'id': 'conversation_export'",
+ "'id': 'retention_policy'",
+ "'id': 'owner_only_group_agent_management'",
+ "'id': 'enforce_workspace_scope_lock'",
+ "'id': 'document_tag_system'",
+ "'id': 'workspace_folder_view'",
+ "'id': 'multi_workspace_scope_management'",
+ "'id': 'chat_document_and_tag_filtering'",
+ "'label': 'Previous Release Features'",
+ "'release_version': '0.239.001'",
+ "'href': 'https://microsoft.github.io/simplechat/latest-release/export-conversation/'",
+ "'path': 'images/features/conversation_export.png'",
+ "'path': 'images/features/conversation_export_type_option.png'",
+ "'path': 'images/features/retention_policy-personal_profile.png'",
+ "'path': 'images/features/retention_policy-manage_group.png'",
+ "'path': 'images/features/workspace_scope_lock.png'",
+ "'path': 'images/features/workspace_tags.png'",
+ "'path': 'images/features/workspace_grid_view.png'",
+ "'path': 'images/features/workspace_scopes_in_chat.png'",
+ "'path': 'images/features/chat_tags_including_doc_classification.png'",
"'path': 'images/features/facts_memory_view_profile.png'",
"'path': 'images/features/fact_memory_management.png'",
"'path': 'images/features/facts_citation_and_thoughts.png'",
@@ -130,7 +151,9 @@ def test_support_menu_settings_defaults_and_persistence():
"'fragment': 'workspace-tutorial-launch'",
"'fragment': 'upload-area'",
"'requires_settings': ['enable_user_workspace']",
+ 'def get_support_latest_feature_release_groups():',
'def get_visible_support_latest_features(settings):',
+ 'def get_visible_support_latest_feature_groups(settings):',
'def _normalize_feature_media(feature):',
]
missing_config = [marker for marker in config_markers if marker not in config_content]
@@ -157,6 +180,9 @@ def test_support_menu_admin_template_and_js():
'{{ feature.title }}',
'Enable Support Menu for End Users',
'Deployment and Redis start unchecked because they are mainly admin-facing rollout and infrastructure topics.',
+ "release_group.id == 'previous_release'",
+ "release_group.collapse_id ~ 'Checklist'",
+ 'Show {{ release_group.label }}',
'Support Menu',
]
missing_template = [marker for marker in template_markers if marker not in template_content]
@@ -218,6 +244,8 @@ def test_support_menu_navigation_and_routes():
route_markers = [
"@app.route('/support/latest-features')",
"def support_latest_features():",
+ 'get_visible_support_latest_feature_groups',
+ 'support_previous_release_feature_groups',
"render_template(",
"'latest_features.html'",
"@app.route('/support/send-feedback')",
@@ -263,11 +291,15 @@ def test_support_menu_feedback_backend_and_templates():
latest_features_markers = [
'A curated view of recent updates your admins have chosen to share with end users.',
'{% if support_latest_features %}',
+ 'support_previous_release_feature_groups',
'support-feature-card',
'support-feature-gallery',
'support-feature-thumbnail-trigger',
'support-feature-thumbnail-title',
'support-feature-callout',
+ 'support-feature-release-panel',
+ 'support-feature-release-toggle',
+ 'support-feature-release-version',
'support-feature-guidance-list',
'support-feature-action-grid',
'support-feature-action-card',
@@ -281,7 +313,11 @@ def test_support_menu_feedback_backend_and_templates():
'Why It Matters',
'How To Try It',
'Open The Right Page',
+ '{% if action.href %}',
+ '{% if action.is_external %}',
"url_for(action.endpoint)",
+ 'release_group.collapse_id',
+ 'Show {{ release_group.label }}',
'latestFeatureImageModal',
'latestFeatureImageModalImage',
'{{ feature.title }}',
diff --git a/functional_tests/test_user_tutorial_visibility_preference.py b/functional_tests/test_user_tutorial_visibility_preference.py
index 6eb8440b..fe2997fe 100644
--- a/functional_tests/test_user_tutorial_visibility_preference.py
+++ b/functional_tests/test_user_tutorial_visibility_preference.py
@@ -2,8 +2,8 @@
# test_user_tutorial_visibility_preference.py
"""
Functional test for user tutorial visibility preference.
-Version: 0.240.068
-Implemented in: 0.240.068
+Version: 0.241.003
+Implemented in: 0.240.068; 0.241.002; 0.241.003
This test ensures that guided tutorial launchers remain visible by default,
users can manage the preference from the profile page, and the Latest Features
@@ -24,7 +24,7 @@
CHAT_TEMPLATE_FILE = REPO_ROOT / "application" / "single_app" / "templates" / "chats.html"
WORKSPACE_TEMPLATE_FILE = REPO_ROOT / "application" / "single_app" / "templates" / "workspace.html"
LATEST_FEATURES_TEMPLATE_FILE = REPO_ROOT / "application" / "single_app" / "templates" / "latest_features.html"
-FEATURE_DOC_FILE = REPO_ROOT / "docs" / "explanation" / "features" / "USER_TUTORIAL_VISIBILITY_PREFERENCE.md"
+FEATURE_DOC_FILE = REPO_ROOT / "docs" / "explanation" / "features" / "v0.241.001" / "USER_TUTORIAL_VISIBILITY_PREFERENCE.md"
def read_text(path: Path) -> str:
@@ -45,7 +45,7 @@ def test_user_tutorial_visibility_preference() -> bool:
latest_features_content = read_text(LATEST_FEATURES_TEMPLATE_FILE)
required_config_markers = [
- 'VERSION = "0.240.068"',
+ 'VERSION = "0.241.003"',
]
missing_config = [marker for marker in required_config_markers if marker not in config_content]
assert not missing_config, f"Missing config markers: {missing_config}"
diff --git a/ui_tests/test_admin_latest_features_previous_release_images.py b/ui_tests/test_admin_latest_features_previous_release_images.py
new file mode 100644
index 00000000..e294f4a5
--- /dev/null
+++ b/ui_tests/test_admin_latest_features_previous_release_images.py
@@ -0,0 +1,78 @@
+# test_admin_latest_features_previous_release_images.py
+"""
+UI test for admin Latest Features previous-release images.
+Version: 0.241.002
+Implemented in: 0.241.002
+
+This test ensures the admin Latest Features page can expand the Previous
+Release Features section and open one of its thumbnails in the shared image
+preview modal.
+"""
+
+import os
+from pathlib import Path
+
+import pytest
+from playwright.sync_api import expect
+
+
+BASE_URL = os.getenv("SIMPLECHAT_UI_BASE_URL", "").rstrip("/")
+ADMIN_STORAGE_STATE = os.getenv("SIMPLECHAT_UI_ADMIN_STORAGE_STATE", "")
+
+
+def _require_base_url():
+ if not BASE_URL:
+ pytest.skip("Set SIMPLECHAT_UI_BASE_URL to run this UI test.")
+
+
+def _require_storage_state():
+ if not ADMIN_STORAGE_STATE or not Path(ADMIN_STORAGE_STATE).exists():
+ pytest.skip("Set SIMPLECHAT_UI_ADMIN_STORAGE_STATE to a valid authenticated Playwright storage state file.")
+
+
+@pytest.mark.ui
+def test_admin_latest_features_previous_release_images(playwright):
+ """Validate that previous-release thumbnails open the shared admin preview modal."""
+ _require_base_url()
+ _require_storage_state()
+
+ browser = playwright.chromium.launch()
+ context = browser.new_context(
+ storage_state=ADMIN_STORAGE_STATE,
+ viewport={"width": 1440, "height": 900},
+ )
+
+ try:
+ page = context.new_page()
+ response = page.goto(f"{BASE_URL}/admin/settings", wait_until="domcontentloaded")
+ assert response is not None, "Expected a navigation response when loading /admin/settings."
+ if response.status in {401, 403, 404}:
+ pytest.skip("Admin settings page was not available for the configured admin session.")
+
+ assert response.ok, f"Expected /admin/settings to load successfully, got HTTP {response.status}."
+ expect(page.locator("#adminSettingsTabContent")).to_be_visible()
+
+ latest_features_pane = page.locator("#latest-features")
+ if latest_features_pane.count() == 0:
+ pytest.skip("Latest Features tab was not available in this environment.")
+
+ previous_release_toggle = page.locator("a[href='#latestFeaturesPreviousRelease']")
+ if previous_release_toggle.count() == 0:
+ pytest.skip("Previous Release Features section was not available in this environment.")
+
+ previous_release_toggle.first.click()
+ expect(page.locator("#latestFeaturesPreviousRelease")).to_be_visible()
+
+ previous_release_thumbnail = page.locator("#latestFeaturesPreviousRelease .latest-feature-thumbnail-trigger").first
+ if previous_release_thumbnail.count() == 0:
+ pytest.skip("No previous-release thumbnails are available in this environment.")
+
+ previous_release_thumbnail.click()
+
+ modal = page.locator("#latestFeatureImageModal")
+ expect(modal).to_be_visible()
+ expect(page.locator("#latestFeatureImageModalImage")).to_be_visible()
+ expect(page.locator("#latestFeatureImageModalLabel")).not_to_be_empty()
+ finally:
+ context.close()
+ browser.close()
\ No newline at end of file
diff --git a/ui_tests/test_latest_features_action_launchers.py b/ui_tests/test_latest_features_action_launchers.py
new file mode 100644
index 00000000..e00e848d
--- /dev/null
+++ b/ui_tests/test_latest_features_action_launchers.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+# test_latest_features_action_launchers.py
+"""
+UI test for latest-features action launchers.
+Version: 0.241.003
+Implemented in: 0.241.003
+
+This test ensures the latest-feature deep links can open the intended
+workspace, profile, and chat workflows directly from their destination pages.
+"""
+
+import os
+from pathlib import Path
+
+import pytest
+from playwright.sync_api import expect
+
+
+BASE_URL = os.getenv("SIMPLECHAT_UI_BASE_URL", "").rstrip("/")
+STORAGE_STATE = os.getenv("SIMPLECHAT_UI_STORAGE_STATE", "")
+ADMIN_STORAGE_STATE = os.getenv("SIMPLECHAT_UI_ADMIN_STORAGE_STATE", "")
+
+
+def _require_base_url():
+ if not BASE_URL:
+ pytest.skip("Set SIMPLECHAT_UI_BASE_URL to run this UI test.")
+
+
+def _get_storage_state_path() -> str:
+ for candidate in (STORAGE_STATE, ADMIN_STORAGE_STATE):
+ if candidate and Path(candidate).exists():
+ return candidate
+ pytest.skip("Set SIMPLECHAT_UI_STORAGE_STATE or SIMPLECHAT_UI_ADMIN_STORAGE_STATE to a valid authenticated Playwright storage state file.")
+
+
+@pytest.mark.ui
+def test_latest_features_action_launchers(playwright):
+ """Validate that launch-intent links open the requested workspace, profile, and chat workflows."""
+ _require_base_url()
+ storage_state = _get_storage_state_path()
+
+ browser = playwright.chromium.launch()
+ context = browser.new_context(
+ storage_state=storage_state,
+ viewport={"width": 1440, "height": 960},
+ )
+
+ try:
+ page = context.new_page()
+
+ workspace_response = page.goto(f"{BASE_URL}/workspace?feature_action=workspace_folder_view", wait_until="domcontentloaded")
+ assert workspace_response is not None, "Expected a navigation response when loading /workspace."
+ if workspace_response.status in {401, 403, 404}:
+ pytest.skip("Personal Workspace page was not available for the configured session.")
+
+ grid_radio = page.locator("#docs-view-grid")
+ if grid_radio.count() == 0:
+ pytest.skip("Workspace grid-view controls were not available in this environment.")
+
+ expect(grid_radio).to_be_checked()
+ expect(page.locator("#documents-grid-view")).to_be_visible()
+ assert "feature_action=" not in page.url, "Workspace feature_action parameter should be consumed after launch."
+
+ workspace_tags_response = page.goto(f"{BASE_URL}/workspace?feature_action=document_tag_system", wait_until="domcontentloaded")
+ assert workspace_tags_response is not None, "Expected a navigation response when reloading /workspace."
+ if workspace_tags_response.status in {401, 403, 404}:
+ pytest.skip("Personal Workspace tag-management flow was not available for the configured session.")
+
+ tag_management_modal = page.locator("#tagManagementModal")
+ if tag_management_modal.count() == 0:
+ pytest.skip("Workspace tag-management modal was not available in this environment.")
+
+ expect(tag_management_modal).to_be_visible()
+ assert "feature_action=" not in page.url, "Workspace tag-management feature_action parameter should be consumed after launch."
+
+ profile_response = page.goto(f"{BASE_URL}/profile?feature_action=retention_policy#retention-policy-settings", wait_until="domcontentloaded")
+ assert profile_response is not None, "Expected a navigation response when loading /profile."
+ if profile_response.status in {401, 403, 404}:
+ pytest.skip("Profile page was not available for the configured session.")
+
+ retention_section = page.locator("#retention-policy-settings")
+ if retention_section.count() == 0:
+ pytest.skip("Retention policy settings were not enabled in this environment.")
+
+ expect(retention_section).to_be_visible()
+ expect(page.locator("#conversation_retention_days")).to_be_focused()
+ assert "feature_action=" not in page.url, "Profile feature_action parameter should be consumed after launch."
+
+ chat_response = page.goto(f"{BASE_URL}/chats?feature_action=multi_workspace_scope_management", wait_until="domcontentloaded")
+ assert chat_response is not None, "Expected a navigation response when loading /chats."
+ if chat_response.status in {401, 403, 404}:
+ pytest.skip("Chat page was not available for the configured session.")
+
+ search_documents_container = page.locator("#search-documents-container")
+ if search_documents_container.count() == 0:
+ pytest.skip("Chat grounded-search controls were not available in this environment.")
+
+ expect(search_documents_container).to_be_visible()
+ expect(page.locator("#scope-dropdown-button")).to_have_attribute("aria-expanded", "true")
+ assert "feature_action=" not in page.url, "Chat feature_action parameter should be consumed after launch."
+ finally:
+ context.close()
+ browser.close()
\ No newline at end of file
diff --git a/ui_tests/test_support_latest_features_image_modal.py b/ui_tests/test_support_latest_features_image_modal.py
index 77e1a375..b41bf0e6 100644
--- a/ui_tests/test_support_latest_features_image_modal.py
+++ b/ui_tests/test_support_latest_features_image_modal.py
@@ -1,8 +1,8 @@
# test_support_latest_features_image_modal.py
"""
UI test for support latest-features image previews.
-Version: 0.240.061
-Implemented in: 0.240.061
+Version: 0.241.002
+Implemented in: 0.240.061; 0.241.002
This test ensures the user-facing Latest Features page opens a full-size image
preview modal when a feature thumbnail is clicked and keeps the expanded
@@ -58,6 +58,21 @@ def test_support_latest_features_image_modal(playwright):
expect(page.locator(".support-feature-callout").first).to_be_visible()
expect(page.locator(".support-feature-action-card").first).to_be_visible()
+ previous_release_toggle = page.get_by_role("button", name="Show Previous Release Features")
+ if previous_release_toggle.count() > 0:
+ previous_release_toggle.first.click()
+ expect(page.locator("#supportLatestFeaturesPreviousRelease")).to_be_visible()
+ expect(page.get_by_role("heading", name="Previous Release Features")).to_be_visible()
+
+ previous_release_thumbnail = page.locator("#supportLatestFeaturesPreviousRelease .support-feature-thumbnail-trigger").first
+ if previous_release_thumbnail.count() > 0:
+ previous_release_thumbnail.click()
+ modal = page.locator("#latestFeatureImageModal")
+ expect(modal).to_be_visible()
+ expect(page.locator("#latestFeatureImageModalImage")).to_be_visible()
+ page.locator("#latestFeatureImageModal .btn-close").click()
+ expect(modal).not_to_be_visible()
+
thumbnail_trigger = page.locator(".support-feature-thumbnail-trigger").first
if thumbnail_trigger.count() == 0:
pytest.skip("No latest-feature images are available in this environment.")
diff --git a/ui_tests/test_workspace_family_document_revision_delete_modal.py b/ui_tests/test_workspace_family_document_revision_delete_modal.py
index 73c6644c..c96391e7 100644
--- a/ui_tests/test_workspace_family_document_revision_delete_modal.py
+++ b/ui_tests/test_workspace_family_document_revision_delete_modal.py
@@ -1,8 +1,8 @@
# test_workspace_family_document_revision_delete_modal.py
"""
UI test for workspace-family document revision delete modals.
-Version: 0.240.056
-Implemented in: 0.240.056
+Version: 0.241.004
+Implemented in: 0.241.004
This test ensures the personal, group, and public workspace pages use a
Bootstrap revision delete modal instead of a native browser confirm dialog,
@@ -47,9 +47,12 @@ def on_dialog(dialog):
assert response.ok, f"Expected {page_path} to load successfully, got HTTP {response.status}."
expect(page.locator(ready_selector)).to_be_visible()
+ modal = page.locator(modal_selector)
+ expect(modal).to_have_count(1)
+ expect(modal).to_be_hidden()
+
page.evaluate(trigger_script)
- modal = page.locator(modal_selector)
expect(modal).to_be_visible()
expect(modal.get_by_role("button", name="Delete Current Version")).to_be_visible()
expect(modal.get_by_role("button", name="Delete All Versions")).to_be_visible()