# 07 — Exporters ## Export surfaces | Endpoint | Output | Purpose | |----------|--------|---------| | `GET /api/export/csv` | CSV | Serial-number export | | `GET /api/export/json` | raw-export ZIP bundle | Reopen and re-analyze later | | `GET /api/export/reanimator` | JSON | Reanimator hardware payload | | `POST /api/convert` | async ZIP artifact | Batch archive-to-Reanimator conversion | ## Raw export Raw export is not a final report dump. It is a replayable artifact that preserves enough source data for future parser improvements. Current bundle contents: - `raw_export.json` - `collect.log` - `parser_fields.json` Design rules: - raw source is authoritative - uploads of raw export must replay from raw source - parsed snapshots inside the bundle are diagnostic only ## Reanimator export Implementation files: - `internal/exporter/reanimator_models.go` - `internal/exporter/reanimator_converter.go` - `internal/server/handlers.go` - `bible-local/docs/hardware-ingest-contract.md` Conversion rules: - canonical source is merged canonical inventory derived from `hardware.devices` plus legacy hardware slices - output must conform to the strict Reanimator ingest contract in `docs/hardware-ingest-contract.md` - local mirror currently tracks upstream contract `v2.7` - timestamps are RFC3339 - status is normalized to Reanimator-friendly values - missing component serial numbers must stay absent; LOGPile must not synthesize fake serials for Reanimator export - CPU `firmware` field means CPU microcode, not generic processor firmware inventory - `NULL`-style board manufacturer/product values are treated as absent - optional component telemetry/health fields are exported when LOGPile already has the data - partial `hardware.devices` must not suppress components still present only in legacy parser/collector fields - `present` is not serialized for exported components; presence is expressed by the existence of the component record itself - Reanimator ingest may apply its own server-side fallback serial rules for CPU and PCIe when LOGPile leaves serials absent ## Inclusion rules Included: - PCIe-class devices when the component itself is present, even if serial number is missing - contract `v2.7` component telemetry and health fields when source data exists - hardware sensors grouped into `fans`, `power`, `temperatures`, `other` only when the sensor has a real numeric reading - sensor `location` is not exported; LOGPile keeps only sensor `name` plus measured values and status - Redfish linked metric docs that carry component telemetry: `ProcessorMetrics`, `MemoryMetrics`, `DriveMetrics`, `EnvironmentMetrics`, `Metrics` - `pcie_devices.slot` is treated as the canonical PCIe address; `bdf` is used only as an internal fallback/dedupe key and is not serialized in the payload - `event_logs` are exported only from normalized parser/collector events that can be mapped to contract sources `host` / `bmc` / `redfish` without synthesizing content - `manufactured_year_week` is exported only as a reliable passthrough when the parser/collector already extracted a valid `YYYY-Www` value Excluded: - storage endpoints from `pcie_devices`; disks and NVMe drives export only through `hardware.storage` - fake serial numbers for PCIe-class devices; any fallback serial generation belongs to Reanimator ingest, not LOGPile - sensors without a real numeric reading - events with internal-only or unmappable sources such as LOGPile internal warnings - memory with missing serial number - memory with `present=false` or `status=Empty` - CPUs with `present=false` - storage without `serial_number` - storage with `present=false` - power supplies without `serial_number` - power supplies with `present=false` - non-present network adapters - non-present PCIe / GPU devices - device-bound firmware duplicated at top-level firmware list - any field not present in the strict ingest contract ## Batch convert `POST /api/convert` accepts multiple supported files and produces a ZIP with: - one `*.reanimator.json` file per successful input - `convert-summary.txt` Behavior: - unsupported filenames are skipped - each file is parsed independently - one bad file must not fail the whole batch if at least one conversion succeeds - result artifact is temporary and deleted after download ## CSV export `GET /api/export/csv` uses the same merged canonical inventory as Reanimator export, with legacy network-card fallback kept only for records that still have no canonical device match.