3.4.0¶
Release Date: April 13, 2026
โจ New Features¶
CLI Tools¶
SAIF CLI Restructuring โ Phases 1โ3: saif doctor, saif agent, and Command Consolidation ๐ฉบ¶
PR: #562
The SAIF CLI has been restructured following industry patterns from Aspire CLI, gh, and azd to be equally productive for humans and AI coding agents. Phases 1โ3 introduce structured environment diagnostics, a renamed agent surface, and a consolidated update workflow.
What's New:
- โ
saif doctorโ Runs all environment checks; renders table or JSON envelope (schema_version+summaryfields).--format jsonalways exits 0; errors appear in the JSON body for agent-safe consumption - โ
saif doctor fixโ Subcommand that remediates issues with--dry-run,--self,--tools,--templatesfilters - โ
saif agentโ Replacessaif mcp;saif agent mcpstarts the MCP server,saif agent initconfigures VS Code and Copilot CLI environments - โ
Backward compatibility โ
saif mcpandsaif updateremain as hidden deprecated aliases through 3.x
saif doctor Example:
# Diagnose environment
saif doctor
saif doctor --format json # Always exits 0; errors in JSON body
# Fix issues
saif doctor fix
saif doctor fix --dry-run # Preview changes
saif doctor fix --tools # Only update dev tools
saif doctor fix --self # Only update SAIF CLI
Benefits:
- ๐
--format jsoncontract enables agent-driven environment management - ๐ง
--dry-runon mutations lets agents preview without risk - ๐ฏ Filtered fixes (
--self,--tools,--templates) replace monolithic update
SAIF CLI Restructuring โ Phases 4โ6: saif config, saif docs, Command Migrations, and Federated Search ๐ง¶
PR: #571
Continues the CLI restructuring with configuration management, documentation commands, structural renames with backward-compatible aliases, and a first-class federated search command.
What's New:
- โ
saif configโ Configuration management backed by~/.saif/config.json. Supportslist,get,set, andvalidatesubcommands with dot-notation keys (output.format,update.channel,agent.autoUpdate) - โ
saif docsโ Documentation commands wrapping theIDocumentationServiceindex:docs list,docs search <query>,docs get <slug> [--section <heading>] - โ
saif pipeline(renamed fromsaif build) โ Adds explicitpipeline runsubcommand;saif buildremains a hidden alias through 3.x - โ
saif auth(renamed fromsaif token) โauth generate --plainoutputs raw token to stdout for scripting/agent use - โ
saif searchโ Federated cross-domain search that fans out across repositories, apps, and docs concurrently viaTask.WhenAll
saif search Example:
saif search <query> [--verbose] [--format table|json]
saif repo search --repository-name <name>
saif docs search <query>
saif app search [--audience <uri>] [--app-id <id>] [--name <name>]
Benefits:
- ๐ Single command searches all domains in parallel; domain failures surface as warnings so partial results are always returned
- โ๏ธ
saif config validateis zero-side-effect and agent-safe - ๐
saif docs get --section <heading>extracts a single heading for targeted agent reads
Terraform Modules¶
Custom Environments Support for tfe-bootstrapper-team ๐¶
PR: #510
The tfe-bootstrapper-team module now accepts a custom_environments variable, allowing teams to provision Terraform Cloud workspaces for environments beyond the standard platform set.
What's New:
- โ
custom_environmentsvariable โ Typed asmap(object({ Name, ShortName, Description, IsProduction })), defaulting to{} - โ
Automatic merging โ Custom environments are merged with standard
module.names.Environments; workspaces are provisioned for all entries - โ
Non-breaking โ Omitting
custom_environmentsproduces identical behaviour to the previous version
Example:
module "team_bootstrap" {
source = "..."
custom_environments = {
"performance" = {
Name = "Performance"
ShortName = "prf"
Description = "Performance testing environment"
IsProduction = false
}
}
}
Cosmos DB Unique Key Constraints for saif-api-service ๐¶
PR: #552
End-to-end unique_keys support has been added for Cosmos DB serverless NoSQL containers, from the Terraform module variable through the feature template YAML.
What's New:
- โ
unique_keysfield โ Added tocosmosdb_nosql_serverless_settings.containers; each entry is a list of one or more paths (single-path or composite constraints) - โ
Feature template support โ
feature-database-cosmosdb.tfextractsunique_keysfrom YAML usingcoalesceto handle missing or null values gracefully - โ
cosmosdb_nosqlmodule bumped to~> 4.0.0โ Required to supportlist(list(string))type for composite key constraints - โ Documentation โ New "Unique Key Constraints" section added to the Cosmos NoSQL guide with YAML examples and migration notes
Example:
# database-cosmosdb-containers.yaml
containers:
- container_name: Users
partition_key: /PartitionKey
unique_keys:
- ["/email"] # single-path constraint
- container_name: Reports
partition_key: /PartitionKey
unique_keys:
- ["/userId", "/reportMonth"] # composite constraint
โ ๏ธ Note: Adding unique keys to an existing Cosmos DB container requires recreation of the container. Review the migration notes in the Cosmos NoSQL Guide.
Security¶
APIM Subscription Key Authentication with Crypto Registration ๐¶
The saif-api-service module's subscription key authentication has been extended to support optional crypto registration for legacy .NET callers, with updated documentation covering the full end-to-end setup.
What's New:
- โ
application_secretsvariable โ Accepts user-provided subscription keys per environment; wired into the APIM subscription resource vialocal_secrets.tf - โ
Crypto registration support โ Pipeline
cryptoRegistrationparameter enables hash-based key registration for legacy service consumers - โ
Revised documentation โ Full rewrite of
subscription-key-auth.mdcovering variable group setup, pipeline configuration, .NET retrieval pattern, key rotation, and troubleshooting
Documentation: Subscription Key Authentication Guide
Naming Module¶
TeamSubscriptions Group with PlatformDev Entry ๐๏ธ¶
PR: #587
A new TeamSubscriptions group has been added to the naming static locals, introducing a PlatformDev entry for the Platform team's development subscription.
What's New:
- โ
TeamSubscriptionsgroup โ Sits betweenSandboxSubscriptions(individual dev sandboxes) andSubscriptions(formal UAT/Prod environments) - โ
PlatformDeventry โ Referenceslocal.Tenants.Corporate.Nameconsistently with other entries; accessible vialocal.TeamSubscriptions.PlatformDev
๐ง Enhancements¶
No user-facing enhancements in this release.
๐ Bug Fixes¶
fix(operations)โ Updated response type for async resource actions to match actual API contractfix(azdo)โ UpdatedNodeTooltask toUseNodefor correct Node.js version specification in Azure DevOps pipelinesfix(platform)โ Resolved missing OTEL tracer, logger, and meter provider global registrations; fixes gaps in telemetry coverage for platform services
๐ Documentation¶
- Integration Test Environment Variables โ New guide covering how to pass required environment variables into CI/CD integration test runs (
docs/guides/development/testing/integration-test-environment-variables.md)
๐ Breaking Changes¶
None in this release โ
๐ Additional Notes¶
- Total commits: 32
- Contributors: brishe, emmjoh, jasyue, Copilot
Support¶
- ๐ง Teams Support Channel: Support