diff --git a/OpenNest.Engine.Tests/Jobs/StockLadderTests.cs b/OpenNest.Engine.Tests/Jobs/StockLadderTests.cs
index 0da3bff..459d3e4 100644
--- a/OpenNest.Engine.Tests/Jobs/StockLadderTests.cs
+++ b/OpenNest.Engine.Tests/Jobs/StockLadderTests.cs
@@ -5,6 +5,23 @@ namespace OpenNest.Engine.Tests.Jobs;
public class StockLadderTests
{
+ [Fact]
+ public void LowerPriorityNumberWinsScarceStock()
+ {
+ var geometry = PartGeometrySnapshot.FromProgram(TestDrawingFactory.Rectangle(4, 4));
+ var high = new NestJobPart("high", geometry, 1);
+ var job = new NestJob(
+ new[] { new NestJobPart("low", geometry, 1, priority: 9), high },
+ new[] { new NestPlateStock("only", new Size(4, 4), 1) }
+ );
+
+ var result = new StockLadderNestingEngine().Solve(job);
+
+ Assert.Equal(0, high.Priority);
+ Assert.Equal("high", Assert.Single(Assert.Single(result.Plates).Placements).PartId);
+ Assert.Equal(0, result.Fulfillment.Single(f => f.PartId == "low").Placed);
+ }
+
private static NestJobPart Rectangle(
string id,
int quantity,
diff --git a/OpenNest.Engine/Jobs/NestJobPart.cs b/OpenNest.Engine/Jobs/NestJobPart.cs
index 15e8d75..7ec3d40 100644
--- a/OpenNest.Engine/Jobs/NestJobPart.cs
+++ b/OpenNest.Engine/Jobs/NestJobPart.cs
@@ -5,6 +5,13 @@ namespace OpenNest.Engine.Jobs;
/// An immutable requirement, independent of drawing names, UI state, and drawing quantity counters.
public sealed class NestJobPart
{
+ /// Creates an immutable part requirement.
+ /// Unique requirement ID.
+ /// Snapshot of the part geometry.
+ /// Positive number requested.
+ /// Placement precedence: lower numbers are placed first and win scarce
+ /// stock. Zero is the default and highest ordinary priority; equal priorities are peers.
+ /// Allowed rotations, or null for automatic rotation.
public NestJobPart(
string id,
PartGeometrySnapshot geometry,
@@ -29,6 +36,10 @@ public sealed class NestJobPart
/// Positive number requested; never decremented by placement code.
public int Quantity { get; }
+ ///
+ /// Placement precedence: a lower number is placed first and wins scarce stock.
+ /// Zero is the default and highest ordinary priority. Parts with equal priority are peers.
+ ///
public int Priority { get; }
public RotationPolicy Rotation { get; }
}