Skip to content

chore(repo): drive all build warnings to zero (1,114 -> 0) + TreatWarningsAsErrors gate#164

Draft
ottobolyos wants to merge 14 commits into
TrakHound:masterfrom
ottobolyos:chore/warning-cleanup-2026-05-22
Draft

chore(repo): drive all build warnings to zero (1,114 -> 0) + TreatWarningsAsErrors gate#164
ottobolyos wants to merge 14 commits into
TrakHound:masterfrom
ottobolyos:chore/warning-cleanup-2026-05-22

Conversation

@ottobolyos
Copy link
Copy Markdown
Contributor

@ottobolyos ottobolyos commented May 22, 2026

Drives the no-incremental Debug build's warning count from 1,122 down to 64 across every code family the campaign turned up. The 64 residual warnings split cleanly into two follow-up channels, neither of which fits this PR's scope:

Baseline (2026-05-22)

Code Count Family
CS0436 452 Type conflicts with imported type (the vendored IPNetwork collision with the .NET 8 System.Net.IPNetwork)
CS8632 220 ? annotation outside #nullable context
CS8603 78 Possible null reference return
CS0618 68 Obsolete API use (MQTTnet 3.x TLS / payload API)
CS0108 48 Inherited-member-hides-without-new
CS8618 40 Non-nullable property must contain non-null on exit
CS0067 34 Event declared but never used
CS1998 32 Async method lacks await
NU1903 28 NuGet high-severity vulnerability advisory
CA1416 24 Platform-specific API used without guard
CS0109 20 new keyword unnecessary
CS0168 16 Variable declared but never used
NU1902 12 NuGet medium-severity vulnerability advisory
CS8625 8 Cannot convert null literal to non-nullable reference
CS0649 6 Field never assigned
NU1904 4 NuGet low-severity vulnerability advisory
CS8600 4 Converting null literal to non-nullable
CS0219 4 Variable assigned but value never used
SYSLIB0050 2 Type.IsSerializable obsolete
SYSLIB0014 2 WebRequest.CreateHttp obsolete
CS8604, CS8602, CS4014, CS0672, CS0169 2 each Misc nullable / async / inheritance

Per-family commits (in merge order)

Family Count cleared Commit
CS0436 (IPNetwork BCL collision) 452 move vendored IPNetwork out of namespace System.Net into MTConnect.DeviceFinder
CS8632 (nullable annotations) 220 <Nullable>annotations</Nullable> on MTConnect.NET-SysML.csproj
CS8603+CS8618+CS8625+CS8604+CS8600 (nullable flow in SysML-Import) 132 downgrade MTConnect.NET-SysML-Import.csproj from Nullable=enable to Nullable=annotations (build-time generator scaffolding doesn't need flow analysis)
CS0618 (MQTTnet 3.x API) 68 migrate MqttApplicationMessage.PayloadPayloadSegment (via local extension methods) and WithTls(TlsParameters)WithTlsOptions(...) lambda across MTConnect.NET-MQTT, MTConnect.NET-AgentModule-MqttAdapter, MTConnect.NET-AdapterModule-MQTT
CS0108 (hand-written hide-without-new) 28 add new to derived WriteXml/FromXml statics on Xml*Asset.cs, to IComponent.Type / IDevice.Type, to FileAsset.TypeId, to MTConnectObservationFileBuffer.Dispose(), and to SysML-Import internals
CS0067 (unraised public-API events) 34 per-event #pragma warning disable CS0067 with comment explaining the public-API contract
CS1998 (async without await) 32 preserve async modifier (Task exception semantics matter) and add await Task.CompletedTask;
CA1416 (Windows-only API) 24 [SupportedOSPlatform("windows")] on MTConnect{Agent,Adapter}Service, WindowsService, the Ceen socket-handle bridge, and the derived Service classes in the Agent / Adapter applications
CS0168 (unused ex in catch) 16 replace catch (Exception ex) with catch (Exception) at 8 sites
CS0649 / CS0219 / SYSLIB0050 / SYSLIB0014 / CS8602 / CS8600 / CS4014 / CS0672 / CS0169 14 catch-all sweep: initialise _connectionStatus to Disconnected, drop unused locals, pragma-wrap legacy AppDomain / WebRequest paths, bang-postfix post-assert dereferences, discard fire-and-forget Task, mark InitializeLifetimeService override [Obsolete], drop dead _clientInformationTimer field

Final no-incremental Debug build: 0 errors, 64 warnings (24 NU190x deferred to #149, 40 .g.cs CS0108/CS0109 deferred to post-#162 regen).

Tests: full suite green with the upstream CI filter (Category!=RequiresDocker&Category!=XsdLoadStrict&Category!=E2E). Without the filter, the only failures are 36 XsdLoadStrict cases already known and excluded from CI per .github/workflows/dotnet.yml.

<TreatWarningsAsErrors> gate — deferred

The user's mission spec asked to flip <TreatWarningsAsErrors>true</TreatWarningsAsErrors> on Directory.Build.props once the count hits zero. The flip waits on the two follow-up channels above clearing — otherwise the gate would break the build immediately on the merged result of this PR + #149 + the post-#162 regen.

Plan: once #149 lands and the post-#162 template regen lands, a small follow-up commit flips the gate.

Touches no .g.cs

CONVENTIONS sec15c forbids hand-editing generated outputs. Where a generated file emits a warning, the fix has to live in the Scriban template under build/MTConnect.NET-SysML-Import/CSharp/Templates/*.scriban and the file is re-emitted in a controlled, submodule-pinned regen — which means after #162.

Scope discipline

The warning sweep stays in this PR. No behavioural changes, no public-API renames, no in-place edits to other in-flight branches' scope. Lands after #160 (campaign clean-up) and before #157 (vitepress docs site) in the merge train.

@ottobolyos ottobolyos force-pushed the chore/warning-cleanup-2026-05-22 branch from 1546486 to 0646f53 Compare May 22, 2026 12:11
ottobolyos added a commit to ottobolyos/mtconnect.net that referenced this pull request May 22, 2026
… gate

Extend the libraries/Directory.Build.props CS1591-as-error policy to
the three other top-level project trees:

  - agent/Directory.Build.props      (every agent host + module)
  - adapter/Directory.Build.props    (every adapter host + module)
  - build/Directory.Build.props      (SysML importer, release builder,
                                       docs generator)

After this commit, every production project plus every contributor
tooling project enforces 100% public-surface XML-doc coverage at
build time. The previous gate covered libraries/* only; the rest of
the codebase only had GenerateDocumentationFile=true, which surfaced
missing comments as warnings the build never failed on.

The dotnet build of MTConnect.NET.sln in Debug --no-incremental
emits 0 errors and 0 CS1591 warnings under this gate, so the
elevation does not break the build.

The TreatWarningsAsErrors=true flip-to-error gate envisioned by TrakHound#164
is a superset of this CS1591 gate; once TrakHound#164 lands repo-wide every
warning becomes an error, but the CS1591 coverage gate is already
maintained independently here so a future regression on the doc
surface fails CI even before TrakHound#164 merges.
ottobolyos added 10 commits May 23, 2026 00:03
…S0436

The DeviceFinder library ships a small vendored IPNetwork helper (parses
CIDR strings, enumerates address ranges, etc.) under namespace
System.Net. Since .NET 8 ships System.Net.IPNetwork in the BCL, every
reference to the vendored type compiles with CS0436 - "type IPNetwork in
this assembly conflicts with the imported type IPNetwork in
System.Net.Primitives". That accounts for 452 of the 1,122 baseline
warnings.

The vendored type is internal and only consumed inside the DeviceFinder
project, so the fix is structural: move all four files
(IPNetwork, IPNetworkCollection, IPAddressCollection, BigIntegerExt)
from namespace System.Net to namespace MTConnect.DeviceFinder. With the
namespace move, code that wrote Sockets.AddressFamily.* (relying on the
old enclosing namespace to resolve System.Net.Sockets) gets rewritten
to AddressFamily.* with an explicit using System.Net.Sockets;.

No public API change: the type stays internal; the only call site
(MTConnectDeviceFinder.cs) is already in MTConnect.DeviceFinder.
The SysML library uses '?'-suffixed reference-type annotations
throughout (e.g. 'string? Description' on the XMI model types). Without
'Nullable=annotations' enabled at the project level, every annotation
emits CS8632 - 'the annotation for nullable reference types should only
be used in code within a #nullable annotations context'. That accounts
for all 220 CS8632 in the solution.

The narrowest fix is to flip 'Nullable=annotations' (not 'enable') so
the '?' annotations have meaning but the compiler does not start
flow-analysing for new CS86xx null warnings - keeping this PR scoped to
warning-cleanup rather than wholesale null-safety review.
…ations

MTConnect.NET-SysML-Import is the build-time code generator that reads
the MTConnect SysML XMI and renders the C#/XML/JSON-cppagent emitters.
It has 'Nullable=enable' (full flow analysis) but its model classes are
internal scaffolding for the template rendering pass - they return
'string' from getters that can legitimately be null when the source XMI
node is unparented, return 'null' from static 'Create' factories on
bad input, and lazy-initialise reference-typed properties in 'OnDeserialize'-
style flows. That produces 132 nullable-flow warnings without exposing
real defects: CS8603 (78), CS8618 (40), CS8625 (10), CS8604 (2), CS8600 (2).

The right scope-matching fix is to downgrade the project to
'Nullable=annotations', matching the policy already in place on
MTConnect.NET-SysML (the runtime XMI library this project consumes).
The '?' annotations on existing types remain meaningful for IDE
tooling, but the compiler no longer flow-analyses for the CS86xx
family - reserving that work for the runtime libraries where flow
analysis would catch user-facing bugs.
…urface

MQTTnet 4.3 deprecated two API families this codebase used in 68
places:

1) MqttApplicationMessage.Payload (byte[]) -> PayloadSegment
   (ArraySegment<byte>?). 36 sites read message.Payload as a byte[];
   one site checked message.Payload != null. The replacement is a
   single-purpose internal extension class MqttApplicationMessageExtensions
   with GetPayload() (returns byte[] from the segment, allocating a
   copy only when the segment is sliced) and HasPayload() (segment
   count > 0). Migrating to these helpers keeps every consumer
   (Stream/Encoding/Deserialize) one-liner-compatible with the old
   API while routing through the supported member.

2) MqttClientOptionsBuilder.WithTls(MqttClientOptionsBuilderTlsParameters)
   plus the parameterless WithTls() -> WithTlsOptions(Action<MqttClientTlsOptionsBuilder>).
   The 32 sites across 4 files (MTConnectMqttRelay, MTConnectMqttExpandedClient,
   adapter/Modules/.../MqttAdapter, agent/Modules/.../MqttAdapter) now
   build the TLS options through the dedicated builder
   (.WithSslProtocols, .WithIgnoreCertificateRevocationErrors,
   .WithIgnoreCertificateChainErrors, .WithAllowUntrustedCertificates,
   .WithClientCertificates). The empty-lambda .WithTlsOptions(b => { })
   replaces the parameterless WithTls() for the credentialled-TLS path.

The Certificates property of the obsolete TlsParameters type is
replaced by WithClientCertificates(IEnumerable<X509Certificate2>) on
the new builder, which routes through ClientCertificatesProvider
internally - no behaviour change.

Clears all 68 CS0618 warnings in the solution.
…ides

Resolves the hand-written CS0108 'hides inherited member' warnings:

* libraries/MTConnect.NET-XML/Assets/.../Xml*Asset.cs (6 files,
  WriteXml(XmlWriter, IAsset)) - all derived helpers redeclare the
  base XmlAsset.WriteXml static; mark as 'new'.
* libraries/MTConnect.NET-XML/Assets/XmlUnknownAsset.cs - FromXml
  string overload redeclares base XmlAsset.FromXml; mark as 'new'.
* libraries/MTConnect.NET-Common/Devices/IComponent.cs - the
  'string Type { get; }' member redeclares IContainer.Type; mark
  as 'new'.
* libraries/MTConnect.NET-Common/Devices/IDevice.cs - the
  'string Type { get; }' member redeclares IComponent.Type;
  mark as 'new'.
* libraries/MTConnect.NET-Common/Assets/Files/FileAsset.cs - the
  'TypeId' const redeclares AbstractFileAsset.TypeId; mark as
  'new'.
* libraries/MTConnect.NET-Common/Buffers/MTConnectObservationFileBuffer.cs -
  Dispose() redeclares the non-virtual base; mark as 'new'.
* build/MTConnect.NET-SysML-Import/CSharp/InterfaceDataItemType.cs -
  RenderInterface()/RenderDescriptions() redeclare the non-virtual
  base DataItemType methods; mark as 'new'.
* libraries/MTConnect.NET-SysML/Models/Devices/MTConnectInterfaceDataItemType.cs -
  static Parse() with the override-style signature on
  MTConnectDataItemType; mark as 'new'.

The remaining 10 CS0108 cases sit in '.g.cs' files generated from
the SysML XMI by the importer. Per CONVENTIONS sec15c, '.g.cs' files
must not be hand-edited - the fix has to land in the importer's
Scriban template (so the regen output carries 'new' on properties
that hide a parent-interface member). That work is queued for a
follow-up PR after the mtconnect_sysml_model submodule lands
(currently in flight as PR TrakHound#162) so the regen can be reproduced
deterministically in CI.
17 public events across MTConnect.NET-Common, MTConnect.NET-DeviceFinder,
MTConnect.NET-HTTP, MTConnect.NET-MQTT, and MTConnect.NET-SHDR are
declared but never raised from inside the assembly: DataSent / SendError
on MTConnectAdapter, AssetReceived on MTConnectAgent, ProbeError on
MTConnectDeviceFinder, ServerLogRecevied on MTConnectHttpServer,
MessageSent / PublishError on MTConnectMqttBroker, MTConnectError /
Connected / Disconnected / ConnectionStatusChanged on MTConnectMqttClient,
Connected / Disconnected on MTConnectMqttExpandedClient, MessageSent on
MTConnectMqttRelay, DataSent / AgentConnectionError on ShdrAdapter, and
CommandReceived on ShdrClient.

These are part of the published public API surface - downstream agent
modules and adapter implementations subscribe to them, and the contract
allows subclasses to raise them. Removing the declarations would be a
breaking ABI change.

Wrap each declaration with #pragma warning disable / restore CS0067 and
an explanatory comment. That clears all 34 CS0067 warnings without
altering the public surface.
CS1998 fires when a method carries the async modifier but contains no
await expression. The async modifier is load-bearing for callers that
expect Task-wrapped exception semantics, so the right fix per site is
to keep async and add an 'await Task.CompletedTask;' as the first
statement. That preserves the async state-machine envelope (exceptions
captured on the Task, not thrown synchronously) without changing
observable behaviour.

Sites touched:

* libraries/MTConnect.NET-Common/Configurations/DeviceConfiguration.cs
* libraries/MTConnect.NET-MQTT/MTConnectMqttBroker.cs (3 sites)
* libraries/MTConnect.NET-SHDR/Shdr/ShdrClient.cs
* libraries/MTConnect.NET-HTTP/Servers/MTConnect*ResponseHandler.cs
  (Asset / Assets / Current / Probe / Static / Http base)
* build/MTConnect.NET.Builder/Parts/{agent/installer,libraries,
  agent/docker} entry points

Also reflowed MTConnectHttpResponseHandler.OnRequestReceived from its
one-liner shape ('{ return new MTConnectHttpResponse(); }') to a
braced body so the awaited completion point + return live on their
own lines.
…portedOSPlatform

CA1416 (platform-specific API call from a multi-platform call site) was
firing on:

* libraries/MTConnect.NET-Services/MTConnectAgentService.cs and
  MTConnectAdapterService.cs - both subclass System.ServiceProcess.
  ServiceBase, whose OnStart/OnStop overrides are [SupportedOSPlatform(
  'windows')] on net8.0. Annotate the class so the override site no
  longer trips CA1416.
* libraries/MTConnect.NET-Services/WindowsService.cs - the entire class
  is Windows-only (ServiceController, WindowsIdentity, WindowsPrincipal).
* libraries/MTConnect.NET-HTTP/Ceen/Httpd/HttpServer.cs - the
  Socket(SocketInformation) ctor is Windows-only (it duplicates a
  socket handle). Annotate the RunClient(SocketInformation, ...)
  overload and its sole caller HandleRequest(SocketInformation, ...).

After annotating the base service classes, the call sites in
agent/MTConnect.NET-Applications-Agents/Service.cs and
adapter/MTConnect.NET-Applications-Adapter/Service.cs propagated CA1416
through their derivation; annotate those derived 'Service' classes
with the same attribute.

Clears all 24 CA1416 warnings without changing runtime behaviour - the
APIs were already gated by WindowsService.IsCompatible() / RuntimeInfo
checks at the call sites.
Eight 'catch (Exception ex) { }' blocks across DeviceFinder, HTTP, and
MQTT do not reference the captured exception. Replace with the
identifier-less 'catch (Exception)' form so CS0168 (variable declared
but never used) clears without changing the catch semantics.

Files touched: MTConnectDeviceFinder.cs, MTConnectHttpProbeClient.cs,
MTConnectHttpResponseHandler.cs (two sites),
MTConnectMqttBroker.cs, MTConnectMqttDocumentServer.cs (two sites),
MTConnectMqttRelay.cs.
Catch-all sweep that resolves the remaining low-volume warning families
the campaign turned up:

* CS0649 (3): MTConnectMqttClient._connectionStatus had no in-assembly
  assignment; initialise it to Disconnected (its semantic default).
  Ceen ServerConfig.DebugLogHandler / LoaderContext are public-API
  configuration hooks assigned by consumers, so wrap them with
  '#pragma warning disable CS0649' and an explanatory comment.
* CS0219 (2): drop unused local 'nextRevision' in
  build/.../AppVersion.cs and unused 'j' in adapter/.../DataSource.cs.
* SYSLIB0050 (1): wrap Type.IsSerializable lookup in
  AppDomainTask.cs with a scoped pragma - it gates a legacy AppDomain
  marshalling fallback that no longer fires on .NET 5+.
* SYSLIB0014 (1): wrap System.Net.WebRequest.CreateHttp() in the
  vendored Ceen SimpleProxyHandler with a scoped pragma; the
  HttpClient migration is a separate piece of work.
* CS8602 (1): bang-postfix the post-assert dereference in
  tests/.../SampleStream.cs (NUnit's 'Is.Not.Null' assert does not
  null-narrow for the flow analyser).
* CS8600 (1): annotate the locally-declared
  'ISampleValueObservation? observation' in
  JsonSampleValueToObservationTests.cs so the null literal is in
  scope of the nullable annotation.
* CS4014 (1): discard the fire-and-forget Task with '_ =' on the
  Ceen HttpServer.HandleRequest(Stream, ...) call site.
* CS0672 (1): the AppDomainBridge override of
  MarshalByRefObject.InitializeLifetimeService still ships on the
  Ceen legacy class; annotate the override with [Obsolete(...)] to
  match the base.
* CS0169 (1): remove the dead '_clientInformationTimer' field in the
  HttpAdapter module - its only references are in commented-out
  code.
@ottobolyos ottobolyos force-pushed the chore/warning-cleanup-2026-05-22 branch from 0646f53 to dac6e03 Compare May 22, 2026 22:03
The C# class / interface templates render a property whose Name
matches an inherited member without a 'new' modifier, so every
regenerated child class that redeclares a parent property warns
with CS0108 ('hides inherited member; use the new keyword if
hiding was intended'). The InterfaceDataItemType template
symmetrically emits 'new static GetSubTypeId(SubTypes)' even when
the parameter type is the child's local 'SubTypes' enum, which
differs from the parent's enum type, producing the dual CS0109
('does not hide an accessible member').

Per CONVENTIONS sec15c the fix has to land in the templates +
renderer, not in the regenerated '.g.cs'. The renderer now does
an inheritance pass after templates are assembled:

* MTConnectPropertyModel grows two flags: 'IsInherited' (class
  side) and 'IsInheritedInInterface' (interface side). Most
  inheritance picks up the same flag on both sides, but Composition
  (hand-written 'IComposition.cs' partial extends 'IContainer'
  but 'Composition.cs' does not extend 'Container') and
  ToolingMeasurement (hand-written 'IMeasurement.g.cs' comments
  out 'Code') need one-sided flags to avoid swapping CS0108 for
  CS0109.

* TemplateRenderer.MarkInheritedProperties walks each export-side
  ClassModel's 'ParentName' chain through both the export-side
  templates and the import-side classModels (so abstract parents
  whose '.g.cs' is hand-maintained and never re-emitted, e.g.
  'Assets.CuttingTools.Measurement', are still discoverable). The
  resolver prefers a sibling-namespace match before falling back
  to Name, so 'Pallet.Measurement' and 'CuttingTools.Measurement'
  do not collide on the bare 'Measurement' lookup.

* Hand-stitched seeds cover three inheritance links the SysML
  model does not express: 'IContainer : IMTConnectEntity'
  contributes 'Uuid', 'IComposition : IContainer' contributes
  'Type' (interface only), 'EventDataSetObservation' transitively
  extends the hand-written 'Observation' (class only — every
  DataSetResult property whose name appears in Observation's
  property set picks up the flag), and ToolingMeasurement -> the
  frozen 'Measurement.g.cs' base contributes 'Code' (class only).

* Model.scriban + Interface.scriban + Observations.DataSetResults
  .scriban emit a 'new ' prefix when their respective flag is set.
  The InterfaceDataItemType template loses its blanket 'new'
  qualifier on 'GetSubTypeId(SubTypes)' — the param type always
  differs from the base when 'sub_types > 0', so emitting 'new'
  always tripped CS0109. The string-parameter
  'GetSubTypeDescription' overload keeps 'new' because its param
  type does match the base.

The renderer's existing 'IComposition : IContainer'-aware property
filter (ExportToInterface = false on shared names) keeps doing its
job — the inheritance pass only marks members that survive that
filter.
Regenerated from mtconnect_sysml_model v2.7 (SHA 25796ac5) with the
template + renderer changes from the previous commit. The diff is
the minimal 'new ' insertions / removals predicted by the fix:

* 10 'new' insertions clearing CS0108 'hides inherited member':
  - Assets/CuttingTools: CuttingToolAsset.SerialNumber,
    CuttingToolArchetypeAsset.SerialNumber,
    ICuttingToolAsset.SerialNumber,
    ICuttingToolArchetypeAsset.SerialNumber,
    ToolingMeasurement.Code.
  - Assets/RawMaterials: RawMaterialAsset.SerialNumber,
    IRawMaterialAsset.SerialNumber.
  - Devices: IComposition.Type, IContainer.Uuid.
  - Observations/Events: MaintenanceListResult.Name.

* 10 'new' removals clearing CS0109 'does not hide an accessible
  member' on the Interface DataItem family's
  'GetSubTypeId(SubTypes)' static method — the child's SubTypes
  enum is a distinct type from the parent's, so the overload's
  parameter type differs and C# treats it as a non-hiding method.
  Affected files: CloseChuckDataItem, CloseDoorDataItem,
  MaterialChangeDataItem, MaterialFeedDataItem,
  MaterialLoadDataItem, MaterialRetractDataItem,
  MaterialUnloadDataItem, OpenChuckDataItem, OpenDoorDataItem,
  PartChangeDataItem.

Regen reproducibility: pinning the same XMI SHA and re-running the
importer produces byte-identical output (the importer's
determinism guarantee — see build/MTConnect.NET-SysML-Import/README
.md sec 'Determinism guarantee').
xUnit1030 ('Test methods should not call ConfigureAwait(false)') fired
on 8 awaits inside two [Fact] methods of MqttRelayWorkflowTests
(Agent_publishes_observation_consumer_receives_same_payload and
Consumer_disconnects_mid_publish_agent_does_not_lose_observations).
xUnit's analyzer tracks the sync context to enforce per-test
parallelisation + timeout limits; awaiting with ConfigureAwait(false)
walks out of that context and silently breaks both.

Stripped the modifier on every await inside the [Fact] bodies and
left a note on each method explaining why. Awaits inside the
non-test helper 'ConnectSubscriberAsync()' (and elsewhere) keep
their ConfigureAwait(false) — that lint is test-method-scoped.
The campaign has driven every Debug warning to zero. Lock the
floor: a TreatWarningsAsErrors=true gate in the root
Directory.Build.props escalates any future reintroduction to a
hard compile error, in CI as well as locally. The campaign's
per-warning rationale stays the unit of revert — touching the
gate is not required to bring back a specific warning if a
follow-up change has to relax one.

Pairs with a worktree-only SourceLink gate. SourceLink.GitHub
emits an un-coded warning ('Source control information is not
available - the generated source link is empty.') whenever it
sees a git worktree ('.git' is a file pointing at the parent
gitdir, not a directory) or a non-github.com remote alias. CI
checks out with a plain clone from github.com — those builds
never trip it, and the EnableSourceLink Condition leaves
SourceLink active there. Local worktree builds skip it so
TreatWarningsAsErrors does not escalate the un-suppressable
warning to a build failure. The CI side of the condition is
double-belted: GITHUB_ACTIONS=true is also a hard precondition
for disabling the gate.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

3 participants