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.
| Prefix | Displayed labels |
|---|---|
F (default) | F1 · F2 · F3 … F8 |
J | J1 · J2 · J3 … J8 |
JIG | JIG1 · JIG2 · JIG3 … JIG8 |
FXT | FXT1 · 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
| Slot | Default 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
}
| Field | Default | Description |
|---|---|---|
level | "info" | Minimum log level: "debug", "info", "warn", "error" |
retain_success_days | 14 | Days to keep logs for PASS runs |
retain_fail_days | 90 | Days to keep logs for FAIL and ABORTED runs |
run_log_max_mb | 10 | Hard cap per individual run log file |
max_storage_mb | 2048 | Total 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.jsonwith credentials redactedstation_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
- Corvus writes
data/reports/<report_id>.json(source of truth) and the HTML view. - If conversion is enabled, Corvus runs:
using the same Python interpreter that drives the test workers.python3 <script_path> <absolute_json_path> [output_dir] - This runs as a fire-and-forget background task — it never blocks the job from resetting for the next cycle.
- 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": ""
}
| Field | Default | Description |
|---|---|---|
enabled | false | Master 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 filesys.argv[2]— output directory (only whenoutput_pathis 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.