# 04 — Data Models

## Core contract: `AnalysisResult`

`internal/models/models.go` defines the shared result passed between parsers, collectors, server handlers, and exporters.

Stability rule:
- do not rename or remove JSON fields from `AnalysisResult`
- additive fields are allowed
- UI and exporter compatibility depends on this shape remaining stable

Key fields:

| Field | Meaning |
|------|---------|
| `filename` | Original upload name or synthesized live source name |
| `source_type` | `archive` or `api` |
| `protocol` | `redfish`, `ipmi`, or empty for archive uploads |
| `target_host` | Hostname or IP for live collection |
| `source_timezone` | Source timezone/offset if known |
| `collected_at` | Canonical collection/upload time |
| `raw_payloads` | Raw source data used for replay or diagnostics |
| `events` | Parsed event timeline |
| `fru` | FRU-derived inventory details |
| `sensors` | Sensor readings |
| `hardware` | Normalized hardware inventory |

## `HardwareConfig`

Main sections:

```text
hardware.board
hardware.devices
hardware.cpus
hardware.memory
hardware.storage
hardware.volumes
hardware.pcie_devices
hardware.gpus
hardware.network_adapters
hardware.network_cards
hardware.power_supplies
hardware.firmware
```

`network_cards` is legacy/alternate source data.
`hardware.devices` is the canonical cross-section inventory.

## Canonical inventory: `hardware.devices`

`hardware.devices` is the single source of truth for device-oriented UI and Reanimator export.

Required rules:

1. UI hardware views must read from `hardware.devices`
2. Reanimator conversion must derive device sections from `hardware.devices`
3. UI/export mismatches are bugs, not accepted divergence
4. New shared device fields belong in `HardwareDevice` first

Deduplication priority:

| Priority | Key |
|----------|-----|
| 1 | usable `serial_number` |
| 2 | `bdf` |
| 3 | keep records separate |

## Raw payloads

`raw_payloads` is authoritative for replayable sources.

Current important payloads:
- `redfish_tree`
- `redfish_fetch_errors`
- `source_timezone`

Normalized hardware fields are derived output, not the long-term source of truth.

## Raw export package

`/api/export/json` produces a reopenable raw-export artifact.

Design rules:
- raw source stays authoritative
- uploads of raw-export artifacts must re-analyze from raw source
- parsed snapshots inside the bundle are diagnostic only
