Skip to main content

Release v1.35.0

Released on March 17, 2026

Executive Summary

Features

Platform Infrastructure

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 AuthenticationExpiryService and an overly tight timing assertion in ProductService (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.0 and net8.0 targets to net10.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 ProductClient for compatibility with .NET 10 JSON serialization changes (135999) (PR 24196)
  • Swashbuckle/NSwag upgrades — Upgraded Swashbuckle.AspNetCore packages 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.Abstractions library — Created a new libs/Configuration.Abstractions library defining cloud-agnostic configuration interfaces (IConfigurationProvider, IConfigurationSource, etc.) (149707) (149708) (PR 23977)
  • Configuration.Azure library — Created a new libs/Configuration.Azure library implementing the abstractions for Azure App Configuration and Key Vault providers (149707) (149709) (PR 23988)
  • AddBasicPlatformConfiguration extension — Refactored the configuration bootstrapping to use AddBasicPlatformConfiguration, removing direct Azure dependencies from the generic configuration library (149707) (PR 24017)
  • Billing.Razor dependency cleanup — Removed transitive Billing.Services and Azure dependencies from Billing.Razor by 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.Azure architecture, 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 localStorage and cookie persistence for the selected contract, ensuring the selection is retained across page reloads and sessions (136878) (PR 24139)
  • Accessible loading state — Enhanced the AccountContractSelector component with improved loading state accessibility, including ARIA attributes and keyboard focus management (136878) (PR 24161)
  • Persistence documentation — Updated developer documentation to accurately describe the localStorage persistence 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:

  • LineItems property on InstanceInputMetadata — Added the LineItems collection property to InstanceInputMetadata and 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:

  • RevenueRealizationMonth and RevenueRealizationYear fields — Added optional fields to TransactionItem to capture the billing period during which revenue is to be realized, including schema changes (SSDT), DTO updates, and database migration (150551) (PR 23995)
  • CurrentPeriodEnd correction — Fixed the revenue realization logic to use CurrentPeriodEnd instead of CurrentPeriodStart when 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:

  • InvoiceTemplateName field — Added InvoiceTemplateName to the CreditorFinanceConfiguration database schema, DTOs, and request models, with validation for maximum length (150094) (150430) (PR 23958)
  • InvoiceSender integration — Updated the InvoiceSender service 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 NULL filters to indexes on high-read billing tables to reduce index size and improve seeks (151156) (PR 24082)
  • TransactionItem index update — Revised the TransactionItem index 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 OpenTelemetry activity and counter instrumentation to StandardBankCollectionService, 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.Dapr workflow — Removed the experimental ProductManagement.Dapr workflow 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 SERIALIZABLE transaction (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 TrySaveStateAsync to prevent concurrent state updates from creating multiple transaction records (137635) (150391) (PR 23990)

  • Developer portal Bad Request error — Resolved a 400 Bad Request error on the developer portal occurring during onboarding patch operations by re-parsing the patch result before schema evaluation, fixing a JsonValidationException caused 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 UserMenuDropdown into 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 AuthenticationExpiryService parallel test execution and resolved an overly tight timing assertion in ProductService tests 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)