Repository navigation
ci(#5212): DOTNET_TieredPGO=0 stopgap in CI + satellite lanes; chart renders it from a record - #6268
Conversation
…t renders it from a record TEMPORARY STOPGAP (maintainer decision, policy tiered-pgo-off-5212) for the .NET 10 JIT miscompile in #5212: Tier-1 + Dynamic PGO drops a type check in an inlined guarded devirtualisation on Roslyn's MetadataWriter path, after which every in-process Emit NREs. Remove when the runtime fix ships. - dotnet-test.yml: job env on test, doc-gate, platform-compat. - node-repo-{compile-check,gate,module-pack,publish-bake}.yml: job env on every job that compiles, bakes or runs satellite tests, plus -e DOTNET_TieredPGO=0 on each emitting `docker run` (the runner env does not cross into the container). Covers satellites whatever tester pin they hold, which #890's runtimeconfig half cannot. - chart: memex-portal-config renders DOTNET_TieredPGO when a record's extraPortalConfig sets it (envFrom -> process env), so the Memex records can carry it. - PolicyNotProse register row + NodeTypeCompilation "environment half" paragraph. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
The core build job still runs Roslyn emits without the Tiered PGO workaround.
1 open finding
What changed in this PR
Adds a temporary Tiered PGO mitigation for Roslyn emit failures across CI, satellite workflows, and portal deployments.
Changes:
- Sets
DOTNET_TieredPGO=0in relevant CI jobs and emitting containers. - Passes the setting from deployment records into portal containers.
- Documents the mitigation and its removal policy.
| File | Description |
|---|---|
.github/workflows/dotnet-test.yml |
Applies the workaround to test and runtime-compilation jobs. |
.github/workflows/node-repo-compile-check.yml |
Protects satellite NodeType compilation. |
.github/workflows/node-repo-gate.yml |
Protects gate processes and containers. |
.github/workflows/node-repo-module-pack.yml |
Protects module builds, packing, and tests. |
.github/workflows/node-repo-publish-bake.yml |
Protects bake compilation and seed containers. |
deploy/helm/templates/memex-portal/config.yaml |
Renders the optional portal environment variable. |
src/MeshWeaver.Documentation/Data/Architecture/NodeTypeCompilation.md |
Documents environment-level coverage. |
src/MeshWeaver.Documentation/Data/Architecture/PolicyNotProse.md |
Registers the temporary policy. |
🧠 Review effort: Balanced
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| env: | ||
| DOTNET_TieredPGO: "0" |
There was a problem hiding this comment.
Fixed in e7fcf1e: the stopgap's env DOTNET_TieredPGO=0 is now set on the build job as well, since the solution build's Roslyn compiler server emits in-process and is not configured by a runtimeconfig.
Test Results (shard 4) 4 files ±0 4 suites ±0 15m 29s ⏱️ -1s Results for commit 9b1102c. ± Comparison against base commit 0e6abb9. This pull request removes 40 and adds 16 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
Test Results 22 files ±0 22 suites ±0 48m 40s ⏱️ -46s Results for commit 9b1102c. ± Comparison against base commit 0e6abb9. This pull request removes 40 and adds 16 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
…erver emits in-process) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
# Conflicts: # src/MeshWeaver.Documentation/Data/Architecture/PolicyNotProse.md

What
Temporary stopgap, as the maintainer decided:
DOTNET_TieredPGO=0for #5212. The .NET 10 Tier-1 JIT, running with Dynamic PGO, drops a type check in an inlined guarded devirtualisation on Roslyn'sMetadataWriter.PopulateNestedClassTableRows/getConsolidatedTypeParameterspath. After that, every in-processEmitNREs. Evidence: #5212 (comment). The root cause stays tracked in #5212 and in an upstream dotnet/runtime issue (filed separately). Every place this PR sets the switch carries a comment that names #5212 and says "remove when the runtime fix ships". Policy:tiered-pgo-off-5212(registered in PolicyNotProse).Relation to #6254 (already merged): #6254 set
<TieredPGO>false</TieredPGO>in both Directory.Build.props, so the switch is in the runtimeconfig. That reaches only hosts built from this tree at or after that commit. This PR adds the environment half, which the runtime reads from the process env and which wins over the runtimeconfig. It covers:TieredPGOproperty today).Changes
dotnet-test.yml: jobenv: DOTNET_TieredPGO: "0"ontest(the shards),doc-gateandplatform-compat. These are the jobs that run in-process emits (test hosts,mw-plugin-test).node-repo-compile-check(compile-check; itsdotnet buildcompiler server is long-lived),node-repo-gate(gate),node-repo-module-pack(build-workspace,pack,tests) andnode-repo-publish-bake(publish-bake).-e DOTNET_TieredPGO=0on each emittingdocker run: gaterun_tester, module-packbuild-project, and publish-bakecompileand seed run. The runner env does not cross into a container.deploy/helm/templates/memex-portal/config.yaml):memex-portal-configrendersDOTNET_TieredPGO, but only whenconfig.memex_portal.DOTNET_TieredPGOis present and non-empty. The ConfigMap reaches the container throughenvFrom, so the runtime sees it as process env. Before this PR the chart did not pass the key through, and a record setting it reached no container.Paired Memex PR
The Systemorph/Memex PR that adds
DOTNET_TieredPGO: "0"to the portal records depends on this PR. Its requiredconfig-key-coveragereads the chart from this repo's default branch. Measured locally: against main's chart that check reports4 new rendered-nowhere(config.memex_portal.DOTNET_TieredPGOon build, memex-cloud, memex and pearl). Against this branch it is 0. Merge this one first.Checks run locally
check-workflow-timeouts.py: 113 jobs, 0 violations.check-workflow-yaml-keys.py: 45 workflows + 6 composite actions, 0 violations.actionlinton all 5 touched workflows.dotnet-test.ymlandnode-repo-compile-check.ymlare clean. gate, module-pack and publish-bake report 20 shellcheck info/style findings, the same 20 as onorigin/main(I ran it on both), so this PR adds none. The stopgap comment sits above each# shellcheck disable=SC2086directive so the directive still binds to itsdocker run.deploy/aks/scripts/check-chart-invariants.sh: all 17 combinations self-consistent, 7 refusal controls hold.deploy/aks/scripts/check-values-are-read.sh: 128 keys read.helm template:--set-string config.memex_portal.DOTNET_TieredPGO=0, the ConfigMap carriesDOTNET_TieredPGO: "0";memexoverlay, it rendersDOTNET_TieredPGO: "0".dotnet build src/MeshWeaver.Documentation -c Release -warnaserror: 0 warnings, 0 errors.Recycle / roll
Nothing in this PR needs a recycle: CI env takes effect on the next run. The chart key does nothing until a record sets it, and it then takes effect on the next pod start (see the Memex PR for the Reconcile list).
Pairs-with: none — no public surface removed
Mirror-sync: none — no i18n catalog change
🤖 Generated with Claude Code