Trace, Evidence and Reports
ChargeLink Native stores machine-readable traces, reports, evidence and diagnostic envelopes below the artifact root. These files are the operational record of what ChargeLink started, what it observed, which test logic ran, how a verdict was produced and whether the evidence remained unchanged after the run. This chapter explains the run-oriented artifact model, how to find and validate a run, and how to prepare a safe support handoff.
Exported artifacts can contain network identifiers, certificate metadata, protocol payload fields and customer signals. Apply the built-in redaction policy and define retention before sharing evidence outside your organisation.
1. Runs, roots and IDs
| Root | Default | Purpose |
|---|---|---|
| Runtime root | .chargelink\runtime under the current directory | Session state, PID, lock and heartbeat files, role locks, recovery, gRPC state |
| Artifact root | .chargelink\artifacts under the current directory | One directory per run: manifest, command result, traces, reports |
Always pass absolute roots. The examples pass --runtime-root C:\ChargeLinkData\runtime and --artifact-root C:\ChargeLinkData\artifacts on every command. A command executed without the same roots looks in a different place and reports that no session or manifest exists.
$CL = 'C:\ChargeLink\0.5.0-rc2\pc1\bin\chargelink.exe'
$Data = 'C:\ChargeLinkData'
$RunId = 'GOT-BENCH03-ISO20DC-20260923-001'
Run IDs: pass --run-id on commands that support it (evse start, sim *, dc-can *, protocol *-live-stack); otherwise ChargeLink generates cl-<role>-<unix_ms>. A good run ID is unique, readable and stable: <SITE>-<BENCH>-<PROTOCOL>-<YYYYMMDD>-<SEQ>. Avoid spaces, personal names and secrets.
2. The run directory
C:\ChargeLinkData\artifacts\<run-id>\
manifest.json schema chargelink-artifact-manifest-v2; one entry per file with size, sha256, redaction_class, export_allowed
command_result.json the JSON result of the command that produced the run
traces\*.jsonl chronological events (schema chargelink-protocol-trace-event-v1 per line)
traces\live-v2gtp-frames.jsonl every V2GTP frame: direction, payload type, length, decode verdict
exi\*.exi raw EXI captures (loopback and fixture lanes)
protocol\*.json, *.bin lane reports and raw V2GTP request dumps
sim\*.json, pki\*.json deterministic simulation reports and transcripts
evse_listener_status.json, sdp_diagnostics.json, tls_handshake_diagnostics.json, session_handshake_artifact_gate.json (EVSE)
session.json, summary.json, protocol_session.json, protocol_summary.json, expected_sequence.json, observed_live_sequence.json, diagnostics.json, conformance_traceability.json (EVCC)
redacted\ + redaction_report.json after artifacts redact
support_bundle\support_bundle_manifest.json after artifacts support-bundle
Trace events carry sequence, timestamp_ms, role, family, phase (runtime_lifecycle, sdp, transport, tls, v2g_tp, exi_boundary, state_machine, artifact), level, verdict (observed, accepted, rejected, timeout, unsupported, faulted) and message. Formats are JSON, JSON-lines, .log, raw .exi and .bin. There is no PCAP writer, no CSV export and no JUnit or PDF report; the customer report is produced as JSON, Markdown and HTML.
3. Find and inspect evidence
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts index # every manifest under the artifact root
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts inspect --run-id $RunId # the manifest of one run
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json runtime list # sessions with lifecycle health
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json runtime inspect --run-id $RunId # lock, pid, heartbeat, lifecycle log
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json runtime locks
Artifact inspection answers "what files exist"; runtime inspection answers "what happened to the process": stale session after a power loss, unexpected exit, role lock that blocks a new start, missing heartbeat, a run never cleanly stopped.
4. Verify integrity
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts integrity --run-id $RunId | Tee-Object -FilePath "$Data\artifacts\$RunId-integrity.json"
Recalculates every SHA-256 and compares it with the manifest; reports verified or failed with missing files and hash mismatches. Run it after the test, before creating a report or support bundle, after copying evidence, before delivery and when reopening an archive. A failed result means the set is no longer identical to the manifest: quarantine the directory, record the failing paths, and repeat the run if trustworthy evidence is required. Never regenerate only the manifest.
5. Reports
| Report | Produced by | Content |
|---|---|---|
campaign_status.json, verdicts.json, customer_report.json | test run, test report | Protocol-first campaign status (completed_pass / completed_fail / completed_inconclusive), per-case verdicts, customer summary |
run_report.json, verdict_report.json, customer_report.md, customer_report.html | conformance package execute / report | Package run, aggregated verdicts, human-readable summary |
signed_verdict_manifest.json | package flow | Verdict-evidence manifest with an integrity seal (SHA-256 over the manifest content, algorithm sha256-internal-integrity-seal-v1). It is not an external CA signature or a legally recognised electronic signature; treat it as tamper evidence, not as authentication. |
session_handshake_artifact_gate.json | EVSE listener | Required versus observed states for the session, with passed / attention_required / failed |
sim\*-report.json | sim | Seed, events, transcript hash |
Outcome categories: pass (evidence satisfied the case), fail (a check failed), inconclusive (no evidence bound), blocked (prerequisite absent), not selected (excluded by PICS/PIXIT). Blocked is not fail and must remain visible in customer reports. A generated report is not an accredited certification result.
6. Redact before sharing
Every manifest entry carries a redaction class: public_metadata, operator_log, protocol_trace, sensitive_credential, customer_confidential or unknown, and an export_allowed flag. Private keys, certificates, passwords and tokens are sensitive_credential and are never exported.
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts policy
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts redact --run-id $RunId
Get-ChildItem "$Data\artifacts\$RunId\redacted" -Recurse
After redaction, open representative files and search for host names, IPv6 addresses, certificate subjects, EVCCID/EVSEID, VeriStand channel names and file paths that reveal customer project names. Redaction reduces exposure; release approval remains your organisation's decision.
7. Support bundle
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts support-bundle --run-id $RunId
Get-Content "$Data\artifacts\$RunId\support_bundle\support_bundle_manifest.json"
The bundle manifest selects the redacted, exportable files. Ship the manifest, the files it lists, the integrity result, the ChargeLink version, protocol/role/profile, the execution mode and the problem description (Support Escalation). Never attach the entire artifact root. For a VeriStand bench session, add the run folder written by Start-SeccSession.ps1 (see Reading the result); it contains no key.
8. Complete evidence workflow
$Review = "$Data\support\handoff-$RunId"
New-Item -ItemType Directory -Force $Review | Out-Null
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json runtime inspect --run-id $RunId | Tee-Object -FilePath "$Review\runtime-inspect.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts inspect --run-id $RunId | Tee-Object -FilePath "$Review\artifact-inspect.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts integrity --run-id $RunId | Tee-Object -FilePath "$Review\integrity-before-redaction.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts redact --run-id $RunId | Tee-Object -FilePath "$Review\redaction-result.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts support-bundle --run-id $RunId | Tee-Object -FilePath "$Review\support-bundle-result.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts index | Tee-Object -FilePath "$Review\artifact-index.json"
9. Retention and access control
- Put the artifact root on an access-controlled volume; keep raw and redacted artifacts in separate directories.
- Decide retention for raw traces and for customer reports before the first customer run; failed and passed runs may differ.
- Prevent automatic cloud synchronisation of the artifact root unless approved.
- Record every external transfer; re-run integrity verification after archive restore.
10. Troubleshooting
| Symptom | Cause | Action |
|---|---|---|
| No active runtime session / run not found | Different roots or run ID | Use the same --runtime-root/--artifact-root as the start command; list with runtime list |
| Manifest not found | Run ended before finalisation, or a relative default root under another working directory | Search the data volume; inspect the start command transcript |
| Integrity verification fails | Manual edit, antivirus quarantine, partial copy, interrupted write | Quarantine; record failing paths; repeat the run |
| Replay fails | --trace points to a live trace instead of a simulation report | Pass the report written by sim ... --output |
| Redacted output still contains customer data | Data in a class the policy exports | Stop the handoff; restrict access; escalate through your security process |

