3.5.0¶
Release Date: May 7, 2026
✨ New Features¶
Smithy AI Assistant¶
Smithy: Full Platform Service with MCP, Multi-Agent Orchestration & CLI Bridge 🤖¶
PR: #592
Smithy is now a fully deployed platform service — SAIF's AI developer assistant — backed by an MCP server, multi-agent orchestration with an experts-as-tools pattern, and a CLI bridge for VS Code integration.
Key Features:
- ✅ Multi-agent orchestration — Forge docs agent + Azure DevOps agent, routed by LLM via function invocation
- ✅ MCP server — Streamable HTTP transport (
/mcp) with stateful sessions and per-user conversation history in Cosmos DB - ✅ Bot channel — M365 Agents SDK bot for Teams with LLM-based chat history compaction and @mention gating
- ✅ TypeSpec spec — OpenAPI generated from TypeSpec for APIM registration
- ✅ CLI MCP Bridge —
RemoteMcpBridgeBackgroundService dynamically discovers remote tools and registers them locally (e.g.,smithy_ask) withtools/list_changedso VS Code picks up new tools without a restart
Benefits:
- 🤖 AI-powered developer assistance directly in VS Code and Teams
- 🔄 Seamless tool federation — local and remote MCP tools coexist
- 🔐 Secure by default — APIM validates Entra ID tokens; MSI for downstream calls
- 🚀 Graceful degradation — remote connection failures are non-fatal; local tools always load
Smithy: Migrated to Composable saif-resources Terraform Modules ♻️¶
PR: #650
Smithy's bespoke 18-file, ~500-line Terraform configuration is replaced with a clean 190-line main.tf composing the new saif-resources module collection.
New saif-resources modules:
environment— resolves all shared infrastructure (TFE outputs, networking, naming) into a singlecontextobjectidentity— UAMI + App Registration + Key Vault secret lifecycle; emits credential app settings controlled by flagscosmosdb— Cosmos DB account + containers + data-plane RBACai-project— AI Foundry project + model deployments with logical deployment key mapping (e.g.deployment_names["chat"])bot— Azure Bot Service + OAuth connections + Teams channelapi— Web App + APIM registration + Front Door routing + auth policies
Benefits:
- 🚀 Teams composing new AI services can bootstrap from proven modules rather than writing bespoke HCL
- 🔄
moved.tfhandles full state migration — no resource recreation required - ✅ Speculative plans validated against both
app-platformdev-corporate-smithyandapp-test-corporate-smithywith Sentinel passing
Feature Flags¶
Label-Based Feature Flag Isolation with App Configuration Refresh 🚩¶
PR: #640
Adds label-based isolation for Azure App Configuration feature flags so that different environments or tenants can have independent flag states within a single App Configuration store.
Benefits:
- 🎯 Isolate feature flag state per environment, tenant, or label without separate stores
- 🔄 Automatic configuration refresh picks up flag changes without redeployment
- ✅ Consistent flag evaluation across all running instances
Foundry: useFeatureFlags Hook & Developer Guide 📚¶
PR: #629
Adds first-class feature flag support to the Foundry frontend with a useFeatureFlags React hook and a companion developer guide.
Benefits:
- 🚀 Developers can gate UI features with a single hook call
- 📖 Comprehensive developer guide with usage examples included
Templates¶
New saif-feature-dependabot Standalone Template 📦¶
PR: #633
Extracts Dependabot configuration into a composable, standalone saif-feature-dependabot template with per-ecosystem toggles. Dependabot config was previously duplicated across saif-feature-api and saif-nuget-package.
Usage:
# .NET-only project
dotnet new saif-feature-dependabot --enable_nuget true
# Full-stack project
dotnet new saif-feature-dependabot --enable_nuget true --enable_npm true
# Everything
dotnet new saif-feature-dependabot --enable_nuget true --enable_npm true --enable_docker true --enable_github_actions true
Parameters:
enable_nuget(default:true) — include NuGet ecosystemenable_npm(default:false) — include npm ecosystemenable_docker(default:false) — include Docker ecosystemenable_github_actions(default:false) — include GitHub Actions ecosystem
Benefits:
- ✅ Single source of truth — no more copy-paste across templates
- ✅ Standalone installation for existing repos
- ✅ New ecosystems added once, available everywhere
NuGet Packages¶
DefaultAccessTokenProvider with Smart Authentication Flow Selection 🔐¶
PR: #607
Adds DefaultAccessTokenProvider that automatically selects the correct authentication flow (OBO, client credentials, or token exchange) based on the incoming token's idtyp claim and tenant.
Package: SAIF.Platform.Kiota.HttpClientLibrary
Flow selection logic:
| Token Type | Tenant | Flow |
|---|---|---|
| User token | Corp/Entra | Token Exchange (OBO) |
App token (idtyp=app) |
Corp/Entra | Client Credentials |
| Any token | External/Okta | Token Exchange (RFC 8693) |
New APIs:
DefaultAccessTokenProvider— inspectsidtypclaim and delegates to the correct providerConfigureHttpClient(projectId)— single-call overload that registersDefaultAccessTokenProviderwith keyed sub-providersScopeBuilder.BuildForClientCredentials()— produces Corp.defaultand External explicit scopes automaticallyAuthenticationConfiguration.ClientCredentialsScopes— separate scope set used only by client credentials flow
Benefits:
- 🚀 Eliminates the
AADSTS7000114OBO failure when services receive app tokens - 🔄 Developers configure named scopes; the platform picks the right scope set per flow
- 🎯 Drop-in simplification via the new
ConfigureHttpClient(projectId)overload
Kiota: Expose HttpClient Configuration via OnHttpClientAdded Callback 🔧¶
PR: #606
Exposes the underlying HttpClient configuration through an OnHttpClientAdded callback, giving callers fine-grained control over HTTP client settings without needing to replace the entire client factory.
Benefits:
- 🎯 Configure timeouts, headers, or handlers per client without losing platform defaults
- 🔄 Works with existing
ConfigureHttpClientregistrations
Terraform Modules¶
saif-utilities: Add TeamEnvironments to Naming Module 🏗️¶
PR: #622
Adds TeamEnvironments support to the saif-utilities naming module, enabling consistent environment-scoped resource names across team-level infrastructure.
Benefits:
- ✅ Consistent naming convention for team-scoped environment resources
- 🔄 Follows existing naming module patterns
🔧 Enhancements¶
saif-staticsite-service: Replaced inline WAF policy with thefrontdoor_endpointmodule, reducing duplication and aligning with the composable module pattern (#616)
🐛 Bug Fixes¶
saif-event-subscriber-service: Fixed storage account name and function app name to useenvironment_short_nameas prefix, ensuring unique names across environments within Azure's 24-character naming limit (#656)- Auth: Fixed
AADSTS7000114failure when services receive app tokens from Corp/Entra —DefaultAccessTokenProvidernow falls back to client credentials flow automatically (#607)
📚 Documentation¶
- Security: Added
CompoundRolessection covering AND-based Okta group membership rules for external business roles (#617)
⚠️ Breaking Changes¶
None in this release ✅
📋 Additional Notes¶
- Total commits: 50
- Contributors: Emmitt Johnson, Jason Coria Corona Yue
Support¶
- 📧 Teams Support Channel: Support