Release v1.35.0
Released on March 17, 2026
Executive Summary
Features
Platform Infrastructure
-
Upgraded the entire platform to .NET 10, ensuring compatibility with the latest framework features, improved performance, and continued support (135999) ([PR 23767, PR 23951, PR 23961, PR 23975, PR 23980, PR 24196])
-
Refactored configuration architecture to extract cloud-agnostic abstractions and Azure-specific providers into dedicated libraries, decoupling 21 projects from direct Azure dependencies (149707) ([149708, 149709, 149711]) ([PR 23977, PR 23988, PR 24017, PR 24045, PR 24048, PR 24078])
-
Implemented service registry validation in the deployment pipeline to ensure configuration accuracy and prevent deployment drift (PR 24079)
User Experience
-
Added multi-account contract switching dropdown for DSS/Easy Systems users, with localStorage and cookie persistence to retain the selected contract across sessions (136878) ([PR 24139, PR 24161, PR 24167])
-
Enabled multi-line item product quoting via the ShowUI path, allowing product flows to pass multiple line items through the quoting orchestration (150483) ([150484, 150485, 150486, 150487]) ([PR 23964, PR 24116])
Billing & Finance
-
Added revenue realization period tracking to capture the billing month and year on each transaction item for accurate financial reporting (150551) ([PR 23995, PR 24070])
-
Introduced per-creditor invoice template configuration, enabling different invoice templates to be assigned to individual creditor finance configurations (150094) ([150430, 150431]) (PR 23958)
-
Completed billing database write performance optimization with targeted index additions, query refinements, and filtered index strategies to reduce query times for high-volume billing operations (151156) ([PR 24081, PR 24082, PR 24097])
-
Added bill run review note display on invoice and transaction detail views, surfacing notes added by billing administrators directly in account-facing views (134512) (PR 23929)
Observability & Reliability
- Added OpenTelemetry metrics to StandardBankCollectionService, exposing collection attempt counts and outcomes to Grafana for real-time billing observability (150855) (PR 24025)
CI/CD & Developer Experience
-
Introduced automated release notes generation pipeline that extracts work items, PR links, and commit data to produce structured release note drafts (151217) ([PR 24093, PR 24183])
-
Removed the ProductManagement.Dapr workflow spike, eliminating the experimental Dapr orchestration approach and returning to the established pattern (150776) (PR 23998)
Testing & Quality
- Introduced the Quoting integration testing framework covering controller endpoints with mock-based WireMock infrastructure and cross-party contract scenarios (149676) ([PR 24096, PR 24131])
Bug Fixes
-
Resolved invoice race condition that could result in duplicate invoices being created by enforcing a serializable transaction during invoice creation (150842) (PR 24005)
-
Fixed APIM policy quota usage counting an off-by-one error, ensuring accurate API quota enforcement (151563) (PR 24141)
-
Fixed duplicate product report billing caused by non-idempotent Dapr state writes by enforcing strong consistency on
TrySaveStateAsync(137635) ([150391]) (PR 23990) -
Resolved a Bad Request error on the developer portal caused by a schema validation issue during onboarding patch operations (149992) (PR 24018)
-
Fixed profile dropdown becoming non-functional after navigating to Bill Runs by extracting UserMenuDropdown to prevent Bootstrap JS binding loss on Blazor navigation (132416) (PR 24137)
-
Resolved flaky unit tests caused by a race condition in
AuthenticationExpiryServiceand an overly tight timing assertion inProductService(151253) (PR 24095) -
Fixed sign-in error handling to redirect users appropriately when an error occurs during authentication (PR 24016)
Overview
v1.35.0 is a major release delivering platform-wide upgrades alongside focused feature enhancements across billing, quoting, and user experience. The headline change is the full migration to .NET 10, completed across all 21+ projects in the solution, bringing improved runtime performance, enhanced language features, and long-term support.
Alongside this, a significant architecture refactoring extracts cloud configuration into dedicated Configuration.Abstractions and Configuration.Azure libraries, decoupling services from Azure-specific dependencies and enabling cleaner unit testing and future provider flexibility.
Key business value is delivered through revenue realization period tracking for accurate financial reporting, per-creditor invoice template configuration for flexible billing customization, and a multi-account contract switching dropdown that improves the DSS/Easy Systems user experience. Billing reliability is strengthened through the invoice race condition fix and duplicate product report billing remediation, while database performance improvements reduce query load for high-volume billing operations.
Features
Platform Infrastructure
.NET 10 Upgrade
A full platform-wide upgrade from .NET 8 (and legacy .NET 6 projects) to the .NET 10 LTS release:
- Core framework upgrade — Upgraded all pipeline configurations, Dockerfiles, and project target frameworks to
net10.0(135999) (PR 23767) - Legacy project migration — Migrated all remaining projects with
net6.0andnet8.0targets tonet10.0(135999) (PR 23951) - NuGet package alignment — Standardized NuGet package versions across the entire solution to resolve version conflicts introduced during the upgrade (135999) (PR 23961)
- Azure Functions Dockerfile — Updated the Durable Functions Dockerfiles to reference the .NET 10 base image (135999) (PR 23975)
- Service registration fixes — Updated service registrations and improved test setups for services affected by .NET 10 breaking changes (135999) (PR 23980)
- ProductClient response type refactoring — Refactored response type handling and improved error logging in
ProductClientfor compatibility with .NET 10 JSON serialization changes (135999) (PR 24196) - Swashbuckle/NSwag upgrades — Upgraded
Swashbuckle.AspNetCorepackages and the NSwag runtime to target .NET 10 tooling
Configuration Architecture Refactoring
Decoupled 21 services and libraries from direct Microsoft.Extensions.Configuration.AzureAppConfiguration dependencies by introducing cloud-agnostic abstractions:
Configuration.Abstractionslibrary — Created a newlibs/Configuration.Abstractionslibrary defining cloud-agnostic configuration interfaces (IConfigurationProvider,IConfigurationSource, etc.) (149707) (149708) (PR 23977)Configuration.Azurelibrary — Created a newlibs/Configuration.Azurelibrary implementing the abstractions for Azure App Configuration and Key Vault providers (149707) (149709) (PR 23988)AddBasicPlatformConfigurationextension — Refactored the configuration bootstrapping to useAddBasicPlatformConfiguration, removing direct Azure dependencies from the generic configuration library (149707) (PR 24017)Billing.Razordependency cleanup — Removed transitiveBilling.Servicesand Azure dependencies fromBilling.Razorby referencing only the required abstractions (149707) (149711) (PR 24045)- Configuration unit tests — Added comprehensive unit tests for both the Azure configuration providers and the abstractions library (149707) (PR 24048)
- Full migration of 21 projects — Migrated all 21 affected projects to consume
Configuration.Azurearchitecture, removing direct Azure App Configuration references from service startup code (149707) (PR 24078) - Solution folder structure — Reorganised the configuration-related projects into a dedicated solution folder for improved navigation (PR 24108)
Deployment Pipeline
- Service registry validation — Implemented validation of the CI/CD service registry, preventing pipeline drift when services are added or renamed without updating the registry (PR 24079)
- ADO-BMAD workflow integration — Added Azure DevOps integration workflow steps and templates for the BMAD method (PR 24026)
User Experience
Multi-Account Contract Switching (DSS/Easy Systems)
Delivered the [DSS/Easy Systems] Multi-Account Dropdown for Contract Switching feature to allow users with access to multiple accounts to switch contracts without signing out:
- Contract selection persistence — Added
localStorageand cookie persistence for the selected contract, ensuring the selection is retained across page reloads and sessions (136878) (PR 24139) - Accessible loading state — Enhanced the
AccountContractSelectorcomponent with improved loading state accessibility, including ARIA attributes and keyboard focus management (136878) (PR 24161) - Persistence documentation — Updated developer documentation to accurately describe the
localStoragepersistence behaviour for the contract selection feature (136878) (PR 24167)
Multi-Line Item Product Flow
Extended the product quoting orchestration to support multiple line items through the ShowUI path:
LineItemsproperty onInstanceInputMetadata— Added theLineItemscollection property toInstanceInputMetadataand updated all related downstream functions, validators, and orchestrations to consume it (150483) (150484) (PR 23964)- Contract ID propagation — Added contract IDs to the quoting process to enable contract-bound product flows to correctly scope line item pricing (150483) (PR 24116)
Billing & Finance
Revenue Realization Period Tracking
Introduced month and year tracking for revenue realization on billing transaction items:
RevenueRealizationMonthandRevenueRealizationYearfields — Added optional fields toTransactionItemto capture the billing period during which revenue is to be realized, including schema changes (SSDT), DTO updates, and database migration (150551) (PR 23995)CurrentPeriodEndcorrection — Fixed the revenue realization logic to useCurrentPeriodEndinstead ofCurrentPeriodStartwhen determining the realization period, ensuring accurate period assignment for end-of-period transactions (150551) (PR 24070)
Invoice Template Per Creditor
Enabled billing administrators to assign a specific invoice template to each creditor finance configuration:
InvoiceTemplateNamefield — AddedInvoiceTemplateNameto theCreditorFinanceConfigurationdatabase schema, DTOs, and request models, with validation for maximum length (150094) (150430) (PR 23958)InvoiceSenderintegration — Updated theInvoiceSenderservice to resolve the correct template when sending invoices for a given creditor, and surfaced the configuration field in the Creditor Finance Configuration UI form and grid (150094) (150431) (PR 23958)
Billing Database Performance Optimization
Completed the full Billing Database Write Performance Optimization work item with additional SQL changes beyond the v1.34.4 hotfix:
- SQL performance implementation — Added filtered indexes and targeted query optimizations across the billing database to reduce lock contention and improve query plan selection (151156) (PR 24081)
- Filtered indexes for soft deletes — Applied
WHERE [DeletedOnDateUtc] IS NULLfilters to indexes on high-read billing tables to reduce index size and improve seeks (151156) (PR 24082) TransactionItemindex update — Revised theTransactionItemindex definition to align key column ordering with the most common query patterns (151156) (PR 24097)- Duplicate index cleanup — Removed duplicate and subsumed indexes from the Billing SSDT project to reduce write overhead (PR 24011)
Bill Run Review Notes Display
-
Notes on invoice and transaction detail views — Surfaced billing notes added via the bill run review interface directly on the invoice detail and transaction detail views, eliminating the need to navigate to the separate notes section (134512) (PR 23929)
-
Make invoice date explicit in finance client — Updated the finance client invoice lookup to use an explicit invoice date rather than relying on inferred dates, improving Sage integration accuracy (PR 24012)
Observability
StandardBank Collection OpenTelemetry Metrics
- OpenTelemetry counters — Added
OpenTelemetryactivity and counter instrumentation toStandardBankCollectionService, tracking collection attempts, successes, and failures as named metrics (150855) (PR 24025)
CI/CD & Developer Experience
Automated Release Notes Pipeline
- Release notes generation pipeline — Introduced an automated pipeline task that extracts merged PR titles, work item links, and commit information to generate structured release note drafts on each release build (151217) (PR 24093)
- Release notes artifact publishing — Added a pipeline step to publish the generated release notes as a build artifact for downstream consumption (151217) (PR 24183)
Technical Debt
ProductManagement Dapr Spike Removal
- Removed
ProductManagement.Daprworkflow — Removed the experimentalProductManagement.Daprworkflow orchestration spike, which explored Dapr Workflow as an alternative orchestration pattern. The decision was made to retain the existing approach. This removes the associated project, Helm chart, pipeline configuration, and Docker artifact (150776) (PR 23998)
Testing & Quality Assurance
Quoting Integration Testing Framework
- Integration test infrastructure — Introduced a WireMock-based integration testing framework for the Quoting service, with modularised test infrastructure, seeders replaced by WireMock stubs, and full controller endpoint coverage (149676) ([149679, 149680, 149681]) ([PR 24096])
- Cross-party contract mock support — Added mock support and integration tests to verify that contract-backed quote line items correctly use the contract owner's account and payment method (151502) (PR 24131)
- Quoting integration tests in PR pipeline — Added the Quoting integration test suite to the PR validation pipeline for earlier failure detection (PR 24093)
Cerbos Policy Centralization
- Shared Cerbos policy files — Centralised Cerbos policy files so that integration tests re-use the same policies as the running application, preventing drift between test and production authorization rules (149769) (PR 23844)
Documentation
- Local account password reset guide — Added a new developer guide for resetting local account passwords in non-production environments (PR 24024)
- Documentation restructuring — Updated documentation links and restructured various developer guides for improved navigation (PR 23910)
- Apex Integration Platform architecture documents — Added UX design specification, requirements, and architecture documents for the Apex Integration Platform initiative (138656) (PR 24069)
Bug Fixes
-
Invoice race condition (duplicate invoices) — Fixed a race condition in the invoice creation flow that could produce duplicate invoices under concurrent requests by wrapping the creation check and insert in a
SERIALIZABLEtransaction (150842) (PR 24005) -
APIM quota off-by-one error — Corrected an off-by-one error in the APIM policy quota calculation that caused an extra usage unit to be counted per request, resulting in premature quota exhaustion (151563) (PR 24141)
-
Duplicate product report billing — Fixed duplicate billing for identical property report requests caused by non-idempotent Dapr state writes; enforced strong consistency mode on
TrySaveStateAsyncto prevent concurrent state updates from creating multiple transaction records (137635) (150391) (PR 23990) -
Developer portal Bad Request error — Resolved a
400 Bad Requesterror on the developer portal occurring during onboarding patch operations by re-parsing the patch result before schema evaluation, fixing aJsonValidationExceptioncaused by stale object references (149992) (PR 24018) -
Profile dropdown non-functional after Bill Runs navigation — Fixed the profile dropdown menu becoming unresponsive after navigating to the Bill Runs page by extracting
UserMenuDropdowninto a dedicated Blazor component, preventing Bootstrap JavaScript event binding loss on Blazor-managed DOM re-renders (132416) (PR 24137) -
Flaky unit tests — Fixed race condition in
AuthenticationExpiryServiceparallel test execution and resolved an overly tight timing assertion inProductServicetests that caused intermittent CI failures (151253) (PR 24095) -
Sign-in error redirect — Fixed the sign-in flow to redirect users to the appropriate error page when an authentication error occurs, rather than displaying an unhandled exception (PR 24016)
-
Reverted bill run status filter — Reverted an unintended change to the bill run status filter that was introduced in a prior PR (PR 24107)