# Changes summary (2026-02-11) Implemented strict `lot_category` flow using `pricelist_items.lot_category` only (no parsing from `lot_name`), plus local caching and backfill: 1. Local DB schema + migrations - Added `lot_category` column to `local_pricelist_items` via `LocalPricelistItem` model. - Added local migration `2026_02_11_local_pricelist_item_category` to add the column if missing and create indexes: - `idx_local_pricelist_items_pricelist_lot (pricelist_id, lot_name)` - `idx_local_pricelist_items_lot_category (lot_category)` 2. Server model/repository - Added `LotCategory` field to `models.PricelistItem`. - `PricelistRepository.GetItems` now sets `Category` from `LotCategory` (no parsing from `lot_name`). 3. Sync + local DB helpers - `SyncPricelistItems` now saves `lot_category` into local cache via `PricelistItemToLocal`. - Added `LocalDB.CountLocalPricelistItemsWithEmptyCategory` and `LocalDB.ReplaceLocalPricelistItems`. - Added `LocalDB.GetLocalLotCategoriesByServerPricelistID` for strict category lookup. - Added `SyncPricelists` backfill step: for used active pricelists with empty categories, force refresh items from server. 4. API handler - `GET /api/pricelists/:id/items` returns `category` from `local_pricelist_items.lot_category` (no parsing from `lot_name`). 5. Article category foundation - New package `internal/article`: - `ResolveLotCategoriesStrict` pulls categories from local pricelist items and errors on missing category. - `GroupForLotCategory` maps only allowed codes (CPU/MEM/GPU/M2/SSD/HDD/EDSFF/HHHL/NIC/HCA/DPU/PSU/PS) to article groups; excludes `SFP`. - Error type `MissingCategoryForLotError` with base `ErrMissingCategoryForLot`. 6. Tests - Added unit tests for converters and article category resolver. - Added handler test to ensure `/api/pricelists/:id/items` returns `lot_category`. - Added sync test for category backfill on used pricelist items. - `go test ./...` passed. Additional fixes (2026-02-11): - Fixed article parsing bug: CPU/GPU parsers were swapped in `internal/article/generator.go`. CPU now uses last token from CPU lot; GPU uses model+memory from `GPU_vendor_model_mem_iface`. - Adjusted configurator base tab layout to align labels on the same row (separate label row + input row grid). UI rule (2026-02-19): - In all breadcrumbs, truncate long specification/configuration names to 16 characters using ellipsis.