Skip to content

FIX: refactor engine builders#727

Merged
justadreamer merged 8 commits intomainfrom
fix/engine-builders
Apr 10, 2026
Merged

FIX: refactor engine builders#727
justadreamer merged 8 commits intomainfrom
fix/engine-builders

Conversation

@viktor-shnaider
Copy link
Copy Markdown
Contributor

Problem

PipelineBuilder.BuildFromConfiguration uses GetRuntimeMethods() to locate a builder's Build() method at runtime. When a builder declares public new Build() to hide the inherited protected virtual Build() from SingleFileAspectEngineBuilderBase, reflection sees both methods and throws a "multiple matching Build methods" error at startup.

Changes

  • RobotsTxtBuilder and PropertyKeyedDeviceEngineBaseBuilder: changed public new Build() to protected override Build() so the base method is replaced rather than hidden — reflection now finds exactly one parameterless Build()
  • RobotsTxtEngine: completed the IOnPremiseAspectEngine members that previously threw NotImplementedException:
  • RefreshData (both overloads) — no-op; data comes from DeviceDetectionHashEngine via AddPipeline, not a file
  • GetDataFileMetaData — returns null; no data files are registered
  • AddDataFile — throws NotSupportedException; data files are not applicable
  • TempDataDirPath — changed to null

Tests

  • RobotsTxtBuilderTests and PropertyKeyedBuilderTests: regression tests that call GetRuntimeMethods() directly and assert exactly one parameterless Build() is visible — will fail if public new is reintroduced
  • Utils.AssertSingleParameterlessBuild: shared helper in TestHelpers for reuse across builder test classes

@justadreamer justadreamer requested review from jwrosewell and removed request for drasmart April 7, 2026 18:03
Copy link
Copy Markdown
Contributor

@jwrosewell jwrosewell left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the changes in the commit I've made to this branch.

I don't understand why the test isn't using the builder. I changed to use the builder for TacEngine and it requires parameters that are unneeded. This suggests the base class is wrong. It is just a simple FlowElement.

I have removed duplicate code and added a place holder for the new problem associated with the builders for Native and TAC using the same element key value.

base(loggerFactory, dataUpdateService)
{
_elementDataKey = "native-profiles";
_elementDataKey = "hardware";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if evidence is provided for Native and TAC in the same request? Sharing the same element key seems like it would create problems.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently, if we make three separate requests — one with TAC evidence, one with Native evidence, and one with both — all profiles will be created under the hardware property.

For example: https://cloud.51degrees.com/api/v4/{resourceKey}.json?TAC=35189711&nativemodel=iPhone11,8

Therefore, to maintain backward compatibility, _elementDataKey is set to "hardware" in both NativeEngineBuilder.cs and TacEngineBuilder.cs.

Please let me know if I misunderstood anything or if this needs correction.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per James: please complete the combined test that was added as a stub in James's commit - so that we confirm that it works exactly as is in the current cloud so we preserve the logic.

base(loggerFactory, dataUpdateService)
{
_elementDataKey = "tac-profiles";
_elementDataKey = "hardware";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See comment against the native engine.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently, if we make three separate requests — one with TAC evidence, one with Native evidence, and one with both — all profiles will be created under the hardware property.

For example: https://cloud.51degrees.com/api/v4/{resourceKey}.json?TAC=35189711&nativemodel=iPhone11,8

Therefore, to maintain backward compatibility, _elementDataKey is set to "hardware" in both NativeEngineBuilder.cs and TacEngineBuilder.cs.

Please let me know if I misunderstood anything or if this needs correction.

@jwrosewell
Copy link
Copy Markdown
Contributor

Overall I think deriving the base class from OnPremiseAspectEngineBase is the root cause of many problems.

public abstract class PropertyKeyedEngine<TData, TProfile> : OnPremiseAspectEngineBase<TData, IFiftyOneAspectPropertyMetaData>, IDisposable where TData : IMultiProfileData<TProfile> where TProfile : IAspectData

Copy link
Copy Markdown
Contributor

@justadreamer justadreamer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

still some cleanup is left to do

Comment on lines +87 to +88
}
if (indexedProperties == null || indexedProperties.Count == 0)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

was moved into the base class in pipeline-dotnet, so this can be removed here


/// <inheritdoc/>
public override TBuilder SetPerformanceProfile(
public TBuilder SetPerformanceProfile(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be removed, we are getting data from the upstream engine in the pipeline.

/// <returns>This builder.</returns>
public PropertyKeyedDeviceEngineBaseBuilder<TBuilder, TEngine>
SetConcurrency(ushort concurrency)
public TBuilder SetConcurrency(ushort concurrency)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see above re: SetPerformanceProfile

_requiredProperties;

public IReadOnlyList<IAspectEngineDataFile> DataFiles => throw new NotImplementedException();
public IReadOnlyList<IAspectEngineDataFile> DataFiles => [];
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is this still needed? since we inherit from AspectEngineBase rather than OnPremiseAspectEngineBase

/// Returns <see langword="null"/>. <see cref="RobotsTxtEngine"/> has no
/// data files of its own so there is no temp directory to configure.
/// </summary>
public string TempDataDirPath => null;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same question as re: DataFiles?

/// it derives its data from <see cref="DeviceDetectionHashEngine"/> via
/// <see cref="AddPipeline"/> and has nothing to reload from disk.
/// </summary>
public void RefreshData(string dataFileIdentifier) { }
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RefreshData probably needs to go too?

/// Returns <see langword="null"/>. <see cref="RobotsTxtEngine"/> has no
/// data files, so there is no metadata to return for any identifier.
/// </summary>
public IAspectEngineDataFile GetDataFileMetaData(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this all needs to be cleaned out

@github-actions
Copy link
Copy Markdown
Contributor

Unit Tests - Mac_arm64_Release

  4 files  ±0    4 suites  ±0   2m 8s ⏱️ ±0s
215 tests +2  192 ✅ +4  23 💤  - 2  0 ❌ ±0 
258 runs  +2  235 ✅ +4  23 💤  - 2  0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

This pull request removes 3 and adds 5 tests. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEngines_UseSameElementDataKey
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEvidence_AggregatesProfilesUnderHardware
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ NativeEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ TacEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware
This pull request removes 3 skipped tests and adds 1 skipped test. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware

@github-actions
Copy link
Copy Markdown
Contributor

Integration Tests - Mac_arm64_Release

0 files   -  12  0 suites   - 12   0s ⏱️ - 22m 6s
0 tests  - 348  0 ✅  - 345  0 💤  - 3  0 ❌ ±0 
0 runs   - 696  0 ✅  - 690  0 💤  - 6  0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Unit Tests - Mac_x64_Release

  4 files  ±0    4 suites  ±0   2m 25s ⏱️ -7s
215 tests +2  192 ✅ +4  23 💤  - 2  0 ❌ ±0 
258 runs  +2  235 ✅ +4  23 💤  - 2  0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

This pull request removes 3 and adds 5 tests. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEngines_UseSameElementDataKey
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEvidence_AggregatesProfilesUnderHardware
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ NativeEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ TacEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware
This pull request removes 3 skipped tests and adds 1 skipped test. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware

@github-actions
Copy link
Copy Markdown
Contributor

Integration Tests - Mac_x64_Release

0 files   -  12  0 suites   - 12   0s ⏱️ - 25m 45s
0 tests  - 348  0 ✅  - 345  0 💤  - 3  0 ❌ ±0 
0 runs   - 696  0 ✅  - 690  0 💤  - 6  0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Unit Tests - Ubuntu_x64_Release

  4 files  ±0    4 suites  ±0   1m 40s ⏱️ -4s
215 tests +2  192 ✅ +4  23 💤  - 2  0 ❌ ±0 
258 runs  +2  235 ✅ +4  23 💤  - 2  0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

This pull request removes 3 and adds 5 tests. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEngines_UseSameElementDataKey
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEvidence_AggregatesProfilesUnderHardware
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ NativeEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ TacEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware
This pull request removes 3 skipped tests and adds 1 skipped test. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware

@github-actions
Copy link
Copy Markdown
Contributor

Unit Tests - Ubuntu_x64_Debug

  4 files  ±0    4 suites  ±0   1m 40s ⏱️ -7s
215 tests +2  192 ✅ +4  23 💤  - 2  0 ❌ ±0 
258 runs  +2  235 ✅ +4  23 💤  - 2  0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

This pull request removes 3 and adds 5 tests. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEngines_UseSameElementDataKey
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEvidence_AggregatesProfilesUnderHardware
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ NativeEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ TacEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware
This pull request removes 3 skipped tests and adds 1 skipped test. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware

@github-actions
Copy link
Copy Markdown
Contributor

Integration Tests - Ubuntu_x64_Release

0 files   -  12  0 suites   - 12   0s ⏱️ - 4m 23s
0 tests  - 348  0 ✅  - 345  0 💤  - 3  0 ❌ ±0 
0 runs   - 696  0 ✅  - 690  0 💤  - 6  0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Integration Tests - Ubuntu_x64_Debug

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Performance Tests - Ubuntu_x64_Release

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Unit Tests - Ubuntu_ARM_Release

  4 files  ±0    4 suites  ±0   1m 37s ⏱️ +4s
215 tests +2  192 ✅ +4  23 💤  - 2  0 ❌ ±0 
258 runs  +2  235 ✅ +4  23 💤  - 2  0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

This pull request removes 3 and adds 5 tests. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEngines_UseSameElementDataKey
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CombinedTests ‑ BothEvidence_AggregatesProfilesUnderHardware
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ NativeEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.PropertyKeyedBuilderTests ‑ TacEngineBuilder_SingleParameterlessBuildMethod
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware
This pull request removes 3 skipped tests and adds 1 skipped test. Note that renamed tests count towards both.
FiftyOne.DeviceDetection.PropertyKeyed.Tests.CustomPropertyEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsUnique
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ RefreshData_Throws
FiftyOne.DeviceDetection.PropertyKeyed.Tests.TacConfiguredEngineTests ‑ ElementDataKey_IsHardware

@github-actions
Copy link
Copy Markdown
Contributor

Unit Tests - Windows_x64_Debug

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Integration Tests - Ubuntu_ARM_Release

0 files   -  12  0 suites   - 12   0s ⏱️ - 3m 52s
0 tests  - 348  0 ✅  - 345  0 💤  - 3  0 ❌ ±0 
0 runs   - 696  0 ✅  - 690  0 💤  - 6  0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Integration Tests - Windows_x64_Debug

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Performance Tests - Ubuntu_ARM_Release

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Unit Tests - Windows_x64_Release

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Integration Tests - Windows_x64_Release

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites  - 2   0 💤 ±0 
0 files    - 2   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Performance Tests - Windows_x64_Release

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Unit Tests - Windows_x86_Debug

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Integration Tests - Windows_x86_Debug

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Unit Tests - Windows_x86_Release

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@github-actions
Copy link
Copy Markdown
Contributor

Integration Tests - Windows_x86_Release

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites  - 2   0 💤 ±0 
0 files    - 2   0 ❌ ±0 

Results for commit 9210209. ± Comparison against base commit 96ce45d.

@justadreamer justadreamer merged commit 1962d92 into main Apr 10, 2026
34 checks passed
@justadreamer justadreamer deleted the fix/engine-builders branch April 10, 2026 07:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants