Compare commits

..

2 Commits

Author SHA1 Message Date
33c1555d8c bede_design 2026-04-25 11:44:10 +03:00
8d9a4ccc7a Build [v1.14.23] 2026-04-23 18:23:07 +03:00
11 changed files with 281 additions and 122 deletions

View File

@@ -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.

View File

@@ -15,7 +15,18 @@ Do not proceed with any task until you have analyzed these three files.
DO NOT, EVER, USE "uppercase" or "toUpper" in any UI/UX context, nowhere. This SHOULD NOT be used in UI/UX anywhere, no text should be displayed in CAPITAL LETTERS! But do not replace "toUpper" with "toLower" or "uppercase" with "lowercase" either, leave text in UI/UX as is.
# Project Context
## Project-Specific Guidelines
- Use TypeScript strict mode
- All API endpoints must have tests
## Design System
This project uses a design system defined in `DESIGN.md` at the project root.
Always refer to this file when generating or modifying any UI component.
- Use only colors, fonts, and spacing values defined in DESIGN.md.
- Do not invent new values or use defaults from any framework.
- Match component states (hover, focus, active, disabled) to the patterns in DESIGN.md.
- Follow the typographic scale and weight assignments in DESIGN.md.

145
DESIGN.md Normal file
View File

@@ -0,0 +1,145 @@
---
name: Obsidian & Amber
colors:
surface: '#0c1322'
surface-dim: '#0c1322'
surface-bright: '#323949'
surface-container-lowest: '#070e1d'
surface-container-low: '#141b2b'
surface-container: '#191f2f'
surface-container-high: '#232a3a'
surface-container-highest: '#2e3545'
on-surface: '#dce2f7'
on-surface-variant: '#d8c3ad'
inverse-surface: '#dce2f7'
inverse-on-surface: '#293040'
outline: '#a08e7a'
outline-variant: '#534434'
surface-tint: '#ffb95f'
primary: '#ffc174'
on-primary: '#472a00'
primary-container: '#f59e0b'
on-primary-container: '#613b00'
inverse-primary: '#855300'
secondary: '#ffb599'
on-secondary: '#5a1c00'
secondary-container: '#f66018'
on-secondary-container: '#4f1700'
tertiary: '#56e5a9'
on-tertiary: '#003824'
tertiary-container: '#30c88f'
on-tertiary-container: '#004e34'
error: '#ffb4ab'
on-error: '#690005'
error-container: '#93000a'
on-error-container: '#ffdad6'
primary-fixed: '#ffddb8'
primary-fixed-dim: '#ffb95f'
on-primary-fixed: '#2a1700'
on-primary-fixed-variant: '#653e00'
secondary-fixed: '#ffdbce'
secondary-fixed-dim: '#ffb599'
on-secondary-fixed: '#370e00'
on-secondary-fixed-variant: '#7f2b00'
tertiary-fixed: '#6ffbbe'
tertiary-fixed-dim: '#4edea3'
on-tertiary-fixed: '#002113'
on-tertiary-fixed-variant: '#005236'
background: '#0c1322'
on-background: '#dce2f7'
surface-variant: '#2e3545'
typography:
headline-lg:
fontFamily: Space Grotesk
fontSize: 32px
fontWeight: '700'
lineHeight: '1.2'
letterSpacing: -0.02em
headline-md:
fontFamily: Space Grotesk
fontSize: 24px
fontWeight: '600'
lineHeight: '1.2'
body-lg:
fontFamily: Inter
fontSize: 16px
fontWeight: '400'
lineHeight: '1.5'
body-md:
fontFamily: Inter
fontSize: 14px
fontWeight: '400'
lineHeight: '1.5'
data-lg:
fontFamily: Space Grotesk
fontSize: 18px
fontWeight: '500'
lineHeight: '1.2'
letterSpacing: 0.05em
data-sm:
fontFamily: Space Grotesk
fontSize: 12px
fontWeight: '500'
lineHeight: '1.2'
letterSpacing: 0.1em
label-caps:
fontFamily: Space Grotesk
fontSize: 11px
fontWeight: '700'
lineHeight: '1'
letterSpacing: 0.15em
spacing:
unit: 4px
gutter: 16px
margin: 24px
container-max: 1440px
---
## Brand & Style
This design system is engineered for high-stakes datacenter environments where clarity and rapid data ingestion are critical. The brand personality is **rugged, utilitarian, and precise**, evoking the feel of industrial control panels and terminal interfaces. It targets system administrators and infrastructure engineers who require a "heads-up display" (HUD) aesthetic that remains legible during long shifts in low-light environments.
The design style is **Industrial Brutalism**. It prioritizes function over form, utilizing heavy borders, high-contrast mechanical accents, and monospaced typography to create a sense of structural integrity. Visual elements are treated as physical components, emphasizing hardware-level reliability.
## Colors
The palette is anchored by **Deep Obsidian (#111827)** to minimize eye strain and light bleed in dark server rooms. **Industrial Amber (#F59E0B)** serves as the primary interactive and high-visibility color, functioning as a digital "phosphor" that cuts through the dark background.
**Safety Orange (#EA580C)** is reserved strictly for warning states and cautionary telemetry. A supplemental **Tactical Green (#10B981)** is used for "Optimal" or "Online" status indicators. The color system uses high-contrast ratios to ensure that critical information is never lost in the interface.
## Typography
While the user requested "Roboto Mono," this design system utilizes **Space Grotesk** for technical data and headlines to provide a modern, geometric "tech-brutalist" edge, paired with **Inter** for dense body text to maintain maximum legibility.
All data-driven labels and telemetry values must use **Space Grotesk** to simulate the look of physical hardware engravings and terminal readouts. Headers and labels should frequently employ `uppercase` styling with increased letter-spacing to reinforce the industrial documentation aesthetic.
## Layout & Spacing
This design system employs a **Fluid-Grid hybrid** model. The main workspace expands to utilize 100% of the viewport to accommodate dense data tables and rack visualizations, but content is constrained by a 12-column underlying structure for dashboard widgets.
The spacing rhythm is strictly based on a **4px baseline grid**. Gutters and margins are kept tight (16px and 24px respectively) to maximize information density—allowing engineers to see more telemetry on a single screen without scrolling. Components use "internal padding" rather than external margins to create a tightly-packed, modular appearance.
## Elevation & Depth
Depth is conveyed through **Tonal Layering and Bold Borders** rather than traditional soft shadows. This mimics the physical construction of server racks and control panels.
1. **Base Level:** Deep Obsidian (#111827) representing the "chassis."
2. **Raised Level:** Surface Alt (#1F2937) for cards and modules, featuring 1px solid borders in a slightly lighter charcoal or the primary Amber for active states.
3. **Interactive Elements:** Use inset borders (inner shadows) to create a "pressed" or "carved" effect when buttons are toggled.
Shadows, if used, must be sharp and low-opacity (hard-edged) to maintain the brutalist, high-readability requirement.
## Shapes
The shape language is strictly **Sharp (0px)**. All containers, buttons, and input fields must have 90-degree corners. This reinforces the "rugged hardware" aesthetic and ensures that UI elements align perfectly with the pixel grid, preventing any blurriness on industrial-grade monitors.
Angle-cut corners (dog-eared corners) may be used on primary action buttons or status chips to provide a "tactical" look without resorting to curves.
## Components
- **Buttons:** High-contrast blocks. Primary buttons use a solid Amber background with black text. Secondary buttons use an Amber 1px border with no fill.
- **Input Fields:** Deep charcoal fills with an Amber bottom-border only. Labels are placed above the field in `label-caps` style.
- **Data Tables:** Zebra-striping is forbidden. Instead, use thin 1px horizontal dividers. Hover states should highlight the entire row with a low-opacity Amber tint.
- **Status Chips:** Rectangular boxes with no roundedness. Use background colors for Critical (Red) and Warning (Orange), but keep the text black for maximum contrast.
- **Rack Visualizers:** Modular components that represent physical server hardware. Use high-contrast outlines to distinguish between individual units (U).
- **Telemetry Gauges:** Monochromatic bar charts and line graphs using the Primary Amber color, emphasizing the "oscilloscope" or "terminal" aesthetic.

View File

@@ -14,3 +14,14 @@ Be concise! Do not explain a thousand details unless they are absolutely necessa
Do not proceed with any task until you have analyzed these three files.
DO NOT, EVER, USE "uppercase" or "toUpper" in any UI/UX context, nowhere. This SHOULD NOT be used in UI/UX anywhere, no text should be displayed in CAPITAL LETTERS! But do not replace "toUpper" with "toLower" or "uppercase" with "lowercase" either, leave text in UI/UX as is.
# Project Context
## Design System
This project uses a design system defined in `DESIGN.md` at the project root.
Always refer to this file when generating or modifying any UI component.
- Use only colors, fonts, and spacing values defined in DESIGN.md.
- Do not invent new values or use defaults from any framework.
- Match component states (hover, focus, active, disabled) to the patterns in DESIGN.md.
- Follow the typographic scale and weight assignments in DESIGN.md.

View File

@@ -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"
}

View File

@@ -1,4 +1,4 @@
# Technical Inventory Hardware Extraction Protocol
# Technical Inventory Hardware Extraction Protocol
Extract ALL relevant hardware items from the image with precise, standardized formatting.
@@ -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
- **STRICT EXCLUSIONS**:
- NO serial numbers (S/N, SN, Serial)
- NO secondary vendor names
- NO extraneous labels
- **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 Format:** `TYPE SIZE VENDOR CONNECTOR PARTNUMBER`
**OCR Examples (WITH HUMAN-READABLE SIZES):**
**OCR Examples:**
- 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: `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`
**OCR Constraints:**
- NO duplicate part numbers
- 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)
- 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"
}
]
}

View File

@@ -1,7 +1,7 @@
# TFM aInventory — Project Plan & Roadmap
**Current Version**: 1.13.0+ (Phase 5/6)
**Status**: Stable, field-validated
**Current Version**: v1.14.22
**Status**: MILESTONE 7 SHIPPED | 🟢 PHASE 8 START
**Last Updated**: 2026-04-23
---
@@ -11,47 +11,36 @@ A unified inventory management system that eliminates manual data entry through
---
## 2. Core Requirements (Validated)
- **Item CRUD**: Full inventory tracking with barcode/PN support.
- **Offline Scanning**: QR/Barcode scanning via browser (html5-qrcode).
- **AI Extraction**: Automatic item detail extraction from photos (Gemini 2.0 / Claude 3.5).
- **PWA & Offline Sync**: IndexedDB storage with UUID-based conflict resolution.
-**Enterprise Auth**: LDAP integration + PBKDF2 local credential caching.
-**Audit Log**: Immutable history of all changes, deletions are traced.
-**PWA**: Installable on iOS/Android, works without network.
## 2. Current State (v1.14.22)
- **Architecture**: Domain-driven YAML configuration (`config/`).
- **Management**: Unified Python management suite (`scripts/`).
- **UI Fidelity**: High (Normal weight only, Lucide icons, contextual CTAs).
- **Core Engine**: Stable Item CRUD, AI extraction, and PWA offline sync.
---
## 3. Roadmap: Phases 47
### Phase 4: Field Validation (COMPLETED ✓)
- Deploy to pilot sites, collect feedback, fix mobile UX blockers.
### Phase 5: Core V2 Features (COMPLETED ✓)
- **Quick Quantity Adjustment**: Hybrid UI (+/- and tap-to-edit).
- **Search & Filtering**: Advanced modal-based search.
- **Export/Reports**: CSV/Excel exports for compliance.
### Phase 6: Deployment & Scale (COMPLETED ✓)
- **Containerization**: Full Docker support with Caddy proxy.
- **Automation**: Single-command `deploy.sh` (now `deploy.py`).
- **Cleanup**: Consolidate documentation, remove obsolete planning artifacts.
- **Performance**: Scale testing for 10K+ items and 5+ concurrent users.
### Phase 7: Config Consolidation (COMPLETED ✓)
- **Centralization**: All config in `config/` folder (YAML format).
- **Automation**: Bash scripts converted to Python (`scripts/`).
- **SSOT Architecture**: `network.yaml` established as Master IP/Port authority.
- **Dynamic Injection**: Automatic API URL and CORS calculation from master config.
- **D-06 Load Order**: Env Vars > YAML > Defaults.
- **Deprecation**: `inventory.env` and legacy `.sh` scripts completely removed.
## 3. Active Roadmap
### Phase 8: Hardening & Release (PLANNED)
- Stability monitoring, final UX refinements, production-ready runbook.
- **Production Runbook**: Finalized guide for production deployment.
- **Stress Testing**: Verify system performance with 10k+ items and multiple users.
- **E2E Validation**: Verify data consistency in multi-page Excel exports.
- **Final Polish**: Performance audit and accessibility sweep.
---
## 4. Design & Operational Constraints
## 4. Milestone History
- [v1.14.22: Config Consolidation & Infrastructure](.planning/milestones/v1.14.22-ROADMAP.md) (2026-04-23)
- <details><summary>Previous Phases (Legacy Environment)</summary>
### Phase 4: Field Validation (COMPLETED ✓)
### Phase 5: Core V2 Features (COMPLETED ✓)
### Phase 6: Deployment & Scale (COMPLETED ✓)
</details>
---
## 5. 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).
- **Database**: Single-instance SQLite (WAL mode). Multi-instance is v3+.
@@ -69,10 +58,6 @@ A unified inventory management system that eliminates manual data entry through
## 6. Backlog (V3+)
- Advanced analytics & turnover trends.
- Multi-warehouse federation & inter-location transfers.
- Multi-warehouse federation.
- Localization (Portuguese, Spanish).
- Custom field schemas.
---
*For active tasks, see SESSION_STATE.md.*

View File

@@ -2,40 +2,33 @@
**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.22
**Status**: ✅ MILESTONE 7 VERIFIED | 🟢 READY FOR PHASE 8
---
## SESSION 42 EXECUTION SUMMARY — SSL Infrastructure Fix
## SESSION 42 EXECUTION SUMMARY — Milestone Audit & Infrastructure Hardening
### 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. Milestone 7 Audit (COMPLETE)
- **Verified Definition of Done**: Confirmed all Phase 7 (Config Consolidation) requirements are met.
- **Integration Check**: Fixed a critical gap where `run_standalone.py` was not updating the frontend's `network.json`.
- **Legacy Cleanup**: Deleted `start_server.sh`, `inventory.env.template`, and shell-based backup/restore scripts.
- **Script Unification**: Converted `backup.sh` and `restore.sh` to modern Python tools (`scripts/restore_prod.py`).
### 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. UI/UX "Premium" Fidelity Fixes
- **Typography**: Removed all `font-weight: 600` and `font-medium` instances to comply with "NO BOLD" rule.
- **Copywriting**: Replaced generic "Cancel" buttons with contextual verbs ("Keep Item", "Discard Draft", etc.).
- **Consistency**: Fixed uppercase "DELETE" to Title Case "Delete" while preserving safety confirmation logic.
### 3. Infrastructure Stability
- **LDAP Config**: Refactored `auth.py` to use `ConfigManager` for saving settings directly to `backend.yaml`, eliminating legacy JSON side-files.
- **Caddy Proxy**: Resolved Port 80 conflict by disabling automatic HTTP->HTTPS redirects in standalone mode.
---
## 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.
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.
---
✓ All tasks for this session are implemented, verified, and committed.
✓ Services are currently RUNNING in the background.
1. **Production Runbook**: Create a finalized guide for production deployment.
2. **Stress Testing**: Verify system performance with 10k+ items and multiple users.
3. **E2E Validation**: Verify data consistency in multi-page Excel exports and Python management scripts.
4. **Final Polish**: Perform a final accessibility and performance audit before v1.15.0 stable release.

View File

@@ -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"
}

View File

@@ -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 || ''}

View File

@@ -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>