Three small leftovers from Task 7 / the inventory-quantity-tracking
removal that a final review caught:
- Edit.razor's custom-stock quantity input still had min="1" even
though its own helper text says "Use -1 for unlimited", validation
already accepts -1, and the add-form defaults Quantity to -1 - so
the field rendered pre-populated with a value the browser's native
min validation flagged as invalid. Matches the min="-1" fix already
applied to the catalog-stock input in Task 7.
- optimize_job's MCP tool description still claimed the optimizer
falls back to "available inventory" when no stock is configured -
that auto-discovery fallback was removed in Task 3. An LLM reads
this description as ground truth, so stale wording here actively
misleads tool use. Also tightened add_job_stock's stockItemId/
isCustomLength wording, which still said "inventory" for what is
now just the stock catalog.
- CLAUDE.md's CutListPackingService summary said InStockBins comes
"from inventory", nudging future readers back toward the
auto-discovery mental model this plan removed.
Point API client at the deployed service port and clear logging
providers to prevent interference with MCP stdio transport.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update all project TFMs to net10.0, EF Core to 10.0.4, add
Microsoft.Extensions.Hosting.WindowsServices, and suppress WFO1000
warning for WinForms project.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add HTTP client methods for job CRUD, parts, stock, packing, and
cutting tool endpoints. Includes response DTOs for all job-related
API responses.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace direct EF Core/DbContext usage in MCP tools with HTTP calls
to the CutList.Web REST API via new ApiClient. Removes CutList.Web
project reference from MCP, adds Microsoft.Extensions.Http instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add SortOrder as secondary ordering key after Shape across all material
queries (list_materials, search methods)
- Default material type to "Steel" when not specified in add_stock_with_offering
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename Result to PackResult to avoid confusion with Result<T>
- Add PackingRequest as immutable configuration replacing mutable engine state
- Add PackingStrategy enum (AdvancedFit, BestFit, Exhaustive)
- Implement pipeline pattern for composable packing steps
- Rewrite AdvancedFitEngine as stateless using pipeline
- Rewrite BestFitEngine as stateless
- Add ExhaustiveFitEngine with symmetry breaking for optimal solutions
- Tries all bin assignments to find minimum bins
- Falls back to AdvancedFit for >20 items
- Configurable threshold via constructor
- Update IEngine/IEngineFactory interfaces for new pattern
- Add strategy parameter to MCP tools
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Consolidate duplicate logic to reduce code smells identified by Roslyn Bridge:
- Extract FlushPendingEdits() helper from Save() and Run() methods
- Simplify ClearData() to delegate to LoadDocumentData()
- Extract ConvertParts(), ConvertStockBins(), RunPackingAlgorithm() helpers
- Move DTO classes to separate Models.cs file
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add new MCP (Model Context Protocol) server project that exposes cut
list optimization tools for AI assistants. Implements tools for:
- create_cutlist: Optimized bin packing with parts and stock bins
- parse_length: Parse architectural format to decimal inches
- format_length: Format inches to feet/inches/fractions
- create_cutlist_report: Generate formatted printable text report
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>