Customize station appearance, logging, and report output.

Configure fixture labels and colors, log retention and debug bundle export, and post-run report conversion scripts.

Fixture appearance

Corvus displays up to 8 fixture slots in the Runner screen. By default each slot is labelled F1 through F8 with a shared accent color. The Fixture Appearance panel lets you change both the label prefix and the accent color of each slot independently.

Open Configuration from the navigation bar. The Fixture Appearance section is visible to all roles.

Label prefix

The prefix is the text that appears before the fixture number.

PrefixDisplayed labels
F (default)F1 · F2 · F3 … F8
JJ1 · J2 · J3 … J8
JIGJIG1 · JIG2 · JIG3 … JIG8
FXTFXT1 · FXT2 · FXT3 … FXT8

Type the new prefix (maximum 6 characters) and click or tab away — the change saves automatically and the live preview updates immediately. The numeric part is always appended automatically.

Per-fixture colors

Each slot has its own accent color, applied to the permanent left border stripe, focus ring, running state badge, timer, and progress bar. Pass/Fail/Abort colors are unaffected — those remain green, red, and orange regardless of this setting.

To change a color:

  • Color picker — click the color swatch to open the OS color picker. The card updates as soon as you confirm.
  • Hex input — type a hex value (#rrggbb) and press Tab. Invalid values are ignored and the field reverts.

Default palette

SlotDefault color
1#3525cd Indigo
2#09825d Green
3#c44c00 Orange
4#ba1a1a Red
5#7c3aed Purple
6#0284c7 Sky blue
7#b45309 Amber
8#be185d Pink

Click Reset to defaults to restore all 8 colors and the F prefix at once.

Persistence

Fixture appearance settings are saved in config/gui_settings.json on the local machine. They are restored on next startup and are independent of the station config and sequence — changing them does not affect test results or reports.

Logging and debug bundles

Corvus writes structured logs for every test run and session event. Logs stay on the local machine — they are never sent automatically.

Log retention

Configure retention in config/system_config.json:

"logging": {
  "level": "info",
  "path": "data/logs",
  "retain_success_days": 14,
  "retain_fail_days": 90,
  "run_log_max_mb": 10,
  "max_storage_mb": 2048
}
FieldDefaultDescription
level"info"Minimum log level: "debug", "info", "warn", "error"
retain_success_days14Days to keep logs for PASS runs
retain_fail_days90Days to keep logs for FAIL and ABORTED runs
run_log_max_mb10Hard cap per individual run log file
max_storage_mb2048Total storage ceiling — oldest PASS logs deleted first when exceeded

Retention runs automatically in the background a few seconds after engine startup. App logs rotate daily and are kept for 7 days.

Log file layout

data/
  logs/
    index/
      runs_2026-04.ndjson     ← append-only run index
    runs/
      2026/04/08/
        run_20260408143200-job0.log.gz
    app/
      app_2026-04-08.log      ← daily session log

Debug bundle export

Click Debug Bundle on a failed run card in the Runner screen to export a zip file for sharing with support. The bundle includes:

  • The specific run log (or last 5 failed run logs)
  • The last 24 h of the app log
  • system_config.json with credentials redacted
  • station_config.json
  • A metadata file with engine version, OS, and export timestamp

Telemetry opt-out

On first launch, Corvus shows a consent dialog for anonymous crash and performance data. Only non-identifiable data is collected — serial numbers, test results, sequence names, and station GUIDs are never sent.

IT administrators can disable telemetry entirely before deployment by creating this file:

data/telemetry/opt_out.flag

If this file exists, the consent dialog is never shown and no telemetry is sent. The flag takes effect immediately without a restart.

Telemetry can also be disabled in config/system_config.json:

"telemetry": {
  "enabled": false
}

Report conversion

Corvus can run a user-supplied Python script at the end of every test, immediately after the JSON report is written. Use this to convert reports into any format your workflow requires — CSV, XML, MES upload, database insert, or anything else.

How it works

  1. Corvus writes data/reports/<report_id>.json (source of truth) and the HTML view.
  2. If conversion is enabled, Corvus runs:
    python3 <script_path> <absolute_json_path> [output_dir]
    
    using the same Python interpreter that drives the test workers.
  3. This runs as a fire-and-forget background task — it never blocks the job from resetting for the next cycle.
  4. Exit 0 is logged as success. Non-zero exit is logged as a warning. Converter failures never affect the test result.

Configuration

"report_conversion": {
  "enabled": true,
  "script_path": "scripts/convert_report.py",
  "output_path": ""
}
FieldDefaultDescription
enabledfalseMaster on/off switch
script_path"scripts/convert_report.py"Path to the script, relative to the app directory or absolute
output_path""Output directory passed as argv[2]. Leave empty to let the script decide.

In the GUI: Config → Report Conversion → toggle on → set script path → Save. Takes effect after the next engine start.

Script contract

Your script receives:

  • sys.argv[1] — absolute path to the JSON report file
  • sys.argv[2] — output directory (only when output_path is configured)
  • No timeout is enforced — the script runs until it exits.

Minimal implementation:

import json, sys
from pathlib import Path

report = json.load(open(sys.argv[1]))
body   = report["report"]

# do whatever you need with body …

Report JSON structure

The converter receives a RunReport object. Key fields:

{
  "report": {
    "meta":     { "report_id": "...", "started_at": "...", "duration_ms": 17000 },
    "station":  { "station_id": "STATION_001", "location": "Lab A" },
    "routing":  { "part_number": "AMP-100", "revision": "B" },
    "trigger":  { "trigger_type": "manual_enter", "data": { "serial": "SN-001" } },
    "result":   "PASS",
    "summary":  { "total_steps": 10, "passed_steps": 10, "failed_steps": 0 },
    "steps": [
      {
        "step_id":    "step_01",
        "step_name":  "Voltage Check",
        "result":     "PASS",
        "duration_ms": 123,
        "raw_data":   { "voltage": 3.32 },
        "validation": { "passed": true, "detail": { "type": "numeric", "actual": 3.32 } }
      }
    ]
  }
}

Possible result values per step: PASS, FAIL, ERROR, TIMEOUT, CRASH. Possible result values for the run: PASS, FAIL, ERROR, ABORTED.

The conversion task starts after the HTML is written, before the job auto-resets. For high-throughput stations with short auto-reset delays, keep your script fast to avoid accumulating a backlog of background tasks.