Orcraft 1.1.3 public beta released 08-Nov-2026. The Free Plan and the Team trial are open; card payments and invoices open shortly.

Orcraft 1.1.3 public beta released 08-Nov-2026. The Free Plan and the Team trial are open; card payments and invoices open shortly.

Orcraft

The platform for test development and orchestration
that lets you and your AI Agents run the entire testing operation

Watch the demo

Orcraft Statuses

Every result in Orcraft carries a status that says how the run went. A case starts at PASS and is moved from there by what the test reports: a warning that leaves it passing, a failure, or an error that ends it without a verdict. This page uses the three Status tests of the tutorial suite's Statuses and Results group, one per outcome, and shows how each one looks in the execution tree, the log and the Details dialog.

The three tests share the same shape. Each runs the Maze application over a small matrix that mixes valid inputs with invalid ones: a misspelt slove command and out-of-bounds start coordinates. The application answers an invalid input with a message on its error output, and each test turns that message into a different status. The application is behaving correctly in every case; the tests are about the reporting.

Select Status: Pass with Warning and Status: Fail in turn and set their Maze Executable Folder. Status: Error takes a Maze Bin Folder instead, the folder that holds one subfolder per Maze version:

Its matrix names two versions, v3.0.0 and v4.0.0. Only the first exists on disk, which is what the test needs to produce an error. Click Update Plan for each of the three tests.

Pass with warning

Source directory:

orcraft-test-suite-tutorial/test_group_statuses_and_results/test_status_pass_with_warning/

The test runs the application and, when the run produced an error message, records it as a warning:

def _run_case(self, case: OrcraftTestCase):

	maze_app = MazeApp(
		self.config.maze_executable_folder,
		case.params["command"],
		width=case.params["width"],
		height=case.params["height"],
		start_row=case.params["start_row"],
		start_col=case.params["start_col"],
	)

	result = maze_app.run()

	if result.error:
		case.result.warning_description = result.error

	return case.result

Assigning warning_description attaches the message to the case without changing its status. Click Run on the test and confirm:

The run's row is drawn in yellow and its status reads Pass (+Warn). The counters tell the rest: 16 planned, 16 done, 16 passed, none failed. A warning is information attached to a passing case, and the tree counts it as a pass. What changes is where the run is surfaced: the Warn chip above the tree counts one test with warnings, and the progress bar in the Execution Status frame turns yellow.

Click Details for the run to see which cases carried the warning:

The two cases with a valid command and valid coordinates read Pass; the other fourteen read Pass (+Warn), and the message the application wrote is in each one's Warning Description column further right. The Items Filter at the bottom narrows the tree to either kind.

Fail

Source directory:

orcraft-test-suite-tutorial/test_group_statuses_and_results/test_status_fail/

The only difference from the previous test is the field the message is assigned to:

	result = maze_app.run()

	if result.error:
		case.result.failure_description = result.error

	return case.result

Assigning failure_description moves the case to FAIL on its own; the test never sets the status by hand, so the reason always travels with it. Run the test:

The row turns red. The test reports 16 done, 2 passed and 14 failed, a pass rate of 12 %, and the Fail chip appears next to Warn. A failure is a finding about the application: the case ran to the end, compared what it saw with what it expected, and the two differed.

The Details dialog lists the finding per case:

The same two cases pass and the same fourteen are now failures, each with its message in the Failure Description column. Whether an unexpected message is a warning or a failure is the test's decision, and these two tests make opposite ones on purpose.

Error

Source directory:

orcraft-test-suite-tutorial/test_group_statuses_and_results/test_status_error/

This test sets no description at all. It builds the executable folder from the case's version and runs the application from there:

def _run_case(self, case: OrcraftTestCase):

	bin_folder = f"{self.config.maze_bin_folder.rstrip('/\\')}/{case.params['maze_version']}"

	maze_app = MazeApp(
		bin_folder,
		case.params["command"],
		width=case.params["width"],
		height=case.params["height"],
	)

	maze_app.run()

	return case.result

For v4.0.0 the folder does not exist, launching the executable raises an exception, and nothing in the test catches it. An uncaught exception is what produces ERROR: the case could not reach a verdict, so there is no finding about the application, only about the run. Run the test:

The row turns orange and an Error chip appears above the tree. The log shows the traceback of each failed launch, the Test Matrix results with both v4.0.0 cases marked ERROR, the message as the test's Error Description, and an Errors table that lists the errored cases with their descriptions. The counters read 4 planned, 2 done and 2 passed, with progress at 50 %: an errored case does not count as done, because it produced no result to count.

The error ends the case, not the test. Its cause may belong to that one case, or be sporadic and gone by the next one, so the framework goes on with the next case and lets it report its own outcome. The same holds for a call to exit() anywhere in a test; the framework reference's Calling exit() section goes through every place it can happen. Open the Details dialog:

The two v3.0.0 cases passed and both v4.0.0 cases errored, each with the message in its Error Description column. Every case was reached, but the errored ones are missing from Done, which is why the progress stays at 50 % rather than reporting the run as complete.

The distinction between fail and error is the one to keep in mind when writing a test. A failure is expected and means the application is wrong; an error is unexpected and means the test could not do its job. Orcraft counts them separately so that a suite with an infrastructure problem does not look like a suite with a quality problem.

Statuses in the tree

Select the Statuses and Results group to see the three runs together:

Each test run row is coloured by its status, and the group aggregates the counters of its tests: 64 planned, 34 done, 20 passed and 14 failed, a progress of 53 %. The Warn, Fail, Error and Not Run chips above the tree count tests by their latest status, and clicking one narrows the tree to those tests. The two remaining tests of the group, Checkpoints and Result Fields, have not run yet and count as not run.

These tests set a status with a single description. The next page, Checkpoints, checks several things in one case and records the outcome of each check in the log.

Type to search the docs.

    ↑↓ navigate ↵ open Esc close