> For the complete documentation index, see [llms.txt](https://framework.aic.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://framework.aic.io/technical-guidelines-code-standards-and-tech-stack/tech-stack/runtime-and-language-standard.md).

# Runtime and Language Standard

## AIC Standard

AIC uses modern .NET as its default engineering platform.

| Use case                         | Standard                                        |
| -------------------------------- | ----------------------------------------------- |
| Production baseline              | .NET 10 LTS                                     |
| Production language              | C# 14                                           |
| Future / preview evaluation      | .NET 11 preview, C# 15                          |
| Legacy compatibility             | Only where required and documented              |
| Desktop Windows                  | WPF on modern .NET                              |
| Cross-platform mobile or desktop | .NET MAUI where justified                       |
| Web API                          | ASP.NET Core on .NET 10                         |
| Data access                      | EF Core 10 unless another approach is justified |

## Mandatory Rules

* New production projects MUST target `net10.0` unless an exception is approved.
* C# production language version MUST align with the target framework.
* Do not force `LangVersion=latest` in production repositories unless specifically approved.
* Preview SDKs MUST NOT be used in production build agents.
* .NET 11 and C# 15 MAY be used for spikes, prototypes, accelerators or approved non-production work.
* All repositories MUST include `global.json`.
* Build images MUST install only approved SDKs.
* Dockerfiles MUST use supported runtime and SDK images.

## Target Framework Guidance

Use single-targeting unless there is a real compatibility reason to multi-target.

```xml
<TargetFramework>net10.0</TargetFramework>
```

Use multi-targeting only where necessary, for example a reusable library consumed by multiple supported applications:

```xml
<TargetFrameworks>net8.0;net10.0</TargetFrameworks>
```

Multi-targeting increases test effort, package complexity and compatibility risk. It requires an ADR.

## Language Version Guidance

Default approach:

```xml
<LangVersion>14.0</LangVersion>
```

Avoid:

```xml
<LangVersion>latest</LangVersion>
```

`latest` can make builds change unexpectedly when developer machines or build agents update. Use a specific version unless the repository is explicitly a preview or language exploration project.

## Required Project Properties

Production projects SHOULD define or inherit:

```xml
<PropertyGroup>
  <TargetFramework>net10.0</TargetFramework>
  <Nullable>enable</Nullable>
  <ImplicitUsings>enable</ImplicitUsings>
  <LangVersion>14.0</LangVersion>
  <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  <AnalysisLevel>latest</AnalysisLevel>
  <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
  <ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
</PropertyGroup>
```

## Runtime Upgrade Rules

Runtime upgrades require:

* review of Microsoft breaking changes
* update to SDK pin
* update to build image
* dependency compatibility check
* test run across all supported projects
* performance smoke test for sensitive services
* security scan
* ADR or upgrade record
* customer approval where contractually required

## Legacy Rule

Legacy .NET Framework, .NET Core 3.1, .NET 5, .NET 6 and .NET 7 MUST NOT be used for greenfield delivery. Legacy systems may be maintained only with a documented containment, migration or customer-approved support plan.
