> For the complete documentation index, see [llms.txt](https://cylexdev.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cylexdev.gitbook.io/docs/cylex_mdt/features/training.md).

# Training

FTO evaluations and officer exams in Cylex MDT

Run structured field training evaluations for cadets and build scored exams with multiple-choice and open-ended questions for any rank.

The Training section of Cylex MDT covers two distinct pipelines: FTO reports that Field Training Officers write to evaluate cadets in the field, and formal Exams that supervisors build and assign to officers for written assessment. Both systems are department-scoped when `Config.DepartmentScopedData` is enabled, so each department manages its own training records independently.

### FTO (Field Training Officer) <a href="#eaae60b2-5c04-40f9-9f03-5d5b0c1ea5ec" id="eaae60b2-5c04-40f9-9f03-5d5b0c1ea5ec"></a>

The FTO page is where training officers document cadet performance. Every evaluation is saved as a permanent record in the archive, searchable by name, reporter, or status.

#### Creating an FTO report <a href="#e0af8278-bcb1-4b3d-96d5-1639927bf510" id="e0af8278-bcb1-4b3d-96d5-1639927bf510"></a>

{% stepper %}
{% step %}

### Open FTO

Navigate to **FTO** in the MDT sidebar.
{% endstep %}

{% step %}

### Click Create Report

Press **Create Report** and enter a report title — for example, `Phase 1 Final Exam` or `Routine Patrol`. Click **Continue**.
{% endstep %}

{% step %}

### Select the cadet

In the **Candidate Information** section, pick the officer under evaluation from the **Select cadet** dropdown. This field is required before saving.
{% endstep %}

{% step %}

### Set the training period

Set a **Start** and **End** date for the evaluation period. Both fields are optional — leave **End** blank if the evaluation is ongoing.
{% endstep %}

{% step %}

### Fill in performance ratings

Rate the cadet on each evaluation criterion from 0 to 10. The MDT calculates and displays the **Average Score** automatically as you fill in scores.
{% endstep %}

{% step %}

### Add qualitative observations

Fill in the four text fields: **Positive Observations**, **Areas for Improvement**, **Final Summary**, and **Officer Notes**.
{% endstep %}

{% step %}

### Save the report

Click **Save Report**. The report is added to the archive with a status of **Under Evaluation**.
{% endstep %}
{% endstepper %}

#### Evaluation criteria <a href="#id-0184ea9d-7f2f-4f7e-9ebf-f2a6018b3130" id="id-0184ea9d-7f2f-4f7e-9ebf-f2a6018b3130"></a>

The six rating categories are defined in `shared/internal_config.lua` and each has a maximum score of 10:

```lua
Config.FTOCriteria = {
    { id = 'calmness', maxScore = 10 },
    { id = 'comm',     maxScore = 10 },
    { id = 'radio',    maxScore = 10 },
    { id = 'driving',  maxScore = 10 },
    { id = 'sop',      maxScore = 10 },
    { id = 'weapon',   maxScore = 10 },
}
```

Their display labels in the UI are pulled from the locale file:

| ID         | Label               |
| ---------- | ------------------- |
| `calmness` | Calmness            |
| `comm`     | Communication       |
| `radio`    | Radio Usage         |
| `driving`  | Driving             |
| `sop`      | Procedure Knowledge |
| `weapon`   | Weapon Handling     |

#### Report statuses <a href="#id-6f1b2ae5-f928-4934-94aa-e0a1c5fe505c" id="id-6f1b2ae5-f928-4934-94aa-e0a1c5fe505c"></a>

FTO reports move through three statuses, stored as canonical IDs in the database:

```lua
Config.FTOStatuses = {
    'under_evaluation',
    'successful',
    'failed',
}
```

| Status               | When to use                                  |
| -------------------- | -------------------------------------------- |
| **Under Evaluation** | The evaluation is in progress                |
| **Successful**       | The cadet passed the training period         |
| **Failed**           | The cadet did not meet the required standard |

Change a report's status by opening the report and updating the status selector, then clicking **Update Report**.

#### Viewing FTO history <a href="#id-2d29a737-8fbe-453c-a2a8-164c5f973b84" id="id-2d29a737-8fbe-453c-a2a8-164c5f973b84"></a>

The FTO archive lists all evaluation reports in a table showing **Report Title**, **Candidate**, **Reporter**, **Date**, and **Status**. Use the search bar to filter by any of these fields. Click a row to open and review the full report. Reports cannot be deleted by default — the archive is a permanent training record.

{% hint style="info" %}
If `Config.DepartmentScopedData` is `true`, officers only see FTO reports created within their own department.
{% endhint %}

***

### Exams <a href="#ca56806d-17ea-493f-bea0-77bba94bbec8" id="ca56806d-17ea-493f-bea0-77bba94bbec8"></a>

The Exams page lets supervisors build written assessments, assign them to specific officers, and review submissions with manual grading for open-ended questions.

#### Creating an exam <a href="#id-8b89b461-9eae-4b41-a054-79683851db53" id="id-8b89b461-9eae-4b41-a054-79683851db53"></a>

{% stepper %}
{% step %}

### Open Exams

Navigate to **Exams** in the MDT sidebar and click **Add Exam**.
{% endstep %}

{% step %}

### Set the title and description

Enter a title — for example, `Basic Procedure Exam` — and an optional description explaining the exam's purpose and scope.
{% endstep %}

{% step %}

### Add participants

Search for officers by name or badge number and add them as **Participants**. Participants are the officers who will take the exam. At least one participant is required.
{% endstep %}

{% step %}

### Add reviewers

Search and add officers as **Reviewers**. Reviewers can see all submissions and grade open-ended answers. This role is separate from participants — a reviewer does not take the exam.
{% endstep %}

{% step %}

### Click Create and Edit

Click **Create and Edit** to save the exam and open the question editor.
{% endstep %}
{% endstepper %}

#### Adding questions <a href="#f2d0a3f9-6fbb-45de-a441-bab1f7cf6b01" id="f2d0a3f9-6fbb-45de-a441-bab1f7cf6b01"></a>

Inside the exam editor, use the buttons at the bottom to add questions:

{% tabs %}
{% tab title="Multiple choice" %}
Click **Add Multiple Choice** to add a question where participants select from a list of options.

* Type the question text in the question field.
* Add answer options with **Add Option**. Mark the correct option by selecting it.
* Set the **Points** value for this question.

The MDT grades multiple-choice answers automatically when the participant submits.
{% endtab %}

{% tab title="Open ended" %}
Click **Add Open Ended** to add a free-text question that a reviewer grades manually.

* Type the question text.
* Set the **Points** value for this question.

Open-ended answers are not auto-graded. A reviewer must score them after submission.
{% endtab %}
{% endtabs %}

The total point value for the exam is shown at the top of the question list and updates as you add questions.

#### Taking an exam <a href="#id-1e3f4b66-616b-4bbf-ad7c-5e3326ef72ba" id="id-1e3f4b66-616b-4bbf-ad7c-5e3326ef72ba"></a>

Participants see their assigned exams in the **My Submissions** section of the Exams page, each marked with a **To Do** status. Click **Take Exam** to open the exam.

Answer each question and click **Submit Answers** when finished. A confirmation dialog warns that you cannot re-enter the exam after submitting. Once submitted, the exam status changes to **Result Pending** until a reviewer grades any open-ended questions.

{% hint style="warning" %}
You cannot re-enter or change your answers after submitting. Make sure you have answered every question before clicking **Submit Answers**.
{% endhint %}

#### Reviewing submissions <a href="#id-79546988-c99a-43ed-86d0-97b3c432ef34" id="id-79546988-c99a-43ed-86d0-97b3c432ef34"></a>

Reviewers open the exam and click **View Submissions** to see the answer sheet for each participant. For each submission:

* Multiple-choice answers are marked **Correct** or **Selected** automatically.
* Open-ended answers show the participant's written response with a **Give points** field. Enter a score up to the question's maximum and optionally add a **Reviewer Note** visible to the participant.
* After grading all open-ended questions, mark the submission as **Passed** or **Failed**.

#### Exam statuses <a href="#id-09d40cdd-be01-49ae-af3a-0419876265a7" id="id-09d40cdd-be01-49ae-af3a-0419876265a7"></a>

| Status                 | Meaning                                                          |
| ---------------------- | ---------------------------------------------------------------- |
| **To Do**              | The participant has not yet started the exam                     |
| **Result Pending**     | The participant has submitted; open-ended questions need grading |
| **Completed — Passed** | The participant passed                                           |
| **Completed — Failed** | The participant did not pass                                     |

#### Department scoping <a href="#ae65b1fc-ffb3-42fb-9a55-5aa8a631dbdf" id="ae65b1fc-ffb3-42fb-9a55-5aa8a631dbdf"></a>

When `Config.DepartmentScopedData` is `true`, exams are scoped per department. Officers only see exams created within their own department. Set it to `false` to share all exams across every department on the server.

```lua
-- editable/config.lua
Config.DepartmentScopedData = true
```
