Build [v1.14.23]
This commit is contained in:
@@ -26,6 +26,7 @@ This is the **Single Source of Truth** for ALL AI agents. Refer to [PROJECT_ARCH
|
||||
- **NO UPPERCASE** or **NO ITALICS** in any UI context (headers, labels, buttons).
|
||||
- **NO BOLD FONTS**: Use `font-normal` throughout. Hierarchy via size and color only.
|
||||
- **NO `tracking-widest`**.
|
||||
- **StatCard Typography**: Numeric values in StatCards MUST match the exact text size of their corresponding labels (e.g., `text-base md:text-lg`) to avoid overwhelming the density of the component.
|
||||
- **Layout**: Main pages MUST use `max-w-7xl`.
|
||||
- **Unified Headers**: Icon box (`p-4 bg-primary/10 border-primary/20`) + Title (`text-3xl font-normal`).
|
||||
- **Iconography**: Use **Lucide Icons** exclusively.
|
||||
|
||||
@@ -100,6 +100,7 @@ def extract_label_info(image_bytes: bytes, mode: str = "item"):
|
||||
"Size": "size",
|
||||
"Color": "color",
|
||||
"PartNr": "part_number",
|
||||
"Specs": "specs",
|
||||
"OCR": "ocr_text"
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
- **Multi-item labels**: Treat each SKU/variant as a separate item (e.g., "5m cable" and "7m cable" = 2 items)
|
||||
|
||||
## Item Field Format (CRITICAL)
|
||||
[]
|
||||
Format: `<size_or_length> <type> <vendor> <connector> <part_number>`
|
||||
|
||||
**Component Rules:**
|
||||
- `<size_or_length>`:
|
||||
@@ -17,8 +17,16 @@
|
||||
- Rule: If ≥1000GB, use TB. If ≥1000MB, use GB. Otherwise use MB.
|
||||
- **CABLE/WIRE LENGTH**: Meters only. Examples: "5m", "10m", "50m"
|
||||
- **RAM DIMM**: Capacity in GB. Examples: "128GB", "32GB", "8GB"
|
||||
- **SFP/TRANSCEIVER SPEED**: Speed in G/Mbps. Examples: "10G", "1G", "40G", "100G"
|
||||
|
||||
- `<type>`: Asset class.
|
||||
- **CABLES**:
|
||||
- Use "Fiber" for all optical fiber cables.
|
||||
- Use "Patchcord" for all copper UTP/RJ45 cables.
|
||||
- Others: SATA, SAS, Power, USB, etc.
|
||||
- **COMPONENTS**: DDR3/DDR4/DDR5, NVMe, SSD, HDD, SFP/Transceiver, DIMM, etc.
|
||||
- **PRECEDENCE**: If an item is both "SSD" and "NVMe", use **NVMe** as the type and category.
|
||||
|
||||
- `<type>`: Asset class. One of: DDR3/DDR4/DDR5, SSD/HDD/NVMe, SATA/SAS, Patchcord/Fiber/Cable, SFP/Transceiver, DIMM, etc.
|
||||
- `<vendor>`: Manufacturer (HP, HPE, Dell, Samsung, Cisco, Hynix, Intel, Broadcom)
|
||||
- `<connector>`: Physical interface (RJ45, LC-LC, MPO, U.3, SATA, SAS, ST, SC). Omit if N/A.
|
||||
- `<part_number>`: Part number ONLY if visible. **Omit serial numbers.**
|
||||
@@ -26,9 +34,10 @@
|
||||
**Item Examples (WITH HUMAN-READABLE SIZES):**
|
||||
- `1.6TB NVMe HPE U.3 P66093-002` (not 1600GB)
|
||||
- `256GB SSD Dell SATA SK-8765` (already human-readable)
|
||||
- `5m Patchcord LC-LC`
|
||||
- `5m Fiber LC-LC` (optical cable)
|
||||
- `2m Patchcord RJ45` (copper cable)
|
||||
- `128GB DDR4 Hynix`
|
||||
- `512MB Cache Samsung SATA` (stays MB if under 1GB)
|
||||
- `10G SFP+ Cisco LC 10-2415-03`
|
||||
|
||||
**Size Conversion Examples:**
|
||||
- 1600GB → 1.6TB
|
||||
@@ -47,72 +56,74 @@
|
||||
## Other Fields
|
||||
- **Type**: Repeat the asset class (DDR4, SSD, NVMe, Patchcord, etc.)
|
||||
- **Description**: Technical summary, max 5 words. Examples: "High-speed fiber optic", "Enterprise Gen4 storage"
|
||||
- **Category**: Memory, Storage, Network, Cabling, Compute, Optical, Transceiver
|
||||
- **Category**:
|
||||
- For Spare Parts (see below): Use `spare parts - <type>` where `<type>` is the lowercase component name (e.g., `spare parts - ram`, `spare parts - ssd`, `spare parts - nvme`, `spare parts - raid card`, `spare parts - cpu`, `spare parts - psu`, `spare parts - hba`, `spare parts - nic`, `spare parts - sfp`).
|
||||
- For Others: Use `Network`, `Cabling`, `Compute`, `Optical`, `Consumable`.
|
||||
- **Connector**: Interface type from Item field. Examples: "LC-LC", "RJ45", "U.3"
|
||||
- **Size**: **HUMAN-READABLE capacity or length.** Examples: "1.6TB", "256GB", "5m" (NOT "1600GB")
|
||||
- **Size**: **HUMAN-READABLE capacity, length, or speed.** Examples: "1.6TB", "256GB", "5m", "10G" (NOT "1600GB")
|
||||
- **Color**: Physical color if distinguishing
|
||||
- **PartNr**: Part number only (no serial numbers)
|
||||
- **OCR**: Robust matching key for OCR tolerance
|
||||
- **PartNr**: Part number only. **CRITICAL: NEVER include Serial Numbers (S/N, SN, Serial).**
|
||||
- **Specs**: Detailed technical specifications (e.g., "1.2V, CL22", "850W 80+ Gold", "Gen4 x4", "Single-mode").
|
||||
- **OCR**: Robust matching key for OCR tolerance. Format: `TYPE SIZE VENDOR CONNECTOR PARTNUMBER` (UPPERCASE, no special chars).
|
||||
|
||||
## OCR Field Rules (CRITICAL)
|
||||
Generate a SHORT, clean matching key:
|
||||
Generate a SHORT, clean matching key for database lookup:
|
||||
- Format: **UPPERCASE space-separated, NO special chars, NO duplicates**
|
||||
- Include ONLY: Type + Size + Primary Vendor + Connector + Part Number
|
||||
- **EXCLUDE**: Serial numbers, secondary vendors, duplicate tokens, EMC/SK labels
|
||||
- **USE HUMAN-READABLE SIZE**: Use TB/GB from Item field, not original notation
|
||||
|
||||
**OCR Format:** `TYPE SIZE VENDOR CONNECTOR PARTNUMBER`
|
||||
|
||||
**OCR Examples (WITH HUMAN-READABLE SIZES):**
|
||||
- Item: `1.6TB NVMe HPE U.3 P66093-002` → OCR: `NVME 1.6TB HPE U3 P66093002`
|
||||
- Item: `5m Patchcord LC-LC` → OCR: `PATCHCORD 5M LC LC`
|
||||
- Item: `256GB SSD Samsung SAS SK-8765` → OCR: `SSD 256GB SAMSUNG SAS SK8765`
|
||||
- Item: `128GB DDR4 Hynix` → OCR: `DDR4 128GB HYNIX`
|
||||
|
||||
**OCR Constraints:**
|
||||
- NO duplicate part numbers
|
||||
- **STRICT EXCLUSIONS**:
|
||||
- NO serial numbers (S/N, SN, Serial)
|
||||
- NO secondary vendor names
|
||||
- NO extraneous labels
|
||||
- Each token appears ONE time only
|
||||
- Remove hyphens/special chars for fuzzy matching
|
||||
- Use HUMAN-READABLE sizes (1.6TB not 1600GB)
|
||||
- **CONSTRAINTS**:
|
||||
- Each token appears ONE time only (no duplicates)
|
||||
- Remove hyphens/special chars for fuzzy matching (e.g., `SK-8765` -> `SK8765`)
|
||||
- **USE HUMAN-READABLE SIZE**: Use TB/GB/M/G from Item field.
|
||||
|
||||
**OCR Examples:**
|
||||
- Item: `1.6TB NVMe HPE U.3 P66093-002` → OCR: `NVME 1.6TB HPE U3 P66093002`
|
||||
- Item: `5m Fiber LC-LC` → OCR: `FIBER 5M LC LC`
|
||||
- Item: `2m Patchcord RJ45` → OCR: `PATCHCORD 2M RJ45`
|
||||
- Item: `256GB SSD Samsung SAS SK-8765` → OCR: `SSD 256GB SAMSUNG SAS SK8765`
|
||||
- Item: `128GB DDR4 Hynix` → OCR: `DDR4 128GB HYNIX`
|
||||
- Item: `10G SFP+ Cisco LC 10-2415-03` → OCR: `SFP+ 10G CISCO LC 10241503`
|
||||
|
||||
## Spare-Parts vs Consumables Classification
|
||||
|
||||
CLASSIFICATION GUIDE - SPARE PARTS vs CONSUMABLES:
|
||||
|
||||
Spare Parts (replaceable components that plug into or interface with devices):
|
||||
- RAM, DDR memory modules (DDR3, DDR4, DDR5, SODIMM, DIMM)
|
||||
- SSDs, NVMe drives, M.2 modules, SATA drives, hard drives
|
||||
- CPUs, GPUs, processors, discrete graphics cards
|
||||
- Power supply units (PSU), power modules (NOT generic power cords)
|
||||
- Expansion cards (PCIe, PCI, RAID controllers, network cards/NIC)
|
||||
- Cooling solutions (heatsinks, CPU coolers, thermal solutions)
|
||||
- Motherboards, chipsets, BIOS modules
|
||||
- **RAM**: DDR3, DDR4, DDR5, SODIMM, DIMM → Category: `spare parts - ram`
|
||||
- **Storage**: NVMe, SSD, M.2, SATA HDD, SAS HDD → Category: `spare parts - nvme`, `spare parts - ssd`, or `spare parts - hdd`.
|
||||
- *Rule: Use `nvme` if the item is an NVMe SSD.*
|
||||
- **CPU**: Processors, Intel Xeon, AMD EPYC → Category: `spare parts - cpu`
|
||||
- **Power**: PSU, Power Supply Modules → Category: `spare parts - psu`
|
||||
- **Controllers**: RAID Controllers, HBA, NIC, Network Cards → Category: `spare parts - raid card` or `spare parts - hba` or `spare parts - nic`
|
||||
- **Cooling**: Heatsinks, Fans (specific to models) → Category: `spare parts - cooling`
|
||||
- **Mainboard**: Motherboards, Riser Cards → Category: `spare parts - motherboard` or `spare parts - riser`
|
||||
- **Optical**: SFPs, Transceivers → Category: `spare parts - sfp`
|
||||
|
||||
NOT Spare Parts (consumables, generic items):
|
||||
- Cables (power, SATA, USB, Ethernet, proprietary cords)
|
||||
- Fasteners (screws, washers, bolts, standoffs)
|
||||
- Thermal paste, thermal pads, adhesive tapes
|
||||
- Connectors, plugs, sockets, generic adapters
|
||||
- Generic cords and utility items
|
||||
- Cables: Power cables, SATA cables, USB, Ethernet, Fiber Patchcords → Category: `Cabling` or `Consumable`
|
||||
- Fasteners: Screws, brackets, rails → Category: `Consumable`
|
||||
- Materials: Thermal paste, pads, tapes → Category: `Consumable`
|
||||
|
||||
Decision Tree:
|
||||
1. Does the item have a replaceable function in a larger system?
|
||||
2. Does it have a manufacturer part number and technical specifications?
|
||||
3. Is it described with model/revision information?
|
||||
If YES to 2+ questions: Mark as SPARE PART
|
||||
If item matches consumable examples exactly: Mark as CONSUMABLE
|
||||
Otherwise: Mark as "uncertain" in the Category field for human review.
|
||||
1. Does the item have a manufacturer part number (P/N)?
|
||||
2. Is it a modular component of a larger system (Server, PC, Switch)?
|
||||
3. Does it have technical specs (Speed, Capacity, Voltage)?
|
||||
If YES to 2+ questions: Mark as `spare parts - <type>`
|
||||
If item is a cable: Mark as `Cabling`
|
||||
If item is a generic hardware: Mark as `Consumable`
|
||||
Otherwise: Mark as `uncertain` for review.
|
||||
|
||||
Examples:
|
||||
✓ "Kingston Fury 16GB DDR4-3200" → Spare Part (RAM module)
|
||||
✓ "Samsung 970 EVO 1TB NVMe" → Spare Part (SSD)
|
||||
✓ "Intel Core i7-12700K" → Spare Part (CPU)
|
||||
✓ "Corsair RM850x 850W Power Supply" → Spare Part (PSU)
|
||||
✗ "6ft SATA Cable" → Consumable (cable)
|
||||
✗ "CPU Mounting Hardware Kit" → Consumable (fasteners)
|
||||
✗ "Thermal Paste Tube" → Consumable (adhesive material)
|
||||
✓ "Kingston Fury 16GB DDR4-3200" → Category: `spare parts - ram`
|
||||
✓ "Samsung 970 EVO 1TB NVMe" → Category: `spare parts - nvme`
|
||||
✓ "Intel Core i7-12700K" → Category: `spare parts - cpu`
|
||||
✓ "LSI MegaRAID 9361-8i" → Category: `spare parts - raid card`
|
||||
✗ "6ft SATA Cable" → Category: `Cabling`
|
||||
✗ "M3 Mounting Screws" → Category: `Consumable`
|
||||
|
||||
|
||||
## Output Format
|
||||
```json
|
||||
@@ -127,7 +138,8 @@
|
||||
"Size": "human_readable_size",
|
||||
"Color": "color",
|
||||
"PartNr": "part_number",
|
||||
"OCR": "TYPE SIZE VENDOR CONNECTOR PARTNUMBER"
|
||||
"Specs": "detailed technical specifications",
|
||||
"OCR": "SIZE TYPE VENDOR CONNECTOR PARTNUMBER"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ A unified inventory management system that eliminates manual data entry through
|
||||
## 4. Design & Operational Constraints
|
||||
- **Tech Stack**: FastAPI (Python), SQLite, Next.js (TypeScript), Tailwind CSS.
|
||||
- **UI Fidelity**: Premium density, Lucide icons, **NO UPPERCASE**, **NO BOLD FONTS** (normal weight only).
|
||||
- **StatCard Rule**: Numeric values MUST match label text size for balanced density.
|
||||
- **Database**: Single-instance SQLite (WAL mode). Multi-instance is v3+.
|
||||
- **Security**: Mandatory auth, no bypasses, immutable audit logs.
|
||||
- **AI**: Multi-provider resilience (Gemini primary, Claude fallback).
|
||||
|
||||
@@ -2,38 +2,30 @@
|
||||
|
||||
**Active AI:** Gemini CLI
|
||||
**Last Updated:** 2026-04-23
|
||||
**Current Version:** v1.14.19
|
||||
**Status**: ✅ SSL PROXY FIXED | 🟢 READY FOR PHASE 8
|
||||
**Current Version:** v1.14.20
|
||||
**Status**: ✅ STATCARD TYPOGRAPHY REFINED | 🟢 READY FOR PHASE 8
|
||||
|
||||
---
|
||||
|
||||
## SESSION 42 EXECUTION SUMMARY — SSL Infrastructure Fix
|
||||
## SESSION 44 EXECUTION SUMMARY — StatCard UI Tweak
|
||||
|
||||
### 1. SSL Proxy Fix (COMPLETE)
|
||||
- **Port 80 Conflict**: Identified that Caddy was failing to start because it tried to bind to port 80 for HTTP->HTTPS redirects, while port 80 was already in use by a system-wide Caddy.
|
||||
- **Caddy Configuration**: Modified `Caddyfile.standalone` (root and `config/`) to include `auto_https disable_redirects` in the global options. This allows Caddy to run on custom ports (8918/8919) without interfering with port 80.
|
||||
- **Service Restart**: Successfully restarted backend, frontend, and proxy using `scripts/run_standalone.py restart`.
|
||||
### 1. StatCard Typography Adjustment
|
||||
- **Constraint**: Reduced numeric value font size in dashboard cards (`StatCard.tsx`) to match their label text size (`text-base md:text-lg`).
|
||||
- **Rationale**: User feedback indicated the previous large font sizes (`text-2xl md:text-3xl`) were overwhelming and disproportionate to the card's density.
|
||||
|
||||
### 2. Verification
|
||||
- **Backend SSL**: Verified reachable at `https://localhost:8918/` (Port 8916 upstream).
|
||||
- **Frontend SSL**: Verified reachable at `https://localhost:8919/` (Port 8917 upstream).
|
||||
- **Service Status**: `run_standalone.py status` confirms all components are UP.
|
||||
### 2. Rule Standardization
|
||||
- **AI_RULES.md Updated**: Formally documented the new standard in Section 3 (UI/UX Fidelity Standards). Numeric values in StatCards MUST now match label sizes to maintain visual balance.
|
||||
|
||||
---
|
||||
|
||||
## NEXT STEPS (Phase 8: Hardening & Release)
|
||||
|
||||
1. **End-to-End Testing**:
|
||||
- Verify data consistency in multi-page Excel exports.
|
||||
- Stress test the new Python-based deployment scripts.
|
||||
|
||||
1. **Extraction Validation**:
|
||||
- Run sample images of RAID cards and NVMe drives to confirm `spare parts - <type>` categorization.
|
||||
2. **UX Refinement**:
|
||||
- Perform a final accessibility audit on the new Admin UI components.
|
||||
- Ensure consistent loading states across all Admin panels.
|
||||
|
||||
3. **Production Preparation**:
|
||||
- Finalize the production runbook.
|
||||
- Prepare for the v1.15.0 "Stable" release milestone.
|
||||
- Ensure the Admin UI displays these new categories correctly.
|
||||
3. **v1.15.0 Milestone**:
|
||||
- Finalize the release candidate.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"version": "1.14.22",
|
||||
"last_build": "2026-04-23-1616",
|
||||
"version": "1.14.23",
|
||||
"last_build": "2026-04-23-1823",
|
||||
"codename": "ConfigCore",
|
||||
"commit": "e5bb14d9"
|
||||
"commit": "7c4441a9"
|
||||
}
|
||||
@@ -448,7 +448,7 @@ export default function InventoryPage() {
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="text-sm font-normal text-secondary ml-1 tracking-tight">Size / Length</label>
|
||||
<label className="text-sm font-normal text-secondary ml-1 tracking-tight">Size / Length / Speed</label>
|
||||
<input
|
||||
type="text"
|
||||
value={editedItem.size || ''}
|
||||
|
||||
@@ -17,7 +17,7 @@ export default function StatCard({ label, value, icon: Icon }: StatCardProps) {
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<span className="text-2xl md:text-3xl font-normal text-white whitespace-nowrap tabular-nums">
|
||||
<span className="text-base md:text-lg font-normal text-white whitespace-nowrap tabular-nums">
|
||||
{value}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user