Practical fault isolation for Pixop Prime operators. Each section follows symptom → evidence → common causes → safe immediate step → escalation. Perform steps in order; prefer observation before restart.
Version gate: CLI subcommands and relay helpers vary by AMI recipe—verify with pixop-version, tsduckctl --help, and command -v tsduck-transport-info before relay-specific steps.
Record UTC timestamps at symptom start, after each recovery, and when attaching logs.
0. Universal prep (non-disruptive)
pixop-version
date -u
pixop-preflight
pixop-stack status
tsduckctl check main
tsduckctl check egress-main
pixop-flow --secs 5
Note /var/lib/pixop-live/instance-init.complete — if missing, you may still be in AWS first-boot or a workbench image.
pixop-flow stage names (match printed output; ports from /etc/pixop-live/network.env defaults):
tsduckctl check may still pass (listener bound); pixop-flowSRT ingest = 0; peer logs show timeout or rejection
Common causes
Security group/NACL/firewall; wrong public IP; passphrase/PBKEYLEN mismatch; caller/listener mode mismatch; init not finished (no passphrase)
Safe step
Off-appliance: verify UDP path and credentials via your encoder sheet. On guest: tsduckctl check main / egress-main; `ss -ulnp | grep -E ':5000
Escalation
Bundle + pixop-version; describe peer product and whether port 5000/5001 probes succeed from outside
Passphrases: use tsduckctl credentials locally only — never paste into tickets.
2. SRT connected but no MPEG-TS (SRT ingest zero, Ingress -> Pixop zero)
Symptom
SRT session up; no throughput at ingest
Evidence
pixop-flow shows 0 on SRT ingest and Ingress -> Pixop; ingest log quiet or “waiting”
Common causes
Encoder not pushing TS; wrong SRT streamid/socket; bonded/multipath misconfiguration; relay backend not merging
Safe step
Confirm encoder actually transmits MPEG-TS (not raw ES). If supported: tsduckctl transport main; else review /etc/pixop-live/tsduck/main.env transport settings (no secrets in tickets). Relay ingress: watch journalctl -u 'tsduck-in@main' for reset/backpressure — Transport troubleshooting
Outage scope
tsduckctl restart main drops ingest SRT — use only after peer is ready to reconnect
3. TS on Ingress -> Pixop but no enhancement (Pixop -> replacement zero)
Symptom
Internal tap shows Mbps; Pixop replacement port flat
Cold GPU/model warmup; license/operational standby; wrong video PID; libav decode errors; pixop-live not active
Safe step
pixopctl status; keep continuous source ≥1–2 min. Read live.log for NVEnc/CUDA/model lines. curl control status for awaiting_job. Check realtime.libavErrors.total in JSON
Tap traffic OK; decode errors rising; after source change
Safe step
tsduckctl detect-video-pid main --secs 10 (read-only) — review reported PID
Mutating
tsduckctl detect-video-pid main --apply updates ORIGINAL_VIDEO_PID and INPUT_PCR_PID and restarts ingress — schedule with downstream
GPU init / hydration / slow cold start
Evidence
Long gap in pixop-startup-timeline; EBS-first-launch delay; REST server late in live.log
Safe step
pixop-startup-timeline; wait through hydration (AWS quickstart). Avoid interpreting healthcheck recover during grace (GRACE_SECS=120) as failure
Escalation
Bundle + timeline output; instance type and volume initialization settings
4. Enhancement running but egress empty or wrong
4a. Final merged TS / SRT main egress zero; Pixop -> replacement OK
Evidence
pixop-flowPixop -> replacement > 0, Final merged TS or SRT main egress ≈ 0
Common causes
tsduck-out@egress-main stalled; merge plugin blocked; egress not started
Safe step
tsduckctl check egress-main; tsduckctl logs egress-main; pixop-stack status
Outage scope
tsduckctl restart egress-main — egress SRT drop only
4b. Egress bitrate OK but receiver shows source quality or wrong resolution
Evidence
SRT main egress > 0 on appliance; receiver still shows source quality, wrong program, or lower resolution than expected
Common causes
Decoder locked to pre-enhancement program/PID; capture started during passthrough/warmup window; wrong program selection — output codec/profile follows your configured recipe (engineering KVM builds often use HEVC Main 10; public AMI defaults may differ)
Safe step
Inspect the full recording timeline (not only the first seconds). Select the enhanced program/PID after warmup. Early egress may be pre-enhancement TS by design (tsduck-out-run packet skip ~2000 ms)
Recommendation
Reconnect downstream after metrics show stable output.framesTotal; confirm expected codec in :8080 UI or nvencc.args backup
5. HDR / color wrong
Symptom
Washed out, wrong gamma, or unexpected BT.709 vs BT.2020
Evidence
live.log color metadata; nvencc.args and UI params; receiver HDR mode
Common causes
Source HLG/PQ vs output signaling; params.json HDR toggles; downstream tone-mapping
Safe step
Document input format from encoder; compare against a privately heldparams.json backup (under /var/lib/pixop-live/parameters/ — not in pack-config or support bundle). Use pixop-pack-config only for a sanitized/etc/pixop-live snapshot. Recommendation: change picture settings through :8080 UI during maintenance (Picture processing); runtime UI tweaks (class A) do not require pixopctl restart — restart only after nvencc.args edits (class C)
Avoid
Inventing API calls not in your build’s HTTP docs
6. Low throughput / stutter / pixop-flow exit 3
Symptom
Drops, macroblocking, or pixop-flow warns backbone capacity
Evidence
Exit 3; Ingress -> Pixop at 100% of TS_TARGET_BITRATE; utilization % in pixop-flow
Lower encoder bitrate or raise TS_TARGET_BITRATE in network.env only with engineering review — mis-tuning affects merge/CBR. Check nvidia-smi
Backbone ceiling
All stages share the guest UDP multicast TS handoff — extreme bitrates may stress the internal path before WAN
7. SRT latency / timing drift
Symptom
Growing delay, AV sync slip
Evidence
Peer-reported latency; timing probe JSON
Safe step
tsduckctl tune-latency main (read-only) — compares PIPELINE_LATENCY to pixop-timing-probe --json
Mutating
tsduckctl tune-latency main --apply writes recommended latency (200–1500 ms) and restarts primary ingress — review read-only report first; do not auto-apply in scripts without operator sign-off
8. Healthcheck recover loops
Symptom
Repeated recovering pixop-live via pixopctl recover in journal
Real decode failure (non-idle status=ERROR); sustained missing JSON and Prometheus metrics per healthcheck rules; misclassified failure (rare — idle should suppress)
Safe step
Distinguish idle vs on-air using pixop-flow and framesTotal. If metrics missing: pixopctl status, port 8080 listen. Recommendation: do not disable timer without cause — fix underlying layer
Restore previous value in main.env; restart ingress
Use pixop-pack-config before edits to capture a sanitized diagnostic archive of /etc/pixop-live — not a private rollback bundle. For rollback, keep separate root-only copies of nvencc.args, tsduck env/args, network.env, and params.json per Configuration change control §3.
Escalation package
pixop-support-bundle
Operational fact: bundle excludes JWT/pulse from packs and runs pixop-redact — best-effort. Recommendation: open the archive on a trusted machine; remove remaining secrets; confirm no credentials dumps.
Include in the ticket:
pixop-version full output
UTC timeline
Deployment (Region, instance type, or KVM + host OS)
Failing layer: input / processing / egress
pixop-preflight summary line
Whether pixop-flow showed bytes at each stage while on-air
Bundle filename under /var/lib/pixop-live/support/
Exclude: passphrases, pixop-license token, raw license.jwt.