DK Studio/Documentation
ProductChangelog

Results and Reports

This page introduces the result model, the difference between a failure and an error, what evidence is kept, and how results are reported and exported.

The result model

Every execution of a case produces one result. A result carries:

FieldMeaning
run_id / case_idWhat ran, in which run.
variantWhich implementation of the capability ran.
targetThe protocol family, device type and OEM combination it ran against.
statusThe outcome β€” one of the values below.
duration_msHow long the execution took end to end.
error_messageWhy it did not pass, when it did not pass.
resultThe per-step outcome: status, duration, message.
script_hashA hash of the rendered procedure that ran.

The executions table carries these as run_id, case_id, status, result, duration_ms, error_message and executed_at.

Two things sit on top of that:

  • Per-step results. A failed execution is much easier to act on when you can see that step 4 of 6 failed and the rest passed, rather than only seeing "failed".
  • A script hash. This makes history trustworthy. When the same case fails in one run and passes in the next, the hash tells you whether the procedure changed in between. Two different hashes for the same variant mean the case was edited; the same hash means the product changed.
execution:
  case: tc.provision
  variant: v.provision.ccc.apple
  target_id: tgt.ccc.apple
  script_hash: "9f2c…"
  status: failed
  duration_ms: 41230
  error_message: "step 4: reply status expected 0x00, got 0x21"
  result:
    - { ordinal: 1, status: passed, duration_ms: 120 }
    - { ordinal: 2, status: passed, duration_ms: 310 }
    - { ordinal: 3, status: passed, duration_ms: 980 }
    - { ordinal: 4, status: failed, duration_ms: 1500, message: "expected 0x00, got 0x21" }
    - { ordinal: 5, status: skipped }

Pass, fail, error

The distinction between these outcomes is the most important thing in the model, because it decides whether a red result sends someone to a bug or to a broken bench.

OutcomeMeaningWhose problem
PassedEvery assertion in the procedure was satisfied.β€”
FailedAn assertion was evaluated and did not hold. The system under test did not behave as required.The product.
ErrorThe execution could not be completed β€” the agent was unreachable, a parameter was missing, a port would not open, the renderer left an unresolved placeholder.The setup.
SkippedThe execution was deliberately not run β€” the target had no matching variant, or the run was aborted before reaching it.Nobody's problem, but it is not a pass.

Two rules follow:

  • An error is never a failure. If the bench was down, the product was not tested, and calling it a failure corrupts the pass rate and hides a real regression behind infrastructure noise.
  • A skip is never a pass. A case that was skipped because no variant matched is a coverage gap, and it belongs in the report as a gap.

A run's own status is derived from its executions: any error makes the run failed as an execution problem, any failure makes it failed as a product problem, and the two are reported separately so that the cause is visible.

Evidence

Evidence is attached to the execution that produced it rather than to the run as a whole: the stdout of step 4 belongs with step 4.

EvidenceWhere it comes from
Standard outputThe command result's stdout.
Standard errorThe command result's stderr.
Exit codeThe command result's exitCode.
DurationThe command result's durationMs.
Serial port metadataPath, manufacturer, serial number, vendor and product ids, delivered as a device event.
Device eventsHot-plug and connection events, delivered as device events over the socket.
The studio records serial metadata, not the byte stream

The bytes coming back from a serial port are delivered to the agent, and the interactive serial console lives on the agent's own page at http://localhost:3001 on the machine under test. The studio keeps the port's identity β€” path, manufacturer, serial number, vendor id, product id β€” so a result says which hardware produced it. See Remote Shell and Serial.

The platform's evidence for a command is therefore the text it produced. Anything richer has to be produced by the script itself and returned as part of stdout, or written on the bench and retrieved by a later command.

Reporting

Reporting is where the model pays off, and it is built around two questions that a flat list of cases cannot answer.

Coverage by capability

Grouping results by capability answers "is our feature set complete?" β€” for each capability, how many of its variants were exercised and how many passed:

Capabilityproj.aproj.bTotal
Provision and enrol4/5 passed5/5 passed9/10
Revoke2/2 passedβ€”2/2

The totals are meaningful because the capability is the shared unit: the same case is counted in every project that ran it.

Compatibility by target

Grouping results by target answers "does our bench fleet work?" β€” for each capability and each protocol family, device type and OEM combination, whether it passed:

CapabilityCCC / AppleCCC / GoogleICCEICCOACOT
Provision and enrolpasspassno variantfailno variant

The two views are complements: the first is a product question, the second is an interoperability question. Reporting only one of them gives half the answer.

Trend over time

For a given capability and variant, the pass rate over successive runs, with the script-hash changes marked. A failure that appears at the same point as a procedure edit is a different problem from one that appears without an edit, and the trend view is where that is visible.

Exporting

A report is exported as a machine-readable table with one row per execution, carrying the case, the variant, the target, the outcome, the duration and the error message. The same rows are available in the executions table, joined to test_runs for the run's name, target and timings, and to test_cases for the case's title and priority.

Exporting is what lets a run be correlated with an external system β€” a nightly report posted to a chat channel, a build pipeline that fails on a regression, a dashboard that reads the table directly.

See also